summaryrefslogtreecommitdiff
path: root/gcc/emit-rtl.c
diff options
context:
space:
mode:
authorwehle <wehle@138bc75d-0d04-0410-961f-82ee72b054a4>2001-12-05 05:47:36 +0000
committerwehle <wehle@138bc75d-0d04-0410-961f-82ee72b054a4>2001-12-05 05:47:36 +0000
commit7e6224aba0b1981132291490d8069812ec0ff519 (patch)
treeab8e7d78c735260db81c354ad6ada82224f8c855 /gcc/emit-rtl.c
parent70494897e897cfe5a82d808523dfa643bf077e5b (diff)
downloadgcc-7e6224aba0b1981132291490d8069812ec0ff519.tar.gz
* emit-rtl.c (set_unique_reg_note): Don't set
a REG_EQUAL or REG_EQUIV note if multiple sets are present. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@47657 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/emit-rtl.c')
-rw-r--r--gcc/emit-rtl.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 3c2d8475598..6a30769cecb 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -4068,11 +4068,30 @@ set_unique_reg_note (insn, kind, datum)
{
rtx note = find_reg_note (insn, kind, NULL_RTX);
- /* Don't add ASM_OPERAND REG_EQUAL/REG_EQUIV notes.
- It serves no useful purpose and breaks eliminate_regs. */
- if ((kind == REG_EQUAL || kind == REG_EQUIV)
- && GET_CODE (datum) == ASM_OPERANDS)
- return NULL_RTX;
+ switch (kind)
+ {
+ case REG_EQUAL:
+ case REG_EQUIV:
+ /* Don't add REG_EQUAL/REG_EQUIV notes if the insn
+ has multiple sets (some callers assume single_set
+ means the insn only has one set, when in fact it
+ means the insn only has one * useful * set). */
+ if (GET_CODE (PATTERN (insn)) == PARALLEL && multiple_sets (insn))
+ {
+ if (note)
+ abort ();
+ return NULL_RTX;
+ }
+
+ /* Don't add ASM_OPERAND REG_EQUAL/REG_EQUIV notes.
+ It serves no useful purpose and breaks eliminate_regs. */
+ if (GET_CODE (datum) == ASM_OPERANDS)
+ return NULL_RTX;
+ break;
+
+ default:
+ break;
+ }
if (note)
{