re PR tree-optimization/88964 (ICE in wide_int_to_tree_1, at tree.c:1561)
authorJakub Jelinek <jakub@redhat.com>
Wed, 23 Jan 2019 08:35:38 +0000 (09:35 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 23 Jan 2019 08:35:38 +0000 (09:35 +0100)
PR tree-optimization/88964
* gimple-loop-interchange.cc (loop_cand::analyze_induction_var): Use
build_zero_cst instead of build_int_cst.  Return false for loop
invariants which honor signed zeros.

* gfortran.dg/pr88964.f90: New test.

From-SVN: r268179

gcc/ChangeLog
gcc/gimple-loop-interchange.cc
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr88964.f90 [new file with mode: 0644]

index 015b36f..4a83a8a 100644 (file)
@@ -1,3 +1,10 @@
+2019-01-23  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/88964
+       * gimple-loop-interchange.cc (loop_cand::analyze_induction_var): Use
+       build_zero_cst instead of build_int_cst.  Return false for loop
+       invariants which honor signed zeros.
+
 2019-01-22  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * doc/invoke.texi (-fsplit-paths): This is enabled by default at -O3.
index bb01a9b..1f0e49d 100644 (file)
@@ -688,11 +688,16 @@ loop_cand::analyze_induction_var (tree var, tree chrec)
   /* Var is loop invariant, though it's unlikely to happen.  */
   if (tree_does_not_contain_chrecs (chrec))
     {
+      /* Punt on floating point invariants if honoring signed zeros,
+        representing that as + 0.0 would change the result if init
+        is -0.0.  */
+      if (HONOR_SIGNED_ZEROS (chrec))
+       return false;
       struct induction *iv = XCNEW (struct induction);
       iv->var = var;
       iv->init_val = init;
       iv->init_expr = chrec;
-      iv->step = build_int_cst (TREE_TYPE (chrec), 0);
+      iv->step = build_zero_cst (TREE_TYPE (chrec));
       m_inductions.safe_push (iv);
       return true;
     }
index 3361da8..164c9bc 100644 (file)
@@ -1,3 +1,8 @@
+2019-01-23  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/88964
+       * gfortran.dg/pr88964.f90: New test.
+
 2019-01-22  Martin Sebor  <msebor@redhat.com>
 
        * c-c++-common/Warray-bounds-2.c: Include headers only if they exist.
diff --git a/gcc/testsuite/gfortran.dg/pr88964.f90 b/gcc/testsuite/gfortran.dg/pr88964.f90
new file mode 100644 (file)
index 0000000..f3a8064
--- /dev/null
@@ -0,0 +1,57 @@
+! PR tree-optimization/88964
+! { dg-do compile }
+! { dg-options "-O3 -fno-tree-forwprop --param sccvn-max-alias-queries-per-access=1" }
+
+MODULE pr88964
+  INTEGER, PARAMETER :: dp=8
+  REAL(KIND=dp) :: p, q, o
+CONTAINS
+  SUBROUTINE foo(a,b,c,f,h)
+    IMPLICIT NONE
+    INTEGER :: a, b, c
+    REAL(KIND=dp) :: f(b*c), h(a*c)
+    CALL bar(h)
+    CALL baz(f)
+    CALL qux(h)
+  END SUBROUTINE foo
+  SUBROUTINE bar(h)
+    IMPLICIT NONE
+    REAL(KIND=dp) :: h(1*1)
+    INTEGER :: r, s, t, u
+    DO u = 1,3
+      DO t = 1,1
+        DO s = 1,3
+          DO r = 1,1
+            h((t-1)*1+r) = h((t-1)*1+r)-p*o
+          END DO
+        END DO
+      END DO
+    END DO
+  END SUBROUTINE bar
+  SUBROUTINE baz(f)
+    IMPLICIT NONE
+    REAL(KIND=dp) :: f(3*1)
+    INTEGER :: s, t, u
+    DO u = 1,4
+      DO t = 1,1
+        DO s = 1,3
+          f((t-1)*3+s) = f((t-1)*3+s) - q
+        END DO
+      END DO
+    END DO
+  END SUBROUTINE baz
+  SUBROUTINE qux(h)
+    IMPLICIT NONE
+    REAL(KIND=dp) :: h(1*1)
+    INTEGER :: r, s, t, u
+    DO u = 1,5
+      DO t = 1,1
+        DO s = 1,3
+          DO r = 1,1
+            h((t-1)*1+r) = h((t-1)*1+r)-p*o
+          END DO
+        END DO
+      END DO
+    END DO
+  END SUBROUTINE qux
+END MODULE pr88964