diff options
author | Alan Modra <amodra@bigpond.net.au> | 2004-02-21 13:03:40 +0000 |
---|---|---|
committer | Alan Modra <amodra@gcc.gnu.org> | 2004-02-21 23:33:40 +1030 |
commit | da6fdad3bb75d58289ba87474ef76cf98a14abc7 (patch) | |
tree | a55f76ddd963a0afc1cea4f20bcc6ebc34846d31 /gcc/combine.c | |
parent | fe932e504bb0efaaa874d1caffdc25e4d34c5484 (diff) | |
download | gcc-da6fdad3bb75d58289ba87474ef76cf98a14abc7.zip gcc-da6fdad3bb75d58289ba87474ef76cf98a14abc7.tar.gz gcc-da6fdad3bb75d58289ba87474ef76cf98a14abc7.tar.bz2 |
combine.c (can_combine_p): Don't ignore SETs marked with REG_EH_REGION notes.
* combine.c (can_combine_p): Don't ignore SETs marked with
REG_EH_REGION notes.
(try_combine): When attemting to fix unrecognized insns, don't
split a PARALLEL that contains the original i2.
From-SVN: r78220
Diffstat (limited to 'gcc/combine.c')
-rw-r--r-- | gcc/combine.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index 8911cb2..55e7ea3 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -960,6 +960,7 @@ can_combine_p (rtx insn, rtx i3, rtx pred ATTRIBUTE_UNUSED, rtx succ, for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++) { rtx elt = XVECEXP (PATTERN (insn), 0, i); + rtx note; switch (GET_CODE (elt)) { @@ -1010,6 +1011,8 @@ can_combine_p (rtx insn, rtx i3, rtx pred ATTRIBUTE_UNUSED, rtx succ, /* Ignore SETs whose result isn't used but not those that have side-effects. */ if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt)) + && (!(note = find_reg_note (insn, REG_EH_REGION, NULL_RTX)) + || INTVAL (XEXP (note, 0)) <= 0) && ! side_effects_p (elt)) break; @@ -2019,11 +2022,21 @@ try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p) we just need the first SET. This can occur when simplifying a divmod insn. We *must* test for this case here because the code below that splits two independent SETs doesn't handle this case correctly when it - updates the register status. Also check the case where the first - SET's destination is unused. That would not cause incorrect code, but - does cause an unneeded insn to remain. */ + updates the register status. - if (insn_code_number < 0 && GET_CODE (newpat) == PARALLEL + It's pointless doing this if we originally had two sets, one from + i3, and one from i2. Combining then splitting the parallel results + in the original i2 again plus an invalid insn (which we delete). + The net effect is only to move instructions around, which makes + debug info less accurate. + + Also check the case where the first SET's destination is unused. + That would not cause incorrect code, but does cause an unneeded + insn to remain. */ + + if (insn_code_number < 0 + && !(added_sets_2 && i1 == 0) + && GET_CODE (newpat) == PARALLEL && XVECLEN (newpat, 0) == 2 && GET_CODE (XVECEXP (newpat, 0, 0)) == SET && GET_CODE (XVECEXP (newpat, 0, 1)) == SET |