| -- { dg-do run } |
| -- { dg-options "-fharden-control-flow-redundancy -fno-hardcfr-check-exceptions -fdump-tree-hardcfr --param=hardcfr-max-blocks=22 --param=hardcfr-max-inline-blocks=12 -O0" } |
| |
| procedure HardCFR is |
| function F (I, J : Integer) return Integer is |
| begin |
| if (I < J) then |
| return 2 * I; |
| else |
| return 3 * J; |
| end if; |
| end F; |
| |
| function G (I : Natural; J : Integer) return Integer is |
| begin |
| case I is |
| when 0 => |
| return J * 2; |
| |
| when 1 => |
| return J * 3; |
| |
| when 2 => |
| return J * 5; |
| |
| when others => |
| return J * 7; |
| end case; |
| end G; |
| |
| function H (I : Natural; -- { dg-warning "has more than 22 blocks, the requested maximum" } |
| J : Integer) |
| return Integer is |
| begin |
| case I is |
| when 0 => |
| return J * 2; |
| |
| when 1 => |
| return J * 3; |
| |
| when 2 => |
| return J * 5; |
| |
| when 3 => |
| return J * 7; |
| |
| when 4 => |
| return J * 11; |
| |
| when 5 => |
| return J * 13; |
| |
| when 6 => |
| return J * 17; |
| |
| when 7 => |
| return J * 19; |
| |
| when others => |
| return J * 23; |
| end case; |
| end H; |
| begin |
| if (F (1, 2) /= 2 or else F (3, 2) /= 6 |
| or else G (2, 5) /= 25 or else H (4, 3) /= 33) |
| then |
| raise Program_Error; |
| end if; |
| end HardCFR; |
| |
| -- HardCFR and HardCFR.F: |
| -- { dg-final { scan-tree-dump-times ".builtin_trap" 2 "hardcfr" } } |
| |
| -- This is __builtin___hardcfr_check in HardCFR.G: |
| -- { dg-final { scan-tree-dump-times ".builtin " 1 "hardcfr" } } |