diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr98513.c | 47 | ||||
-rw-r--r-- | gcc/value-range.cc | 6 |
2 files changed, 51 insertions, 2 deletions
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr98513.c b/gcc/testsuite/gcc.dg/tree-ssa/pr98513.c new file mode 100644 index 0000000..c15d6bd --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr98513.c @@ -0,0 +1,47 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fgimple" } */ + +__attribute__((noipa)) +void __GIMPLE (ssa,startwith("evrp")) +foo (int x, int minus_1) +{ + int tem; + unsigned int _1; + unsigned int _2; + + __BB(2): + tem_4 = minus_1_3(D); + tem_5 = tem_4 + 2; + _1 = (unsigned int) x_6(D); + _2 = _1 + 2147483647u; + if (_2 > 1u) + goto __BB3; + else + goto __BB6; + + __BB(3): + if (x_6(D) <= tem_5) + goto __BB4; + else + goto __BB6; + + __BB(4): + if (x_6(D) > 5) + goto __BB5; + else + goto __BB6; + + __BB(5): + __builtin_exit (0); + + __BB(6): + return; + +} + +int +main() +{ + foo (10, 100); + __builtin_abort (); +} diff --git a/gcc/value-range.cc b/gcc/value-range.cc index c404787..9c42f82 100644 --- a/gcc/value-range.cc +++ b/gcc/value-range.cc @@ -974,7 +974,8 @@ intersect_ranges (enum value_range_kind *vr0type, } else if ((operand_less_p (vr1min, *vr0max) == 1 || operand_equal_p (vr1min, *vr0max, 0)) - && operand_less_p (*vr0min, vr1min) == 1) + && operand_less_p (*vr0min, vr1min) == 1 + && operand_less_p (*vr0max, vr1max) == 1) { /* [ ( ] ) or [ ]( ) */ if (*vr0type == VR_ANTI_RANGE @@ -1008,7 +1009,8 @@ intersect_ranges (enum value_range_kind *vr0type, } else if ((operand_less_p (*vr0min, vr1max) == 1 || operand_equal_p (*vr0min, vr1max, 0)) - && operand_less_p (vr1min, *vr0min) == 1) + && operand_less_p (vr1min, *vr0min) == 1 + && operand_less_p (vr1max, *vr0max) == 1) { /* ( [ ) ] or ( )[ ] */ if (*vr0type == VR_ANTI_RANGE |