aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2023-11-23 09:49:59 +0100
committerRichard Biener <rguenther@suse.de>2023-11-24 08:49:59 +0100
commita7d82b45edeed99a850595eee0e59d16c4df7aff (patch)
tree7a8a8d1e8e597bc77cd8867ca52bfd139cf5f067
parentd83013b88b74d1f1f774d94ca950d3b6dba26e5d (diff)
downloadgcc-a7d82b45edeed99a850595eee0e59d16c4df7aff.zip
gcc-a7d82b45edeed99a850595eee0e59d16c4df7aff.tar.gz
gcc-a7d82b45edeed99a850595eee0e59d16c4df7aff.tar.bz2
tree-optimization/112344 - relax final value-replacement fix
The following tries to reduce the number of cases we use an unsigned type for the addition when we know the original signed increment was OK which is when the total unsigned increment computed fits the signed type as well. This fixes the observed testsuite fallout. PR tree-optimization/112344 * tree-chrec.cc (chrec_apply): Only use an unsigned add when the overall increment doesn't fit the signed type.
-rw-r--r--gcc/tree-chrec.cc18
1 files changed, 15 insertions, 3 deletions
diff --git a/gcc/tree-chrec.cc b/gcc/tree-chrec.cc
index f4ba130..e2864e8 100644
--- a/gcc/tree-chrec.cc
+++ b/gcc/tree-chrec.cc
@@ -646,9 +646,21 @@ chrec_apply (unsigned var,
res = chrec_fold_multiply (utype,
chrec_convert (utype, chrecr, NULL),
res);
- res = chrec_fold_plus (utype,
- chrec_convert (utype, chrecl, NULL), res);
- res = chrec_convert (type, res, NULL);
+ /* When the resulting increment fits the original type
+ do the increment in it. */
+ if (TREE_CODE (res) == INTEGER_CST
+ && int_fits_type_p (res, TREE_TYPE (chrecr)))
+ {
+ res = chrec_convert (TREE_TYPE (chrecr), res, NULL);
+ res = chrec_fold_plus (type, chrecl, res);
+ }
+ else
+ {
+ res = chrec_fold_plus (utype,
+ chrec_convert (utype, chrecl, NULL),
+ res);
+ res = chrec_convert (type, res, NULL);
+ }
}
}
else if (TREE_CODE (x) == INTEGER_CST