On 12/10/2015 01:38 PM, Jan Beulich wrote:
* cfgexpand.c (expand_one_var): Exclude static and external
variables when adjusting stack alignment related state.
gcc/testsuite/
2015-12-10 Jan Beulich <jbeul...@suse.com>
* gcc.c-torture/execute/stkalign.c: New.
--- 2015-12-09/gcc/cfgexpand.c
+++ 2015-12-09/gcc/cfgexpand.c
@@ -1544,12 +1544,15 @@ static HOST_WIDE_INT
expand_one_var (tree var, bool toplevel, bool really_expand)
{
unsigned int align = BITS_PER_UNIT;
+ bool stack = true;
tree origvar = var;
var = SSAVAR (var);
if (TREE_TYPE (var) != error_mark_node && TREE_CODE (var) == VAR_DECL)
{
+ stack = !TREE_STATIC (var) && !DECL_EXTERNAL (var);
+
/* Because we don't know if VAR will be in register or on stack,
we conservatively assume it will be on stack even if VAR is
eventually put into register after RA pass. For non-automatic
@@ -1578,7 +1581,8 @@ expand_one_var (tree var, bool toplevel,
align = POINTER_SIZE;
}
- record_alignment_for_reg_var (align);
+ if (stack)
+ record_alignment_for_reg_var (align);
A bit further down we have
else if (DECL_EXTERNAL (var))
;
else if (DECL_HAS_VALUE_EXPR_P (var))
;
else if (TREE_STATIC (var))
;
[....]
return 0;
so I'm thinking the function doesn't do anything for DECL_EXTERNAL or
TREE_STATIC vars. You're still computing alignment for them but not
using it. I suggest just doing an early return for non-stack vars.
Bernd