From ee912514f61ec2c4d126cf6d43b69d01a08886c8 Mon Sep 17 00:00:00 2001 From: marxin Date: Wed, 7 Nov 2018 13:47:40 +0100 Subject: [PATCH 2/2] Come up with the flag -fipa-stack-alignment. gcc/ChangeLog: 2018-11-07 Martin Liska * common.opt: Add -fipa-stack-alignment flag. * doc/invoke.texi: Document it. * final.c (rest_of_clean_state): Guard stack shrinking with flag. gcc/testsuite/ChangeLog: 2018-11-07 Martin Liska * gcc.target/i386/ipa-stack-alignment.c: New test. --- gcc/common.opt | 4 ++++ gcc/doc/invoke.texi | 7 ++++++- gcc/final.c | 3 ++- gcc/testsuite/gcc.target/i386/ipa-stack-alignment.c | 13 +++++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/ipa-stack-alignment.c diff --git a/gcc/common.opt b/gcc/common.opt index 6a64b0e27d5..6ee48fbcfc4 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -1724,6 +1724,10 @@ fipa-reference-addressable Common Report Var(flag_ipa_reference_addressable) Init(0) Optimization Discover read-only and write-only addressable variables. +fipa-stack-alignment +Common Report Var(flag_ipa_stack_alignment) Init(1) Optimization +Reduce stack alignment on call sites if possible. + fipa-matrix-reorg Common Ignore Does nothing. Preserved for backward compatibility. diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 82c6fa913e8..2332e643993 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -413,7 +413,7 @@ Objective-C and Objective-C++ Dialects}. -finline-small-functions -fipa-cp -fipa-cp-clone @gol -fipa-bit-cp -fipa-vrp @gol -fipa-pta -fipa-profile -fipa-pure-const -fipa-reference -fipa-reference-addressable @gol --fipa-icf -fira-algorithm=@var{algorithm} @gol +-fipa-stack-alignment -fipa-icf -fira-algorithm=@var{algorithm} @gol -fira-region=@var{region} -fira-hoist-pressure @gol -fira-loop-pressure -fno-ira-share-save-slots @gol -fno-ira-share-spill-slots @gol @@ -8901,6 +8901,11 @@ Enabled by default at @option{-O} and higher. Discover read-only and write-only addressable variables. Enabled by default at @option{-O} and higher. +@item -fipa-stack-alignment +@opindex fipa-stack-alignment +Reduce stack alignment on call sites if possible. +Enabled by default. + @item -fipa-pta @opindex fipa-pta Perform interprocedural pointer analysis and interprocedural modification diff --git a/gcc/final.c b/gcc/final.c index 6e61f1e17a8..0c1ac625f37 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -4890,7 +4890,8 @@ rest_of_clean_state (void) /* We can reduce stack alignment on call site only when we are sure that the function body just produced will be actually used in the final executable. */ - if (decl_binds_to_current_def_p (current_function_decl)) + if (flag_ipa_stack_alignment + && decl_binds_to_current_def_p (current_function_decl)) { unsigned int pref = crtl->preferred_stack_boundary; if (crtl->stack_alignment_needed > crtl->preferred_stack_boundary) diff --git a/gcc/testsuite/gcc.target/i386/ipa-stack-alignment.c b/gcc/testsuite/gcc.target/i386/ipa-stack-alignment.c new file mode 100644 index 00000000000..1176b59aa5f --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/ipa-stack-alignment.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-fno-ipa-stack-alignment -O" } */ + +typedef struct { + long a; + long b[]; +} c; + +c *d; +void e() { d->b[0] = 5; } +void f() { e(); } + +/* { dg-final { scan-assembler "sub.*%.sp" } } */ -- 2.19.1