diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fadba61c1df..ea92a4286cc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-10-25 Richard Biener + + PR tree-optimization/87665 + PR tree-optimization/87745 + * tree-vectorizer.h (get_earlier_stmt): Remove. + (get_later_stmt): Pick up UID from the original non-pattern stmt. + 2018-10-25 Sam Tebbs * options.texi (Deprecated): Move list to Var section. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 94496cd30a7..6a50e92905b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-10-25 Richard Biener + + PR tree-optimization/87665 + PR tree-optimization/87745 + * gfortran.dg/20181025-1.f: New testcase. + 2018-10-25 Jakub Jelinek PR fortran/87725 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 98845680831..08d696a2f7c 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -1085,38 +1085,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. */ @@ -1137,6 +1105,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. */