/* PR target/39139 */
|
/* PR target/39139 */
|
/* { dg-do compile } */
|
/* { dg-do compile } */
|
/* { dg-options "-Os" } */
|
/* { dg-options "-Os" } */
|
|
|
#ifdef __x86_64__
|
#ifdef __x86_64__
|
# define AX_REG asm ("rax")
|
# define AX_REG asm ("rax")
|
# define DI_REG asm ("rdi")
|
# define DI_REG asm ("rdi")
|
# define SI_REG asm ("rsi")
|
# define SI_REG asm ("rsi")
|
#else
|
#else
|
# define AX_REG asm ("eax")
|
# define AX_REG asm ("eax")
|
# define DI_REG asm ("edi")
|
# define DI_REG asm ("edi")
|
# define SI_REG asm ("esi")
|
# define SI_REG asm ("esi")
|
#endif
|
#endif
|
|
|
__extension__ typedef __SIZE_TYPE__ size_t;
|
__extension__ typedef __SIZE_TYPE__ size_t;
|
|
|
static inline int
|
static inline int
|
foo (unsigned int x, void *y)
|
foo (unsigned int x, void *y)
|
{
|
{
|
register size_t r AX_REG;
|
register size_t r AX_REG;
|
register size_t a1 DI_REG;
|
register size_t a1 DI_REG;
|
register size_t a2 SI_REG;
|
register size_t a2 SI_REG;
|
a1 = (size_t) x;
|
a1 = (size_t) x;
|
a2 = (size_t) y;
|
a2 = (size_t) y;
|
asm volatile ("" : "=r" (r), "+r" (a1), "+r" (a2) : : "memory");
|
asm volatile ("" : "=r" (r), "+r" (a1), "+r" (a2) : : "memory");
|
return (int) r;
|
return (int) r;
|
}
|
}
|
|
|
struct T { size_t t1, t2; unsigned int t3, t4, t5; };
|
struct T { size_t t1, t2; unsigned int t3, t4, t5; };
|
|
|
int
|
int
|
bar (size_t x, unsigned int y, size_t u, unsigned int v)
|
bar (size_t x, unsigned int y, size_t u, unsigned int v)
|
{
|
{
|
long r;
|
long r;
|
struct T e = { .t1 = x, .t2 = u };
|
struct T e = { .t1 = x, .t2 = u };
|
|
|
if (x << y != u << v)
|
if (x << y != u << v)
|
return 5;
|
return 5;
|
r = foo (11, &e);
|
r = foo (11, &e);
|
return e.t3 == x;
|
return e.t3 == x;
|
}
|
}
|
|
|