[llvm] [Xtensa] Implement lowering Exception Selector and Pointer Registers. (PR #198043)

Andrei Safronov via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 2 04:09:36 PDT 2026


https://github.com/andreisfr updated https://github.com/llvm/llvm-project/pull/198043

>From 7ade4f60f579a63622d8c8f67fa719d76c8df5dd Mon Sep 17 00:00:00 2001
From: Andrei Safronov <safronov at espressif.com>
Date: Sat, 16 May 2026 02:25:08 +0300
Subject: [PATCH 1/2] [Xtensa] Implement lowering Exception Selector and
 Pointer Registers.

---
 llvm/lib/Target/Xtensa/XtensaISelLowering.cpp | 10 +++++
 llvm/lib/Target/Xtensa/XtensaISelLowering.h   |  6 +++
 llvm/test/CodeGen/Xtensa/landingpad.ll        | 39 +++++++++++++++++++
 3 files changed, 55 insertions(+)
 create mode 100644 llvm/test/CodeGen/Xtensa/landingpad.ll

diff --git a/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp b/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp
index 090037c28704f..923afb2ec1b3d 100644
--- a/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp
+++ b/llvm/lib/Target/Xtensa/XtensaISelLowering.cpp
@@ -258,6 +258,16 @@ XtensaTargetLowering::XtensaTargetLowering(const TargetMachine &TM,
   computeRegisterProperties(STI.getRegisterInfo());
 }
 
+Register XtensaTargetLowering::getExceptionPointerRegister(
+    const Constant *PersonalityFn) const {
+  return Xtensa::A2;
+}
+
+Register XtensaTargetLowering::getExceptionSelectorRegister(
+    const Constant *PersonalityFn) const {
+  return Xtensa::A3;
+}
+
 bool XtensaTargetLowering::isOffsetFoldingLegal(
     const GlobalAddressSDNode *GA) const {
   // The Xtensa target isn't yet aware of offsets.
diff --git a/llvm/lib/Target/Xtensa/XtensaISelLowering.h b/llvm/lib/Target/Xtensa/XtensaISelLowering.h
index 385843054155e..0d455919cb407 100644
--- a/llvm/lib/Target/Xtensa/XtensaISelLowering.h
+++ b/llvm/lib/Target/Xtensa/XtensaISelLowering.h
@@ -41,6 +41,12 @@ class XtensaTargetLowering : public TargetLowering {
     return VT.changeVectorElementTypeToInteger();
   }
 
+  Register
+  getExceptionPointerRegister(const Constant *PersonalityFn) const override;
+
+  Register
+  getExceptionSelectorRegister(const Constant *PersonalityFn) const override;
+
   bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
 
   bool isFPImmLegal(const APFloat &Imm, EVT VT,
diff --git a/llvm/test/CodeGen/Xtensa/landingpad.ll b/llvm/test/CodeGen/Xtensa/landingpad.ll
new file mode 100644
index 0000000000000..c9e5b6f16fa3f
--- /dev/null
+++ b/llvm/test/CodeGen/Xtensa/landingpad.ll
@@ -0,0 +1,39 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=xtensa -verify-machineinstrs < %s \
+; RUN:   | FileCheck -check-prefix=XTENSA %s
+
+define { ptr, i32 } @test() personality ptr null {
+; XTENSA-LABEL: test:
+; XTENSA:       .Lfunc_begin0:
+; XTENSA-NEXT:    .cfi_startproc
+; XTENSA-NEXT:  # %bb.0: # %else
+; XTENSA-NEXT:    addi a8, a1, -16
+; XTENSA-NEXT:    or a1, a8, a8
+; XTENSA-NEXT:    .cfi_def_cfa_offset 16
+; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
+; XTENSA-NEXT:    .cfi_offset a0, -4
+; XTENSA-NEXT:  .Ltmp0: # EH_LABEL
+; XTENSA-NEXT:    movi a2, 0
+; XTENSA-NEXT:    or a3, a2, a2
+; XTENSA-NEXT:    or a4, a2, a2
+; XTENSA-NEXT:    callx0 a2
+; XTENSA-NEXT:  .Ltmp1: # EH_LABEL
+; XTENSA-NEXT:  # %bb.1: # %postinvoke
+; XTENSA-NEXT:  .LBB0_2: # %landingPad
+; XTENSA-NEXT:  .Ltmp2: # EH_LABEL
+; XTENSA-NEXT:    l32i a0, a1, 0 # 4-byte Folded Reload
+; XTENSA-NEXT:    addi a8, a1, 16
+; XTENSA-NEXT:    or a1, a8, a8
+; XTENSA-NEXT:    ret
+else:
+  invoke void null({ i32, ptr } zeroinitializer, i32 0)
+          to label %postinvoke unwind label %landingPad
+
+postinvoke:
+  unreachable
+
+landingPad:
+  %0 = landingpad { ptr, i32 }
+          cleanup
+  ret { ptr, i32 } %0
+}

>From 32b33f5c509211bec78b75e122eb54817520de8f Mon Sep 17 00:00:00 2001
From: Andrei Safronov <safronov at espressif.com>
Date: Tue, 2 Jun 2026 14:07:19 +0300
Subject: [PATCH 2/2] [Xtensa] Minor fix in test.

---
 llvm/test/CodeGen/Xtensa/landingpad.ll | 49 +++++++++++++-------------
 1 file changed, 24 insertions(+), 25 deletions(-)

diff --git a/llvm/test/CodeGen/Xtensa/landingpad.ll b/llvm/test/CodeGen/Xtensa/landingpad.ll
index c9e5b6f16fa3f..eab59e8f2e6f3 100644
--- a/llvm/test/CodeGen/Xtensa/landingpad.ll
+++ b/llvm/test/CodeGen/Xtensa/landingpad.ll
@@ -1,30 +1,29 @@
-; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
-; RUN: llc -mtriple=xtensa -verify-machineinstrs < %s \
-; RUN:   | FileCheck -check-prefix=XTENSA %s
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mtriple=xtensa -verify-machineinstrs < %s | FileCheck %s
 
 define { ptr, i32 } @test() personality ptr null {
-; XTENSA-LABEL: test:
-; XTENSA:       .Lfunc_begin0:
-; XTENSA-NEXT:    .cfi_startproc
-; XTENSA-NEXT:  # %bb.0: # %else
-; XTENSA-NEXT:    addi a8, a1, -16
-; XTENSA-NEXT:    or a1, a8, a8
-; XTENSA-NEXT:    .cfi_def_cfa_offset 16
-; XTENSA-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
-; XTENSA-NEXT:    .cfi_offset a0, -4
-; XTENSA-NEXT:  .Ltmp0: # EH_LABEL
-; XTENSA-NEXT:    movi a2, 0
-; XTENSA-NEXT:    or a3, a2, a2
-; XTENSA-NEXT:    or a4, a2, a2
-; XTENSA-NEXT:    callx0 a2
-; XTENSA-NEXT:  .Ltmp1: # EH_LABEL
-; XTENSA-NEXT:  # %bb.1: # %postinvoke
-; XTENSA-NEXT:  .LBB0_2: # %landingPad
-; XTENSA-NEXT:  .Ltmp2: # EH_LABEL
-; XTENSA-NEXT:    l32i a0, a1, 0 # 4-byte Folded Reload
-; XTENSA-NEXT:    addi a8, a1, 16
-; XTENSA-NEXT:    or a1, a8, a8
-; XTENSA-NEXT:    ret
+; CHECK-LABEL: test:
+; CHECK:       .Lfunc_begin0:
+; CHECK-NEXT:    .cfi_startproc
+; CHECK-NEXT:  # %bb.0: # %else
+; CHECK-NEXT:    addi a8, a1, -16
+; CHECK-NEXT:    or a1, a8, a8
+; CHECK-NEXT:    .cfi_def_cfa_offset 16
+; CHECK-NEXT:    s32i a0, a1, 0 # 4-byte Folded Spill
+; CHECK-NEXT:    .cfi_offset a0, -4
+; CHECK-NEXT:  .Ltmp0: # EH_LABEL
+; CHECK-NEXT:    movi a2, 0
+; CHECK-NEXT:    or a3, a2, a2
+; CHECK-NEXT:    or a4, a2, a2
+; CHECK-NEXT:    callx0 a2
+; CHECK-NEXT:  .Ltmp1: # EH_LABEL
+; CHECK-NEXT:  # %bb.1: # %postinvoke
+; CHECK-NEXT:  .LBB0_2: # %landingPad
+; CHECK-NEXT:  .Ltmp2: # EH_LABEL
+; CHECK-NEXT:    l32i a0, a1, 0 # 4-byte Folded Reload
+; CHECK-NEXT:    addi a8, a1, 16
+; CHECK-NEXT:    or a1, a8, a8
+; CHECK-NEXT:    ret
 else:
   invoke void null({ i32, ptr } zeroinitializer, i32 0)
           to label %postinvoke unwind label %landingPad



More information about the llvm-commits mailing list