From: Andreas Krebbel Date: Tue, 30 Mar 2010 13:27:36 +0000 (+0000) Subject: s390.c (s390_emit_prologue): Omit issuing a X-Git-Tag: releases/gcc-4.3.5~118 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bff443405d3cc1729b88a3688895e57a4f12cbb0;p=thirdparty%2Fgcc.git s390.c (s390_emit_prologue): Omit issuing a 2010-03-30 Andreas Krebbel * config/s390/s390.c (s390_emit_prologue): Omit issuing a * dynamic stack check if the mask would be zero. 2010-03-30 Andreas Krebbel * gcc.target/s390/stackcheck1.c: New testcase. From-SVN: r157824 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 838e39de9d34..c68f8bf1983a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-03-30 Andreas Krebbel + + * config/s390/s390.c (s390_emit_prologue): Omit issuing a dynamic + stack check if the mask would be zero. + 2010-03-27 Uros Bizjak PR target/42113 diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 280358c0c3f6..9c806467e9f6 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -7357,20 +7357,37 @@ 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) - gen_cmpdi (t, const0_rtx); - else - gen_cmpsi (t, const0_rtx); - - emit_insn (gen_conditional_trap (gen_rtx_EQ (CCmode, - gen_rtx_REG (CCmode, - CC_REGNUM), - 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 + { + 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) + gen_cmpdi (t, const0_rtx); + else + gen_cmpsi (t, const0_rtx); + + emit_insn (gen_conditional_trap ( + gen_rtx_EQ (CCmode, + gen_rtx_REG (CCmode, + CC_REGNUM), + const0_rtx), + const0_rtx)); + } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index df9456535a45..124ff8367577 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-03-30 Andreas Krebbel + + * gcc.target/s390/stackcheck1.c: New testcase. + 2010-03-21 Kaveh R. Ghazi * gcc.target/powerpc/ppc-sdata-1.c: Require nonpic. diff --git a/gcc/testsuite/gcc.target/s390/stackcheck1.c b/gcc/testsuite/gcc.target/s390/stackcheck1.c new file mode 100644 index 000000000000..f588833d899e --- /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); +}