From 878315ae489ebf92e97470d7019da91f1c57436d Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Wed, 21 Oct 2020 09:33:06 +0200 Subject: [PATCH] Adjust overflow for invariants in bounds_of_var_in_loop. Invariants returned from SCEV can have TREE_OVERFLOW set. Clear the overflow as we do with the rest of the values returned from this function. gcc/ChangeLog: * gimple-range.cc (gimple_ranger::range_of_ssa_name_with_loop_info): Remove TREE_OVERFLOW special case. * vr-values.c (bounds_of_var_in_loop): Adjust overflow for invariants. --- gcc/gimple-range.cc | 4 ++-- gcc/vr-values.c | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc index b790d62d75f..c5520e0700b 100644 --- a/gcc/gimple-range.cc +++ b/gcc/gimple-range.cc @@ -1156,9 +1156,9 @@ gimple_ranger::range_of_ssa_name_with_loop_info (irange &r, tree name, // ?? We could do better here. Since MIN/MAX can only be an // SSA, SSA +- INTEGER_CST, or INTEGER_CST, we could easily call // the ranger and solve anything not an integer. - if (TREE_CODE (min) != INTEGER_CST || TREE_OVERFLOW (min)) + if (TREE_CODE (min) != INTEGER_CST) min = vrp_val_min (type); - if (TREE_CODE (max) != INTEGER_CST || TREE_OVERFLOW (max)) + if (TREE_CODE (max) != INTEGER_CST) max = vrp_val_max (type); r.set (min, max); } diff --git a/gcc/vr-values.c b/gcc/vr-values.c index cc0ddca2bd3..7a0e70eab64 100644 --- a/gcc/vr-values.c +++ b/gcc/vr-values.c @@ -1844,7 +1844,7 @@ bounds_of_var_in_loop (tree *min, tree *max, range_query *query, if (is_gimple_min_invariant (chrec)) { *min = *max = chrec; - return true; + goto fix_overflow; } if (TREE_CODE (chrec) != POLYNOMIAL_CHREC) @@ -1964,6 +1964,7 @@ bounds_of_var_in_loop (tree *min, tree *max, range_query *query, else *min = init; + fix_overflow: /* Even for valid range info, sometimes overflow flag will leak in. As GIMPLE IL should have no constants with TREE_OVERFLOW set, we drop them. */ -- 2.30.2