[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