]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/64580 (very high rs6000_stack_info() usage during LTO Firefox build...
authorSegher Boessenkool <segher@kernel.crashing.org>
Thu, 5 Feb 2015 15:06:40 +0000 (16:06 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Thu, 5 Feb 2015 15:06:40 +0000 (16:06 +0100)
PR target/64580
Backport from mainline
* config.rs6000/rs6000.c (compute_vrsave_mask): Reverse loop order.
(rs6000_stack_info): Add assert.
(rs6000_output_savres_externs): New function, split off from...
(rs6000_output_function_prologue): ... here.  Do not call it for
thunks.

From-SVN: r220454

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index fabe60089449626c406576b7280bc1adcfb38085..1b3ced8e2ba6d06b1c814ec7aaae9aa8715d47c5 100644 (file)
@@ -1,3 +1,13 @@
+2015-02-05  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR target/64580
+       Backport from mainline
+       * config.rs6000/rs6000.c (compute_vrsave_mask): Reverse loop order.
+       (rs6000_stack_info): Add assert.
+       (rs6000_output_savres_externs): New function, split off from...
+       (rs6000_output_function_prologue): ... here.  Do not call it for
+       thunks.
+
 2015-02-04  Uros Bizjak  <ubizjak@gmail.com>
 
        Backport from mainline
index eabdbdfd4140664501765fa1da150a571942d134..2f9a1789f5711010f7980a765b8325174f24a8e3 100644 (file)
@@ -20748,7 +20748,7 @@ compute_vrsave_mask (void)
      them in again.  More importantly, the mask we compute here is
      used to generate CLOBBERs in the set_vrsave insn, and we do not
      wish the argument registers to die.  */
-  for (i = crtl->args.info.vregno - 1; i >= ALTIVEC_ARG_MIN_REG; --i)
+  for (i = ALTIVEC_ARG_MIN_REG; i < (unsigned) crtl->args.info.vregno; i++)
     mask &= ~ALTIVEC_REG_BIT (i);
 
   /* Similarly, remove the return value from the set.  */
@@ -21158,6 +21158,9 @@ rs6000_savres_strategy (rs6000_stack_t *info,
 static rs6000_stack_t *
 rs6000_stack_info (void)
 {
+  /* We should never be called for thunks, we are not set up for that.  */
+  gcc_assert (!cfun->is_thunk);
+
   rs6000_stack_t *info_ptr = &stack_info;
   int reg_size = TARGET_32BIT ? 4 : 8;
   int ehrd_size;
@@ -23886,11 +23889,10 @@ rs6000_emit_prologue (void)
     }
 }
 
-/* Write function prologue.  */
+/* Output .extern statements for the save/restore routines we use.  */
 
 static void
-rs6000_output_function_prologue (FILE *file,
-                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
+rs6000_output_savres_externs (FILE *file)
 {
   rs6000_stack_t *info = rs6000_stack_info ();
 
@@ -23922,6 +23924,16 @@ rs6000_output_function_prologue (FILE *file,
          fprintf (file, "\t.extern %s\n", name);
        }
     }
+}
+
+/* Write function prologue.  */
+
+static void
+rs6000_output_function_prologue (FILE *file,
+                                HOST_WIDE_INT size ATTRIBUTE_UNUSED)
+{
+  if (!cfun->is_thunk)
+    rs6000_output_savres_externs (file);
 
   /* ELFv2 ABI r2 setup code and local entry point.  This must follow
      immediately after the global entry point label.  */