[AArch64] Restructure callee save slot allocation logic.
authorMarcus Shawcroft <marcus.shawcroft@arm.com>
Thu, 5 Jun 2014 12:22:07 +0000 (12:22 +0000)
committerMarcus Shawcroft <mshawcroft@gcc.gnu.org>
Thu, 5 Jun 2014 12:22:07 +0000 (12:22 +0000)
Co-Authored-By: Jiong Wang <jiong.wang@arm.com>
From-SVN: r211271

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

index dccab5e62d3c50031bd303ddc8c2369b1760e480..777eb25a9103b6b3587d83a08cbfa52d5efc466e 100644 (file)
@@ -1,3 +1,10 @@
+2014-06-05  Marcus Shawcroft  <marcus.shawcroft@arm.com>
+           Jiong Wang  <jiong.wang@arm.com>
+
+       * config/aarch64/aarch64.c (SLOT_NOT_REQUIRED, SLOT_REQUIRED): Define.
+       (aarch64_layout_frame): Use SLOT_NOT_REQUIRED and SLOT_REQUIRED.
+       (aarch64_register_saved_on_entry): Adjust test.
+
 2014-06-05  Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
        * config/aarch64/aarch64.h (machine_function): Move
index 80530c603ceb2f5eaf2d4aa753f7d72da37e5df6..a58d93ff613ebbdb921618312b74fa313f0346af 100644 (file)
@@ -1812,28 +1812,32 @@ aarch64_layout_frame (void)
   if (reload_completed && cfun->machine->frame.laid_out)
     return;
 
+#define SLOT_NOT_REQUIRED (-2)
+#define SLOT_REQUIRED     (-1)
+
   /* 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] = -1;
+    cfun->machine->frame.reg_offset[regno] = SLOT_NOT_REQUIRED;
 
   for (regno = V0_REGNUM; regno <= V31_REGNUM; regno++)
-    cfun->machine->frame.reg_offset[regno] = -1;
+    cfun->machine->frame.reg_offset[regno] = SLOT_NOT_REQUIRED;
 
   /* ... that includes the eh data registers (if needed)...  */
   if (crtl->calls_eh_return)
     for (regno = 0; EH_RETURN_DATA_REGNO (regno) != INVALID_REGNUM; regno++)
-      cfun->machine->frame.reg_offset[EH_RETURN_DATA_REGNO (regno)] = 0;
+      cfun->machine->frame.reg_offset[EH_RETURN_DATA_REGNO (regno)]
+       = SLOT_REQUIRED;
 
   /* ... and any callee saved register that dataflow says is live.  */
   for (regno = R0_REGNUM; regno <= R30_REGNUM; regno++)
     if (df_regs_ever_live_p (regno)
        && !call_used_regs[regno])
-      cfun->machine->frame.reg_offset[regno] = 0;
+      cfun->machine->frame.reg_offset[regno] = SLOT_REQUIRED;
 
   for (regno = V0_REGNUM; regno <= V31_REGNUM; regno++)
     if (df_regs_ever_live_p (regno)
        && !call_used_regs[regno])
-      cfun->machine->frame.reg_offset[regno] = 0;
+      cfun->machine->frame.reg_offset[regno] = SLOT_REQUIRED;
 
   if (frame_pointer_needed)
     {
@@ -1844,14 +1848,14 @@ aarch64_layout_frame (void)
 
   /* Now assign stack slots for them.  */
   for (regno = R0_REGNUM; regno <= R28_REGNUM; regno++)
-    if (cfun->machine->frame.reg_offset[regno] != -1)
+    if (cfun->machine->frame.reg_offset[regno] == SLOT_REQUIRED)
       {
        cfun->machine->frame.reg_offset[regno] = offset;
        offset += UNITS_PER_WORD;
       }
 
   for (regno = V0_REGNUM; regno <= V31_REGNUM; regno++)
-    if (cfun->machine->frame.reg_offset[regno] != -1)
+    if (cfun->machine->frame.reg_offset[regno] == SLOT_REQUIRED)
       {
        cfun->machine->frame.reg_offset[regno] = offset;
        offset += UNITS_PER_WORD;
@@ -1863,7 +1867,7 @@ aarch64_layout_frame (void)
       offset += UNITS_PER_WORD;
     }
 
-  if (cfun->machine->frame.reg_offset[R30_REGNUM] != -1)
+  if (cfun->machine->frame.reg_offset[R30_REGNUM] == SLOT_REQUIRED)
     {
       cfun->machine->frame.reg_offset[R30_REGNUM] = offset;
       offset += UNITS_PER_WORD;
@@ -1896,7 +1900,7 @@ aarch64_set_frame_expr (rtx frame_pattern)
 static bool
 aarch64_register_saved_on_entry (int regno)
 {
-  return cfun->machine->frame.reg_offset[regno] != -1;
+  return cfun->machine->frame.reg_offset[regno] >= 0;
 }