aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2023-07-05 13:36:27 -0400
committerAndrew MacLeod <amacleod@redhat.com>2023-07-05 19:06:30 -0400
commitf0375705613675ab13cd211e93a1d620be8bf03f (patch)
tree67afcbe1b15128267173063f4ab23c52c6a82cfa
parent70d1e3f40f09102c6b12c58d97809552b1a08961 (diff)
downloadgcc-f0375705613675ab13cd211e93a1d620be8bf03f.zip
gcc-f0375705613675ab13cd211e93a1d620be8bf03f.tar.gz
gcc-f0375705613675ab13cd211e93a1d620be8bf03f.tar.bz2
Simplify compute_operand_range for op1 and op2 case.
Move the check for co-dependency between 2 operands into compute_operand_range, resulting in a much cleaner compute_operand1_and_operand2_range routine. * gimple-range-gori.cc (compute_operand_range): Check for operand interdependence when both op1 and op2 are computed. (compute_operand1_and_operand2_range): No checks required now.
-rw-r--r--gcc/gimple-range-gori.cc25
1 files changed, 11 insertions, 14 deletions
diff --git a/gcc/gimple-range-gori.cc b/gcc/gimple-range-gori.cc
index b0d13a8..5429c6e 100644
--- a/gcc/gimple-range-gori.cc
+++ b/gcc/gimple-range-gori.cc
@@ -650,6 +650,17 @@ gori_compute::compute_operand_range (vrange &r, gimple *stmt,
if (!op1_in_chain && !op2_in_chain)
return false;
+ // If either operand is in the def chain of the other (or they are equal), it
+ // will be evaluated twice and can result in an exponential time calculation.
+ // Instead just evaluate the one operand.
+ if (op1_in_chain && op2_in_chain)
+ {
+ if (in_chain_p (op1, op2) || op1 == op2)
+ op1_in_chain = false;
+ else if (in_chain_p (op2, op1))
+ op2_in_chain = false;
+ }
+
bool res = false;
// If the lhs doesn't tell us anything only a relation can possibly enhance
// the result.
@@ -1275,24 +1286,10 @@ gori_compute::compute_operand1_and_operand2_range (vrange &r,
{
Value_Range op_range (TREE_TYPE (name));
- // If op1 is in the def chain of op2, we'll do the work twice to evalaute
- // op1. This can result in an exponential time calculation.
- // Instead just evaluate op2, which will eventualy get to op1.
- if (in_chain_p (handler.operand1 (), handler.operand2 ()))
- return compute_operand2_range (r, handler, lhs, name, src, rel);
-
- // Likewise if op2 is in the def chain of op1.
- if (in_chain_p (handler.operand2 (), handler.operand1 ()))
- return compute_operand1_range (r, handler, lhs, name, src, rel);
-
// Calculate a good a range through op2.
if (!compute_operand2_range (r, handler, lhs, name, src, rel))
return false;
- // If op1 == op2 there is again no need to go further.
- if (handler.operand1 () == handler.operand2 ())
- return true;
-
// Now get the range thru op1.
if (!compute_operand1_range (op_range, handler, lhs, name, src, rel))
return false;