From 64068ca2f1fb0174ceb16e0f0f917da7afe82837 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Tue, 20 Dec 2005 17:06:14 +0000 Subject: [PATCH] re PR rtl-optimization/25115 (Segmentation fault in pre_insert_copy_insn) 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. Co-Authored-By: Paolo Bonzini From-SVN: r108855 --- 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: