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. */