aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2012-08-02 20:28:36 -0700
committerRichard Henderson <rth@gcc.gnu.org>2012-08-02 20:28:36 -0700
commit34831f3e27748ea41fe976de0e9a2ead29059878 (patch)
treeb5d9d7cd2065f71046fd8b930903596b2c603b72 /gcc
parent6e48db73ed88eeb3e1025b28aa49c4f5ee4f3a76 (diff)
downloadgcc-34831f3e27748ea41fe976de0e9a2ead29059878.zip
gcc-34831f3e27748ea41fe976de0e9a2ead29059878.tar.gz
gcc-34831f3e27748ea41fe976de0e9a2ead29059878.tar.bz2
Revert "PR 34548"
This reverts commit 190051. From-SVN: r190110
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog19
-rw-r--r--gcc/cfgexpand.c1
-rw-r--r--gcc/explow.c55
-rw-r--r--gcc/function.c7
-rw-r--r--gcc/function.h4
5 files changed, 47 insertions, 39 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6763f95..28a2c86 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2012-08-02 Richard Henderson <rth@redhat.com>
+
+ Revert:
+ PR 34548
+ * function.h (struct rtl_data): Add max_dynamic_stack_alignment.
+ * cfgexpand.c (gimple_expand_cfg): Initialise it.
+ * explow.c (allocate_dynamic_stack_space): Set it. Simplify
+ alignment requirements given the known alignment of dynamic_offset.
+ * function.c (instantiate_virtual_regs): Align dtnamic_offset.
+
2012-08-02 Kenneth Zadeck <zadeck@naturalbridge.com>
* cfgexpand.c (expand_debug_locations): Encapsulate test for
@@ -391,15 +401,6 @@
2012-08-01 Richard Henderson <rth@redhat.com>
- PR middle-end/34548
- * function.h (struct rtl_data): Add max_dynamic_stack_alignment.
- * cfgexpand.c (gimple_expand_cfg): Initialise it.
- * explow.c (allocate_dynamic_stack_space): Set it. Simplify
- alignment requirements given the known alignment of dynamic_offset.
- * function.c (instantiate_virtual_regs): Align dtnamic_offset.
-
-2012-08-01 Richard Henderson <rth@redhat.com>
-
* expmed.h (NUM_MODE_PARTIAL_INT): New.
(NUM_MODE_VECTOR_INT, NUM_MODE_IP_INT, NUM_MODE_IPV_INT): New.
(struct expmed_op_cheap): Size one array on NUM_MODE_IPV_INT.
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index 00e5e4d..e5e26e3 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -4356,7 +4356,6 @@ gimple_expand_cfg (void)
crtl->max_used_stack_slot_alignment = STACK_BOUNDARY;
crtl->stack_alignment_estimated = 0;
crtl->preferred_stack_boundary = STACK_BOUNDARY;
- crtl->max_dynamic_stack_alignment = 0;
cfun->cfg->max_jumptable_ents = 0;
/* Resovle the function section. Some targets, like ARM EABI rely on knowledge
diff --git a/gcc/explow.c b/gcc/explow.c
index c7581b0..1cfe93b 100644
--- a/gcc/explow.c
+++ b/gcc/explow.c
@@ -1173,6 +1173,7 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
{
HOST_WIDE_INT stack_usage_size = -1;
rtx final_label, final_target, target;
+ unsigned extra_align = 0;
bool must_align;
/* If we're asking for zero bytes, it doesn't matter what we point
@@ -1236,40 +1237,58 @@ allocate_dynamic_stack_space (rtx size, unsigned size_align,
else if (size_align < BITS_PER_UNIT)
size_align = BITS_PER_UNIT;
+ /* We can't attempt to minimize alignment necessary, because we don't
+ know the final value of preferred_stack_boundary yet while executing
+ this code. */
+ if (crtl->preferred_stack_boundary < PREFERRED_STACK_BOUNDARY)
+ crtl->preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
+
/* We will need to ensure that the address we return is aligned to
- REQUIRED_ALIGN. If that alignment is no larger than
- PREFERRED_STACK_BOUNDARY, we can handle everything without an
- explicit alignment. */
- if (required_align <= PREFERRED_STACK_BOUNDARY)
+ REQUIRED_ALIGN. If STACK_DYNAMIC_OFFSET is defined, we don't
+ always know its final value at this point in the compilation (it
+ might depend on the size of the outgoing parameter lists, for
+ example), so we must align the value to be returned in that case.
+ (Note that STACK_DYNAMIC_OFFSET will have a default nonzero value if
+ STACK_POINTER_OFFSET or ACCUMULATE_OUTGOING_ARGS are defined).
+ We must also do an alignment operation on the returned value if
+ the stack pointer alignment is less strict than REQUIRED_ALIGN.
+
+ If we have to align, we must leave space in SIZE for the hole
+ that might result from the alignment operation. */
+
+ must_align = (crtl->preferred_stack_boundary < required_align);
+ if (must_align)
{
- if (crtl->preferred_stack_boundary < required_align)
- crtl->preferred_stack_boundary = required_align;
- if (crtl->max_dynamic_stack_alignment < required_align)
- crtl->max_dynamic_stack_alignment = required_align;
- must_align = false;
+ if (required_align > PREFERRED_STACK_BOUNDARY)
+ extra_align = PREFERRED_STACK_BOUNDARY;
+ else if (required_align > STACK_BOUNDARY)
+ extra_align = STACK_BOUNDARY;
+ else
+ extra_align = BITS_PER_UNIT;
}
- else
- {
- unsigned extra, extra_align;
- crtl->preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
- crtl->max_dynamic_stack_alignment = PREFERRED_STACK_BOUNDARY;
+ /* ??? STACK_POINTER_OFFSET is always defined now. */
+#if defined (STACK_DYNAMIC_OFFSET) || defined (STACK_POINTER_OFFSET)
+ must_align = true;
+ extra_align = BITS_PER_UNIT;
+#endif
- extra_align = PREFERRED_STACK_BOUNDARY;
- extra = (required_align - extra_align) / BITS_PER_UNIT;
+ if (must_align)
+ {
+ unsigned extra = (required_align - extra_align) / BITS_PER_UNIT;
size = plus_constant (Pmode, size, extra);
size = force_operand (size, NULL_RTX);
if (flag_stack_usage_info)
stack_usage_size += extra;
+
if (extra && size_align > extra_align)
size_align = extra_align;
- must_align = true;
}
/* Round the size to a multiple of the required stack alignment.
- Since the stack is presumed to be rounded before this allocation,
+ Since the stack if presumed to be rounded before this allocation,
this will maintain the required alignment.
If the stack grows downward, we could save an insn by subtracting
diff --git a/gcc/function.c b/gcc/function.c
index 827f687..f1e0b2d3 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -1892,14 +1892,7 @@ instantiate_virtual_regs (void)
/* Compute the offsets to use for this function. */
in_arg_offset = FIRST_PARM_OFFSET (current_function_decl);
var_offset = STARTING_FRAME_OFFSET;
-
dynamic_offset = STACK_DYNAMIC_OFFSET (current_function_decl);
- if (crtl->max_dynamic_stack_alignment)
- {
- int align = crtl->max_dynamic_stack_alignment / BITS_PER_UNIT;
- dynamic_offset = (dynamic_offset + align - 1) & -align;
- }
-
out_arg_offset = STACK_POINTER_OFFSET;
#ifdef FRAME_POINTER_CFA_OFFSET
cfa_offset = FRAME_POINTER_CFA_OFFSET (current_function_decl);
diff --git a/gcc/function.h b/gcc/function.h
index ed6fcb1..3d3313f 100644
--- a/gcc/function.h
+++ b/gcc/function.h
@@ -347,10 +347,6 @@ struct GTY(()) rtl_data {
local stack. */
unsigned int stack_alignment_estimated;
- /* The (capped) maximum alignment of dynamic stack space, and thus the
- required alignment of STACK_DYNAMIC_OFFSET. */
- unsigned int max_dynamic_stack_alignment;
-
/* For reorg. */
/* If some insns can be deferred to the delay slots of the epilogue, the