re PR middle-end/47735 (Unnecessary adjustments to stack pointer)
authorJakub Jelinek <jakub@redhat.com>
Thu, 9 Jan 2014 20:12:36 +0000 (21:12 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 9 Jan 2014 20:12:36 +0000 (21:12 +0100)
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

gcc/ChangeLog
gcc/cfgexpand.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr47735.c [new file with mode: 0644]

index 7d000f2..c87697f 100644 (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
index 5f14d81..c0cbeb3 100644 (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)));
index d6a7a01..0957d84 100644 (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.
diff --git a/gcc/testsuite/gcc.target/i386/pr47735.c b/gcc/testsuite/gcc.target/i386/pr47735.c
new file mode 100644 (file)
index 0000000..0d44df4
--- /dev/null
@@ -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" } } */