aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorWilco Dijkstra <wdijkstr@arm.com>2017-11-08 15:34:36 +0000
committerWilco Dijkstra <wilco@gcc.gnu.org>2017-11-08 15:34:36 +0000
commit7040939b9e2cbd084e6dbe015ee6cd2761aacf46 (patch)
treec7a02a8d9d4ea3d223427b71d56ca73e56370c5a /gcc/config
parent7cc7f3aa68b852b217c511e7d841458b0bdd532a (diff)
downloadgcc-7040939b9e2cbd084e6dbe015ee6cd2761aacf46.zip
gcc-7040939b9e2cbd084e6dbe015ee6cd2761aacf46.tar.gz
gcc-7040939b9e2cbd084e6dbe015ee6cd2761aacf46.tar.bz2
[AArch64] Remove aarch64_frame_pointer_required
To implement -fomit-leaf-frame-pointer, there are 2 places where we need to check whether we have to use a frame chain (since register allocation may allocate LR in a leaf function that omits the frame pointer, but if LR is spilled we must emit a frame chain). To simplify this do not force frame_pointer_needed via aarch64_frame_pointer_required, but enable the frame chain in aarch64_layout_frame. Now aarch64_frame_pointer_required can be removed and aarch64_can_eliminate is simplified. gcc/ * config/aarch64/aarch64.c (aarch64_frame_pointer_required) Remove. (aarch64_layout_frame): Initialise emit_frame_chain. (aarch64_can_eliminate): Remove omit leaf frame pointer code. (TARGET_FRAME_POINTER_REQUIRED): Remove define. testsuite/ * gcc.target/aarch64/dwarf-cfa-reg.c: Update. From-SVN: r254533
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/aarch64/aarch64.c37
1 files changed, 8 insertions, 29 deletions
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 62ce7d6..f58f192 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -2891,21 +2891,6 @@ aarch64_output_probe_stack_range (rtx reg1, rtx reg2)
return "";
}
-static bool
-aarch64_frame_pointer_required (void)
-{
- /* Use the frame pointer if enabled and it is not a leaf function, unless
- leaf frame pointer omission is disabled. If the frame pointer is enabled,
- force the frame pointer in leaf functions which use LR. */
- if (flag_omit_frame_pointer == 2
- && !(flag_omit_leaf_frame_pointer
- && crtl->is_leaf
- && !df_regs_ever_live_p (LR_REGNUM)))
- return true;
-
- return false;
-}
-
/* Mark the registers that need to be saved by the callee and calculate
the size of the callee-saved registers area and frame record (both FP
and LR may be omitted). */
@@ -2922,6 +2907,14 @@ aarch64_layout_frame (void)
cfun->machine->frame.emit_frame_chain
= frame_pointer_needed || crtl->calls_eh_return;
+ /* Emit a frame chain if the frame pointer is enabled.
+ If -momit-leaf-frame-pointer is used, do not use a frame chain
+ in leaf functions which do not use LR. */
+ if (flag_omit_frame_pointer == 2
+ && !(flag_omit_leaf_frame_pointer && crtl->is_leaf
+ && !df_regs_ever_live_p (LR_REGNUM)))
+ cfun->machine->frame.emit_frame_chain = true;
+
#define SLOT_NOT_REQUIRED (-2)
#define SLOT_REQUIRED (-1)
@@ -5939,17 +5932,6 @@ aarch64_can_eliminate (const int from, const int to)
return false;
}
- else
- {
- /* If we decided that we didn't need a leaf frame pointer but then used
- LR in the function, then we'll want a frame pointer after all, so
- prevent this elimination to ensure a frame pointer is used. */
- if (to == STACK_POINTER_REGNUM
- && flag_omit_frame_pointer == 2
- && flag_omit_leaf_frame_pointer
- && df_regs_ever_live_p (LR_REGNUM))
- return false;
- }
return true;
}
@@ -15261,9 +15243,6 @@ aarch64_run_selftests (void)
#undef TARGET_FUNCTION_VALUE_REGNO_P
#define TARGET_FUNCTION_VALUE_REGNO_P aarch64_function_value_regno_p
-#undef TARGET_FRAME_POINTER_REQUIRED
-#define TARGET_FRAME_POINTER_REQUIRED aarch64_frame_pointer_required
-
#undef TARGET_GIMPLE_FOLD_BUILTIN
#define TARGET_GIMPLE_FOLD_BUILTIN aarch64_gimple_fold_builtin