The previous change exposed a miscompile when trying to interpret
CHREC_RIGHT correctly which in fact it already was to the extent
it is used.  The following reverts this part of the change, only
retaining the singling out of HOST_WIDE_INT_MIN.

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

2021-01-22  Richard Biener  <rguent...@suse.de>

        PR middle-end/98773
        * tree-data-ref.c (initalize_matrix_A): Revert previous
        change, retaining failing on HOST_WIDE_INT_MIN CHREC_RIGHT.

        * gcc.dg/torture/pr98773.c: New testcase.
---
 gcc/testsuite/gcc.dg/torture/pr98773.c | 19 +++++++++++++++++++
 gcc/tree-data-ref.c                    | 17 +++--------------
 2 files changed, 22 insertions(+), 14 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr98773.c

diff --git a/gcc/testsuite/gcc.dg/torture/pr98773.c 
b/gcc/testsuite/gcc.dg/torture/pr98773.c
new file mode 100644
index 00000000000..026e8efba5c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr98773.c
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+
+char a[128];
+
+void __attribute__((noipa))
+foo ()
+{
+  for (unsigned i = 27; i >= 5; --i)
+    a[i] = a[i-5];
+}
+
+int main()
+{
+  __builtin_memcpy (a, "Hello World", sizeof ("Hello World"));
+  foo ();
+  if (__builtin_memcmp (a + 5, "Hello World", sizeof ("Hello World")) != 0)
+    __builtin_abort ();
+  return 0;
+}
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
index d19c5eb51e4..124a7bea6a9 100644
--- a/gcc/tree-data-ref.c
+++ b/gcc/tree-data-ref.c
@@ -3924,21 +3924,10 @@ initialize_matrix_A (lambda_matrix A, tree chrec, 
unsigned index, int mult)
   switch (TREE_CODE (chrec))
     {
     case POLYNOMIAL_CHREC:
-      /* CHREC_RIGHT and its negated value should fit in a lambda_int.
-        Pointer typed chrecs right are to be interpreted signed.  */
       HOST_WIDE_INT chrec_right;
-      if (POINTER_TYPE_P (chrec_type (chrec)))
-       {
-         if (!cst_and_fits_in_hwi (CHREC_RIGHT (chrec)))
-           return chrec_dont_know;
-         chrec_right = int_cst_value (CHREC_RIGHT (chrec));
-       }
-      else
-       {
-         if (!tree_fits_shwi_p (CHREC_RIGHT (chrec)))
-           return chrec_dont_know;
-         chrec_right = tree_to_shwi (CHREC_RIGHT (chrec));
-       }
+      if (!cst_and_fits_in_hwi (CHREC_RIGHT (chrec)))
+       return chrec_dont_know;
+      chrec_right = int_cst_value (CHREC_RIGHT (chrec));
       /* We want to be able to negate without overflow.  */
       if (chrec_right == HOST_WIDE_INT_MIN)
        return chrec_dont_know;
-- 
2.26.2

Reply via email to