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__extension__ typedef __SIZE_TYPE__ size_t; 16 17static inline int 18foo (unsigned int x, void *y) 19{ 20 register size_t r AX_REG; 21 register size_t a1 DI_REG; 22 register size_t a2 SI_REG; 23 a1 = (size_t) x; 24 a2 = (size_t) y; 25 asm volatile ("" : "=r" (r), "+r" (a1), "+r" (a2) : : "memory"); 26 return (int) r; 27} 28 29struct T { size_t t1, t2; unsigned int t3, t4, t5; }; 30 31int 32bar (size_t x, unsigned int y, size_t u, unsigned int v) 33{ 34 long r; 35 struct T e = { .t1 = x, .t2 = u }; 36 37 if (x << y != u << v) 38 return 5; 39 r = foo (11, &e); 40 return e.t3 == x; 41} 42