OSDN Git Service

2010-03-30 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 30 Mar 2010 13:53:10 +0000 (13:53 +0000)
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 30 Mar 2010 13:53:10 +0000 (13:53 +0000)
* config/s390/s390.c (s390_emit_prologue): Omit issuing a dynamic
stack check if the mask would be zero.

2010-03-30  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

* gcc.target/s390/stackcheck1.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157825 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/s390/s390.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/stackcheck1.c [new file with mode: 0644]

index a033d48..3dae6a0 100644 (file)
@@ -1,3 +1,8 @@
+2010-03-30  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * config/s390/s390.c (s390_emit_prologue): Omit issuing a dynamic
+       stack check if the mask would be zero.
+
 2010-03-30  Seongbae Park <seongbae.park@gmail.com>
            Jack Howarth <howarth@bromo.med.uc.edu>
 
index 2f82f66..c2cf3d4 100644 (file)
@@ -7802,16 +7802,35 @@ s390_emit_prologue (void)
            }
          else
            {
-             HOST_WIDE_INT stack_check_mask = ((s390_stack_size - 1)
-                                               & ~(stack_guard - 1));
-             rtx t = gen_rtx_AND (Pmode, stack_pointer_rtx,
-                                  GEN_INT (stack_check_mask));
-             if (TARGET_64BIT)
-               emit_insn (gen_ctrapdi4 (gen_rtx_EQ (VOIDmode, t, const0_rtx),
-                                        t, const0_rtx, const0_rtx));
+             /* stack_guard has to be smaller than s390_stack_size.
+                Otherwise we would emit an AND with zero which would
+                not match the test under mask pattern.  */
+             if (stack_guard >= s390_stack_size)
+               {
+                 warning (0, "frame size of function %qs is "
+                          HOST_WIDE_INT_PRINT_DEC
+                          " bytes which is more than half the stack size. "
+                          "The dynamic check would not be reliable. "
+                          "No check emitted for this function.",
+                          current_function_name(),
+                          cfun_frame_layout.frame_size);
+               }
              else
-               emit_insn (gen_ctrapsi4 (gen_rtx_EQ (VOIDmode, t, const0_rtx),
-                                        t, const0_rtx, const0_rtx));
+               {
+                 HOST_WIDE_INT stack_check_mask = ((s390_stack_size - 1)
+                                                   & ~(stack_guard - 1));
+
+                 rtx t = gen_rtx_AND (Pmode, stack_pointer_rtx,
+                                      GEN_INT (stack_check_mask));
+                 if (TARGET_64BIT)
+                   emit_insn (gen_ctrapdi4 (gen_rtx_EQ (VOIDmode,
+                                                        t, const0_rtx),
+                                            t, const0_rtx, const0_rtx));
+                 else
+                   emit_insn (gen_ctrapsi4 (gen_rtx_EQ (VOIDmode,
+                                                        t, const0_rtx),
+                                            t, const0_rtx, const0_rtx));
+               }
            }
        }
 
index 34fc037..21738c2 100644 (file)
@@ -1,3 +1,7 @@
+2010-03-30  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * gcc.target/s390/stackcheck1.c: New testcase.
+
 2010-03-29  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libfortran/43265
diff --git a/gcc/testsuite/gcc.target/s390/stackcheck1.c b/gcc/testsuite/gcc.target/s390/stackcheck1.c
new file mode 100644 (file)
index 0000000..f588833
--- /dev/null
@@ -0,0 +1,14 @@
+/* The automatically chosen stack guard value caused an ICE in that
+   case.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -mstack-size=4096" } */
+
+extern void bar (char *);
+
+void
+foo ()
+{
+  char a[2500];
+  bar (a);
+}