[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