| /* { dg-do assemble } */ |
| /* { dg-timeout-factor 2.0 } */ |
| /* { dg-options "-O1 -fno-reorder-blocks -fno-tree-cselim --save-temps" } */ |
| |
| |
| __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 ENTRY_SUM(n, x) \ |
| sum = sum / ((n) + (x)); \ |
| sum = restore (sum, (n) + (x)); |
| |
| #define ENTRY_SUM2(n, x) ENTRY_SUM ((n), (x)) ENTRY_SUM ((n), (x)+1) |
| #define ENTRY_SUM4(n, x) ENTRY_SUM2 ((n), (x)) ENTRY_SUM2 ((n), (x)+2) |
| #define ENTRY_SUM8(n, x) ENTRY_SUM4 ((n), (x)) ENTRY_SUM4 ((n), (x)+4) |
| #define ENTRY_SUM16(n, x) ENTRY_SUM8 ((n), (x)) ENTRY_SUM8 ((n), (x)+8) |
| #define ENTRY_SUM32(n, x) ENTRY_SUM16 ((n), (x)) ENTRY_SUM16 ((n), (x)+16) |
| #define ENTRY_SUM64(n, x) ENTRY_SUM32 ((n), (x)) ENTRY_SUM32 ((n), (x)+32) |
| #define ENTRY_SUM128(n, x) ENTRY_SUM64 ((n), (x)) ENTRY_SUM64 ((n), (x)+64) |
| |
| #define CASE_ENTRY(n) \ |
| case n: \ |
| sum = sum / (n + 1); \ |
| sum = restore (sum, n + 1); \ |
| if (sum == (n + addend)) \ |
| break;\ |
| ENTRY_SUM128 ((n), 2) \ |
| ENTRY_SUM16 ((n), 130) \ |
| break; |
| |
| #define CASE_ENTRY2(n) CASE_ENTRY ((n)) CASE_ENTRY ((n)+1) |
| #define CASE_ENTRY4(n) CASE_ENTRY2 ((n)) CASE_ENTRY2 ((n)+2) |
| #define CASE_ENTRY8(n) CASE_ENTRY4 ((n)) CASE_ENTRY4 ((n)+4) |
| #define CASE_ENTRY16(n) CASE_ENTRY8 ((n)) CASE_ENTRY8 ((n)+8) |
| #define CASE_ENTRY32(n) CASE_ENTRY16 ((n)) CASE_ENTRY16 ((n)+16) |
| #define CASE_ENTRY64(n) CASE_ENTRY32 ((n)) CASE_ENTRY32 ((n)+32) |
| #define CASE_ENTRY128(n) CASE_ENTRY64 ((n)) CASE_ENTRY64 ((n)+64) |
| |
| __attribute__((noinline, noclone)) long long |
| test_and_branch (int selector, int addend, int cond) |
| { |
| long long sum = selector + 1; |
| |
| if (selector > 200) |
| { |
| start0: |
| return sum - 1; |
| start3: |
| return sum - 2; |
| } |
| else |
| { |
| switch (selector) |
| { |
| start1: |
| start2: |
| CASE_ENTRY128 (1) |
| CASE_ENTRY64 (129) |
| CASE_ENTRY16 (193) |
| } |
| |
| do_nothing ((int *)&sum); |
| |
| if (cond == 0) |
| goto start0; |
| else if (cond < 0) |
| goto start1; |
| else if ((cond & 0x010) != 0) |
| goto start2; |
| else if (cond >= 14) |
| goto start3; |
| |
| } |
| |
| return -1; |
| } |
| |
| /* { dg-final { scan-assembler "Lbcond" } } */ |
| /* { dg-final { scan-assembler "Lcb" } } */ |
| /* { dg-final { scan-assembler "Ltb" } } */ |