From a22265a4f9303a025c5291037d74f167a7b2590d Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Thu, 4 Nov 2010 07:15:33 -0600 Subject: [PATCH] ira.c (validate_equiv_mem): Remove code to avoid invalidation of readonly memory equivalances for... * ira.c (validate_equiv_mem): Remove code to avoid invalidation of readonly memory equivalances for const/pure calls. From-SVN: r166309 --- gcc/ChangeLog | 5 +++++ gcc/ira.c | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a2e1cc88391..c5fe9b290bd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-11-04 Jeff Law + + * ira.c (validate_equiv_mem): Remove code to avoid invalidation + of readonly memory equivalances for const/pure calls. + 2010-11-04 Richard Guenther PR tree-optimization/45733 diff --git a/gcc/ira.c b/gcc/ira.c index e84230e1c3e..d37247f55b1 100644 --- 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);