Allocate constant size dynamic stack space in the prologue
authorDominik Vogt <vogt@linux.vnet.ibm.com>
Mon, 18 Jul 2016 13:10:27 +0000 (13:10 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Mon, 18 Jul 2016 13:10:27 +0000 (13:10 +0000)
commit7072df0aae0c59ae437e5cc28e4e5e5777e930ba
treeeae0f0bf4792f63f3083251ebd6cbec79241a3cb
parent54158a1aa94f7b75f59d6ca8d6ca7ebfc11e1673
Allocate constant size dynamic stack space in the prologue

The attached patch fixes a warning during Linux kernel compilation
on S/390 due to -mwarn-dynamicstack and runtime alignment of stack
variables with constant size causing cfun->calls_alloca to be set
(even if alloca is not used at all).  The patched code places
constant size runtime aligned variables in the "virtual stack
vars" area instead of creating a "virtual stack dynamic" area.

This behaviour is activated by defining

  #define ALLOCATE_DYNAMIC_STACK_SPACE_IN_PROLOGUE 1

in the backend; otherwise the old logic is used.

The kernel uses runtime alignment for the page structure (aligned
to 16 bytes), and apart from triggereing the alloca warning
(-mwarn-dynamicstack), the current Gcc also generates inefficient
code like

  aghi %r15,-160  # prologue: create stack frame
    lgr %r11,%r15   # prologue: generate frame pointer
      aghi %r15,-32   # space for dynamic stack

which could be simplified to

  aghi %r15,-192

(if later optimization passes are able to get rid of the frame
pointer).  Is there a specific reason why the patched behaviour
shouldn't be used for all platforms?

--

As the placement of runtime aligned stack variables with constant
size is done completely in the middleend, I don't see a way to fix
this in the backend.

gcc/ChangeLog:

2016-07-18  Dominik Vogt  <vogt@linux.vnet.ibm.com>

* cfgexpand.c (expand_stack_vars): Implement synamic stack space
allocation in the prologue.
* explow.c (get_dynamic_stack_base): New function to return an address
expression for the dynamic stack base.
(get_dynamic_stack_size): New function to do the required dynamic stack
space size calculations.
(allocate_dynamic_stack_space): Use new functions.
(align_dynamic_address): Move some code from
allocate_dynamic_stack_space to new function.
* explow.h (get_dynamic_stack_base, get_dynamic_stack_size): Export.

gcc/testsuite/ChangeLog:

2016-07-18  Dominik Vogt  <vogt@linux.vnet.ibm.com>

* gcc.target/s390/warn-dynamicstack-1.c: New test.
* gcc.dg/stack-usage-2.c (foo3): Adapt expected warning.
stack-layout-dynamic-1.c: New test.

From-SVN: r238432
gcc/ChangeLog
gcc/cfgexpand.c
gcc/explow.c
gcc/explow.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/stack-layout-dynamic-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/stack-usage-2.c
gcc/testsuite/gcc.target/s390/warn-dynamicstack-1.c [new file with mode: 0644]