re PR middle-end/47735 (Unnecessary adjustments to stack pointer)

PR middle-end/47735
	* cfgexpand.c (expand_one_var): For SSA_NAMEs, if the underlying
	var satisfies use_register_for_decl, just take into account type
	alignment, rather than decl alignment.

	* gcc.target/i386/pr47735.c: New test.

From-SVN: r206493
This commit is contained in:
Jakub Jelinek 2014-01-09 21:12:36 +01:00 committed by Jakub Jelinek
parent a70e9985fd
commit 3396aba538
4 changed files with 29 additions and 2 deletions

View File

@ -1,5 +1,10 @@
2014-01-09 Jakub Jelinek <jakub@redhat.com>
PR middle-end/47735
* cfgexpand.c (expand_one_var): For SSA_NAMEs, if the underlying
var satisfies use_register_for_decl, just take into account type
alignment, rather than decl alignment.
PR tree-optimization/59622
* gimple-fold.c (gimple_fold_call): Fix a typo in message. For
__builtin_unreachable replace the OBJ_TYPE_REF call with a call to

View File

@ -1215,8 +1215,11 @@ expand_one_var (tree var, bool toplevel, bool really_expand)
we conservatively assume it will be on stack even if VAR is
eventually put into register after RA pass. For non-automatic
variables, which won't be on stack, we collect alignment of
type and ignore user specified alignment. */
if (TREE_STATIC (var) || DECL_EXTERNAL (var))
type and ignore user specified alignment. Similarly for
SSA_NAMEs for which use_register_for_decl returns true. */
if (TREE_STATIC (var)
|| DECL_EXTERNAL (var)
|| (TREE_CODE (origvar) == SSA_NAME && use_register_for_decl (var)))
align = MINIMUM_ALIGNMENT (TREE_TYPE (var),
TYPE_MODE (TREE_TYPE (var)),
TYPE_ALIGN (TREE_TYPE (var)));

View File

@ -1,5 +1,8 @@
2014-01-09 Jakub Jelinek <jakub@redhat.com>
PR middle-end/47735
* gcc.target/i386/pr47735.c: New test.
PR tree-optimization/59622
* g++.dg/opt/pr59622-2.C: New test.
* g++.dg/opt/pr59622-3.C: New test.

View File

@ -0,0 +1,16 @@
/* PR middle-end/47735 */
/* { dg-do compile } */
/* { dg-options "-O2 -fomit-frame-pointer" } */
unsigned
mulh (unsigned a, unsigned b)
{
unsigned long long l __attribute__ ((aligned (32)))
= ((unsigned long long) a * (unsigned long long) b) >> 32;
return l;
}
/* No need to dynamically realign the stack here. */
/* { dg-final { scan-assembler-not "and\[^\n\r]*%\[re\]sp" } } */
/* Nor use a frame pointer. */
/* { dg-final { scan-assembler-not "%\[re\]bp" } } */