diff options
author | Alan Modra <amodra@gmail.com> | 2016-03-16 08:34:42 +1030 |
---|---|---|
committer | Alan Modra <amodra@gcc.gnu.org> | 2016-03-16 08:34:42 +1030 |
commit | 6585b2e2dd63bb2e1ccc1390a7a52970152cd34d (patch) | |
tree | a4b27532087917fcfbf35124aeb52422b5530c80 | |
parent | 42c729c52e91374b3af861eeff7b6cfaa77d9712 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/ira.c | 26 |
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 @@ -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; + } } } } |