re PR rtl-optimization/47614 (cpu2000 benchmark 301.apsi fails with revision 169782)

PR rtl-optimization/47614
	* rtl.h (check_for_inc_dec): Declare.
	* dse.c (check_for_inc_dec): Externalize...
	* postreload.c (reload_cse_simplify): ...use it before deleting stmt.
	(reload_cse_simplify_operands): Don't simplify opnds with side effects.

	* testsuite/gfortran.dg/pr47614.f: New.

From-SVN: r170059
This commit is contained in:
Pat Haugen 2011-02-11 20:52:55 +00:00 committed by Pat Haugen
parent f33d8408d0
commit 3f82421f9c
6 changed files with 58 additions and 1 deletions

View File

@ -1,3 +1,11 @@
2011-02-11 Pat Haugen <pthaugen@us.ibm.com>
PR rtl-optimization/47614
* rtl.h (check_for_inc_dec): Declare.
* dse.c (check_for_inc_dec): Externalize...
* postreload.c (reload_cse_simplify): ...use it before deleting stmt.
(reload_cse_simplify_operands): Don't simplify opnds with side effects.
2011-02-11 Joseph Myers <joseph@codesourcery.com>
PR driver/47678

View File

@ -830,7 +830,7 @@ emit_inc_dec_insn_before (rtx mem ATTRIBUTE_UNUSED,
/* Before we delete INSN, make sure that the auto inc/dec, if it is
there, is split into a separate insn. */
static void
void
check_for_inc_dec (rtx insn)
{
rtx note = find_reg_note (insn, REG_INC, NULL_RTX);

View File

@ -112,6 +112,7 @@ reload_cse_simplify (rtx insn, rtx testreg)
if (REG_P (value)
&& ! REG_FUNCTION_VALUE_P (value))
value = 0;
check_for_inc_dec (insn);
delete_insn_and_edges (insn);
return;
}
@ -163,6 +164,7 @@ reload_cse_simplify (rtx insn, rtx testreg)
if (i < 0)
{
check_for_inc_dec (insn);
delete_insn_and_edges (insn);
/* We're done with this insn. */
return;
@ -476,6 +478,8 @@ reload_cse_simplify_operands (rtx insn, rtx testreg)
continue;
}
#endif /* LOAD_EXTEND_OP */
if (side_effects_p (op))
continue;
v = cselib_lookup (op, recog_data.operand_mode[i], 0, VOIDmode);
if (! v)
continue;

View File

@ -2302,6 +2302,9 @@ extern int cse_main (rtx, int);
extern int exp_equiv_p (const_rtx, const_rtx, int, bool);
extern unsigned hash_rtx (const_rtx x, enum machine_mode, int *, int *, bool);
/* In dse.c */
extern void check_for_inc_dec (rtx insn);
/* In jump.c */
extern int comparison_dominates_p (enum rtx_code, enum rtx_code);
extern int condjump_p (const_rtx);

View File

@ -1,3 +1,8 @@
2011-02-11 Pat Haugen <pthaugen@us.ibm.com>
PR rtl-optimization/47614
* gfortran.dg/pr47614.f: New.
2011-02-11 Joseph Myers <joseph@codesourcery.com>
PR driver/47678

View File

@ -0,0 +1,37 @@
! { dg-do run { target { powerpc*-*-* } } }
! { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } }
! { dg-options "-O3 -funroll-loops -ffast-math -mcpu=power4" }
SUBROUTINE SFCPAR(ZET,NZ,ZMH,TSL,TMES)
IMPLICIT REAL*8 (A-H, O-Z)
REAL*8 ZET(*)
ZS=MAX(TSL*ZMH,ZET(2))
DO 10 K=2,NZ
KLEV=K-1
IF(ZS.LE.ZET(K)) GO TO 20
10 CONTINUE
20 CONTINUE
TMES=ZET(KLEV+1)
RETURN
END
program pr47614
real*8 ar1(10),d1,d2,d3
integer i
d1 = 2.0
d2 = 3.0
d3 = 3.0
do 50 i=1,10
ar1(i) = d1
d1 = d1 + 2.0
50 continue
call sfcpar(ar1,10,d2,d3,d1)
if (d1.ne.10.0) call abort()
end