aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/range-op.cc8
1 files changed, 5 insertions, 3 deletions
diff --git a/gcc/range-op.cc b/gcc/range-op.cc
index 1af42eb..a4f6e9e 100644
--- a/gcc/range-op.cc
+++ b/gcc/range-op.cc
@@ -209,10 +209,12 @@ range_operator::fold_range (irange &r, tree type,
unsigned num_rh = rh.num_pairs ();
// If both ranges are single pairs, fold directly into the result range.
- if (num_lh == 1 && num_rh == 1)
+ // If the number of subranges grows too high, produce a summary result as the
+ // loop becomes exponential with little benefit. See PR 103821.
+ if ((num_lh == 1 && num_rh == 1) || num_lh * num_rh > 12)
{
- wi_fold_in_parts (r, type, lh.lower_bound (0), lh.upper_bound (0),
- rh.lower_bound (0), rh.upper_bound (0));
+ wi_fold_in_parts (r, type, lh.lower_bound (), lh.upper_bound (),
+ rh.lower_bound (), rh.upper_bound ());
op1_op2_relation_effect (r, type, lh, rh, rel);
return true;
}