]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[AArch64] Extend frame state to track WB candidates.
authorJiong Wang <jiong.wang@arm.com>
Thu, 24 Jul 2014 14:32:54 +0000 (14:32 +0000)
committerMarcus Shawcroft <mshawcroft@gcc.gnu.org>
Thu, 24 Jul 2014 14:32:54 +0000 (14:32 +0000)
From-SVN: r212996

gcc/ChangeLog
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/aarch64.h

index f1a0b3c02774dc1c37c1b0d09188d61c2e4fad2e..71ae61cacca5b939b47f01c53fad511bcf41bfe4 100644 (file)
@@ -1,3 +1,9 @@
+2014-07-24  Jiong Wang  <jiong.wang@arm.com>
+
+       * config/aarch64/aarch64.h (frame): New fields "wb_candidate1" and
+       "wb_candidate2".
+       * config/aarch64/aarch64.c (aarch64_layout_frame): Initialize above.
+
 2014-07-24  Roman Gareev  <gareevroman@gmail.com>
 
        * graphite-isl-ast-to-gimple.c:
index 345705185e0ce14db5687840bf9a0b7c79845e61..37fae938b3714b014df3d1e2138b50aa5b58c383 100644 (file)
@@ -1818,6 +1818,9 @@ aarch64_layout_frame (void)
 #define SLOT_NOT_REQUIRED (-2)
 #define SLOT_REQUIRED     (-1)
 
+  cfun->machine->frame.wb_candidate1 = FIRST_PSEUDO_REGISTER;
+  cfun->machine->frame.wb_candidate2 = FIRST_PSEUDO_REGISTER;
+
   /* First mark all the registers that really need to be saved...  */
   for (regno = R0_REGNUM; regno <= R30_REGNUM; regno++)
     cfun->machine->frame.reg_offset[regno] = SLOT_NOT_REQUIRED;
@@ -1846,7 +1849,9 @@ aarch64_layout_frame (void)
     {
       /* FP and LR are placed in the linkage record.  */
       cfun->machine->frame.reg_offset[R29_REGNUM] = 0;
+      cfun->machine->frame.wb_candidate1 = R29_REGNUM;
       cfun->machine->frame.reg_offset[R30_REGNUM] = UNITS_PER_WORD;
+      cfun->machine->frame.wb_candidate2 = R30_REGNUM;
       cfun->machine->frame.hardfp_offset = 2 * UNITS_PER_WORD;
       offset += 2 * UNITS_PER_WORD;
     }
@@ -1856,6 +1861,10 @@ aarch64_layout_frame (void)
     if (cfun->machine->frame.reg_offset[regno] == SLOT_REQUIRED)
       {
        cfun->machine->frame.reg_offset[regno] = offset;
+       if (cfun->machine->frame.wb_candidate1 == FIRST_PSEUDO_REGISTER)
+         cfun->machine->frame.wb_candidate1 = regno;
+       else if (cfun->machine->frame.wb_candidate2 == FIRST_PSEUDO_REGISTER)
+         cfun->machine->frame.wb_candidate2 = regno;
        offset += UNITS_PER_WORD;
       }
 
@@ -1863,6 +1872,11 @@ aarch64_layout_frame (void)
     if (cfun->machine->frame.reg_offset[regno] == SLOT_REQUIRED)
       {
        cfun->machine->frame.reg_offset[regno] = offset;
+       if (cfun->machine->frame.wb_candidate1 == FIRST_PSEUDO_REGISTER)
+         cfun->machine->frame.wb_candidate1 = regno;
+       else if (cfun->machine->frame.wb_candidate2 == FIRST_PSEUDO_REGISTER
+                && cfun->machine->frame.wb_candidate1 >= V0_REGNUM)
+         cfun->machine->frame.wb_candidate2 = regno;
        offset += UNITS_PER_WORD;
       }
 
index 080b23f71a601011952f61b870aef4e8d7363750..db950da8f5ec7f8447943533966fd90eeb133276 100644 (file)
@@ -542,6 +542,9 @@ struct GTY (()) aarch64_frame
    * frame (incomming SP) to the stack_pointer.  This value is always
    * a multiple of STACK_BOUNDARY.  */
 
+  unsigned wb_candidate1;
+  unsigned wb_candidate2;
+
   HOST_WIDE_INT frame_size;
 
   bool laid_out;