https://gcc.gnu.org/g:1f2e4058e57c68b5ea91ab2bac469d5e57b6ff46
commit r16-1569-g1f2e4058e57c68b5ea91ab2bac469d5e57b6ff46 Author: Lili Cui <lili....@intel.com> Date: Thu Jun 19 08:39:54 2025 +0800 x86: Fix shrink wrap separate ICE under -fstack-clash-protection [PR120697] gcc/ChangeLog: PR target/120697 * config/i386/i386.cc (ix86_expand_prologue): Remove 3 assertions and associated code. gcc/testsuite/ChangeLog: PR target/120697 * gcc.target/i386/stack-clash-protection.c: New test. Diff: --- gcc/config/i386/i386.cc | 14 +------------- .../gcc.target/i386/stack-clash-protection.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc index 9bf198c7416c..77853297a2fa 100644 --- a/gcc/config/i386/i386.cc +++ b/gcc/config/i386/i386.cc @@ -9234,10 +9234,9 @@ ix86_expand_prologue (void) the stack frame saving one cycle of the prologue. However, avoid doing this if we have to probe the stack; at least on x86_64 the stack probe can turn into a call that clobbers a red zone location. */ - else if ((ix86_using_red_zone () + else if (ix86_using_red_zone () && (! TARGET_STACK_PROBE || frame.stack_pointer_offset < CHECK_STACK_LIMIT)) - || crtl->shrink_wrapped_separate) { HOST_WIDE_INT allocate_offset; if (crtl->shrink_wrapped_separate) @@ -9253,11 +9252,6 @@ ix86_expand_prologue (void) ix86_emit_save_regs_using_mov (frame.reg_save_offset); int_registers_saved = true; - - if (ix86_using_red_zone () - && (! TARGET_STACK_PROBE - || frame.stack_pointer_offset < CHECK_STACK_LIMIT)) - cfun->machine->red_zone_used = true; } } @@ -9377,8 +9371,6 @@ ix86_expand_prologue (void) && flag_stack_clash_protection && !ix86_target_stack_probe ()) { - gcc_assert (!crtl->shrink_wrapped_separate); - ix86_adjust_stack_and_probe (allocate, int_registers_saved, false); allocate = 0; } @@ -9389,8 +9381,6 @@ ix86_expand_prologue (void) { const HOST_WIDE_INT probe_interval = get_probe_interval (); - gcc_assert (!crtl->shrink_wrapped_separate); - if (STACK_CHECK_MOVING_SP) { if (crtl->is_leaf @@ -9447,8 +9437,6 @@ ix86_expand_prologue (void) else if (!ix86_target_stack_probe () || frame.stack_pointer_offset < CHECK_STACK_LIMIT) { - gcc_assert (!crtl->shrink_wrapped_separate); - pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx, GEN_INT (-allocate), -1, m->fs.cfa_reg == stack_pointer_rtx); diff --git a/gcc/testsuite/gcc.target/i386/stack-clash-protection.c b/gcc/testsuite/gcc.target/i386/stack-clash-protection.c new file mode 100644 index 000000000000..5be28cb3ac7b --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/stack-clash-protection.c @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fstack-clash-protection" } */ + +int flag; +void open(); +int getChar(); +typedef enum { QUOTE } CharType; +typedef enum { UNQ } State; +CharType getCharType(); +void expand() { + open(); + if (flag) + return; + int ch = getChar(); + State nextState = getCharType(); + if (nextState) + while (ch) + ; +}