From: danglin Date: Sat, 9 Feb 2008 20:34:47 +0000 (+0000) Subject: PR middle_end/34150 X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=3e478718bc0585e5dcdda7e031934932b9e5c649 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@132203 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ff20e5af107..c41e364cfe7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2008-02-09 John David Anglin + + 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 PR middle-end/34627 diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index c571a75c447..c270e4b333d 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; }