From 7072df0aae0c59ae437e5cc28e4e5e5777e930ba Mon Sep 17 00:00:00 2001 From: Dominik Vogt Date: Mon, 18 Jul 2016 13:10:27 +0000 Subject: 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 * 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 * 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/explow.h | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'gcc/explow.h') diff --git a/gcc/explow.h b/gcc/explow.h index 52113db..e12f90c 100644 --- a/gcc/explow.h +++ b/gcc/explow.h @@ -87,6 +87,14 @@ extern void record_new_stack_level (void); /* Allocate some space on the stack dynamically and return its address. */ extern rtx allocate_dynamic_stack_space (rtx, unsigned, unsigned, bool); +/* Calculate the necessary size of a constant dynamic stack allocation from the + size of the variable area. */ +extern void get_dynamic_stack_size (rtx *, unsigned, unsigned, HOST_WIDE_INT *); + +/* Returns the address of the dynamic stack space without allocating it. */ +extern rtx get_dynamic_stack_base (HOST_WIDE_INT offset, + unsigned required_align); + /* Emit one stack probe at ADDRESS, an address within the stack. */ extern void emit_stack_probe (rtx); -- cgit v1.1