From: Lili Cui <lili....@intel.com> Hi Uros,
An assertion I added in shrink wrap separate V2 reports ICE when -fstack-clash-protection is enabled. The assertion should not be added here. I created a patch to remove 3 assertions and their associated code. 1. Reproduced PR120697 issue and solved the issue with this patch, also added a new test case for -fstack-clash-protection. 2. Recollected performance data with -fstack-clash-protection, there is no ICE and regressions. 3. Use this patch to build the latest Linux kernel and boot successfully. 4. Bootstrapped & regtested on x86-64-pc-linux-gnu. Ok for master? Thanks, Lili. 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. --- gcc/config/i386/i386.cc | 14 +------------- .../gcc.target/i386/stack-clash-protection.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 13 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/stack-clash-protection.c diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc index 3824b533989..6dce7cdfdcb 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 00000000000..5be28cb3ac7 --- /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) + ; +} -- 2.34.1