From 00ce82e32acdca19491df20f37a3f424a92ca3ee Mon Sep 17 00:00:00 2001 From: bonzini Date: Tue, 20 Dec 2005 17:06:14 +0000 Subject: 2005-12-20 Roger Sayle Paolo Bonzini PR rtl-optimization/25115 * gcse.c (pre_insert_copy_insn): Fall back to the sole SET in the insn if there is no SET for an expression that is equivalent to EXPR. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@108855 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 ++++++++ gcc/gcse.c | 22 +++++++++++++++++----- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3c7451058f2..300c0f748bf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2005-12-20 Roger Sayle + Paolo Bonzini + + PR rtl-optimization/25115 + * gcse.c (pre_insert_copy_insn): Fall back to the sole + SET in the insn if there is no SET for an + expression that is equivalent to EXPR. + 2005-12-20 Richard Guenther PR middle-end/24306 diff --git a/gcc/gcse.c b/gcc/gcse.c index df6e48436a1..8e4dbecb672 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -4219,7 +4219,7 @@ pre_insert_copy_insn (struct expr *expr, rtx insn) int regno = REGNO (reg); int indx = expr->bitmap_index; rtx pat = PATTERN (insn); - rtx set, new_insn; + rtx set, first_set, new_insn; rtx old_reg; int i; @@ -4233,17 +4233,29 @@ pre_insert_copy_insn (struct expr *expr, rtx insn) case PARALLEL: /* Search through the parallel looking for the set whose source was the expression that we're interested in. */ + first_set = NULL_RTX; set = NULL_RTX; for (i = 0; i < XVECLEN (pat, 0); i++) { rtx x = XVECEXP (pat, 0, i); - if (GET_CODE (x) == SET - && expr_equiv_p (SET_SRC (x), expr->expr)) + if (GET_CODE (x) == SET) { - set = x; - break; + /* If the source was a REG_EQUAL or REG_EQUIV note, we + may not find an equivalent expression, but in this + case the PARALLEL will have a single set. */ + if (first_set == NULL_RTX) + first_set = x; + if (expr_equiv_p (SET_SRC (x), expr->expr)) + { + set = x; + break; + } } } + + gcc_assert (first_set); + if (set == NULL_RTX) + set = first_set; break; default: -- cgit v1.2.1