diff options
| -rw-r--r-- | gcc/ChangeLog | 7 | ||||
| -rw-r--r-- | gcc/config/pa/pa.c | 21 |
2 files changed, 27 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ff20e5a..c41e364 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2008-02-09 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> + + PR middle_end/34150 + * pa.c (legitimize_pic_address): Add REG_EQUAL note on sets with a + pic_label_operand source. Similarly, add a REG_LABEL_OPERAND note + and update LABEL_NUSES during and after reload. + 2008-02-08 Steven Bosscher <stevenb.gcc@gmail.com> PR middle-end/34627 diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index c571a75..c270e4b 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -668,6 +668,8 @@ legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg) /* Labels need special handling. */ if (pic_label_operand (orig, mode)) { + rtx insn; + /* We do not want to go through the movXX expanders here since that would create recursion. @@ -678,7 +680,24 @@ legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg) So instead we just emit the raw set, which avoids the movXX expanders completely. */ mark_reg_pointer (reg, BITS_PER_UNIT); - emit_insn (gen_rtx_SET (VOIDmode, reg, orig)); + insn = emit_insn (gen_rtx_SET (VOIDmode, reg, orig)); + + /* Put a REG_EQUAL note on this insn, so that it can be optimized. */ + REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, orig, REG_NOTES (insn)); + + /* During and after reload, we need to generate a REG_LABEL_OPERAND note + and update LABEL_NUSES because this is not done automatically. */ + if (reload_in_progress || reload_completed) + { + /* Extract LABEL_REF. */ + if (GET_CODE (orig) == CONST) + orig = XEXP (XEXP (orig, 0), 0); + /* Extract CODE_LABEL. */ + orig = XEXP (orig, 0); + REG_NOTES (insn) = gen_rtx_INSN_LIST (REG_LABEL_OPERAND, orig, + REG_NOTES (insn)); + LABEL_NUSES (orig)++; + } current_function_uses_pic_offset_table = 1; return reg; } |
