1 /* PR debug/67192 */
2 /* { dg-do run } */
3 /* { dg-options "-g -Wmisleading-indentation" } */
4
5 volatile int cnt = 0;
6
7 __attribute__((noinline, noclone)) static int
8 last (void)
9 {
10 return ++cnt % 5 == 0;
11 }
12
13 __attribute__((noinline, noclone)) static void
14 do_it (void)
15 {
16 asm volatile ("" : : "r" (&cnt) : "memory");
17 }
18
19 __attribute__((noinline, noclone)) static void
20 f1 (void)
21 {
22 for (;; do_it())
23 {
24 if (last ())
25 break;
26 }
27 do_it (); /* { dg-final { gdb-test . "cnt" "5" } } */
28 }
29
30 __attribute__((noinline, noclone)) static void
31 f2 (void)
32 {
33 while (1)
34 {
35 if (last ())
36 break;
37 do_it ();
38 }
39 do_it (); /* { dg-final { gdb-test . "cnt" "10" } } */
40 }
41
42 __attribute__((noinline, noclone)) static void
43 f3 (void)
44 {
45 for (;; do_it())
46 if (last ())
47 break;
48 do_it (); /* { dg-final { gdb-test . "cnt" "15" } } */
49 }
50
51 __attribute__((noinline, noclone)) static void
52 f4 (void)
53 {
54 while (1) /* { dg-final { gdb-test . "cnt" "15" } } */
55 if (last ())
56 break;
57 else
58 do_it ();
59 do_it (); /* { dg-final { gdb-test . "cnt" "20" } } */
60 }
61
62 void (*volatile fnp1) (void) = f1;
63 void (*volatile fnp2) (void) = f2;
64 void (*volatile fnp3) (void) = f3;
65 void (*volatile fnp4) (void) = f4;
66
67 int
68 main ()
69 {
70 asm volatile ("" : : "r" (&fnp1) : "memory");
71 asm volatile ("" : : "r" (&fnp2) : "memory");
72 asm volatile ("" : : "r" (&fnp3) : "memory");
73 asm volatile ("" : : "r" (&fnp4) : "memory");
74 fnp1 ();
75 fnp2 ();
76 fnp3 ();
77 fnp4 ();
78 return 0;
79 }