aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2004-02-21 13:03:40 +0000
committerAlan Modra <amodra@gcc.gnu.org>2004-02-21 23:33:40 +1030
commitda6fdad3bb75d58289ba87474ef76cf98a14abc7 (patch)
treea55f76ddd963a0afc1cea4f20bcc6ebc34846d31 /gcc/combine.c
parentfe932e504bb0efaaa874d1caffdc25e4d34c5484 (diff)
downloadgcc-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.c21
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