tree-optimization/112344 - relax final value-replacement fix

Message ID 20231124070128.0F706132E2@imap2.dmz-prg2.suse.org
State Unresolved
Headers
Series tree-optimization/112344 - relax final value-replacement fix |

Checks

Context Check Description
snail/gcc-patch-check warning Git am fail log

Commit Message

Richard Biener Nov. 24, 2023, 7:01 a.m. UTC
  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.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

	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 | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)
  

Patch

diff --git a/gcc/tree-chrec.cc b/gcc/tree-chrec.cc
index f4ba130ba20..e2864e8d131 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