Patchwork [Revisedx2] Fix PR36502, PR42313 and PR44651

login
register
mail settings
Submitter Jack Howarth
Date Sept. 4, 2010, 9:19 p.m.
Message ID <20100904211922.GA13654@bromo.med.uc.edu>
Download mbox | patch
Permalink /patch/63808/
State New
Headers show

Comments

Jack Howarth - Sept. 4, 2010, 9:19 p.m.
This is the same patch as before updated to reflect the fact that it also fixes PR42313/target
and PR44651/target. The gcc.target/i386/builtin-unreachable.c testcase is restored to run on darwin.
  The attached patch solves PR36502, PR42313, and PR44651 eliminating the unnecessary stack 
operations, by defining STACK_BOUNDARY to BITS_PER_WORD except for profiling or the use of 
the MS_ABI at 64-bit and by replacing STACK_BOUNDARY with 128 in the MAX macro defining
PREFERRED_STACK_BOUNDARY. Eliminating the redefinition of MAIN_STACK_BOUNDARY enables stack
realignments so that the testcases for gcc.target/i386/stack-usage-realign.c and the
gcc.target/i386/builtin-unreachable.c can be run on darwin. The special adjustment for darwin
in gcc/testsuite/gcc.dg/stack-usage-1.c can also be dropped. Finally, a new test case for PR36502,
gcc.target/i386/pr36502.c, of unnecessary stack operations is added.

Bootstrap and regression tested on x86_64-apple-darwin10 in conjunction with the proposed fix for
PR45234 (http://gcc.gnu.org/ml/gcc-patches/2010-08/msg01916.html).

http://gcc.gnu.org/ml/gcc-testresults/2010-09/msg00259.html

Okay for gcc trunk?
         Jack


2010-09-04  H.J. Lu  <hjl.tools@gmail.com>
            Jack Howarth <howarth@bromo.med.uc.edu>

        PR 36502/target
	PR 42313/target
	PR 44651/target

        * gcc/config/i386/darwin.h (STACK_BOUNDARY): Redefine as 128 for profiling
        or 64-bit MS_ABI and as BITS_PER_WORD otherwise.
	(MAIN_STACK_BOUNDARY): Don't redefine.
        (PREFERRED_STACK_BOUNDARY): Replace STACK_BOUNDARY with 128 in MAX macro.
        * gcc.target/i386/pr36502.c: New test.
        * gcc.target/i386/stack-usage-realign.c: Don't skip on darwin.
	* gcc.target/i386/builtin-unreachable.c: Likewise.
        * gcc/testsuite/gcc.dg/stack-usage-1.c: Use default on i386/Darwin.

Patch

Index: gcc/testsuite/gcc.target/i386/stack-usage-realign.c
===================================================================
--- gcc/testsuite/gcc.target/i386/stack-usage-realign.c	(revision 163768)
+++ gcc/testsuite/gcc.target/i386/stack-usage-realign.c	(working copy)
@@ -1,6 +1,5 @@ 
 /* { dg-do compile } */
 /* { dg-require-effective-target ilp32 } */
-/* { dg-skip-if "no stack realignment" { *-*-darwin* } { "*" } { "" } } */
 /* { dg-options "-fstack-usage -msse2 -mforce-drap" } */
 
 typedef int __attribute__((vector_size(16))) vec;
Index: gcc/testsuite/gcc.dg/stack-usage-1.c
===================================================================
--- gcc/testsuite/gcc.dg/stack-usage-1.c	(revision 163768)
+++ gcc/testsuite/gcc.dg/stack-usage-1.c	(working copy)
@@ -8,11 +8,7 @@ 
    Then check that this is the actual stack usage in the assembly file.  */
 
 #if defined(__i386__)
-#  if defined (__MACH__)
-#    define SIZE 232
-#  else
-#    define SIZE 248
-#  endif
+#  define SIZE 248
 #elif defined(__x86_64__)
 #  define SIZE 356
 #elif defined (__sparc__)
Index: gcc/config/i386/darwin.h
===================================================================
--- gcc/config/i386/darwin.h	(revision 163768)
+++ gcc/config/i386/darwin.h	(working copy)
@@ -79,11 +79,10 @@ 
    Failure to ensure this will lead to a crash in the system libraries
    or dynamic loader.  */
 #undef STACK_BOUNDARY
-#define STACK_BOUNDARY 128
+#define STACK_BOUNDARY \
+ ((profile_flag || (TARGET_64BIT && ix86_abi == MS_ABI)) \
+  ? 128 : BITS_PER_WORD)
 
-#undef MAIN_STACK_BOUNDARY
-#define MAIN_STACK_BOUNDARY 128
-
 /* Since we'll never want a stack boundary less aligned than 128 bits
    we need the extra work here otherwise bits of gcc get very grumpy
    when we ask for lower alignment.  We could just reject values less
@@ -91,7 +90,7 @@ 
    it's below the minimum.  */
 #undef PREFERRED_STACK_BOUNDARY
 #define PREFERRED_STACK_BOUNDARY			\
-  MAX (STACK_BOUNDARY, ix86_preferred_stack_boundary)
+  MAX (128, ix86_preferred_stack_boundary)
 
 /* We want -fPIC by default, unless we're using -static to compile for
    the kernel or some such.  */
--- /dev/null	2010-09-01 11:08:32.000000000 -0400
+++ gcc/testsuite/gcc.target/i386/pr36502.c	2010-09-01 11:23:10.000000000 -0400
@@ -0,0 +1,7 @@ 
+/* PR target/36502 */
+/* { dg-do compile { target { *-*-darwin* && ilp32 } } } */
+/* { dg-options "-O -fomit-frame-pointer -fno-pic -S" } */
+int a;
+void f() {a++;}
+/* { dg-final { scan-assembler-not "esp" } } */
+
Index: gcc/testsuite/gcc.target/i386/builtin-unreachable.c
===================================================================
--- gcc/testsuite/gcc.target/i386/builtin-unreachable.c	(revision 163859)
+++ gcc/testsuite/gcc.target/i386/builtin-unreachable.c	(working copy)
@@ -9,5 +9,5 @@ 
     __builtin_unreachable ();
   return p ? 1 : 0;
 }
-/* { dg-final { scan-assembler-not "%e\[bs\]p" { target { ! *-*-darwin* } } } } */
+/* { dg-final { scan-assembler-not "%e\[bs\]p" } } */
 /* { dg-final { scan-assembler-not "\[\\t \]+j" } } */