]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/64453 (Live high register not saved in function prolog on...
authorThomas Preud'homme <thomas.preudhomme@arm.com>
Tue, 3 Mar 2015 09:32:44 +0000 (09:32 +0000)
committerThomas Preud'homme <thopre01@gcc.gnu.org>
Tue, 3 Mar 2015 09:32:44 +0000 (09:32 +0000)
2015-01-23  Thomas Preud'homme  <thomas.preudhomme@arm.com>

    Backport from mainline
    2015-01-14  Thomas Preud'homme  <thomas.preudhomme@arm.com>

    gcc/
    PR target/64453
    * config/arm/arm.c (callee_saved_reg_p): Define.
    (arm_compute_save_reg0_reg12_mask): Use callee_saved_reg_p to check if
    register is callee saved instead of !call_used_regs[reg].
    (thumb1_compute_save_reg_mask): Likewise.

    gcc/testsuite/
    PR target/64453
    * gcc.target/arm/pr64453.c: New.

From-SVN: r221135

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/pr64453.c [new file with mode: 0644]

index 2cf5d964f438731f2ec2f7061ff8a9d3b791e7ed..ed8ca3150439d711b57d58ddcfb01a3ee05867d9 100644 (file)
@@ -1,3 +1,14 @@
+2015-01-23  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       Backport from mainline
+       2015-01-14  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       PR target/64453
+       * config/arm/arm.c (callee_saved_reg_p): Define.
+       (arm_compute_save_reg0_reg12_mask): Use callee_saved_reg_p to check if
+       register is callee saved instead of !call_used_regs[reg].
+       (thumb1_compute_save_reg_mask): Likewise.
+
 2015-02-27  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/63175
index 5e2571c5ed48c2528ace85dbb90c58ed2199c2a3..0dd2167257d9285271cfd5045954c47e67eae5ce 100644 (file)
@@ -18601,6 +18601,14 @@ output_ascii_pseudo_op (FILE *stream, const unsigned char *p, int len)
   fputs ("\"\n", stream);
 }
 \f
+/* Whether a register is callee saved or not.  This is necessary because high
+   registers are marked as caller saved when optimizing for size on Thumb-1
+   targets despite being callee saved in order to avoid using them.  */
+#define callee_saved_reg_p(reg) \
+  (!call_used_regs[reg] \
+   || (TARGET_THUMB1 && optimize_size \
+       && reg >= FIRST_HI_REGNUM && reg <= LAST_HI_REGNUM))
+
 /* Compute the register save mask for registers 0 through 12
    inclusive.  This code is used by arm_compute_save_reg_mask.  */
 
@@ -18661,7 +18669,7 @@ arm_compute_save_reg0_reg12_mask (void)
       /* In the normal case we only need to save those registers
         which are call saved and which are used by this function.  */
       for (reg = 0; reg <= 11; reg++)
-       if (df_regs_ever_live_p (reg) && ! call_used_regs[reg])
+       if (df_regs_ever_live_p (reg) && callee_saved_reg_p (reg))
          save_reg_mask |= (1 << reg);
 
       /* Handle the frame pointer as a special case.  */
@@ -18824,7 +18832,7 @@ thumb1_compute_save_reg_mask (void)
 
   mask = 0;
   for (reg = 0; reg < 12; reg ++)
-    if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
+    if (df_regs_ever_live_p (reg) && callee_saved_reg_p (reg))
       mask |= 1 << reg;
 
   if (flag_pic
@@ -18857,7 +18865,7 @@ thumb1_compute_save_reg_mask (void)
       if (reg * UNITS_PER_WORD <= (unsigned) arm_size_return_regs ())
        reg = LAST_LO_REGNUM;
 
-      if (! call_used_regs[reg])
+      if (callee_saved_reg_p (reg))
        mask |= 1 << reg;
     }
 
@@ -29671,8 +29679,7 @@ arm_conditional_register_usage (void)
       /* When optimizing for size on Thumb-1, it's better not
         to use the HI regs, because of the overhead of
         stacking them.  */
-      for (regno = FIRST_HI_REGNUM;
-          regno <= LAST_HI_REGNUM; ++regno)
+      for (regno = FIRST_HI_REGNUM; regno <= LAST_HI_REGNUM; ++regno)
        fixed_regs[regno] = call_used_regs[regno] = 1;
     }
 
index 9fca1a097171af7ffe5e046354f9f8ad6ede43d8..40b2ac56b8fe25d06cd16609e958a62de71a03c2 100644 (file)
@@ -1,3 +1,11 @@
+2015-01-23  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       Backport from mainline
+       2015-01-14  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       PR target/64453
+       * gcc.target/arm/pr64453.c: New.
+
 2015-02-27  Pat Haugen <pthaugen@us.ibm.com>
 
        * gcc.dg/vect/pr59354.c: Move vector producing code to separate function.
diff --git a/gcc/testsuite/gcc.target/arm/pr64453.c b/gcc/testsuite/gcc.target/arm/pr64453.c
new file mode 100644 (file)
index 0000000..17155af
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-mthumb -Os " }  */
+/* { dg-require-effective-target arm_thumb1_ok } */
+
+void save_regs () {
+  __asm volatile ("" ::: "r8");
+}
+
+/* { dg-final { scan-assembler "\tmov\tr., r8" } } */