[AArch64] Do not increase data alignment at -Os and with -fconserve-stack.
authorRamana Radhakrishnan <ramana.radhakrishnan@arm.com>
Wed, 28 Jun 2017 22:09:50 +0000 (22:09 +0000)
committerRamana Radhakrishnan <ramana@gcc.gnu.org>
Wed, 28 Jun 2017 22:09:50 +0000 (22:09 +0000)
We unnecessarily align data to 8 byte alignments even when -Os is
specified. This brings the logic in the AArch64 backend more in line
with the ARM backend and helps gain some image size in a few
places. Caught by an internal report on the size of rodata sections
being high with aarch64 gcc.

* config/aarch64/aarch64.h (AARCH64_EXPAND_ALIGNMENT): New.
  (DATA_ALIGNMENT): Update to use AARCH64_EXPAND_ALIGNMENT.
  (LOCAL_ALIGNMENT): Update to use AARCH64_EXPAND_ALIGNMENT.

Bootstrapped and regression tested on aarch64-none-linux-gnu with no
regressions.

From-SVN: r249764

gcc/ChangeLog
gcc/config/aarch64/aarch64.h

index c7523753620eeed7e465784de6fd875aceab3c77..5211806db14504a566e2812a4a4e53e1f83f3400 100644 (file)
@@ -1,3 +1,9 @@
+2017-06-28  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
+
+       * config/aarch64/aarch64.h (AARCH64_EXPAND_ALIGNMENT): New.
+       (DATA_ALIGNMENT): Update to use AARCH64_EXPAND_ALIGNMENT.
+       (LOCAL_ALIGNMENT): Update to use AARCH64_EXPAND_ALIGNMENT.
+
 2017-06-28  Sebastian Peryt  <sebastian.peryt@intel.com>
 
        * config/i386/avx512vlintrin.h (_mm256_permutexvar_epi64)
index 3b3f27e2f950235b052d463b4b4d355ab2b9d3f8..106cf3a56662d7f6466e2e29a42cc957b65ecf2a 100644 (file)
     && (ALIGN) < BITS_PER_WORD)                        \
    ? BITS_PER_WORD : ALIGN)
 
-#define DATA_ALIGNMENT(EXP, ALIGN)             \
-  ((((ALIGN) < BITS_PER_WORD)                  \
-    && (TREE_CODE (EXP) == ARRAY_TYPE          \
-       || TREE_CODE (EXP) == UNION_TYPE        \
-       || TREE_CODE (EXP) == RECORD_TYPE))     \
-   ? BITS_PER_WORD : (ALIGN))
-
-#define LOCAL_ALIGNMENT(EXP, ALIGN) DATA_ALIGNMENT(EXP, ALIGN)
+/* Align definitions of arrays, unions and structures so that
+   initializations and copies can be made more efficient.  This is not
+   ABI-changing, so it only affects places where we can see the
+   definition.  Increasing the alignment tends to introduce padding,
+   so don't do this when optimizing for size/conserving stack space.  */
+#define AARCH64_EXPAND_ALIGNMENT(COND, EXP, ALIGN)                     \
+  (((COND) && ((ALIGN) < BITS_PER_WORD)                                        \
+    && (TREE_CODE (EXP) == ARRAY_TYPE                                  \
+       || TREE_CODE (EXP) == UNION_TYPE                                \
+       || TREE_CODE (EXP) == RECORD_TYPE)) ? BITS_PER_WORD : (ALIGN))
+
+/* Align global data.  */
+#define DATA_ALIGNMENT(EXP, ALIGN)                     \
+  AARCH64_EXPAND_ALIGNMENT (!optimize_size, EXP, ALIGN)
+
+/* Similarly, make sure that objects on the stack are sensibly aligned.  */
+#define LOCAL_ALIGNMENT(EXP, ALIGN)                            \
+  AARCH64_EXPAND_ALIGNMENT (!flag_conserve_stack, EXP, ALIGN)
 
 #define STRUCTURE_SIZE_BOUNDARY                8