[PATCH 4.5]: Fix PR39146 unneccesary stack realign

H.J. Lu hjl.tools@gmail.com
Tue Mar 3 17:36:00 GMT 2009


On Tue, Mar 3, 2009 at 6:55 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> - Show quoted text -
> On Mon, Mar 2, 2009 at 10:10 PM, Ye, Joey <joey.ye@intel.com> wrote:
>> Update testcase. OK for 4.5?
>>
>> Please move it to gcc.target/i386/stackalign and remove
>
> I think this test belongs to gcc.target/i386/stackalign. But
> it isn't that important.
>
>>
>> /* { dg-require-effective-target lp64 } */
>
> You didn't remove this. This test should be run for 32bit.
>
>> You can use
>>
>> /* { dg-final { scan-assembler-not "and\[lq\]?\[\\t \]*\\$-32,\[\\t
>> \]*%\[re\]?sp" } } */
>>
>>
>
> I think
>
> /* { dg-final { scan-assembler-not "and\[lq\]?\[^\\n\]*-32,\[^\\n\]*sp" } } */
>
> will work for Windows.

Here is the revised patch. We should set max_used_stack_slot_alignmen
to actual alignment used.  Also there is no need to update for alignment
of argument on stack since it will be properly aligned by caller.  OK for
4.5 if there are regressions on Linux/ia32, Linux/ia64 and Linux/x86-64?

Thanks.

-- 
H.J.
---
gcc/

2009-03-03  Joey Ye  <joey.ye@intel.com>

	PR middle-end/39146
	* cfgexpand.c (get_decl_align_unit): Update
	max_used_stack_slot_alignment with align instead of
	stack_alignment_needed.

	* function.c (assign_stack_local_1): Update
	max_used_stack_slot_alignment with alignment_in_bits instead
	of stack_alignment_needed.
	(locate_and_pad_parm): Don't update max_used_stack_slot_alignment
	here.

gcc/testsuite/

2009-03-03  Joey Ye  <joey.ye@intel.com>
	    H.J. Lu  <hongjiu.lu@intel.com>

	PR middle-end/39146
	* gcc.target/i386/stackalign/pr39146.c: New.
-------------- next part --------------
gcc/

2009-03-03  Joey Ye  <joey.ye@intel.com>

	PR middle-end/39146
	* cfgexpand.c (get_decl_align_unit): Update
	max_used_stack_slot_alignment with align instead of
	stack_alignment_needed.

	* function.c (assign_stack_local_1): Update
	max_used_stack_slot_alignment with alignment_in_bits instead
	of stack_alignment_needed.
	(locate_and_pad_parm): Don't update max_used_stack_slot_alignment
	here.

gcc/testsuite/

2009-03-03  Joey Ye  <joey.ye@intel.com>
	    H.J. Lu  <hongjiu.lu@intel.com>

	PR middle-end/39146
	* gcc.target/i386/stackalign/pr39146.c: New.

Index: gcc/function.c
===================================================================
--- gcc/function.c	(revision 144337)
+++ gcc/function.c	(revision 144338)
@@ -357,8 +357,8 @@ assign_stack_local_1 (enum machine_mode 
 
   if (crtl->stack_alignment_needed < alignment_in_bits)
     crtl->stack_alignment_needed = alignment_in_bits;
-  if (crtl->max_used_stack_slot_alignment < crtl->stack_alignment_needed)
-    crtl->max_used_stack_slot_alignment = crtl->stack_alignment_needed;
+  if (crtl->max_used_stack_slot_alignment < alignment_in_bits)
+    crtl->max_used_stack_slot_alignment = alignment_in_bits;
 
   /* Calculate how many bytes the start of local variables is off from
      stack alignment.  */
@@ -3498,8 +3498,6 @@ locate_and_pad_parm (enum machine_mode p
      calling function side.  */
   if (crtl->stack_alignment_needed < boundary)
     crtl->stack_alignment_needed = boundary;
-  if (crtl->max_used_stack_slot_alignment < crtl->stack_alignment_needed)
-    crtl->max_used_stack_slot_alignment = crtl->stack_alignment_needed;
   if (crtl->preferred_stack_boundary < boundary)
     crtl->preferred_stack_boundary = boundary;
 
Index: gcc/cfgexpand.c
===================================================================
--- gcc/cfgexpand.c	(revision 144337)
+++ gcc/cfgexpand.c	(revision 144338)
@@ -507,8 +507,8 @@ get_decl_align_unit (tree decl)
      So here we only make sure stack_alignment_needed >= align.  */
   if (crtl->stack_alignment_needed < align)
     crtl->stack_alignment_needed = align;
-  if (crtl->max_used_stack_slot_alignment < crtl->stack_alignment_needed)
-    crtl->max_used_stack_slot_alignment = crtl->stack_alignment_needed;
+  if (crtl->max_used_stack_slot_alignment < align)
+    crtl->max_used_stack_slot_alignment = align;
 
   return align / BITS_PER_UNIT;
 }
Index: gcc/testsuite/gcc.target/i386/stackalign/pr39146.c
===================================================================
--- gcc/testsuite/gcc.target/i386/stackalign/pr39146.c	(revision 0)
+++ gcc/testsuite/gcc.target/i386/stackalign/pr39146.c	(revision 144577)
@@ -0,0 +1,13 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-O2 -mavx" } */
+
+typedef long long __m256i __attribute__ ((__vector_size__ (32), __may_alias__));
+
+
+__m256i
+bar (__m256i x)
+{
+  return x;
+}
+
+/* { dg-final { scan-assembler-not "and\[lq\]?\[^\\n\]*-32,\[^\\n\]*sp" } } */


More information about the Gcc-patches mailing list