aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Krebbel <Andreas.Krebbel@de.ibm.com>2010-03-30 13:53:10 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2010-03-30 13:53:10 +0000
commita3e7e012bf455a184a521162aa9ec8856a1e3622 (patch)
tree5d882f52e9f05f24e25574be825ca4c24ef599b5
parent40ae6799329ad23721e9e0c6bf3b2347e0d3bb05 (diff)
downloadgcc-a3e7e012bf455a184a521162aa9ec8856a1e3622.zip
gcc-a3e7e012bf455a184a521162aa9ec8856a1e3622.tar.gz
gcc-a3e7e012bf455a184a521162aa9ec8856a1e3622.tar.bz2
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> * 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. From-SVN: r157825
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/s390/s390.c37
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/s390/stackcheck1.c14
4 files changed, 51 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a033d48..3dae6a0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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>
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 2f82f66..c2cf3d4 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -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));
+ }
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 34fc037..21738c2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..f588833d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/stackcheck1.c
@@ -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);
+}