Patchwork [ARM] Avoid enlarged alignment when optimizing for size

login
register
mail settings
Submitter Chung-Lin Tang
Date Oct. 12, 2010, 11:47 a.m.
Message ID <4CB44AD2.7090707@codesourcery.com>
Download mbox | patch
Permalink /patch/67542/
State New
Headers show

Comments

Chung-Lin Tang - Oct. 12, 2010, 11:47 a.m.
> I think this comment needs updating. i.e. increasing the alignment tends to
> introduce padding, so don't do this when optimizing for size.
>
> Other than that, ok.
>
> In theory we could try and be smarter. e.g. still align multiple-of-4 sized
> objects, treating readonly/initialized data differently (i.e. where it doesn't
> effect runtime init code). In practice I doubt it's worth the hassle, and you
> still won't please everyone.

Yeah, and here the macros only receive the tree type; does not seem 
convenient to do that kind of differentiation at this place.

Here's the patch with updated comments, I commit it in a few hours 
unless you feel the wording needs fixing.

Thanks,
Chung-Lin

	* config/arm/arm.h (ARM_EXPAND_ALIGNMENT): Rename from
	DATA_ALIGNMENT and add COND parameter. Update comments above.
	(DATA_ALIGNMENT): Use ARM_EXPAND_ALIGNMENT, with !optimize_size.
	(LOCAL_ALIGNMENT): Use ARM_EXPAND_ALIGNMENT, with
	!flag_conserve_stack.

Patch

Index: arm.h
===================================================================
--- arm.h	(revision 165361)
+++ arm.h	(working copy)
@@ -617,15 +617,21 @@ 
 /* 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.  */
-#define DATA_ALIGNMENT(EXP, ALIGN)					\
-  ((((ALIGN) < BITS_PER_WORD)                                           \
+   definition. Increasing the alignment tends to introduce padding,
+   so don't do this when optimizing for size/conserving stack space. */
+#define ARM_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)			\
+  ARM_EXPAND_ALIGNMENT(!optimize_size, EXP, ALIGN)
+
 /* Similarly, make sure that objects on the stack are sensibly aligned.  */
-#define LOCAL_ALIGNMENT(EXP, ALIGN) DATA_ALIGNMENT(EXP, ALIGN)
+#define LOCAL_ALIGNMENT(EXP, ALIGN)				\
+  ARM_EXPAND_ALIGNMENT(!flag_conserve_stack, EXP, ALIGN)
 
 /* Setting STRUCTURE_SIZE_BOUNDARY to 32 produces more efficient code, but the
    value set in previous versions of this toolchain was 8, which pro