]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/112344 - relax final value-replacement fix
authorRichard Biener <rguenther@suse.de>
Thu, 23 Nov 2023 08:49:59 +0000 (09:49 +0100)
committerRichard Biener <rguenther@suse.de>
Fri, 24 Nov 2023 07:49:59 +0000 (08:49 +0100)
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.

gcc/tree-chrec.cc

index f4ba130ba20037d89cd94b2bb845eaaa00545654..e2864e8d131057ce91071b5d4cce370f3f139ce2 100644 (file)
@@ -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