https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121370
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
it's SCEV I believe:
(set_scalar_evolution
instantiated_below = 2
(scalar = e_8)
(scalar_evolution = {2147483647, +, 2147483647(OVF)}_1))
SCEV happily combines the -2147483647 and -2 increment. Further:
set_scalar_evolution
instantiated_below = 2
(scalar = _3)
(scalar_evolution = {-2147483647, +, -2147483647(OVF)}_1))
and from there niter analysis based on UB of integer overflow "breaks".
I think the evolution is simply not affine? e_8 goes
2147483647, -2 - but there's no increment value in type int that goes
from 2147483647 to -2 without integer overflow.
A "hack" might be to turn all chrecs with (OVF) into chrec_dont_know.
The following fixes the PR, but it might be better done somewhere
beyond analyze_scalar_evolution and apply this to the full CHREC
(or only CHREC_RIGHTs?). That said, we know SCEV is full of those
issues and this will only detect the cases for constants, not those
when building the CHREC is invalid re-association (we've backed out
a wider fix due to optimization fallout).
diff --git a/gcc/tree-chrec.cc b/gcc/tree-chrec.cc
index a7c2f8de0d5..23dbe1b97ec 100644
--- a/gcc/tree-chrec.cc
+++ b/gcc/tree-chrec.cc
@@ -361,9 +361,15 @@ chrec_fold_plus_1 (enum tree_code code, tree type,
return fold_build_pointer_plus (fold_convert (type, op0),
op1);
else
- return fold_build2 (code, type,
- fold_convert (type, op0),
- fold_convert (type, op1));
+ {
+ tree res = fold_build2 (code, type,
+ fold_convert (type, op0),
+ fold_convert (type, op1));
+ if (TREE_CODE (res) == INTEGER_CST
+ && TREE_OVERFLOW (res))
+ return chrec_dont_know;
+ return res;
+ }
}
else
return chrec_dont_know;