Commit acea40ac by Wilco Dijkstra Committed by Wilco Dijkstra

PR60580: Fix frame pointer option magic

To fix PR60580 simplify the logic in aarch64_override_options_after_change_1 (). 
If the frame pointer is enabled, set it to a special value that behaves similar
to frame pointer omission.  If we don't do this all leaf functions will get a
frame pointer even if flag_omit_leaf_frame_pointer is set.

If flag_omit_frame_pointer has this special value, we must force the frame
pointer if not in a leaf function.  We also need to force it in a leaf function
if flag_omit_frame_pointer is not set or if LR is used.

Doing this allows both -fomit-frame-pointer and -fomit-leaf-frame-pointer to be
independently set and changed in each function with the expected behaviour.

    gcc/
	PR middle-end/60580
	* config/aarch64/aarch64.c (aarch64_frame_pointer_required)
	Check special value of flag_omit_frame_pointer.
	(aarch64_can_eliminate): Likewise.
	(aarch64_override_options_after_change_1): Simplify handling of
	-fomit-frame-pointer and -fomit-leaf-frame-pointer.

From-SVN: r254052
parent 02b0c08c
2017-10-24 Wilco Dijkstra <wdijkstr@arm.com>
PR middle-end/60580
* config/aarch64/aarch64.c (aarch64_frame_pointer_required)
Check special value of flag_omit_frame_pointer.
(aarch64_can_eliminate): Likewise.
(aarch64_override_options_after_change_1): Simplify handling of
-fomit-frame-pointer and -fomit-leaf-frame-pointer.
2017-10-24 Richard Biener <rguenther@suse.de> 2017-10-24 Richard Biener <rguenther@suse.de>
PR tree-optimization/82697 PR tree-optimization/82697
...@@ -2867,12 +2867,13 @@ aarch64_output_probe_stack_range (rtx reg1, rtx reg2) ...@@ -2867,12 +2867,13 @@ aarch64_output_probe_stack_range (rtx reg1, rtx reg2)
static bool static bool
aarch64_frame_pointer_required (void) aarch64_frame_pointer_required (void)
{ {
/* In aarch64_override_options_after_change /* Use the frame pointer if enabled and it is not a leaf function, unless
flag_omit_leaf_frame_pointer turns off the frame pointer by leaf frame pointer omission is disabled. If the frame pointer is enabled,
default. Turn it back on now if we've not got a leaf force the frame pointer in leaf functions which use LR. */
function. */ if (flag_omit_frame_pointer == 2
if (flag_omit_leaf_frame_pointer && !(flag_omit_leaf_frame_pointer
&& (!crtl->is_leaf || df_regs_ever_live_p (LR_REGNUM))) && crtl->is_leaf
&& !df_regs_ever_live_p (LR_REGNUM)))
return true; return true;
/* Force a frame pointer for EH returns so the return address is at FP+8. */ /* Force a frame pointer for EH returns so the return address is at FP+8. */
...@@ -5926,6 +5927,7 @@ aarch64_can_eliminate (const int from, const int to) ...@@ -5926,6 +5927,7 @@ aarch64_can_eliminate (const int from, const int to)
LR in the function, then we'll want a frame pointer after all, so LR in the function, then we'll want a frame pointer after all, so
prevent this elimination to ensure a frame pointer is used. */ prevent this elimination to ensure a frame pointer is used. */
if (to == STACK_POINTER_REGNUM if (to == STACK_POINTER_REGNUM
&& flag_omit_frame_pointer == 2
&& flag_omit_leaf_frame_pointer && flag_omit_leaf_frame_pointer
&& df_regs_ever_live_p (LR_REGNUM)) && df_regs_ever_live_p (LR_REGNUM))
return false; return false;
...@@ -8965,24 +8967,16 @@ aarch64_parse_override_string (const char* input_string, ...@@ -8965,24 +8967,16 @@ aarch64_parse_override_string (const char* input_string,
static void static void
aarch64_override_options_after_change_1 (struct gcc_options *opts) aarch64_override_options_after_change_1 (struct gcc_options *opts)
{ {
/* The logic here is that if we are disabling all frame pointer generation /* PR 70044: We have to be careful about being called multiple times for the
then we do not need to disable leaf frame pointer generation as a same function. This means all changes should be repeatable. */
separate operation. But if we are *only* disabling leaf frame pointer
generation then we set flag_omit_frame_pointer to true, but in /* If the frame pointer is enabled, set it to a special value that behaves
aarch64_frame_pointer_required we return false only for leaf functions. similar to frame pointer omission. If we don't do this all leaf functions
will get a frame pointer even if flag_omit_leaf_frame_pointer is set.
PR 70044: We have to be careful about being called multiple times for the If flag_omit_frame_pointer has this special value, we must force the
same function. Once we have decided to set flag_omit_frame_pointer just frame pointer if not in a leaf function. We also need to force it in a
so that we can omit leaf frame pointers, we must then not interpret a leaf function if flag_omit_frame_pointer is not set or if LR is used. */
second call as meaning that all frame pointer generation should be if (opts->x_flag_omit_frame_pointer == 0)
omitted. We do this by setting flag_omit_frame_pointer to a special,
non-zero value. */
if (opts->x_flag_omit_frame_pointer == 2)
opts->x_flag_omit_frame_pointer = 0;
if (opts->x_flag_omit_frame_pointer)
opts->x_flag_omit_leaf_frame_pointer = false;
else if (opts->x_flag_omit_leaf_frame_pointer)
opts->x_flag_omit_frame_pointer = 2; opts->x_flag_omit_frame_pointer = 2;
/* If not optimizing for size, set the default /* If not optimizing for size, set the default
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment