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