From: Richard Biener Date: Thu, 23 Nov 2023 08:49:59 +0000 (+0100) Subject: tree-optimization/112344 - relax final value-replacement fix X-Git-Tag: basepoints/gcc-15~4326 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a7d82b45edeed99a850595eee0e59d16c4df7aff;p=thirdparty%2Fgcc.git 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. --- diff --git a/gcc/tree-chrec.cc b/gcc/tree-chrec.cc index f4ba130ba200..e2864e8d1310 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