diff options
| author | krebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-03-30 13:53:10 +0000 |
|---|---|---|
| committer | krebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-03-30 13:53:10 +0000 |
| commit | b437383e2ff84fdc6eca55e52f9928b784ff2206 (patch) | |
| tree | 5d882f52e9f05f24e25574be825ca4c24ef599b5 | |
| parent | 72aa8cd5b7c2809765e7c1619278e9c82f615417 (diff) | |
| download | ppe42-gcc-b437383e2ff84fdc6eca55e52f9928b784ff2206.tar.gz ppe42-gcc-b437383e2ff84fdc6eca55e52f9928b784ff2206.zip | |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157825 138bc75d-0d04-0410-961f-82ee72b054a4
| -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 a033d4897b5..3dae6a056de 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 2f82f661308..c2cf3d4a828 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 34fc037701f..21738c254bc 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 00000000000..f588833d899 --- /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); +} |

