re PR target/23473 (ICE at config/arm/arm.c:3280)
authorRichard Earnshaw <rearnsha@arm.com>
Fri, 19 Aug 2005 13:17:04 +0000 (13:17 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Fri, 19 Aug 2005 13:17:04 +0000 (13:17 +0000)
PR target/23473
* arm.md (arm_load_pic_register): Change argument to the mask of
saved registers.  Call thumb_find_work_register if we need a
scratch register on Thumb.
(arm_expand_prologue): Pass empty register set to
arm_load_pic_register.
(thumb_expand_prologue): Pass live_regs_mask directly to
arm_load_pic_register.
* arm-protos.h (arm_load_pic_register): Update prototype.

From-SVN: r103277

gcc/ChangeLog
gcc/config/arm/arm-protos.h
gcc/config/arm/arm.c

index bafacaf..d325007 100644 (file)
@@ -1,3 +1,15 @@
+2005-08-19  Richard Earnshaw  <richard.earnshaw@arm.com>
+
+       PR target/23473
+       * arm.md (arm_load_pic_register): Change argument to the mask of
+       saved registers.  Call thumb_find_work_register if we need a 
+       scratch register on Thumb.
+       (arm_expand_prologue): Pass empty register set to 
+       arm_load_pic_register.
+       (thumb_expand_prologue): Pass live_regs_mask directly to
+       arm_load_pic_register.
+       * arm-protos.h (arm_load_pic_register): Update prototype.
+
 2005-08-19  J"orn Rennecke <joern.rennecke@st.com>
 
        * sh.c (find_sole_member): New function.
index cb34f3b..c7ec642 100644 (file)
@@ -27,7 +27,7 @@
 extern void arm_override_options (void);
 extern int use_return_insn (int, rtx);
 extern int arm_regno_class (int);
-extern void arm_load_pic_register (unsigned int);
+extern void arm_load_pic_register (unsigned long);
 extern int arm_volatile_func (void);
 extern const char *arm_output_epilogue (rtx);
 extern void arm_expand_prologue (void);
index 9534a91..0235c53 100644 (file)
@@ -3285,7 +3285,7 @@ thumb_find_work_register (unsigned long pushed_regs_mask)
    low register.  */
 
 void
-arm_load_pic_register (unsigned int scratch)
+arm_load_pic_register (unsigned long saved_regs ATTRIBUTE_UNUSED)
 {
 #ifndef AOF_ASSEMBLER
   rtx l1, pic_tmp, pic_tmp2, pic_rtx;
@@ -3319,9 +3319,10 @@ arm_load_pic_register (unsigned int scratch)
     {
       if (REGNO (pic_offset_table_rtx) > LAST_LO_REGNUM)
        {
-         /* We will have pushed the pic register, so should always be
+         /* We will have pushed the pic register, so we should always be
             able to find a work register.  */
-         pic_tmp = gen_rtx_REG (SImode, scratch);
+         pic_tmp = gen_rtx_REG (SImode,
+                                thumb_find_work_register (saved_regs));
          emit_insn (gen_pic_load_addr_thumb (pic_tmp, pic_rtx));
          emit_insn (gen_movsi (pic_offset_table_rtx, pic_tmp));
        }
@@ -10509,7 +10510,7 @@ arm_expand_prologue (void)
 
 
   if (flag_pic)
-    arm_load_pic_register (INVALID_REGNUM);
+    arm_load_pic_register (0UL);
 
   /* If we are profiling, make sure no instructions are scheduled before
      the call to mcount.  Similarly if the user has requested no
@@ -13236,7 +13237,7 @@ thumb_expand_prologue (void)
   /* Load the pic register before setting the frame pointer,
      so we can use r7 as a temporary work register.  */
   if (flag_pic)
-    arm_load_pic_register (thumb_find_work_register (live_regs_mask));
+    arm_load_pic_register (live_regs_mask);
 
   offsets = arm_get_frame_offsets ();