diff options
author | Richard Biener <rguenther@suse.de> | 2019-07-31 07:53:11 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-07-31 07:53:11 +0000 |
commit | ce52e0ffb4f1ea7bd4fb99aea5dda75d260e438f (patch) | |
tree | fa5e90e2b49ba23ce8378101ebe58e0816ce0334 /gcc/tree-vrp.c | |
parent | c3ac76aa4078e84d8ca0daf6dab7bc9738f3aa33 (diff) | |
download | gcc-ce52e0ffb4f1ea7bd4fb99aea5dda75d260e438f.zip gcc-ce52e0ffb4f1ea7bd4fb99aea5dda75d260e438f.tar.gz gcc-ce52e0ffb4f1ea7bd4fb99aea5dda75d260e438f.tar.bz2 |
re PR tree-optimization/91257 (Compile-time and memory-hog hog)
2019-07-31 Richard Biener <rguenther@suse.de>
PR tree-optimization/91257
* tree-vrp.c (union_ranges): Unify equality and less tests
by using compare_values. Re-order cheap tests first.
From-SVN: r273923
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 1b20489..e285068 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -5420,8 +5420,10 @@ union_ranges (enum value_range_kind *vr0type, enum value_range_kind vr1type, tree vr1min, tree vr1max) { - bool mineq = vrp_operand_equal_p (*vr0min, vr1min); - bool maxeq = vrp_operand_equal_p (*vr0max, vr1max); + int cmpmin = compare_values (*vr0min, vr1min); + int cmpmax = compare_values (*vr0max, vr1max); + bool mineq = cmpmin == 0; + bool maxeq = cmpmax == 0; /* [] is vr0, () is vr1 in the following classification comments. */ if (mineq && maxeq) @@ -5521,8 +5523,8 @@ union_ranges (enum value_range_kind *vr0type, else gcc_unreachable (); } - else if ((maxeq || operand_less_p (vr1max, *vr0max) == 1) - && (mineq || operand_less_p (*vr0min, vr1min) == 1)) + else if ((maxeq || cmpmax == 1) + && (mineq || cmpmin == -1)) { /* [ ( ) ] or [( ) ] or [ ( )] */ if (*vr0type == VR_RANGE @@ -5555,8 +5557,8 @@ union_ranges (enum value_range_kind *vr0type, else gcc_unreachable (); } - else if ((maxeq || operand_less_p (*vr0max, vr1max) == 1) - && (mineq || operand_less_p (vr1min, *vr0min) == 1)) + else if ((maxeq || cmpmax == -1) + && (mineq || cmpmin == 1)) { /* ( [ ] ) or ([ ] ) or ( [ ]) */ if (*vr0type == VR_RANGE @@ -5595,10 +5597,10 @@ union_ranges (enum value_range_kind *vr0type, else gcc_unreachable (); } - else if ((operand_less_p (vr1min, *vr0max) == 1 - || operand_equal_p (vr1min, *vr0max, 0)) - && operand_less_p (*vr0min, vr1min) == 1 - && operand_less_p (*vr0max, vr1max) == 1) + else if (cmpmin == -1 + && cmpmax == -1 + && (operand_less_p (vr1min, *vr0max) == 1 + || operand_equal_p (vr1min, *vr0max, 0))) { /* [ ( ] ) or [ ]( ) */ if (*vr0type == VR_RANGE @@ -5632,10 +5634,10 @@ union_ranges (enum value_range_kind *vr0type, else gcc_unreachable (); } - else if ((operand_less_p (*vr0min, vr1max) == 1 - || operand_equal_p (*vr0min, vr1max, 0)) - && operand_less_p (vr1min, *vr0min) == 1 - && operand_less_p (vr1max, *vr0max) == 1) + else if (cmpmin == 1 + && cmpmax == 1 + && (operand_less_p (*vr0min, vr1max) == 1 + || operand_equal_p (*vr0min, vr1max, 0))) { /* ( [ ) ] or ( )[ ] */ if (*vr0type == VR_RANGE |