]> 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>
Wed, 4 Mar 2015 02:06:07 +0000 (02:06 +0000)
committerThomas Preud'homme <thopre01@gcc.gnu.org>
Wed, 4 Mar 2015 02:06:07 +0000 (02:06 +0000)
2015-03-04  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: r221170

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

index dce2ea05ae7bd382e6150c24d61cf774beac7a57..3671cf1fe8229f602ad84f5a65458a68bccfe451 100644 (file)
@@ -1,3 +1,14 @@
+2015-03-04  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 lto/65193
index 90244292f949942c8183e66d00b77641b67ffec0..346a2c979249603560e229df0a918fa11e9a2519 100644 (file)
@@ -15626,6 +15626,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.  */
 
@@ -15686,7 +15694,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.  */
@@ -15840,7 +15848,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
@@ -15873,7 +15881,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;
     }
 
index 10317c10a3ef1136b74a7e3d386a4ee9aa323b36..d0aa70edb62936fcd42cd773bafafefb5897358e 100644 (file)
@@ -1,3 +1,8 @@
+2015-03-04  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       PR target/64453
+       * gcc.target/arm/pr64453.c: New.
+
 2015-02-27  Richard Biener  <rguenther@suse.de>
 
        PR lto/65193
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" } } */