/* { dg-do run } */ /* { dg-options "-O2 -fno-reorder-blocks" } */ /* { dg-skip-if "limited code space" { pdp11-*-* } } */ void abort (); __attribute__((noinline, noclone)) int restore (int a, int b) { return a * b; } __attribute__((noinline, noclone)) void do_nothing (int *input) { *input = restore (*input, 1); return; } #define CASE_ENTRY(n) \ case n: \ sum = sum / (n + 1); \ sum = restore (sum, n + 1); \ if (sum == (n + addend)) \ break;\ sum = sum / (n + 2); \ sum = restore (sum, n + 2); \ sum = sum / (n + 3); \ sum = restore (sum, n + 3); \ sum = sum / (n + 4); \ sum = restore (sum, n + 4); \ sum = sum / (n + 5); \ sum = restore (sum, n + 5); \ sum = sum / (n + 6); \ sum = restore (sum, n + 6); \ sum = sum / (n + 7); \ sum = restore (sum, n + 7); \ sum = sum / (n + 8); \ sum = restore (sum, n + 8); \ sum = sum / (n + 9); \ sum = restore (sum, n + 9); \ sum = sum / (n + 10); \ sum = restore (sum, n + 10); \ sum = sum / (n + 11); \ sum = restore (sum, n + 11); \ sum = sum / (n + 12); \ sum = restore (sum, n + 12); \ sum = sum / (n + 13); \ sum = restore (sum, n + 13); \ sum = sum / (n + 14); \ sum = restore (sum, n + 14); \ sum = sum / (n + 15); \ sum = restore (sum, n + 15); \ sum = sum / (n + 16); \ sum = restore (sum, n + 16); \ sum = sum / (n + 17); \ sum = restore (sum, n + 17); \ sum = sum / (n + 18); \ sum = restore (sum, n + 18); \ sum = sum / (n + 19); \ sum = restore (sum, n + 19); \ sum = sum / (n + 20); \ sum = restore (sum, n + 20); \ sum = sum / (n + 21); \ sum = restore (sum, n + 21); \ sum = sum / (n + 22); \ sum = restore (sum, n + 22); \ sum = sum / (n + 23); \ sum = restore (sum, n + 23); \ sum = sum / (n + 24); \ sum = restore (sum, n + 24); \ sum = sum / (n + 25); \ sum = restore (sum, n + 25); \ sum = sum / (n + 26); \ sum = restore (sum, n + 26); \ sum = sum / (n + 27); \ sum = restore (sum, n + 27); \ sum = sum / (n + 28); \ sum = restore (sum, n + 28); \ sum = sum / (n + 29); \ sum = restore (sum, n + 29); \ sum = sum / (n + 30); \ sum = restore (sum, n + 30); \ sum = sum / (n + 31); \ sum = restore (sum, n + 31); \ sum = sum / (n + 32); \ sum = restore (sum, n + 32); \ sum = sum / (n + 33); \ sum = restore (sum, n + 33); \ sum = sum / (n + 34); \ sum = restore (sum, n + 34); \ sum = sum / (n + 35); \ sum = restore (sum, n + 35); \ sum = sum / (n + 36); \ sum = restore (sum, n + 36); \ break; __attribute__((noinline, noclone)) long long test_and_branch (int selector, int addend) { long long sum = selector + 1; if (selector > 64) { start: return sum - 1; } else { switch (selector) { CASE_ENTRY (1) CASE_ENTRY (2) CASE_ENTRY (3) CASE_ENTRY (4) CASE_ENTRY (5) CASE_ENTRY (6) CASE_ENTRY (7) CASE_ENTRY (8) CASE_ENTRY (9) CASE_ENTRY (10) CASE_ENTRY (11) CASE_ENTRY (12) CASE_ENTRY (13) CASE_ENTRY (14) CASE_ENTRY (15) CASE_ENTRY (16) CASE_ENTRY (17) CASE_ENTRY (18) CASE_ENTRY (19) CASE_ENTRY (20) CASE_ENTRY (21) CASE_ENTRY (22) CASE_ENTRY (23) CASE_ENTRY (24) CASE_ENTRY (25) CASE_ENTRY (26) CASE_ENTRY (27) CASE_ENTRY (28) CASE_ENTRY (29) CASE_ENTRY (30) CASE_ENTRY (31) CASE_ENTRY (32) CASE_ENTRY (33) CASE_ENTRY (34) CASE_ENTRY (35) CASE_ENTRY (36) CASE_ENTRY (37) CASE_ENTRY (38) CASE_ENTRY (39) CASE_ENTRY (40) CASE_ENTRY (41) CASE_ENTRY (42) CASE_ENTRY (43) CASE_ENTRY (44) CASE_ENTRY (45) CASE_ENTRY (46) CASE_ENTRY (47) CASE_ENTRY (48) CASE_ENTRY (49) CASE_ENTRY (50) CASE_ENTRY (51) CASE_ENTRY (52) CASE_ENTRY (53) CASE_ENTRY (54) CASE_ENTRY (55) CASE_ENTRY (56) CASE_ENTRY (57) CASE_ENTRY (58) CASE_ENTRY (59) CASE_ENTRY (60) CASE_ENTRY (61) CASE_ENTRY (62) CASE_ENTRY (63) CASE_ENTRY (64) } do_nothing ((int *)&sum); if (sum & 0x40) goto start; } return -1; } int main (int argc, char **argv) { long long ret = test_and_branch (64, 1); if (ret != 64) abort (); ret = test_and_branch (7, 1); if (ret != -1) abort (); return 0; }