aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2016-03-16 08:34:42 +1030
committerAlan Modra <amodra@gcc.gnu.org>2016-03-16 08:34:42 +1030
commit6585b2e2dd63bb2e1ccc1390a7a52970152cd34d (patch)
treea4b27532087917fcfbf35124aeb52422b5530c80
parent42c729c52e91374b3af861eeff7b6cfaa77d9712 (diff)
downloadgcc-6585b2e2dd63bb2e1ccc1390a7a52970152cd34d.zip
gcc-6585b2e2dd63bb2e1ccc1390a7a52970152cd34d.tar.gz
gcc-6585b2e2dd63bb2e1ccc1390a7a52970152cd34d.tar.bz2
Fix thinko in indirect_jump_optimize
PR rtl-optimization/69195 PR rtl-optimization/47992 * ira.c (indirect_jump_optimize): Ignore artificial defs. Add comments. From-SVN: r234235
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/ira.c26
2 files changed, 25 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8909a99..7359f0b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2016-03-16 Alan Modra <amodra@gmail.com>
+
+ PR rtl-optimization/69195
+ PR rtl-optimization/47992
+ * ira.c (indirect_jump_optimize): Ignore artificial defs.
+ Add comments.
+
2016-03-15 Eric Botcazou <ebotcazou@adacore.com>
PR bootstrap/69513
diff --git a/gcc/ira.c b/gcc/ira.c
index 5e7a2ed..062b8a4 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -3842,7 +3842,8 @@ update_equiv_regs (void)
free (pdx_subregs);
}
-/* A pass over indirect jumps, converting simple cases to direct jumps. */
+/* A pass over indirect jumps, converting simple cases to direct jumps.
+ Combine does this optimization too, but only within a basic block. */
static void
indirect_jump_optimize (void)
{
@@ -3862,14 +3863,23 @@ indirect_jump_optimize (void)
int regno = REGNO (SET_SRC (x));
if (DF_REG_DEF_COUNT (regno) == 1)
{
- rtx_insn *def_insn = DF_REF_INSN (DF_REG_DEF_CHAIN (regno));
- rtx note = find_reg_note (def_insn, REG_LABEL_OPERAND, NULL_RTX);
-
- if (note)
+ df_ref def = DF_REG_DEF_CHAIN (regno);
+ if (!DF_REF_IS_ARTIFICIAL (def))
{
- rtx lab = gen_rtx_LABEL_REF (Pmode, XEXP (note, 0));
- if (validate_replace_rtx (SET_SRC (x), lab, insn))
- rebuild_p = true;
+ rtx_insn *def_insn = DF_REF_INSN (def);
+ rtx note = find_reg_note (def_insn, REG_LABEL_OPERAND, NULL_RTX);
+
+ if (note)
+ {
+ /* Substitute a LABEL_REF to the label given by the
+ note rather than using SET_SRC of DEF_INSN.
+ DEF_INSN might be loading the label constant from
+ a constant pool, which isn't what we want in a
+ direct branch. */
+ rtx lab = gen_rtx_LABEL_REF (Pmode, XEXP (note, 0));
+ if (validate_replace_rtx (SET_SRC (x), lab, insn))
+ rebuild_p = true;
+ }
}
}
}