]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
x86: Fix shrink wrap separate ICE under -fstack-clash-protection [PR120697]
authorLili Cui <lili.cui@intel.com>
Thu, 19 Jun 2025 00:39:54 +0000 (08:39 +0800)
committerCui, Lili <lili.cui@intel.com>
Thu, 19 Jun 2025 00:47:13 +0000 (08:47 +0800)
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
gcc/testsuite/gcc.target/i386/stack-clash-protection.c [new file with mode: 0644]

index 9bf198c7416c48246ec6e6ba64c5441d2aa56f8d..77853297a2fa549782a6677887b9d3a27b9c8937 100644 (file)
@@ -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 (file)
index 0000000..5be28cb
--- /dev/null
@@ -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)
+      ;
+}