OSDN Git Service

PR middle_end/34150
authordanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 9 Feb 2008 20:34:47 +0000 (20:34 +0000)
committerdanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 9 Feb 2008 20:34:47 +0000 (20:34 +0000)
* 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

gcc/ChangeLog
gcc/config/pa/pa.c

index ff20e5a..c41e364 100644 (file)
@@ -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
index c571a75..c270e4b 100644 (file)
@@ -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;
     }