common.opt (flimit-function-alignment): New.
authorBernd Schmidt <bernds@redhat.com>
Thu, 24 Nov 2016 12:54:56 +0000 (12:54 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Thu, 24 Nov 2016 12:54:56 +0000 (12:54 +0000)
gcc/
* common.opt (flimit-function-alignment): New.
* doc/invoke.texi (-flimit-function-alignment): Document.
* emit-rtl.h (struct rtl_data): Add max_insn_address field.
* final.c (shorten_branches): Set it.
* varasm.c (assemble_start_function): Limit alignment if
requested.

gcc/testsuite/
* gcc.target/i386/align-limit.c: New test.

From-SVN: r242836

gcc/ChangeLog
gcc/common.opt
gcc/doc/invoke.texi
gcc/emit-rtl.h
gcc/final.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/align-limit.c [new file with mode: 0644]
gcc/varasm.c

index 1676fe100d1017c0a1a78a73f72ba2cd0769eb0e..92c2c9e00155c53f539fb6b8d3e5a0d914c3e400 100644 (file)
@@ -1,3 +1,12 @@
+2016-11-24  Bernd Schmidt  <bschmidt@redhat.com>
+
+       * common.opt (flimit-function-alignment): New.
+       * doc/invoke.texi (-flimit-function-alignment): Document.
+       * emit-rtl.h (struct rtl_data): Add max_insn_address field.
+       * final.c (shorten_branches): Set it.
+       * varasm.c (assemble_start_function): Limit alignment if
+       requested.
+
 2016-11-24  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/71595
index d7ccf3b1a90a1274b005ea916d510cbeda12fefd..b350b07b9d8cfc99f9a9b0c16517c3dfefc7382c 100644 (file)
@@ -924,6 +924,9 @@ Align the start of functions.
 falign-functions=
 Common RejectNegative Joined UInteger Var(align_functions)
 
+flimit-function-alignment
+Common Report Var(flag_limit_function_alignment) Optimization Init(0)
+
 falign-jumps
 Common Report Var(align_jumps,0) Optimization UInteger
 Align labels which are only reached by jumping.
index 22f539d440725c005e7b7b5260043cf7d994ecb4..34c7187e46dfd9dd04fea7b30b428145a0db69bb 100644 (file)
@@ -373,7 +373,7 @@ Objective-C and Objective-C++ Dialects}.
 -fno-ira-share-spill-slots @gol
 -fisolate-erroneous-paths-dereference -fisolate-erroneous-paths-attribute @gol
 -fivopts -fkeep-inline-functions -fkeep-static-functions @gol
--fkeep-static-consts -flive-range-shrinkage @gol
+-fkeep-static-consts -flimit-function-alignment -flive-range-shrinkage @gol
 -floop-block -floop-interchange -floop-strip-mine @gol
 -floop-unroll-and-jam -floop-nest-optimize @gol
 -floop-parallelize-all -flra-remat -flto -flto-compression-level @gol
@@ -8513,6 +8513,12 @@ If @var{n} is not specified or is zero, use a machine-dependent default.
 
 Enabled at levels @option{-O2}, @option{-O3}.
 
+@item -flimit-function-alignment
+If this option is enabled, the compiler tries to avoid unnecessarily
+overaligning functions. It attempts to instruct the assembler to align
+by the amount specified by @option{-falign-functions}, but not to
+skip more bytes than the size of the function.
+
 @item -falign-labels
 @itemx -falign-labels=@var{n}
 @opindex falign-labels
index 0a242b1234d31a025d1158a5587b2604b544b5d6..a919bf072ab56e4557e83213d75bc76d08ae1b47 100644 (file)
@@ -288,6 +288,9 @@ struct GTY(()) rtl_data {
      to eliminable regs (like the frame pointer) are set if an asm
      sets them.  */
   HARD_REG_SET asm_clobbers;
+
+  /* The highest address seen during shorten_branches.  */
+  int max_insn_address;
 };
 
 #define return_label (crtl->x_return_label)
index d3a53c3cbe6b51af9035d32f89bcb18b11221c91..91acb01d96b196c69477e1abd2c0ec09e6af097f 100644 (file)
@@ -1463,7 +1463,7 @@ shorten_branches (rtx_insn *first)
       if (!increasing)
        break;
     }
-
+  crtl->max_insn_address = insn_current_address;
   free (varying_length);
 }
 
index 300106c19ffb6468556cb6e74bde3f2eee48d6df..694e59dfd0fa105b3e3e4780fb9bc543ba70872c 100644 (file)
@@ -1,3 +1,7 @@
+2016-11-24  Bernd Schmidt  <bschmidt@redhat.com>
+
+       * gcc.target/i386/align-limit.c: New test.
+
 2016-11-24  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/71595
diff --git a/gcc/testsuite/gcc.target/i386/align-limit.c b/gcc/testsuite/gcc.target/i386/align-limit.c
new file mode 100644 (file)
index 0000000..e34baf0
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -falign-functions=64 -flimit-function-alignment" } */
+/* { dg-final { scan-assembler ".p2align 6,,1" } } */
+/* { dg-final { scan-assembler-not ".p2align 6,,63" } } */
+
+void
+test_func (void)
+{
+}
index 2a20f64d6677541e0d745e11e95fe5b869724673..54e06acd542a3bec18ef7cd488b8ec3a97a32c48 100644 (file)
@@ -1791,9 +1791,14 @@ assemble_start_function (tree decl, const char *fnname)
       && align_functions_log > align
       && optimize_function_for_speed_p (cfun))
     {
+      int align_log = align_functions_log;
+      int max_skip = align_functions - 1;
+      if (flag_limit_function_alignment && crtl->max_insn_address > 0
+         && max_skip >= crtl->max_insn_address)
+       max_skip = crtl->max_insn_address - 1;
+
 #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
-      ASM_OUTPUT_MAX_SKIP_ALIGN (asm_out_file,
-                                align_functions_log, align_functions - 1);
+      ASM_OUTPUT_MAX_SKIP_ALIGN (asm_out_file, align_log, max_skip);
 #else
       ASM_OUTPUT_ALIGN (asm_out_file, align_functions_log);
 #endif