re PR tree-optimization/87665 (gcc HEAD (svn: 265340) breaks elements on resize)

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

	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.

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

From-SVN: r265481
This commit is contained in:
Richard Biener 2018-10-25 08:59:07 +00:00 committed by Richard Biener
parent 86f36311bc
commit 7852940e7b
4 changed files with 53 additions and 32 deletions

View File

@ -1,3 +1,10 @@
2018-10-25 Richard Biener <rguenther@suse.de>
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 <sam.tebbs@arm.com>
* options.texi (Deprecated): Move list to Var section.

View File

@ -1,3 +1,9 @@
2018-10-25 Richard Biener <rguenther@suse.de>
PR tree-optimization/87665
PR tree-optimization/87745
* gfortran.dg/20181025-1.f: New testcase.
2018-10-25 Jakub Jelinek <jakub@redhat.com>
PR fortran/87725

View File

@ -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

View File

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