1 /* PR debug/67192 */ 2 /* { dg-do run } */ 3 /* { dg-options "-x c++ -g -Wmisleading-indentation" } */ 4 5 volatile int cnt = 0; 6 7 __attribute__((noinline, noclone)) static int last(void)8last (void) 9 { 10 return ++cnt % 5 == 0; 11 } 12 13 __attribute__((noinline, noclone)) static void do_it(void)14do_it (void) 15 { 16 asm volatile ("" : : "r" (&cnt) : "memory"); 17 } 18 19 __attribute__((noinline, noclone)) static void f1(void)20f1 (void) 21 { 22 for (;; do_it()) 23 { 24 if (last ()) 25 break; 26 } 27 do_it (); /* { dg-final { gdb-test 27 "cnt" "5" } } */ 28 } 29 30 __attribute__((noinline, noclone)) static void f2(void)31f2 (void) 32 { 33 while (1) 34 { 35 if (last ()) 36 break; 37 do_it (); 38 } 39 do_it (); /* { dg-final { gdb-test 39 "cnt" "10" } } */ 40 } 41 42 __attribute__((noinline, noclone)) static void f3(void)43f3 (void) 44 { 45 for (;; do_it()) 46 if (last ()) 47 break; 48 do_it (); /* { dg-final { gdb-test 48 "cnt" "15" } } */ 49 } 50 51 __attribute__((noinline, noclone)) static void f4(void)52f4 (void) 53 { 54 while (1) /* { dg-final { gdb-test 54 "cnt" "15" } } */ 55 if (last ()) 56 break; 57 else 58 do_it (); 59 do_it (); /* { dg-final { gdb-test 59 "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()68main () 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