OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [gcc.target/] [avr/] [pr46779-2.c] - Rev 848

Go to most recent revision | Compare with Previous | Blame | View Log

/* { dg-do run } */
/* { dg-options "-Os -fno-split-wide-types" } */
 
/* This testcase should uncover bugs like
   PR46779
   PR45291
   PR41894
 
   The inline asm just serves to direct y into the Y register.
   Otherwise, it is hard to write a "stable" test case that
   also fails with slight variations in source code, middle- resp.
   backend.
 
   The problem is that Y is also the frame-pointer, and
   avr.c:avr_hard_regno_mode_ok disallows QI to get in Y-reg.
   However, the y.a = 0 generates a
       (set (subreg:QI (reg:HI pseudo)) ...)
   where pseudo gets allocated to Y.
 
   Reload fails to generate the right spill.
*/
 
#include <stdlib.h>
 
struct S
{
    unsigned char a, b;
} ab = {12, 34};
 
void yoo (struct S y)
{
    __asm volatile ("ldi %B0, 56" : "+y" (y));
    y.a = 0;
    __asm volatile ("; y = %0" : "+y" (y));
    ab = y;
}
 
int main ()
{
    yoo (ab);
 
    if (ab.a != 0)
        abort();
 
    if (ab.b != 56)
        abort();
 
    exit (0);
 
    return 0;
}
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.