* [PATCH] Avoid frame pointer and stack realignment in AVX/AVX2 using fns if they don't touch sp/fp
@ 2011-11-07 21:22 Jakub Jelinek
2011-11-09 19:56 ` Richard Henderson
0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2011-11-07 21:22 UTC (permalink / raw)
To: Uros Bizjak, Richard Henderson; +Cc: gcc-patches
Hi!
As I've mentioned during the weekend, currently all functions that use
32-byte vectors end up with frame pointer and stack realignment
(except when they have some 32-byte aligned argument, but that
means 9+ arguments, so quite unlikely). The stack realignment is
there just in case, if reloaded wanted to spill anything.
This patch attempts to improve the easy case, where the function
doesn't touch the stack at all and the only reason for frame pointer
was the conservative guess on stack realignment need.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
PS: It would be nice if stack_alignment_needed was only set on
actual needs rather than estimations and stack_alignment_estimated
used for the latter (e.g. currently expand_one_var does adjust
stack_alignment_needed always, I'd hope it could do it only when
actually putting the var into stack), then while we would still
need to assume that perhaps stack realignment might be needed during
reload, if we don't spill anything requiring 32-byte alignment
during reload we could perhaps keep the frame pointer, but at least
optimize away the stack anding in even more cases.
2011-11-07 Jakub Jelinek <jakub@redhat.com>
* function.h (requires_stack_frame_p): New prototype.
* function.c (requires_stack_frame_p): No longer static.
* config/i386/i386.c (ix86_finalize_stack_realign_flags): If
stack_realign_fp was just a conservative guess for a function
which doesn't use sp/fp/argp at all, clear frame_pointer_needed
and stack realignment.
--- gcc/function.h.jj 2011-11-07 12:40:36.000000000 +0100
+++ gcc/function.h 2011-11-07 18:18:57.000000000 +0100
@@ -753,6 +753,10 @@ extern void used_types_insert (tree);
extern int get_next_funcdef_no (void);
extern int get_last_funcdef_no (void);
+#ifdef HAVE_simple_return
+extern bool requires_stack_frame_p (rtx, HARD_REG_SET, HARD_REG_SET);
+#endif
+
/* In predict.c */
extern bool optimize_function_for_size_p (struct function *);
extern bool optimize_function_for_speed_p (struct function *);
--- gcc/function.c.jj 2011-11-07 12:40:36.000000000 +0100
+++ gcc/function.c 2011-11-07 18:18:57.000000000 +0100
@@ -5282,7 +5282,7 @@ prologue_epilogue_contains (const_rtx in
PROLOGUE_USED contains the hard registers used in the function
prologue. SET_UP_BY_PROLOGUE is the set of registers we expect the
prologue to set up for the function. */
-static bool
+bool
requires_stack_frame_p (rtx insn, HARD_REG_SET prologue_used,
HARD_REG_SET set_up_by_prologue)
{
--- gcc/config/i386/i386.c.jj 2011-11-07 18:19:49.000000000 +0100
+++ gcc/config/i386/i386.c 2011-11-07 19:02:06.000000000 +0100
@@ -9894,12 +9894,68 @@ ix86_finalize_stack_realign_flags (void)
/* After stack_realign_needed is finalized, we can't no longer
change it. */
gcc_assert (crtl->stack_realign_needed == stack_realign);
+ return;
}
- else
- {
- crtl->stack_realign_needed = stack_realign;
- crtl->stack_realign_finalized = true;
+
+ /* If the only reason for frame_pointer_needed is that we conservatively
+ assumed stack realignment might be needed, but in the end nothing that
+ needed the stack alignment had been spilled, clear frame_pointer_needed
+ and say we don't need stack realignment. */
+ if (stack_realign
+ && !crtl->need_drap
+ && frame_pointer_needed
+ && current_function_is_leaf
+ && flag_omit_frame_pointer
+ && current_function_sp_is_unchanging
+ && !ix86_current_function_calls_tls_descriptor
+ && !crtl->accesses_prior_frames
+ && !cfun->calls_alloca
+ && !crtl->calls_eh_return
+ && !(flag_stack_check && STACK_CHECK_MOVING_SP)
+ && !ix86_frame_pointer_required ()
+ && get_frame_size () == 0
+ && ix86_nsaved_sseregs () == 0
+ && ix86_varargs_gpr_size + ix86_varargs_fpr_size == 0)
+ {
+ HARD_REG_SET set_up_by_prologue, prologue_used;
+ basic_block bb;
+
+ CLEAR_HARD_REG_SET (prologue_used);
+ CLEAR_HARD_REG_SET (set_up_by_prologue);
+ add_to_hard_reg_set (&set_up_by_prologue, Pmode, STACK_POINTER_REGNUM);
+ add_to_hard_reg_set (&set_up_by_prologue, Pmode, ARG_POINTER_REGNUM);
+ add_to_hard_reg_set (&set_up_by_prologue, Pmode,
+ HARD_FRAME_POINTER_REGNUM);
+ FOR_EACH_BB (bb)
+ {
+ rtx insn;
+ FOR_BB_INSNS (bb, insn)
+ if (NONDEBUG_INSN_P (insn)
+ && requires_stack_frame_p (insn, prologue_used,
+ set_up_by_prologue))
+ {
+ crtl->stack_realign_needed = stack_realign;
+ crtl->stack_realign_finalized = true;
+ return;
+ }
+ }
+
+ frame_pointer_needed = false;
+ stack_realign = false;
+ crtl->max_used_stack_slot_alignment = incoming_stack_boundary;
+ crtl->stack_alignment_needed = incoming_stack_boundary;
+ crtl->stack_alignment_estimated = incoming_stack_boundary;
+ if (crtl->preferred_stack_boundary > incoming_stack_boundary)
+ crtl->preferred_stack_boundary = incoming_stack_boundary;
+ df_finish_pass (true);
+ df_scan_alloc (NULL);
+ df_scan_blocks ();
+ df_compute_regs_ever_live (true);
+ df_analyze ();
}
+
+ crtl->stack_realign_needed = stack_realign;
+ crtl->stack_realign_finalized = true;
}
/* Expand the prologue into a bunch of separate insns. */
Jakub
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] Avoid frame pointer and stack realignment in AVX/AVX2 using fns if they don't touch sp/fp
2011-11-07 21:22 [PATCH] Avoid frame pointer and stack realignment in AVX/AVX2 using fns if they don't touch sp/fp Jakub Jelinek
@ 2011-11-09 19:56 ` Richard Henderson
0 siblings, 0 replies; 2+ messages in thread
From: Richard Henderson @ 2011-11-09 19:56 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Uros Bizjak, gcc-patches
On 11/07/2011 01:14 PM, Jakub Jelinek wrote:
> * function.h (requires_stack_frame_p): New prototype.
> * function.c (requires_stack_frame_p): No longer static.
> * config/i386/i386.c (ix86_finalize_stack_realign_flags): If
> stack_realign_fp was just a conservative guess for a function
> which doesn't use sp/fp/argp at all, clear frame_pointer_needed
> and stack realignment.
Ok.
r~
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-11-09 19:17 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-07 21:22 [PATCH] Avoid frame pointer and stack realignment in AVX/AVX2 using fns if they don't touch sp/fp Jakub Jelinek
2011-11-09 19:56 ` Richard Henderson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).