diff options
author | Andreas Krebbel <Andreas.Krebbel@de.ibm.com> | 2010-03-30 13:53:10 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2010-03-30 13:53:10 +0000 |
commit | a3e7e012bf455a184a521162aa9ec8856a1e3622 (patch) | |
tree | 5d882f52e9f05f24e25574be825ca4c24ef599b5 | |
parent | 40ae6799329ad23721e9e0c6bf3b2347e0d3bb05 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/s390/s390.c | 37 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/s390/stackcheck1.c | 14 |
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); +} |