annotate gcc/testsuite/gcc.dg/pr55940.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* PR target/55940 */
kono
parents:
diff changeset
2 /* { dg-do run } */
kono
parents:
diff changeset
3 /* { dg-options "-Os" } */
kono
parents:
diff changeset
4 /* { dg-additional-options "-mpreferred-stack-boundary=2" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 struct S { int s; unsigned long t; };
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 __attribute__ ((noinline, noclone)) unsigned long long
kono
parents:
diff changeset
9 bar (struct S *x, unsigned long y)
kono
parents:
diff changeset
10 {
kono
parents:
diff changeset
11 asm volatile ("" : : "r" (x), "r" (y) : "memory");
kono
parents:
diff changeset
12 return x->s + y;
kono
parents:
diff changeset
13 }
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 __attribute__ ((noinline, noclone)) unsigned long long
kono
parents:
diff changeset
16 foo (struct S *x, unsigned long y)
kono
parents:
diff changeset
17 {
kono
parents:
diff changeset
18 unsigned long a;
kono
parents:
diff changeset
19 if (__builtin_expect (((__UINTPTR_TYPE__) (x) + 0x1000U < 0x2000U), 0))
kono
parents:
diff changeset
20 return ~0ULL;
kono
parents:
diff changeset
21 if (__builtin_expect (x->s <= 0 || x->s > 9, 0))
kono
parents:
diff changeset
22 return ~0ULL;
kono
parents:
diff changeset
23 a = x->t >> 12;
kono
parents:
diff changeset
24 if (y == a)
kono
parents:
diff changeset
25 return ~0ULL;
kono
parents:
diff changeset
26 if (x->s == 3)
kono
parents:
diff changeset
27 return x->t + y * 4096;
kono
parents:
diff changeset
28 return bar (x, y);
kono
parents:
diff changeset
29 }
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 int va, vb, vc, vd;
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 int
kono
parents:
diff changeset
34 main ()
kono
parents:
diff changeset
35 {
kono
parents:
diff changeset
36 struct S s;
kono
parents:
diff changeset
37 asm volatile ("" : : : "memory");
kono
parents:
diff changeset
38 int a = va, b = vb, c = vc, d = vd;
kono
parents:
diff changeset
39 asm volatile ("" : : : "memory");
kono
parents:
diff changeset
40 int i;
kono
parents:
diff changeset
41 for (i = 0; i < 64; i++)
kono
parents:
diff changeset
42 if (foo ((struct S *) 0, 0) != ~0ULL)
kono
parents:
diff changeset
43 __builtin_abort ();
kono
parents:
diff changeset
44 s.s = 3;
kono
parents:
diff changeset
45 s.t = 2 << 12;
kono
parents:
diff changeset
46 if (foo (&s, 2) != ~0ULL)
kono
parents:
diff changeset
47 __builtin_abort ();
kono
parents:
diff changeset
48 if (foo (&s, 3) != (2 << 12) + 3 * 4096)
kono
parents:
diff changeset
49 __builtin_abort ();
kono
parents:
diff changeset
50 asm volatile ("" : : : "memory");
kono
parents:
diff changeset
51 va = a; vb = b; vc = c; vd = d;
kono
parents:
diff changeset
52 asm volatile ("" : : : "memory");
kono
parents:
diff changeset
53 return 0;
kono
parents:
diff changeset
54 }