aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-07-31 07:53:11 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-07-31 07:53:11 +0000
commitce52e0ffb4f1ea7bd4fb99aea5dda75d260e438f (patch)
treefa5e90e2b49ba23ce8378101ebe58e0816ce0334 /gcc/tree-vrp.c
parentc3ac76aa4078e84d8ca0daf6dab7bc9738f3aa33 (diff)
downloadgcc-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.c30
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