The following fixes an issue with my patch for PR87665 which runs into
get_later_stmt asserts in many SPEC CPU 2006 benchmarks.

The 8 branch doesn't assert here but the bug is latent there
(latent wrong-code), so I'll fix it there in a similar way as well.

Bootstrap & regtest running on x86_64-unknown-linux-gnu.

Richard.

2018-10-25  Richard Biener  <rguent...@suse.de>

        * tree-vectorizer.h (get_earlier_stmt): Remove.
        (get_later_stmt): Pick up UID from the original non-pattern stmt.

        * gfortran.dg/20181025-1.f: New testcase.

diff --git a/gcc/testsuite/gfortran.dg/20181025-1.f 
b/gcc/testsuite/gfortran.dg/20181025-1.f
new file mode 100644
index 00000000000..1acbd72616c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/20181025-1.f
@@ -0,0 +1,28 @@
+! { dg-do compile }
+! { dg-options "-Ofast" }
+! { dg-additional-options "-mavx2" { target { x86_64-*-* i?86-*-* } } }
+      SUBROUTINE FOO(EF3,CA,ZA,NATA,IC4,NFRGPT)
+      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
+      PARAMETER (MXATM=500)
+      COMMON DE(3,MXATM)
+      DIMENSION CA(3,NATA)
+      DIMENSION ZA(NATA)
+      DIMENSION EF3(3,NFRGPT)
+      DO II = 1,NATA
+         XII = XJ - CA(1,II)
+         YII = YJ - CA(2,II)
+         ZII = ZJ - CA(3,II)
+         RJII = SQRT(XII*XII + YII*YII + ZII*ZII)
+         R3 = RJII*RJII*RJII
+         IF (IC4.EQ.0) THEN
+            DE(1,II) = DE(1,II) - S2*ZA(II)*XII/R3
+            DE(2,II) = DE(2,II) - S2*ZA(II)*YII/R3
+            DE(3,II) = DE(3,II) - S2*ZA(II)*ZII/R3
+         ELSE 
+            EF3(1,IC4+II) = EF3(1,IC4+II) - S2*ZA(II)*XII/R3
+            EF3(2,IC4+II) = EF3(2,IC4+II) - S2*ZA(II)*YII/R3
+            EF3(3,IC4+II) = EF3(3,IC4+II) - S2*ZA(II)*ZII/R3
+         END IF
+      END DO
+      RETURN
+      END           
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index 548ffab4c20..1434eeaf270 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -1091,38 +1091,6 @@ nested_in_vect_loop_p (struct loop *loop, stmt_vec_info 
stmt_info)
          && (loop->inner == (gimple_bb (stmt_info->stmt))->loop_father));
 }
 
-/* Return the earlier statement between STMT1_INFO and STMT2_INFO.  */
-
-static inline stmt_vec_info
-get_earlier_stmt (stmt_vec_info stmt1_info, stmt_vec_info stmt2_info)
-{
-  gcc_checking_assert ((STMT_VINFO_IN_PATTERN_P (stmt1_info)
-                       || !STMT_VINFO_RELATED_STMT (stmt1_info))
-                      && (STMT_VINFO_IN_PATTERN_P (stmt2_info)
-                          || !STMT_VINFO_RELATED_STMT (stmt2_info)));
-
-  if (gimple_uid (stmt1_info->stmt) < gimple_uid (stmt2_info->stmt))
-    return stmt1_info;
-  else
-    return stmt2_info;
-}
-
-/* Return the later statement between STMT1_INFO and STMT2_INFO.  */
-
-static inline stmt_vec_info
-get_later_stmt (stmt_vec_info stmt1_info, stmt_vec_info stmt2_info)
-{
-  gcc_checking_assert ((STMT_VINFO_IN_PATTERN_P (stmt1_info)
-                       || !STMT_VINFO_RELATED_STMT (stmt1_info))
-                      && (STMT_VINFO_IN_PATTERN_P (stmt2_info)
-                          || !STMT_VINFO_RELATED_STMT (stmt2_info)));
-
-  if (gimple_uid (stmt1_info->stmt) > gimple_uid (stmt2_info->stmt))
-    return stmt1_info;
-  else
-    return stmt2_info;
-}
-
 /* Return TRUE if a statement represented by STMT_INFO is a part of a
    pattern.  */
 
@@ -1143,6 +1111,18 @@ vect_orig_stmt (stmt_vec_info stmt_info)
   return stmt_info;
 }
 
+/* Return the later statement between STMT1_INFO and STMT2_INFO.  */
+
+static inline stmt_vec_info
+get_later_stmt (stmt_vec_info stmt1_info, stmt_vec_info stmt2_info)
+{
+  if (gimple_uid (vect_orig_stmt (stmt1_info)->stmt)
+      > gimple_uid (vect_orig_stmt (stmt2_info)->stmt))
+    return stmt1_info;
+  else
+    return stmt2_info;
+}
+
 /* If STMT_INFO has been replaced by a pattern statement, return the
    replacement statement, otherwise return STMT_INFO itself.  */
 

Reply via email to