[llvm] 983a0ae - [LoongArch] Specify registers used in DWARF exception handling
Weining Lu via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 28 02:56:20 PDT 2022
Author: wanglei
Date: 2022-09-28T17:53:16+08:00
New Revision: 983a0ae5cfbcd586e23b2a0c93d6ab790305a728
URL: https://github.com/llvm/llvm-project/commit/983a0ae5cfbcd586e23b2a0c93d6ab790305a728
DIFF: https://github.com/llvm/llvm-project/commit/983a0ae5cfbcd586e23b2a0c93d6ab790305a728.diff
LOG: [LoongArch] Specify registers used in DWARF exception handling
Defines LoongArch registers for getExceptionPointerRegister() and
getExceptionSelectorRegister().
Differential Revision: https://reviews.llvm.org/D134709
Added:
llvm/test/CodeGen/LoongArch/exception-pointer-register.ll
Modified:
llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
llvm/lib/Target/LoongArch/LoongArchISelLowering.h
Removed:
################################################################################
diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
index 4a9e2a39c182c..caed2465d4f6c 100644
--- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
+++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
@@ -1965,6 +1965,16 @@ bool LoongArchTargetLowering::isFMAFasterThanFMulAndFAdd(
return false;
}
+Register LoongArchTargetLowering::getExceptionPointerRegister(
+ const Constant *PersonalityFn) const {
+ return LoongArch::R4;
+}
+
+Register LoongArchTargetLowering::getExceptionSelectorRegister(
+ const Constant *PersonalityFn) const {
+ return LoongArch::R5;
+}
+
//===----------------------------------------------------------------------===//
// LoongArch Inline Assembly Support
//===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.h b/llvm/lib/Target/LoongArch/LoongArchISelLowering.h
index 714c6398d3a91..084b269cd3979 100644
--- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.h
+++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.h
@@ -114,6 +114,12 @@ class LoongArchTargetLowering : public TargetLowering {
bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF,
EVT VT) const override;
+ Register
+ getExceptionPointerRegister(const Constant *PersonalityFn) const override;
+
+ Register
+ getExceptionSelectorRegister(const Constant *PersonalityFn) const override;
+
private:
/// Target-specific function used to lower LoongArch calling conventions.
typedef bool LoongArchCCAssignFn(const DataLayout &DL, LoongArchABI::ABI ABI,
diff --git a/llvm/test/CodeGen/LoongArch/exception-pointer-register.ll b/llvm/test/CodeGen/LoongArch/exception-pointer-register.ll
new file mode 100644
index 0000000000000..3ad025d160ce2
--- /dev/null
+++ b/llvm/test/CodeGen/LoongArch/exception-pointer-register.ll
@@ -0,0 +1,120 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc --mtriple=loongarch32 --verify-machineinstrs < %s \
+; RUN: | FileCheck %s --check-prefix=LA32
+; RUN: llc --mtriple=loongarch64 --verify-machineinstrs < %s \
+; RUN: | FileCheck %s --check-prefix=LA64
+
+declare void @foo(ptr %p);
+declare void @bar(ptr %p);
+declare dso_local i32 @__gxx_personality_v0(...)
+
+;; Before getExceptionPointerRegister() and getExceptionSelectorRegister()
+;; lowering hooks were defined this would trigger an assertion during live
+;; variable analysis.
+
+define void @caller(ptr %p) personality ptr @__gxx_personality_v0 {
+; LA32-LABEL: caller:
+; LA32: # %bb.0: # %entry
+; LA32-NEXT: addi.w $sp, $sp, -16
+; LA32-NEXT: .cfi_def_cfa_offset 16
+; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill
+; LA32-NEXT: st.w $s0, $sp, 4 # 4-byte Folded Spill
+; LA32-NEXT: .cfi_offset 1, -4
+; LA32-NEXT: .cfi_offset 22, -8
+; LA32-NEXT: .cfi_offset 23, -12
+; LA32-NEXT: move $fp, $a0
+; LA32-NEXT: beqz $a0, .LBB0_1
+; LA32-NEXT: # %bb.2: # %bb2
+; LA32-NEXT: .Ltmp0:
+; LA32-NEXT: move $a0, $fp
+; LA32-NEXT: bl %plt(bar)
+; LA32-NEXT: .Ltmp1:
+; LA32-NEXT: b .LBB0_3
+; LA32-NEXT: .LBB0_1: # %bb1
+; LA32-NEXT: .Ltmp2:
+; LA32-NEXT: move $a0, $fp
+; LA32-NEXT: bl %plt(foo)
+; LA32-NEXT: .Ltmp3:
+; LA32-NEXT: .LBB0_3: # %end2
+; LA32-NEXT: ld.w $s0, $sp, 4 # 4-byte Folded Reload
+; LA32-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload
+; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-NEXT: addi.w $sp, $sp, 16
+; LA32-NEXT: ret
+; LA32-NEXT: .LBB0_4: # %lpad
+; LA32-NEXT: .Ltmp4:
+; LA32-NEXT: move $s0, $a0
+; LA32-NEXT: move $a0, $fp
+; LA32-NEXT: bl callee
+; LA32-NEXT: move $a0, $s0
+; LA32-NEXT: bl %plt(_Unwind_Resume)
+;
+; LA64-LABEL: caller:
+; LA64: # %bb.0: # %entry
+; LA64-NEXT: addi.d $sp, $sp, -32
+; LA64-NEXT: .cfi_def_cfa_offset 32
+; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill
+; LA64-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill
+; LA64-NEXT: st.d $s0, $sp, 8 # 8-byte Folded Spill
+; LA64-NEXT: .cfi_offset 1, -8
+; LA64-NEXT: .cfi_offset 22, -16
+; LA64-NEXT: .cfi_offset 23, -24
+; LA64-NEXT: move $fp, $a0
+; LA64-NEXT: beqz $a0, .LBB0_1
+; LA64-NEXT: # %bb.2: # %bb2
+; LA64-NEXT: .Ltmp0:
+; LA64-NEXT: move $a0, $fp
+; LA64-NEXT: bl %plt(bar)
+; LA64-NEXT: .Ltmp1:
+; LA64-NEXT: b .LBB0_3
+; LA64-NEXT: .LBB0_1: # %bb1
+; LA64-NEXT: .Ltmp2:
+; LA64-NEXT: move $a0, $fp
+; LA64-NEXT: bl %plt(foo)
+; LA64-NEXT: .Ltmp3:
+; LA64-NEXT: .LBB0_3: # %end2
+; LA64-NEXT: ld.d $s0, $sp, 8 # 8-byte Folded Reload
+; LA64-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload
+; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload
+; LA64-NEXT: addi.d $sp, $sp, 32
+; LA64-NEXT: ret
+; LA64-NEXT: .LBB0_4: # %lpad
+; LA64-NEXT: .Ltmp4:
+; LA64-NEXT: move $s0, $a0
+; LA64-NEXT: move $a0, $fp
+; LA64-NEXT: bl callee
+; LA64-NEXT: move $a0, $s0
+; LA64-NEXT: bl %plt(_Unwind_Resume)
+entry:
+ %0 = icmp eq ptr %p, null
+ br i1 %0, label %bb1, label %bb2
+
+bb1:
+ invoke void @foo(ptr %p) to label %end1 unwind label %lpad
+
+bb2:
+ invoke void @bar(ptr %p) to label %end2 unwind label %lpad
+
+lpad:
+ %1 = landingpad { ptr, i32 } cleanup
+ call void @callee(ptr %p)
+ resume { ptr, i32 } %1
+
+end1:
+ ret void
+
+end2:
+ ret void
+}
+
+define internal void @callee(ptr %p) {
+; LA32-LABEL: callee:
+; LA32: # %bb.0:
+; LA32-NEXT: ret
+;
+; LA64-LABEL: callee:
+; LA64: # %bb.0:
+; LA64-NEXT: ret
+ ret void
+}
More information about the llvm-commits
mailing list