1 /* { dg-do run } */
2 /* { dg-options "-Os -fno-split-wide-types" } */
3 
4 /* This testcase should uncover bugs like
5    PR46779
6    PR45291
7    PR41894
8 
9    The inline asm just serves to direct y into the Y register.
10    Otherwise, it is hard to write a "stable" test case that
11    also fails with slight variations in source code, middle- resp.
12    backend.
13 
14    The problem is that Y is also the frame-pointer, and
15    avr.c:avr_hard_regno_mode_ok disallows QI to get in Y-reg.
16    However, the y.a = 0 generates a
17        (set (subreg:QI (reg:HI pseudo)) ...)
18    where pseudo gets allocated to Y.
19 
20    Reload fails to generate the right spill.
21 */
22 
23 #include <stdlib.h>
24 
25 struct S
26 {
27     unsigned char a, b;
28 } ab = {12, 34};
29 
yoo(struct S y)30 void yoo (struct S y)
31 {
32     __asm volatile ("ldi %B0, 56" : "+y" (y));
33     y.a = 0;
34     __asm volatile ("; y = %0" : "+y" (y));
35     ab = y;
36 }
37 
main()38 int main ()
39 {
40     yoo (ab);
41 
42     if (ab.a != 0)
43         abort();
44 
45     if (ab.b != 56)
46         abort();
47 
48     exit (0);
49 
50     return 0;
51 }
52