From 363ffa50f1394a6eaaa137f7c5e63084b9fd4226 Mon Sep 17 00:00:00 2001 From: Jiong Wang Date: Thu, 24 Jul 2014 14:32:54 +0000 Subject: [PATCH] [AArch64] Extend frame state to track WB candidates. From-SVN: r212996 --- gcc/ChangeLog | 6 ++++++ gcc/config/aarch64/aarch64.c | 14 ++++++++++++++ gcc/config/aarch64/aarch64.h | 3 +++ 3 files changed, 23 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f1a0b3c0277..71ae61cacca 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-07-24 Jiong Wang + + * 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 * graphite-isl-ast-to-gimple.c: diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 345705185e0..37fae938b37 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -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; } diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h index 080b23f71a6..db950da8f5e 100644 --- a/gcc/config/aarch64/aarch64.h +++ b/gcc/config/aarch64/aarch64.h @@ -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;