OSDN Git Service

PR target/39139
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.target / i386 / pr39139.c
1 /* PR target/39139 */
2 /* { dg-do compile } */
3 /* { dg-options "-Os" } */
4
5 #ifdef __x86_64__
6 # define AX_REG asm ("rax")
7 # define DI_REG asm ("rdi")
8 # define SI_REG asm ("rsi")
9 #else
10 # define AX_REG asm ("eax")
11 # define DI_REG asm ("edi")
12 # define SI_REG asm ("esi")
13 #endif
14
15 static inline int
16 foo (unsigned int x, void *y)
17 {
18   register unsigned long r AX_REG;
19   register unsigned long a1 DI_REG;
20   register unsigned long a2 SI_REG;
21   a1 = (unsigned long) x;
22   a2 = (unsigned long) y;
23   asm volatile ("" : "=r" (r), "+r" (a1), "+r" (a2) : : "memory");
24   return (int) r;
25 }
26
27 struct T { unsigned long t1, t2; unsigned int t3, t4, t5; };
28
29 int
30 bar (unsigned long x, unsigned int y, unsigned long u, unsigned int v)
31 {
32   long r;
33   struct T e = { .t1 = x, .t2 = u };
34
35   if (x << y != u << v)
36     return 5;
37   r = foo (11, &e);
38   return e.t3 == x;
39 }