[patch] for PR 22509
Zdenek Dvorak
rakdver@atrey.karlin.mff.cuni.cz
Fri Nov 4 10:03:00 GMT 2005
Hello,
this PR is caused by the fact that local_alloc may create invalid
REG_EQUIV notes (that are later used by greg for rematerialization).
In particular, if there is a code like
reg = something;
call (); {pure but not const}
memory = reg;
it will add REG_EQUIV(memory) note on the reg assignment. Greg later
turns it into
memory = something;
call ();
which is wrong in case call reads the memory. This patch adds the
missing check to memref_used_between_p (the reason this problem does
not appear more often is that if the function is not pure, lreg will
note earlier that the memory may be modified by it).
Bootstrapped & regtested on i686 and x86_64.
Zdenek
PR rtl-optimization/22509
* local-alloc.c (memref_used_between_p): Check whether a function call
could not reference the memref.
Index: local-alloc.c
===================================================================
*** local-alloc.c (revision 106319)
--- local-alloc.c (working copy)
*************** memref_used_between_p (rtx memref, rtx s
*** 762,769 ****
for (insn = NEXT_INSN (start); insn != NEXT_INSN (end);
insn = NEXT_INSN (insn))
! if (INSN_P (insn) && memref_referenced_p (memref, PATTERN (insn)))
! return 1;
return 0;
}
--- 762,780 ----
for (insn = NEXT_INSN (start); insn != NEXT_INSN (end);
insn = NEXT_INSN (insn))
! {
! if (!INSN_P (insn))
! continue;
!
! if (memref_referenced_p (memref, PATTERN (insn)))
! return 1;
!
! /* Nonconst functions may access memory. */
! if (CALL_P (insn)
! && (! CONST_OR_PURE_CALL_P (insn)
! || pure_call_p (insn)))
! return 1;
! }
return 0;
}
More information about the Gcc-patches
mailing list