re PR middle-end/46297 (gfortran.dg/g77/980701-0.f FAILs with -Os -fno-asynchronous-unwind-tables)

PR middle-end-optimization/46297
	* postreload.c (reload_combine_note_store): Deal with embedded
	side effects in MEM expressions.

	* gfortran.dg/pr46297.f: New test.

From-SVN: r166905
This commit is contained in:
Jeff Law 2010-11-18 07:34:29 -07:00 committed by Jeff Law
parent d96283a052
commit 12c2b0adb1
4 changed files with 61 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2010-11-18 Jeff Law <law@redhat.com>
PR middle-end-optimization/46297
* postreload.c (reload_combine_note_store): Deal with embedded
side effects in MEM expressions.
2010-11-18 Richard Guenther <rguenther@suse.de>
PR lto/45089

View File

@ -1409,6 +1409,31 @@ reload_combine_note_store (rtx dst, const_rtx set, void *data ATTRIBUTE_UNUSED)
GET_MODE (dst));
dst = SUBREG_REG (dst);
}
/* Some targets do argument pushes without adding REG_INC notes. */
if (MEM_P (dst))
{
dst = XEXP (dst, 0);
if (GET_CODE (dst) == PRE_INC || GET_CODE (dst) == POST_INC
|| GET_CODE (dst) == PRE_DEC || GET_CODE (dst) == POST_DEC)
{
regno = REGNO (XEXP (dst, 0));
mode = GET_MODE (XEXP (dst, 0));
for (i = hard_regno_nregs[regno][mode] - 1 + regno; i >= regno; i--)
{
/* We could probably do better, but for now mark the register
as used in an unknown fashion and set/clobbered at this
insn. */
reg_state[i].use_index = -1;
reg_state[i].store_ruid = reload_combine_ruid;
reg_state[i].real_store_ruid = reload_combine_ruid;
}
}
else
return;
}
if (!REG_P (dst))
return;
regno += REGNO (dst);

View File

@ -1,3 +1,8 @@
2010-11-18 Jeff Law <law@redhat.com>
PR middle-end-optimization/46297
* gfortran.dg/pr46297.f: New test.
2010-11-17 Steve Ellcey <sje@cup.hp.com>
PR middle-end/31490

View File

@ -0,0 +1,25 @@
! { dg-options "-Os -fno-asynchronous-unwind-tables" }
! { dg-do run }
real r1(5), r2(5), r3(5)
real s1(2), s2(2), s3(2)
double precision d1, d2, d3
equivalence (r3, s3(2))
equivalence (d3, r3(2))
s1(1) = 1.
s3(1) = 3.
r3(1) = 3.
d3 = 30.
i3 = 3
call x (s1, r1, d1, i1, s2, r2, d2, i2, s3, r3, d3, i3)
end
subroutine x (s1, r1, d1, i1, s2, r2, d2, i2, s3, r3, d3, i3)
real r1(5), r2(5), r3(5)
real s1(2), s2(2), s3(2)
double precision d1, d2, d3
if (s1(1) .ne. 1.) call abort
if (s3(1) .ne. 3.) call abort
if (r3(1) .ne. 3.) call abort
if (d3 .ne. 30.) call abort
if (i3 .ne. 3) call abort
end