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: r157823
This commit is contained in:
parent
ded08389a6
commit
65a5da932c
|
@ -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-27 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
|
||||
|
||||
Backport:
|
||||
|
|
|
@ -7763,20 +7763,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);
|
||||
/* 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));
|
||||
emit_insn (gen_conditional_trap (
|
||||
gen_rtx_EQ (CCmode,
|
||||
gen_rtx_REG (CCmode,
|
||||
CC_REGNUM),
|
||||
const0_rtx),
|
||||
const0_rtx));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue