| /* PR debug/67192 */ |
| /* { dg-do run } */ |
| /* { dg-options "-x c++ -g -Wmisleading-indentation" } */ |
| |
| volatile int cnt = 0; |
| |
| __attribute__((noinline, noclone)) static int |
| last (void) |
| { |
| return ++cnt % 5 == 0; |
| } |
| |
| __attribute__((noinline, noclone)) static void |
| do_it (void) |
| { |
| asm volatile ("" : : "r" (&cnt) : "memory"); |
| } |
| |
| __attribute__((noinline, noclone)) static void |
| f1 (void) |
| { |
| for (;; do_it()) |
| { |
| if (last ()) |
| break; |
| } |
| do_it (); /* { dg-final { gdb-test 27 "cnt" "5" } } */ |
| } |
| |
| __attribute__((noinline, noclone)) static void |
| f2 (void) |
| { |
| while (1) |
| { |
| if (last ()) |
| break; |
| do_it (); |
| } |
| do_it (); /* { dg-final { gdb-test 39 "cnt" "10" } } */ |
| } |
| |
| __attribute__((noinline, noclone)) static void |
| f3 (void) |
| { |
| for (;; do_it()) |
| if (last ()) |
| break; |
| do_it (); /* { dg-final { gdb-test 48 "cnt" "15" } } */ |
| } |
| |
| __attribute__((noinline, noclone)) static void |
| f4 (void) |
| { |
| while (1) /* { dg-final { gdb-test 54 "cnt" "15" } } */ |
| if (last ()) |
| break; |
| else |
| do_it (); |
| do_it (); /* { dg-final { gdb-test 59 "cnt" "20" } } */ |
| } |
| |
| void (*volatile fnp1) (void) = f1; |
| void (*volatile fnp2) (void) = f2; |
| void (*volatile fnp3) (void) = f3; |
| void (*volatile fnp4) (void) = f4; |
| |
| int |
| main () |
| { |
| asm volatile ("" : : "r" (&fnp1) : "memory"); |
| asm volatile ("" : : "r" (&fnp2) : "memory"); |
| asm volatile ("" : : "r" (&fnp3) : "memory"); |
| asm volatile ("" : : "r" (&fnp4) : "memory"); |
| fnp1 (); |
| fnp2 (); |
| fnp3 (); |
| fnp4 (); |
| return 0; |
| } |