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
last(void)8 last (void)
9 {
10   return ++cnt % 5 == 0;
11 }
12 
13 __attribute__((noinline, noclone)) static void
do_it(void)14 do_it (void)
15 {
16   asm volatile ("" : : "r" (&cnt) : "memory");
17 }
18 
19 __attribute__((noinline, noclone)) static void
f1(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
f2(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
f3(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
f4(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
main()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 }
80