OSDN Git Service

* ira.c (validate_equiv_mem): Remove code to avoid invalidation
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 Nov 2010 13:15:33 +0000 (13:15 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 Nov 2010 13:15:33 +0000 (13:15 +0000)
of readonly memory equivalances for const/pure calls.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166309 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ira.c

index a2e1cc8..c5fe9b2 100644 (file)
@@ -1,3 +1,8 @@
+2010-11-04  Jeff Law  <law@redhat.com>
+
+       * ira.c (validate_equiv_mem): Remove code to avoid invalidation
+       of readonly memory equivalances for const/pure calls.
+
 2010-11-04  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/45733
index e84230e..d37247f 100644 (file)
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -1915,8 +1915,12 @@ validate_equiv_mem (rtx start, rtx reg, rtx memref)
       if (find_reg_note (insn, REG_DEAD, reg))
        return 1;
 
-      if (CALL_P (insn) && ! MEM_READONLY_P (memref)
-         && ! RTL_CONST_OR_PURE_CALL_P (insn))
+      /* This used to ignore readonly memory and const/pure calls.  The problem
+        is the equivalent form may reference a pseudo which gets assigned a
+        call clobbered hard reg.  When we later replace REG with its
+        equivalent form, the value in the call-clobbered reg has been
+        changed and all hell breaks loose.  */
+      if (CALL_P (insn))
        return 0;
 
       note_stores (PATTERN (insn), validate_equiv_mem_from_store, NULL);