aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilco Dijkstra <wdijkstr@arm.com>2017-09-05 13:27:58 +0000
committerWilco Dijkstra <wilco@gcc.gnu.org>2017-09-05 13:27:58 +0000
commitae85ad3a95d6df3c4131d02fd327809a29d10b33 (patch)
tree7280c7e1c75597c2c29f62ff781b46e1369249c9
parent54c430044ba9a35a590e591108b184535eba5763 (diff)
downloadgcc-ae85ad3a95d6df3c4131d02fd327809a29d10b33.zip
gcc-ae85ad3a95d6df3c4131d02fd327809a29d10b33.tar.gz
gcc-ae85ad3a95d6df3c4131d02fd327809a29d10b33.tar.bz2
Improve alloca alignment
This patch improves alloca alignment. Currently alloca reserves too much space as it aligns twice, and generates unnecessary stack alignment code. When the requested alignment is lower than the stack alignment, no extra alignment is needed. If the requested alignment is higher, we need to increase the size by the difference of the requested alignment and the stack alignment. As a result, the alloca alignment is exactly as expected: alloca (16): sub sp, sp, #16 mov x1, sp alloca (x): add x0, x0, 15 and x0, x0, -16 sub sp, sp, x0 mov x0, sp __builtin_alloca_with_align (x, 512): add x0, x0, 63 and x0, x0, -16 sub sp, sp, x0 add x0, sp, 63 and x0, x0, -64 gcc/ * explow.c (get_dynamic_stack_size): Improve dynamic alignment. From-SVN: r251713
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/explow.c21
2 files changed, 17 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7f5b384..58d1629 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2017-09-05 Wilco Dijkstra <wdijkstr@arm.com>
+
+ * explow.c (get_dynamic_stack_size): Improve dynamic alignment.
+
2017-09-05 Richard Biener <rguenther@suse.de>
PR tree-optimization/82084
diff --git a/gcc/explow.c b/gcc/explow.c
index 13736a5..638dc5f 100644
--- a/gcc/explow.c
+++ b/gcc/explow.c
@@ -1240,15 +1240,20 @@ get_dynamic_stack_size (rtx *psize, unsigned size_align,
example), so we must preventively align the value. We leave space
in SIZE for the hole that might result from the alignment operation. */
- extra = (required_align - BITS_PER_UNIT) / BITS_PER_UNIT;
- size = plus_constant (Pmode, size, extra);
- size = force_operand (size, NULL_RTX);
-
- if (flag_stack_usage_info && pstack_usage_size)
- *pstack_usage_size += extra;
+ /* Since the stack is presumed to be aligned before this allocation,
+ we only need to increase the size of the allocation if the required
+ alignment is more than the stack alignment. */
+ if (required_align > STACK_BOUNDARY)
+ {
+ extra = (required_align - STACK_BOUNDARY) / BITS_PER_UNIT;
+ size = plus_constant (Pmode, size, extra);
+ size = force_operand (size, NULL_RTX);
+ if (size_align > STACK_BOUNDARY)
+ size_align = STACK_BOUNDARY;
- if (extra && size_align > BITS_PER_UNIT)
- size_align = BITS_PER_UNIT;
+ if (flag_stack_usage_info && pstack_usage_size)
+ *pstack_usage_size += extra;
+ }
/* Round the size to a multiple of the required stack alignment.
Since the stack is presumed to be rounded before this allocation,