[llvm] [X86][GlobalISel] Explicitly legalize G_INVOKE_REGION_START (PR #203503)

Evgenii Kudriashov via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 12 04:00:23 PDT 2026


https://github.com/e-kud created https://github.com/llvm/llvm-project/pull/203503

Removing dependency on the legacy ruleset similarly to #197374

The missing testing coverage was found during LegacyLegalizerInfo removal in #197308


>From 2569244a7b6efab653c3a7214c9204856a58da18 Mon Sep 17 00:00:00 2001
From: Evgenii Kudriashov <evgenii.kudriashov at intel.com>
Date: Fri, 12 Jun 2026 03:31:10 -0700
Subject: [PATCH] [X86][GlobalISel] Explicitly legalize G_INVOKE_REGION_START

---
 .../lib/Target/X86/GISel/X86LegalizerInfo.cpp |   1 +
 llvm/test/CodeGen/X86/isel-invoke.ll          | 106 ++++++++++++++++++
 2 files changed, 107 insertions(+)
 create mode 100644 llvm/test/CodeGen/X86/isel-invoke.ll

diff --git a/llvm/lib/Target/X86/GISel/X86LegalizerInfo.cpp b/llvm/lib/Target/X86/GISel/X86LegalizerInfo.cpp
index 750bb03df21c7..09c2c6ab5f0af 100644
--- a/llvm/lib/Target/X86/GISel/X86LegalizerInfo.cpp
+++ b/llvm/lib/Target/X86/GISel/X86LegalizerInfo.cpp
@@ -623,6 +623,7 @@ X86LegalizerInfo::X86LegalizerInfo(const X86Subtarget &STI,
   getActionDefinitionsBuilder({G_INTRINSIC, G_INTRINSIC_W_SIDE_EFFECTS})
       .alwaysLegal();
   getActionDefinitionsBuilder({G_TRAP, G_DEBUGTRAP, G_UBSANTRAP}).alwaysLegal();
+  getActionDefinitionsBuilder(G_INVOKE_REGION_START).alwaysLegal();
 
   getLegacyLegalizerInfo().computeTables();
   verify(*STI.getInstrInfo());
diff --git a/llvm/test/CodeGen/X86/isel-invoke.ll b/llvm/test/CodeGen/X86/isel-invoke.ll
new file mode 100644
index 0000000000000..4484efa45cd1f
--- /dev/null
+++ b/llvm/test/CodeGen/X86/isel-invoke.ll
@@ -0,0 +1,106 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; NOTE: FastISel can't select and fallbacks to SDAG
+; RUN: llc < %s -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86,SDAG-X86
+; RUN: llc < %s -mtriple=i686-linux-gnu -fast-isel | FileCheck %s --check-prefixes=X86,FASTISEL-X86
+; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=GISEL-X86
+; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck %s --check-prefixes=X64,SDAG-X64
+; RUN: llc < %s -mtriple=x86_64-linux-gnu -fast-isel  | FileCheck %s --check-prefixes=X64,FASTISEL-X64
+; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=GISEL-X64
+
+declare void @_Unwind_Resume(ptr)
+declare i32 @__gxx_personality_v0(...)
+declare void @bar()
+define void @foo() personality ptr @__gxx_personality_v0 {
+; X86-LABEL: foo:
+; X86:       # %bb.0: # %entry
+; X86-NEXT:    subl $12, %esp
+; X86-NEXT:    .cfi_def_cfa_offset 16
+; X86-NEXT:  .Ltmp0: # EH_LABEL
+; X86-NEXT:    calll bar at PLT
+; X86-NEXT:  .Ltmp1: # EH_LABEL
+; X86-NEXT:  # %bb.1: # %invoke.cont
+; X86-NEXT:    addl $12, %esp
+; X86-NEXT:    .cfi_def_cfa_offset 4
+; X86-NEXT:    retl
+; X86-NEXT:  .LBB0_2: # %lpad
+; X86-NEXT:    .cfi_def_cfa_offset 16
+; X86-NEXT:  .Ltmp2: # EH_LABEL
+; X86-NEXT:    movl $0, (%esp)
+; X86-NEXT:    calll _Unwind_Resume at PLT
+;
+; GISEL-X86-LABEL: foo:
+; GISEL-X86:       # %bb.0: # %entry
+; GISEL-X86-NEXT:    pushl %esi
+; GISEL-X86-NEXT:    .cfi_def_cfa_offset 8
+; GISEL-X86-NEXT:    subl $8, %esp
+; GISEL-X86-NEXT:    .cfi_def_cfa_offset 16
+; GISEL-X86-NEXT:    .cfi_offset %esi, -8
+; GISEL-X86-NEXT:    movl $0, %esi
+; GISEL-X86-NEXT:  .Ltmp0: # EH_LABEL
+; GISEL-X86-NEXT:    calll bar
+; GISEL-X86-NEXT:  .Ltmp1: # EH_LABEL
+; GISEL-X86-NEXT:  # %bb.1: # %invoke.cont
+; GISEL-X86-NEXT:    addl $8, %esp
+; GISEL-X86-NEXT:    .cfi_def_cfa_offset 8
+; GISEL-X86-NEXT:    popl %esi
+; GISEL-X86-NEXT:    .cfi_def_cfa_offset 4
+; GISEL-X86-NEXT:    retl
+; GISEL-X86-NEXT:  .LBB0_2: # %lpad
+; GISEL-X86-NEXT:    .cfi_def_cfa_offset 16
+; GISEL-X86-NEXT:  .Ltmp2: # EH_LABEL
+; GISEL-X86-NEXT:    movl %esi, (%esp)
+; GISEL-X86-NEXT:    calll _Unwind_Resume
+;
+; X64-LABEL: foo:
+; X64:       # %bb.0: # %entry
+; X64-NEXT:    pushq %rax
+; X64-NEXT:    .cfi_def_cfa_offset 16
+; X64-NEXT:  .Ltmp0: # EH_LABEL
+; X64-NEXT:    callq bar at PLT
+; X64-NEXT:  .Ltmp1: # EH_LABEL
+; X64-NEXT:  # %bb.1: # %invoke.cont
+; X64-NEXT:    popq %rax
+; X64-NEXT:    .cfi_def_cfa_offset 8
+; X64-NEXT:    retq
+; X64-NEXT:  .LBB0_2: # %lpad
+; X64-NEXT:    .cfi_def_cfa_offset 16
+; X64-NEXT:  .Ltmp2: # EH_LABEL
+; X64-NEXT:    xorl %edi, %edi
+; X64-NEXT:    callq _Unwind_Resume at PLT
+;
+; GISEL-X64-LABEL: foo:
+; GISEL-X64:       # %bb.0: # %entry
+; GISEL-X64-NEXT:    pushq %rax
+; GISEL-X64-NEXT:    .cfi_def_cfa_offset 16
+; GISEL-X64-NEXT:  .Ltmp0: # EH_LABEL
+; GISEL-X64-NEXT:    callq bar
+; GISEL-X64-NEXT:  .Ltmp1: # EH_LABEL
+; GISEL-X64-NEXT:  # %bb.1: # %invoke.cont
+; GISEL-X64-NEXT:    popq %rax
+; GISEL-X64-NEXT:    .cfi_def_cfa_offset 8
+; GISEL-X64-NEXT:    retq
+; GISEL-X64-NEXT:  .LBB0_2: # %lpad
+; GISEL-X64-NEXT:    .cfi_def_cfa_offset 16
+; GISEL-X64-NEXT:  .Ltmp2: # EH_LABEL
+; GISEL-X64-NEXT:    movl $0, %edi
+; GISEL-X64-NEXT:    callq _Unwind_Resume
+entry:
+  invoke void @bar() to label %invoke.cont unwind label %lpad
+
+invoke.cont:                                      ; preds = %entry
+  ret void
+
+lpad:                                             ; preds = %entry
+  %4 = landingpad { ptr, i32 }
+          cleanup
+  br label %eh.resume
+
+eh.resume:                                        ; preds = %lpad
+  call void @_Unwind_Resume(ptr null) #13
+  unreachable
+}
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; FASTISEL-X64: {{.*}}
+; FASTISEL-X86: {{.*}}
+; SDAG-X64: {{.*}}
+; SDAG-X86: {{.*}}



More information about the llvm-commits mailing list