]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Come up with the flag -fipa-stack-alignment.
authormarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 9 Nov 2018 15:05:40 +0000 (15:05 +0000)
committermarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 9 Nov 2018 15:05:40 +0000 (15:05 +0000)
2018-11-09  Martin Liska  <mliska@suse.cz>

* common.opt: Add -fipa-stack-alignment flag.
* doc/invoke.texi: Document it.
* final.c (rest_of_clean_state): Guard stack
shrinking with flag.
2018-11-09  Martin Liska  <mliska@suse.cz>

* gcc.target/i386/ipa-stack-alignment.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@265970 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/common.opt
gcc/doc/invoke.texi
gcc/final.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/ipa-stack-alignment.c [new file with mode: 0644]

index 6a30303c99bfa2b499985974738f90349db928a1..107dbcd9f77f9f9f8ef618397f903533c2b7ba14 100644 (file)
@@ -1,3 +1,10 @@
+2018-11-09  Martin Liska  <mliska@suse.cz>
+
+       * common.opt: Add -fipa-stack-alignment flag.
+       * doc/invoke.texi: Document it.
+       * final.c (rest_of_clean_state): Guard stack
+       shrinking with flag.
+
 2018-11-09  Martin Liska  <mliska@suse.cz>
 
        * cgraph.h (ipa_discover_readonly_nonaddressable_vars): Rename
index cba516e7c6e80a8b5977d412ca37bd9fad4e2754..98e8eb03ef35073b6424ebccd00f31f149acd594 100644 (file)
@@ -1728,6 +1728,10 @@ fipa-reference-addressable
 Common Report Var(flag_ipa_reference_addressable) Init(0) Optimization
 Discover read-only, write-only and non-addressable static 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.
index e510fefe64b14ee04195a7f03eddf30874734922..4ea93a7b5cb52d01d9c5392149197e13000724a6 100644 (file)
@@ -414,7 +414,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
@@ -8917,6 +8917,11 @@ Enabled by default at @option{-O} and higher.
 Discover read-only, write-only and non-addressable static 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
index 6e61f1e17a8edba349a325759d26ca90f99c9c19..0c1ac625f37a087c74c34401f02f2a4efacaddc7 100644 (file)
@@ -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)
index 6dd28ffb7e8d4cc6a11692239b0fd0b2fef326ad..0e257c3e6b0ff9dd691d28dedabf78f95b3d1f1d 100644 (file)
@@ -1,3 +1,7 @@
+2018-11-09  Martin Liska  <mliska@suse.cz>
+
+       * gcc.target/i386/ipa-stack-alignment.c: New test.
+
 2018-11-09  Martin Liska  <mliska@suse.cz>
 
        * gcc.dg/tree-ssa/writeonly-2.c: New test.
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 (file)
index 0000000..1176b59
--- /dev/null
@@ -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" } } */