This is the mail archive of the
mailing list for the GCC project.
RE: [RFC] Add middle end hook for stack red zone size
- From: Joern Rennecke <amylaar at spamcop dot net>
- To: Jiangning Liu <jiangning dot liu at arm dot com>
- Cc: gcc at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org, vmakarov at redhat dot com, dje dot gcc at gmail dot com, Richard Henderson <rth at redhat dot com>, Ramana Radhakrishnan <Ramana dot Radhakrishnan at arm dot com>, 'Ramana Radhakrishnan' <ramana dot radhakrishnan at linaro dot org>
- Date: Mon, 25 Jul 2011 22:33:19 -0400
- Subject: RE: [RFC] Add middle end hook for stack red zone size
- References: <4e255312.0a852b0a.528d.6933SMTPIN_ADDED@mx.google.com> <CACUk7=WsaUN+TUw7rb8-o1EukoaCMrAh8bFJM6832LtRmfkofg@mail.gmail.com> <001e01cc4b33$6d3818f0$47a84ad0$@firstname.lastname@example.org>
Quoting Jiangning Liu <email@example.com>:
One month ago, I sent out this RFC to *gcc-patches* mail list, but I
didn't receive any response yet. So I'm forwarding this mail to
*gcc* mail list. Can anybody here really give feedback to me?
Well, I couldn't approve any patch, but I can point out some issues
with your patch.
First, it's missing a ChangeLog, and you don't state how you have tested it.
And regarding the code in sched_analyze_1, I think you'll get false
positives with alloca, and false negatives when registers are involved
to compute offsets or to restore the stack pointer from.
FWIW, I think generally blunt scheduling barriers should be avoided, and
instead the dependencies made visible to the scheduler.
E.g., I've been working with another architecture with a redzone, where at
-fno-omit-frame-pointer, the prologue can put pretend_args into the redzone,
then after stack adjustment and frame allocation, these arguments are
accessed via the frame pointer.
With the attached patchlet, alias analysis works for this situation too, so
no blunt scheduling block is required.
Likewise, with stack adjustments, they should not affect scheduling in
general, but be considered to clobber the part of the frame that is
being exposed to interrupt writes either before or after the adjustment.
At the moment, each port that wants to have such selective scheduling
blockages has to define a stack_adjust pattern with a memory clobber
in a parallel, with a memref that shows the high water mark of possible
interrupt stack writes.
Prima facia it would seem convenient if you only had to tell the middle-end
about the redzone size, and it could figure out the implicit clobbers when
the stack is changed. However, when a big stack adjustment is being made,
or the stack is realigned, or restored from the frame pointer / another
register where it was saved due to realignment, the adjustment is not
so obvious. I'm not sure if you can actually create an robust interface
that's simpler to use than putting the right memory clobber in the stack
adjust pattern. Note also that the redzone size can vary from function
to function depending on ABI-altering attributes, in particular for interrupt
functions, which can also have different incoming and outgoing redzone
sizes. Plus, you can have an NMI / reset handler which can use the stack
like an ordinary address register.
2009-09-23 Joern Rennecke <firstname.lastname@example.org>
* alias.c (base_alias_check): Allow for aliases between stack-
and frame-pointer referenced memory.
--- alias.c (revision 1646)
+++ alias.c (revision 1647)
@@ -1751,6 +1751,17 @@ base_alias_check (rtx x, rtx y, enum mac
if (GET_CODE (x_base) != ADDRESS && GET_CODE (y_base) != ADDRESS)
+ /* If both are stack references, one via the stack pointer, the other via
+ the frame pointer, there can be an alias.
+ E.g.: gcc.c-torture/execute/20041113-1.c -O3 -g */
+ if (GET_CODE (x_base) == ADDRESS
+ && (XEXP (x_base, 0) == stack_pointer_rtx
+ || XEXP (x_base, 0) == hard_frame_pointer_rtx)
+ && GET_CODE (y_base) == ADDRESS
+ && (XEXP (y_base, 0) == stack_pointer_rtx
+ || XEXP (y_base, 0) == hard_frame_pointer_rtx))
+ return 1;
/* If one address is a stack reference there can be no alias:
stack references using different base registers do not alias,
a stack reference can not alias a parameter, and a stack reference