1 /* { dg-do run } */
2 /* { dg-additional-options "-mno-speculate-indirect-jumps" } */
3 /* { dg-warning "'-mno-speculate-indirect-jumps' is deprecated" "" { target *-*-* } 0 } */
4
5 /* Test for deliberate misprediction of jump tables. */
6
7 void __attribute__((noinline)) bar ()
8 {
9 }
10
11 int foo (int x)
12 {
13 int a;
14
15 switch (x)
16 {
17 default:
18 a = -1;
19 break;
20 case 0:
21 a = x * x + 3;
22 break;
23 case 1:
24 a = x + 1;
25 break;
26 case 2:
27 a = x + x;
28 break;
29 case 3:
30 a = x << 3;
31 break;
32 case 4:
33 a = x >> 1;
34 break;
35 case 5:
36 a = x;
37 break;
38 case 6:
39 a = 0;
40 break;
41 case 7:
42 a = x * x + x;
43 break;
44 }
45
46 bar();
47
48 return a;
49 }
50
51 int main ()
52 {
53 if (foo (0) != 3)
54 __builtin_abort ();
55
56 if (foo (1) != 2)
57 __builtin_abort ();
58
59 if (foo (2) != 4)
60 __builtin_abort ();
61
62 if (foo (3) != 24)
63 __builtin_abort ();
64
65 if (foo (4) != 2)
66 __builtin_abort ();
67
68 if (foo (5) != 5)
69 __builtin_abort ();
70
71 if (foo (6) != 0)
72 __builtin_abort ();
73
74 if (foo (7) != 56)
75 __builtin_abort ();
76
77 if (foo (8) != -1)
78 __builtin_abort ();
79
80 return 0;
81 }