[llvm] [LoongArch] Implement getJumpTableIndex to allow splitting jump table edges (PR #228550)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Oct 3 09:16:20 PDT 2026
https://github.com/lrzlin updated https://github.com/llvm/llvm-project/pull/228550
>From 890e21467de28fe68b9afcb243a0348eecb21d8e Mon Sep 17 00:00:00 2001
From: Lin Runze <linrunze at loongson.cn>
Date: Sat, 3 Oct 2026 01:59:25 +0800
Subject: [PATCH 1/2] [LoongArch][NFC] Pre-commit tests for getJumpTableIndex
---
.../machine-sink-jumptable-edge-split.ll | 330 ++++++++++++++++++
1 file changed, 330 insertions(+)
create mode 100644 llvm/test/CodeGen/LoongArch/machine-sink-jumptable-edge-split.ll
diff --git a/llvm/test/CodeGen/LoongArch/machine-sink-jumptable-edge-split.ll b/llvm/test/CodeGen/LoongArch/machine-sink-jumptable-edge-split.ll
new file mode 100644
index 00000000000000..812632f9272e5d
--- /dev/null
+++ b/llvm/test/CodeGen/LoongArch/machine-sink-jumptable-edge-split.ll
@@ -0,0 +1,330 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc --mtriple=loongarch64 < %s | FileCheck %s --check-prefix=LA64
+; RUN: llc --mtriple=loongarch64 --relocation-model=pic < %s | FileCheck %s --check-prefix=LA64-PIC
+; RUN: llc --mtriple=loongarch32 < %s | FileCheck %s --check-prefix=LA32R
+; RUN: llc --mtriple=loongarch32 --relocation-model=pic < %s | FileCheck %s --check-prefix=LA32R-PIC
+; RUN: llc --mtriple=loongarch32 -mattr=+32s < %s | FileCheck %s --check-prefix=LA32S
+; RUN: llc --mtriple=loongarch32 -mattr=+32s --relocation-model=pic < %s | FileCheck %s --check-prefix=LA32S-PIC
+
+;; The edge from the jump table dispatch to %merge is critical. The copy of the
+;; incoming constant must be placed on that edge, not in the dispatch block
+;; where every case would execute it.
+
+declare void @g(i32)
+
+define void @f(i32 %x, i32 %a) nounwind {
+; LA64-LABEL: f:
+; LA64: # %bb.0: # %entry
+; LA64-NEXT: addi.w $a0, $a0, 0
+; LA64-NEXT: ori $a2, $zero, 5
+; LA64-NEXT: bltu $a2, $a0, .LBB0_8
+; LA64-NEXT: # %bb.1: # %entry
+; LA64-NEXT: addi.d $sp, $sp, -16
+; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-NEXT: slli.d $a0, $a0, 3
+; LA64-NEXT: pcalau12i $a2, %pc_hi20(.LJTI0_0)
+; LA64-NEXT: addi.d $a2, $a2, %pc_lo12(.LJTI0_0)
+; LA64-NEXT: ldx.d $a2, $a2, $a0
+; LA64-NEXT: ori $a0, $zero, 1234
+; LA64-NEXT: jr $a2
+; LA64-NEXT: .LBB0_2: # %c0
+; LA64-NEXT: ori $a0, $zero, 10
+; LA64-NEXT: b .LBB0_7
+; LA64-NEXT: .LBB0_3: # %c4
+; LA64-NEXT: ori $a0, $zero, 14
+; LA64-NEXT: b .LBB0_7
+; LA64-NEXT: .LBB0_4: # %c1
+; LA64-NEXT: ori $a0, $zero, 11
+; LA64-NEXT: b .LBB0_7
+; LA64-NEXT: .LBB0_5: # %c2
+; LA64-NEXT: move $a0, $a1
+; LA64-NEXT: b .LBB0_7
+; LA64-NEXT: .LBB0_6: # %c5
+; LA64-NEXT: ori $a0, $zero, 15
+; LA64-NEXT: .LBB0_7:
+; LA64-NEXT: pcaddu18i $ra, %call36(g)
+; LA64-NEXT: jirl $ra, $ra, 0
+; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-NEXT: addi.d $sp, $sp, 16
+; LA64-NEXT: .LBB0_8: # %exit
+; LA64-NEXT: ret
+;
+; LA64-PIC-LABEL: f:
+; LA64-PIC: # %bb.0: # %entry
+; LA64-PIC-NEXT: addi.w $a0, $a0, 0
+; LA64-PIC-NEXT: ori $a2, $zero, 5
+; LA64-PIC-NEXT: bltu $a2, $a0, .LBB0_8
+; LA64-PIC-NEXT: # %bb.1: # %entry
+; LA64-PIC-NEXT: addi.d $sp, $sp, -16
+; LA64-PIC-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-PIC-NEXT: slli.d $a0, $a0, 2
+; LA64-PIC-NEXT: pcalau12i $a2, %pc_hi20(.LJTI0_0)
+; LA64-PIC-NEXT: addi.d $a2, $a2, %pc_lo12(.LJTI0_0)
+; LA64-PIC-NEXT: ldx.w $a0, $a2, $a0
+; LA64-PIC-NEXT: add.d $a2, $a2, $a0
+; LA64-PIC-NEXT: ori $a0, $zero, 1234
+; LA64-PIC-NEXT: jr $a2
+; LA64-PIC-NEXT: .LBB0_2: # %c0
+; LA64-PIC-NEXT: ori $a0, $zero, 10
+; LA64-PIC-NEXT: b .LBB0_7
+; LA64-PIC-NEXT: .LBB0_3: # %c4
+; LA64-PIC-NEXT: ori $a0, $zero, 14
+; LA64-PIC-NEXT: b .LBB0_7
+; LA64-PIC-NEXT: .LBB0_4: # %c1
+; LA64-PIC-NEXT: ori $a0, $zero, 11
+; LA64-PIC-NEXT: b .LBB0_7
+; LA64-PIC-NEXT: .LBB0_5: # %c2
+; LA64-PIC-NEXT: move $a0, $a1
+; LA64-PIC-NEXT: b .LBB0_7
+; LA64-PIC-NEXT: .LBB0_6: # %c5
+; LA64-PIC-NEXT: ori $a0, $zero, 15
+; LA64-PIC-NEXT: .LBB0_7:
+; LA64-PIC-NEXT: pcaddu18i $ra, %call36(g)
+; LA64-PIC-NEXT: jirl $ra, $ra, 0
+; LA64-PIC-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-PIC-NEXT: addi.d $sp, $sp, 16
+; LA64-PIC-NEXT: .LBB0_8: # %exit
+; LA64-PIC-NEXT: ret
+;
+; LA32R-LABEL: f:
+; LA32R: # %bb.0: # %entry
+; LA32R-NEXT: ori $a2, $zero, 5
+; LA32R-NEXT: bltu $a2, $a0, .LBB0_8
+; LA32R-NEXT: # %bb.1: # %entry
+; LA32R-NEXT: addi.w $sp, $sp, -16
+; LA32R-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32R-NEXT: slli.w $a0, $a0, 2
+; LA32R-NEXT: .Lpcadd_hi0:
+; LA32R-NEXT: pcaddu12i $a2, %pcadd_hi20(.LJTI0_0)
+; LA32R-NEXT: addi.w $a2, $a2, %pcadd_lo12(.Lpcadd_hi0)
+; LA32R-NEXT: add.w $a0, $a2, $a0
+; LA32R-NEXT: ld.w $a2, $a0, 0
+; LA32R-NEXT: ori $a0, $zero, 1234
+; LA32R-NEXT: jr $a2
+; LA32R-NEXT: .LBB0_2: # %c0
+; LA32R-NEXT: ori $a0, $zero, 10
+; LA32R-NEXT: b .LBB0_7
+; LA32R-NEXT: .LBB0_3: # %c4
+; LA32R-NEXT: ori $a0, $zero, 14
+; LA32R-NEXT: b .LBB0_7
+; LA32R-NEXT: .LBB0_4: # %c1
+; LA32R-NEXT: ori $a0, $zero, 11
+; LA32R-NEXT: b .LBB0_7
+; LA32R-NEXT: .LBB0_5: # %c2
+; LA32R-NEXT: move $a0, $a1
+; LA32R-NEXT: b .LBB0_7
+; LA32R-NEXT: .LBB0_6: # %c5
+; LA32R-NEXT: ori $a0, $zero, 15
+; LA32R-NEXT: .LBB0_7:
+; LA32R-NEXT: bl g
+; LA32R-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32R-NEXT: addi.w $sp, $sp, 16
+; LA32R-NEXT: .LBB0_8: # %exit
+; LA32R-NEXT: ret
+;
+; LA32R-PIC-LABEL: f:
+; LA32R-PIC: # %bb.0: # %entry
+; LA32R-PIC-NEXT: ori $a2, $zero, 5
+; LA32R-PIC-NEXT: bltu $a2, $a0, .LBB0_8
+; LA32R-PIC-NEXT: # %bb.1: # %entry
+; LA32R-PIC-NEXT: addi.w $sp, $sp, -16
+; LA32R-PIC-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32R-PIC-NEXT: slli.w $a0, $a0, 2
+; LA32R-PIC-NEXT: .Lpcadd_hi0:
+; LA32R-PIC-NEXT: pcaddu12i $a2, %pcadd_hi20(.LJTI0_0)
+; LA32R-PIC-NEXT: addi.w $a2, $a2, %pcadd_lo12(.Lpcadd_hi0)
+; LA32R-PIC-NEXT: add.w $a0, $a2, $a0
+; LA32R-PIC-NEXT: ld.w $a0, $a0, 0
+; LA32R-PIC-NEXT: add.w $a2, $a2, $a0
+; LA32R-PIC-NEXT: ori $a0, $zero, 1234
+; LA32R-PIC-NEXT: jr $a2
+; LA32R-PIC-NEXT: .LBB0_2: # %c0
+; LA32R-PIC-NEXT: ori $a0, $zero, 10
+; LA32R-PIC-NEXT: b .LBB0_7
+; LA32R-PIC-NEXT: .LBB0_3: # %c4
+; LA32R-PIC-NEXT: ori $a0, $zero, 14
+; LA32R-PIC-NEXT: b .LBB0_7
+; LA32R-PIC-NEXT: .LBB0_4: # %c1
+; LA32R-PIC-NEXT: ori $a0, $zero, 11
+; LA32R-PIC-NEXT: b .LBB0_7
+; LA32R-PIC-NEXT: .LBB0_5: # %c2
+; LA32R-PIC-NEXT: move $a0, $a1
+; LA32R-PIC-NEXT: b .LBB0_7
+; LA32R-PIC-NEXT: .LBB0_6: # %c5
+; LA32R-PIC-NEXT: ori $a0, $zero, 15
+; LA32R-PIC-NEXT: .LBB0_7:
+; LA32R-PIC-NEXT: bl g
+; LA32R-PIC-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32R-PIC-NEXT: addi.w $sp, $sp, 16
+; LA32R-PIC-NEXT: .LBB0_8: # %exit
+; LA32R-PIC-NEXT: ret
+;
+; LA32S-LABEL: f:
+; LA32S: # %bb.0: # %entry
+; LA32S-NEXT: ori $a2, $zero, 5
+; LA32S-NEXT: bltu $a2, $a0, .LBB0_8
+; LA32S-NEXT: # %bb.1: # %entry
+; LA32S-NEXT: addi.w $sp, $sp, -16
+; LA32S-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32S-NEXT: pcalau12i $a2, %pc_hi20(.LJTI0_0)
+; LA32S-NEXT: addi.w $a2, $a2, %pc_lo12(.LJTI0_0)
+; LA32S-NEXT: alsl.w $a0, $a0, $a2, 2
+; LA32S-NEXT: ld.w $a2, $a0, 0
+; LA32S-NEXT: ori $a0, $zero, 1234
+; LA32S-NEXT: jr $a2
+; LA32S-NEXT: .LBB0_2: # %c0
+; LA32S-NEXT: ori $a0, $zero, 10
+; LA32S-NEXT: b .LBB0_7
+; LA32S-NEXT: .LBB0_3: # %c4
+; LA32S-NEXT: ori $a0, $zero, 14
+; LA32S-NEXT: b .LBB0_7
+; LA32S-NEXT: .LBB0_4: # %c1
+; LA32S-NEXT: ori $a0, $zero, 11
+; LA32S-NEXT: b .LBB0_7
+; LA32S-NEXT: .LBB0_5: # %c2
+; LA32S-NEXT: move $a0, $a1
+; LA32S-NEXT: b .LBB0_7
+; LA32S-NEXT: .LBB0_6: # %c5
+; LA32S-NEXT: ori $a0, $zero, 15
+; LA32S-NEXT: .LBB0_7:
+; LA32S-NEXT: bl g
+; LA32S-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32S-NEXT: addi.w $sp, $sp, 16
+; LA32S-NEXT: .LBB0_8: # %exit
+; LA32S-NEXT: ret
+;
+; LA32S-PIC-LABEL: f:
+; LA32S-PIC: # %bb.0: # %entry
+; LA32S-PIC-NEXT: ori $a2, $zero, 5
+; LA32S-PIC-NEXT: bltu $a2, $a0, .LBB0_8
+; LA32S-PIC-NEXT: # %bb.1: # %entry
+; LA32S-PIC-NEXT: addi.w $sp, $sp, -16
+; LA32S-PIC-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32S-PIC-NEXT: pcalau12i $a2, %pc_hi20(.LJTI0_0)
+; LA32S-PIC-NEXT: addi.w $a2, $a2, %pc_lo12(.LJTI0_0)
+; LA32S-PIC-NEXT: alsl.w $a0, $a0, $a2, 2
+; LA32S-PIC-NEXT: ld.w $a0, $a0, 0
+; LA32S-PIC-NEXT: add.w $a2, $a2, $a0
+; LA32S-PIC-NEXT: ori $a0, $zero, 1234
+; LA32S-PIC-NEXT: jr $a2
+; LA32S-PIC-NEXT: .LBB0_2: # %c0
+; LA32S-PIC-NEXT: ori $a0, $zero, 10
+; LA32S-PIC-NEXT: b .LBB0_7
+; LA32S-PIC-NEXT: .LBB0_3: # %c4
+; LA32S-PIC-NEXT: ori $a0, $zero, 14
+; LA32S-PIC-NEXT: b .LBB0_7
+; LA32S-PIC-NEXT: .LBB0_4: # %c1
+; LA32S-PIC-NEXT: ori $a0, $zero, 11
+; LA32S-PIC-NEXT: b .LBB0_7
+; LA32S-PIC-NEXT: .LBB0_5: # %c2
+; LA32S-PIC-NEXT: move $a0, $a1
+; LA32S-PIC-NEXT: b .LBB0_7
+; LA32S-PIC-NEXT: .LBB0_6: # %c5
+; LA32S-PIC-NEXT: ori $a0, $zero, 15
+; LA32S-PIC-NEXT: .LBB0_7:
+; LA32S-PIC-NEXT: bl g
+; LA32S-PIC-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32S-PIC-NEXT: addi.w $sp, $sp, 16
+; LA32S-PIC-NEXT: .LBB0_8: # %exit
+; LA32S-PIC-NEXT: ret
+; LA32-LABEL: f:
+; LA32: # %bb.0: # %entry
+; LA32-NEXT: ori $a2, $zero, 5
+; LA32-NEXT: bltu $a2, $a0, .LBB0_8
+; LA32-NEXT: # %bb.1: # %entry
+; LA32-NEXT: addi.w $sp, $sp, -16
+; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-NEXT: slli.w $a0, $a0, 2
+; LA32-NEXT: .Lpcadd_hi0:
+; LA32-NEXT: pcaddu12i $a2, %pcadd_hi20(.LJTI0_0)
+; LA32-NEXT: addi.w $a2, $a2, %pcadd_lo12(.Lpcadd_hi0)
+; LA32-NEXT: add.w $a0, $a2, $a0
+; LA32-NEXT: ld.w $a2, $a0, 0
+; LA32-NEXT: ori $a0, $zero, 1234
+; LA32-NEXT: jr $a2
+; LA32-NEXT: .LBB0_2: # %c0
+; LA32-NEXT: ori $a0, $zero, 10
+; LA32-NEXT: b .LBB0_7
+; LA32-NEXT: .LBB0_3: # %c4
+; LA32-NEXT: ori $a0, $zero, 14
+; LA32-NEXT: b .LBB0_7
+; LA32-NEXT: .LBB0_4: # %c1
+; LA32-NEXT: ori $a0, $zero, 11
+; LA32-NEXT: b .LBB0_7
+; LA32-NEXT: .LBB0_5: # %c2
+; LA32-NEXT: move $a0, $a1
+; LA32-NEXT: b .LBB0_7
+; LA32-NEXT: .LBB0_6: # %c5
+; LA32-NEXT: ori $a0, $zero, 15
+; LA32-NEXT: .LBB0_7:
+; LA32-NEXT: bl g
+; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-NEXT: addi.w $sp, $sp, 16
+; LA32-NEXT: .LBB0_8: # %exit
+; LA32-NEXT: ret
+; LA32-PIC-LABEL: f:
+; LA32-PIC: # %bb.0: # %entry
+; LA32-PIC-NEXT: ori $a2, $zero, 5
+; LA32-PIC-NEXT: bltu $a2, $a0, .LBB0_8
+; LA32-PIC-NEXT: # %bb.1: # %entry
+; LA32-PIC-NEXT: addi.w $sp, $sp, -16
+; LA32-PIC-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-PIC-NEXT: slli.w $a0, $a0, 2
+; LA32-PIC-NEXT: .Lpcadd_hi0:
+; LA32-PIC-NEXT: pcaddu12i $a2, %pcadd_hi20(.LJTI0_0)
+; LA32-PIC-NEXT: addi.w $a2, $a2, %pcadd_lo12(.Lpcadd_hi0)
+; LA32-PIC-NEXT: add.w $a0, $a2, $a0
+; LA32-PIC-NEXT: ld.w $a0, $a0, 0
+; LA32-PIC-NEXT: add.w $a2, $a2, $a0
+; LA32-PIC-NEXT: ori $a0, $zero, 1234
+; LA32-PIC-NEXT: jr $a2
+; LA32-PIC-NEXT: .LBB0_2: # %c0
+; LA32-PIC-NEXT: ori $a0, $zero, 10
+; LA32-PIC-NEXT: b .LBB0_7
+; LA32-PIC-NEXT: .LBB0_3: # %c4
+; LA32-PIC-NEXT: ori $a0, $zero, 14
+; LA32-PIC-NEXT: b .LBB0_7
+; LA32-PIC-NEXT: .LBB0_4: # %c1
+; LA32-PIC-NEXT: ori $a0, $zero, 11
+; LA32-PIC-NEXT: b .LBB0_7
+; LA32-PIC-NEXT: .LBB0_5: # %c2
+; LA32-PIC-NEXT: move $a0, $a1
+; LA32-PIC-NEXT: b .LBB0_7
+; LA32-PIC-NEXT: .LBB0_6: # %c5
+; LA32-PIC-NEXT: ori $a0, $zero, 15
+; LA32-PIC-NEXT: .LBB0_7:
+; LA32-PIC-NEXT: bl g
+; LA32-PIC-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-PIC-NEXT: addi.w $sp, $sp, 16
+; LA32-PIC-NEXT: .LBB0_8: # %exit
+; LA32-PIC-NEXT: ret
+entry:
+ switch i32 %x, label %exit [
+ i32 0, label %c0
+ i32 1, label %c1
+ i32 2, label %c2
+ i32 3, label %merge
+ i32 4, label %c4
+ i32 5, label %c5
+ ]
+c0:
+ call void @g(i32 10)
+ br label %exit
+c1:
+ call void @g(i32 11)
+ br label %exit
+c2:
+ br label %merge
+c4:
+ call void @g(i32 14)
+ br label %exit
+c5:
+ call void @g(i32 15)
+ br label %exit
+merge:
+ %p = phi i32 [ 1234, %entry ], [ %a, %c2 ]
+ call void @g(i32 %p)
+ br label %exit
+exit:
+ ret void
+}
>From 044fb3ea6e050b8b93dc83bfb1b5bd0960acee06 Mon Sep 17 00:00:00 2001
From: Lin Runze <linrunze at loongson.cn>
Date: Sat, 3 Oct 2026 02:03:55 +0800
Subject: [PATCH 2/2] [LoongArch] Implement getJumpTableIndex to allow
splitting jump table edges
---
.../Target/LoongArch/LoongArchInstrInfo.cpp | 115 +++++++++
.../lib/Target/LoongArch/LoongArchInstrInfo.h | 2 +
.../machine-sink-jumptable-edge-split.ll | 232 +++++++++---------
3 files changed, 237 insertions(+), 112 deletions(-)
diff --git a/llvm/lib/Target/LoongArch/LoongArchInstrInfo.cpp b/llvm/lib/Target/LoongArch/LoongArchInstrInfo.cpp
index 1b79e523b5733a..1d99139e2e0a52 100644
--- a/llvm/lib/Target/LoongArch/LoongArchInstrInfo.cpp
+++ b/llvm/lib/Target/LoongArch/LoongArchInstrInfo.cpp
@@ -374,6 +374,121 @@ bool LoongArchInstrInfo::isAsCheapAsAMove(const MachineInstr &MI) const {
return MI.isAsCheapAsAMove();
}
+static bool isJumpTableLoad(const MachineInstr &MI) {
+ return any_of(MI.memoperands(), [](const MachineMemOperand *MMO) {
+ const PseudoSourceValue *PSV = MMO->getPseudoValue();
+ return PSV && PSV->isJumpTable();
+ });
+}
+
+// Return the index of the jump table whose address
+// (or an entry loaded from it) is held in Reg, or -1.
+static int getJumpTableIndexFromReg(const MachineRegisterInfo &MRI,
+ Register Reg) {
+ if (!Reg.isVirtual())
+ return -1;
+ const MachineInstr *MI = MRI.getUniqueVRegDef(Reg);
+ if (!MI)
+ return -1;
+
+ int JTI;
+ switch (MI->getOpcode()) {
+ case LoongArch::ADDI_D:
+ case LoongArch::ADDI_W:
+ case LoongArch::PseudoLA_PCREL:
+ for (const MachineOperand &MO : MI->operands())
+ if (MO.isJTI())
+ return MO.getIndex();
+ return -1;
+ case LoongArch::LDX_D:
+ case LoongArch::LDX_W:
+ // Normally, NonFIBaseAddr is corresponding to register $rj.
+ JTI = getJumpTableIndexFromReg(MRI, MI->getOperand(1).getReg());
+ if (JTI >= 0)
+ return JTI;
+ JTI = getJumpTableIndexFromReg(MRI, MI->getOperand(2).getReg());
+ if (JTI >= 0)
+ return JTI;
+ break;
+ default:
+ return -1;
+ }
+
+ return -1;
+}
+
+// LA32 do not support register offset load instrunctions (LDX),
+// so add another layer to get jump table address.
+static int getJumpTableIndexFromLoadAddr(const MachineRegisterInfo &MRI,
+ Register Reg) {
+ if (!Reg.isVirtual())
+ return -1;
+ const MachineInstr *MI = MRI.getUniqueVRegDef(Reg);
+ if (!MI)
+ return -1;
+
+ int JTI;
+ switch (MI->getOpcode()) {
+ case LoongArch::ADD_W:
+ JTI = getJumpTableIndexFromReg(MRI, MI->getOperand(1).getReg());
+ if (JTI >= 0)
+ return JTI;
+ JTI = getJumpTableIndexFromReg(MRI, MI->getOperand(2).getReg());
+ if (JTI >= 0)
+ return JTI;
+ break;
+ case LoongArch::ALSL_W:
+ // For la32s, address could only stores in register $rk.
+ return getJumpTableIndexFromReg(MRI, MI->getOperand(2).getReg());
+ }
+
+ return -1;
+}
+
+// Recursively search for %jump-table.N starting from PseudoBRIND,
+// and return the index of &jump-table.N
+//
+// One common jump table:
+//
+// %base = PseudoLA_PCREL %jump-table.N
+// %off = LDX_W %base, %index
+// %tgt = ADD_D %base, %off
+// %PseudoBRIND %tgt, 0
+//
+int LoongArchInstrInfo::getJumpTableIndex(const MachineInstr &MI) const {
+ if (MI.getOpcode() != LoongArch::PseudoBRIND)
+ return -1;
+
+ Register Reg = MI.getOperand(0).getReg();
+ if (!Reg.isVirtual())
+ return -1;
+
+ const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo();
+ MachineInstr *Def = MRI.getUniqueVRegDef(Reg);
+ if (!Def)
+ return -1;
+
+ int JTI;
+ switch (Def->getOpcode()) {
+ case LoongArch::LD_W:
+ if (!isJumpTableLoad(*Def))
+ return -1;
+
+ JTI = getJumpTableIndexFromLoadAddr(MRI, Def->getOperand(1).getReg());
+ if (JTI >= 0)
+ return JTI;
+ break;
+ case LoongArch::ADD_D:
+ case LoongArch::ADD_W:
+ JTI = getJumpTableIndexFromReg(MRI, Def->getOperand(1).getReg());
+ if (JTI >= 0)
+ return JTI;
+ return getJumpTableIndexFromReg(MRI, Def->getOperand(2).getReg());
+ }
+
+ return getJumpTableIndexFromReg(MRI, Reg);
+}
+
MachineBasicBlock *
LoongArchInstrInfo::getBranchDestBlock(const MachineInstr &MI) const {
assert(MI.getDesc().isBranch() && "Unexpected opcode!");
diff --git a/llvm/lib/Target/LoongArch/LoongArchInstrInfo.h b/llvm/lib/Target/LoongArch/LoongArchInstrInfo.h
index df0aa4b23bd476..64217220fa2ff5 100644
--- a/llvm/lib/Target/LoongArch/LoongArchInstrInfo.h
+++ b/llvm/lib/Target/LoongArch/LoongArchInstrInfo.h
@@ -71,6 +71,8 @@ class LoongArchInstrInfo : public LoongArchGenInstrInfo {
bool isAsCheapAsAMove(const MachineInstr &MI) const override;
+ int getJumpTableIndex(const MachineInstr &MI) const override;
+
MachineBasicBlock *getBranchDestBlock(const MachineInstr &MI) const override;
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,
diff --git a/llvm/test/CodeGen/LoongArch/machine-sink-jumptable-edge-split.ll b/llvm/test/CodeGen/LoongArch/machine-sink-jumptable-edge-split.ll
index 812632f9272e5d..8d568271619496 100644
--- a/llvm/test/CodeGen/LoongArch/machine-sink-jumptable-edge-split.ll
+++ b/llvm/test/CodeGen/LoongArch/machine-sink-jumptable-edge-split.ll
@@ -17,43 +17,44 @@ define void @f(i32 %x, i32 %a) nounwind {
; LA64: # %bb.0: # %entry
; LA64-NEXT: addi.w $a0, $a0, 0
; LA64-NEXT: ori $a2, $zero, 5
-; LA64-NEXT: bltu $a2, $a0, .LBB0_8
+; LA64-NEXT: bltu $a2, $a0, .LBB0_9
; LA64-NEXT: # %bb.1: # %entry
; LA64-NEXT: addi.d $sp, $sp, -16
; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
; LA64-NEXT: slli.d $a0, $a0, 3
; LA64-NEXT: pcalau12i $a2, %pc_hi20(.LJTI0_0)
; LA64-NEXT: addi.d $a2, $a2, %pc_lo12(.LJTI0_0)
-; LA64-NEXT: ldx.d $a2, $a2, $a0
-; LA64-NEXT: ori $a0, $zero, 1234
-; LA64-NEXT: jr $a2
+; LA64-NEXT: ldx.d $a0, $a2, $a0
+; LA64-NEXT: jr $a0
; LA64-NEXT: .LBB0_2: # %c0
; LA64-NEXT: ori $a0, $zero, 10
-; LA64-NEXT: b .LBB0_7
+; LA64-NEXT: b .LBB0_8
; LA64-NEXT: .LBB0_3: # %c4
; LA64-NEXT: ori $a0, $zero, 14
-; LA64-NEXT: b .LBB0_7
-; LA64-NEXT: .LBB0_4: # %c1
-; LA64-NEXT: ori $a0, $zero, 11
-; LA64-NEXT: b .LBB0_7
-; LA64-NEXT: .LBB0_5: # %c2
+; LA64-NEXT: b .LBB0_8
+; LA64-NEXT: .LBB0_4:
+; LA64-NEXT: ori $a1, $zero, 1234
+; LA64-NEXT: .LBB0_5: # %merge
; LA64-NEXT: move $a0, $a1
-; LA64-NEXT: b .LBB0_7
-; LA64-NEXT: .LBB0_6: # %c5
+; LA64-NEXT: b .LBB0_8
+; LA64-NEXT: .LBB0_6: # %c1
+; LA64-NEXT: ori $a0, $zero, 11
+; LA64-NEXT: b .LBB0_8
+; LA64-NEXT: .LBB0_7: # %c5
; LA64-NEXT: ori $a0, $zero, 15
-; LA64-NEXT: .LBB0_7:
+; LA64-NEXT: .LBB0_8:
; LA64-NEXT: pcaddu18i $ra, %call36(g)
; LA64-NEXT: jirl $ra, $ra, 0
; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
; LA64-NEXT: addi.d $sp, $sp, 16
-; LA64-NEXT: .LBB0_8: # %exit
+; LA64-NEXT: .LBB0_9: # %exit
; LA64-NEXT: ret
;
; LA64-PIC-LABEL: f:
; LA64-PIC: # %bb.0: # %entry
; LA64-PIC-NEXT: addi.w $a0, $a0, 0
; LA64-PIC-NEXT: ori $a2, $zero, 5
-; LA64-PIC-NEXT: bltu $a2, $a0, .LBB0_8
+; LA64-PIC-NEXT: bltu $a2, $a0, .LBB0_9
; LA64-PIC-NEXT: # %bb.1: # %entry
; LA64-PIC-NEXT: addi.d $sp, $sp, -16
; LA64-PIC-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
@@ -61,35 +62,36 @@ define void @f(i32 %x, i32 %a) nounwind {
; LA64-PIC-NEXT: pcalau12i $a2, %pc_hi20(.LJTI0_0)
; LA64-PIC-NEXT: addi.d $a2, $a2, %pc_lo12(.LJTI0_0)
; LA64-PIC-NEXT: ldx.w $a0, $a2, $a0
-; LA64-PIC-NEXT: add.d $a2, $a2, $a0
-; LA64-PIC-NEXT: ori $a0, $zero, 1234
-; LA64-PIC-NEXT: jr $a2
+; LA64-PIC-NEXT: add.d $a0, $a2, $a0
+; LA64-PIC-NEXT: jr $a0
; LA64-PIC-NEXT: .LBB0_2: # %c0
; LA64-PIC-NEXT: ori $a0, $zero, 10
-; LA64-PIC-NEXT: b .LBB0_7
+; LA64-PIC-NEXT: b .LBB0_8
; LA64-PIC-NEXT: .LBB0_3: # %c4
; LA64-PIC-NEXT: ori $a0, $zero, 14
-; LA64-PIC-NEXT: b .LBB0_7
-; LA64-PIC-NEXT: .LBB0_4: # %c1
-; LA64-PIC-NEXT: ori $a0, $zero, 11
-; LA64-PIC-NEXT: b .LBB0_7
-; LA64-PIC-NEXT: .LBB0_5: # %c2
+; LA64-PIC-NEXT: b .LBB0_8
+; LA64-PIC-NEXT: .LBB0_4:
+; LA64-PIC-NEXT: ori $a1, $zero, 1234
+; LA64-PIC-NEXT: .LBB0_5: # %merge
; LA64-PIC-NEXT: move $a0, $a1
-; LA64-PIC-NEXT: b .LBB0_7
-; LA64-PIC-NEXT: .LBB0_6: # %c5
+; LA64-PIC-NEXT: b .LBB0_8
+; LA64-PIC-NEXT: .LBB0_6: # %c1
+; LA64-PIC-NEXT: ori $a0, $zero, 11
+; LA64-PIC-NEXT: b .LBB0_8
+; LA64-PIC-NEXT: .LBB0_7: # %c5
; LA64-PIC-NEXT: ori $a0, $zero, 15
-; LA64-PIC-NEXT: .LBB0_7:
+; LA64-PIC-NEXT: .LBB0_8:
; LA64-PIC-NEXT: pcaddu18i $ra, %call36(g)
; LA64-PIC-NEXT: jirl $ra, $ra, 0
; LA64-PIC-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
; LA64-PIC-NEXT: addi.d $sp, $sp, 16
-; LA64-PIC-NEXT: .LBB0_8: # %exit
+; LA64-PIC-NEXT: .LBB0_9: # %exit
; LA64-PIC-NEXT: ret
;
; LA32R-LABEL: f:
; LA32R: # %bb.0: # %entry
; LA32R-NEXT: ori $a2, $zero, 5
-; LA32R-NEXT: bltu $a2, $a0, .LBB0_8
+; LA32R-NEXT: bltu $a2, $a0, .LBB0_9
; LA32R-NEXT: # %bb.1: # %entry
; LA32R-NEXT: addi.w $sp, $sp, -16
; LA32R-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
@@ -98,34 +100,35 @@ define void @f(i32 %x, i32 %a) nounwind {
; LA32R-NEXT: pcaddu12i $a2, %pcadd_hi20(.LJTI0_0)
; LA32R-NEXT: addi.w $a2, $a2, %pcadd_lo12(.Lpcadd_hi0)
; LA32R-NEXT: add.w $a0, $a2, $a0
-; LA32R-NEXT: ld.w $a2, $a0, 0
-; LA32R-NEXT: ori $a0, $zero, 1234
-; LA32R-NEXT: jr $a2
+; LA32R-NEXT: ld.w $a0, $a0, 0
+; LA32R-NEXT: jr $a0
; LA32R-NEXT: .LBB0_2: # %c0
; LA32R-NEXT: ori $a0, $zero, 10
-; LA32R-NEXT: b .LBB0_7
+; LA32R-NEXT: b .LBB0_8
; LA32R-NEXT: .LBB0_3: # %c4
; LA32R-NEXT: ori $a0, $zero, 14
-; LA32R-NEXT: b .LBB0_7
-; LA32R-NEXT: .LBB0_4: # %c1
-; LA32R-NEXT: ori $a0, $zero, 11
-; LA32R-NEXT: b .LBB0_7
-; LA32R-NEXT: .LBB0_5: # %c2
+; LA32R-NEXT: b .LBB0_8
+; LA32R-NEXT: .LBB0_4:
+; LA32R-NEXT: ori $a1, $zero, 1234
+; LA32R-NEXT: .LBB0_5: # %merge
; LA32R-NEXT: move $a0, $a1
-; LA32R-NEXT: b .LBB0_7
-; LA32R-NEXT: .LBB0_6: # %c5
+; LA32R-NEXT: b .LBB0_8
+; LA32R-NEXT: .LBB0_6: # %c1
+; LA32R-NEXT: ori $a0, $zero, 11
+; LA32R-NEXT: b .LBB0_8
+; LA32R-NEXT: .LBB0_7: # %c5
; LA32R-NEXT: ori $a0, $zero, 15
-; LA32R-NEXT: .LBB0_7:
+; LA32R-NEXT: .LBB0_8:
; LA32R-NEXT: bl g
; LA32R-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
; LA32R-NEXT: addi.w $sp, $sp, 16
-; LA32R-NEXT: .LBB0_8: # %exit
+; LA32R-NEXT: .LBB0_9: # %exit
; LA32R-NEXT: ret
;
; LA32R-PIC-LABEL: f:
; LA32R-PIC: # %bb.0: # %entry
; LA32R-PIC-NEXT: ori $a2, $zero, 5
-; LA32R-PIC-NEXT: bltu $a2, $a0, .LBB0_8
+; LA32R-PIC-NEXT: bltu $a2, $a0, .LBB0_9
; LA32R-PIC-NEXT: # %bb.1: # %entry
; LA32R-PIC-NEXT: addi.w $sp, $sp, -16
; LA32R-PIC-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
@@ -135,68 +138,70 @@ define void @f(i32 %x, i32 %a) nounwind {
; LA32R-PIC-NEXT: addi.w $a2, $a2, %pcadd_lo12(.Lpcadd_hi0)
; LA32R-PIC-NEXT: add.w $a0, $a2, $a0
; LA32R-PIC-NEXT: ld.w $a0, $a0, 0
-; LA32R-PIC-NEXT: add.w $a2, $a2, $a0
-; LA32R-PIC-NEXT: ori $a0, $zero, 1234
-; LA32R-PIC-NEXT: jr $a2
+; LA32R-PIC-NEXT: add.w $a0, $a2, $a0
+; LA32R-PIC-NEXT: jr $a0
; LA32R-PIC-NEXT: .LBB0_2: # %c0
; LA32R-PIC-NEXT: ori $a0, $zero, 10
-; LA32R-PIC-NEXT: b .LBB0_7
+; LA32R-PIC-NEXT: b .LBB0_8
; LA32R-PIC-NEXT: .LBB0_3: # %c4
; LA32R-PIC-NEXT: ori $a0, $zero, 14
-; LA32R-PIC-NEXT: b .LBB0_7
-; LA32R-PIC-NEXT: .LBB0_4: # %c1
-; LA32R-PIC-NEXT: ori $a0, $zero, 11
-; LA32R-PIC-NEXT: b .LBB0_7
-; LA32R-PIC-NEXT: .LBB0_5: # %c2
+; LA32R-PIC-NEXT: b .LBB0_8
+; LA32R-PIC-NEXT: .LBB0_4:
+; LA32R-PIC-NEXT: ori $a1, $zero, 1234
+; LA32R-PIC-NEXT: .LBB0_5: # %merge
; LA32R-PIC-NEXT: move $a0, $a1
-; LA32R-PIC-NEXT: b .LBB0_7
-; LA32R-PIC-NEXT: .LBB0_6: # %c5
+; LA32R-PIC-NEXT: b .LBB0_8
+; LA32R-PIC-NEXT: .LBB0_6: # %c1
+; LA32R-PIC-NEXT: ori $a0, $zero, 11
+; LA32R-PIC-NEXT: b .LBB0_8
+; LA32R-PIC-NEXT: .LBB0_7: # %c5
; LA32R-PIC-NEXT: ori $a0, $zero, 15
-; LA32R-PIC-NEXT: .LBB0_7:
+; LA32R-PIC-NEXT: .LBB0_8:
; LA32R-PIC-NEXT: bl g
; LA32R-PIC-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
; LA32R-PIC-NEXT: addi.w $sp, $sp, 16
-; LA32R-PIC-NEXT: .LBB0_8: # %exit
+; LA32R-PIC-NEXT: .LBB0_9: # %exit
; LA32R-PIC-NEXT: ret
;
; LA32S-LABEL: f:
; LA32S: # %bb.0: # %entry
; LA32S-NEXT: ori $a2, $zero, 5
-; LA32S-NEXT: bltu $a2, $a0, .LBB0_8
+; LA32S-NEXT: bltu $a2, $a0, .LBB0_9
; LA32S-NEXT: # %bb.1: # %entry
; LA32S-NEXT: addi.w $sp, $sp, -16
; LA32S-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
; LA32S-NEXT: pcalau12i $a2, %pc_hi20(.LJTI0_0)
; LA32S-NEXT: addi.w $a2, $a2, %pc_lo12(.LJTI0_0)
; LA32S-NEXT: alsl.w $a0, $a0, $a2, 2
-; LA32S-NEXT: ld.w $a2, $a0, 0
-; LA32S-NEXT: ori $a0, $zero, 1234
-; LA32S-NEXT: jr $a2
+; LA32S-NEXT: ld.w $a0, $a0, 0
+; LA32S-NEXT: jr $a0
; LA32S-NEXT: .LBB0_2: # %c0
; LA32S-NEXT: ori $a0, $zero, 10
-; LA32S-NEXT: b .LBB0_7
+; LA32S-NEXT: b .LBB0_8
; LA32S-NEXT: .LBB0_3: # %c4
; LA32S-NEXT: ori $a0, $zero, 14
-; LA32S-NEXT: b .LBB0_7
-; LA32S-NEXT: .LBB0_4: # %c1
-; LA32S-NEXT: ori $a0, $zero, 11
-; LA32S-NEXT: b .LBB0_7
-; LA32S-NEXT: .LBB0_5: # %c2
+; LA32S-NEXT: b .LBB0_8
+; LA32S-NEXT: .LBB0_4:
+; LA32S-NEXT: ori $a1, $zero, 1234
+; LA32S-NEXT: .LBB0_5: # %merge
; LA32S-NEXT: move $a0, $a1
-; LA32S-NEXT: b .LBB0_7
-; LA32S-NEXT: .LBB0_6: # %c5
+; LA32S-NEXT: b .LBB0_8
+; LA32S-NEXT: .LBB0_6: # %c1
+; LA32S-NEXT: ori $a0, $zero, 11
+; LA32S-NEXT: b .LBB0_8
+; LA32S-NEXT: .LBB0_7: # %c5
; LA32S-NEXT: ori $a0, $zero, 15
-; LA32S-NEXT: .LBB0_7:
+; LA32S-NEXT: .LBB0_8:
; LA32S-NEXT: bl g
; LA32S-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
; LA32S-NEXT: addi.w $sp, $sp, 16
-; LA32S-NEXT: .LBB0_8: # %exit
+; LA32S-NEXT: .LBB0_9: # %exit
; LA32S-NEXT: ret
;
; LA32S-PIC-LABEL: f:
; LA32S-PIC: # %bb.0: # %entry
; LA32S-PIC-NEXT: ori $a2, $zero, 5
-; LA32S-PIC-NEXT: bltu $a2, $a0, .LBB0_8
+; LA32S-PIC-NEXT: bltu $a2, $a0, .LBB0_9
; LA32S-PIC-NEXT: # %bb.1: # %entry
; LA32S-PIC-NEXT: addi.w $sp, $sp, -16
; LA32S-PIC-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
@@ -204,33 +209,34 @@ define void @f(i32 %x, i32 %a) nounwind {
; LA32S-PIC-NEXT: addi.w $a2, $a2, %pc_lo12(.LJTI0_0)
; LA32S-PIC-NEXT: alsl.w $a0, $a0, $a2, 2
; LA32S-PIC-NEXT: ld.w $a0, $a0, 0
-; LA32S-PIC-NEXT: add.w $a2, $a2, $a0
-; LA32S-PIC-NEXT: ori $a0, $zero, 1234
-; LA32S-PIC-NEXT: jr $a2
+; LA32S-PIC-NEXT: add.w $a0, $a2, $a0
+; LA32S-PIC-NEXT: jr $a0
; LA32S-PIC-NEXT: .LBB0_2: # %c0
; LA32S-PIC-NEXT: ori $a0, $zero, 10
-; LA32S-PIC-NEXT: b .LBB0_7
+; LA32S-PIC-NEXT: b .LBB0_8
; LA32S-PIC-NEXT: .LBB0_3: # %c4
; LA32S-PIC-NEXT: ori $a0, $zero, 14
-; LA32S-PIC-NEXT: b .LBB0_7
-; LA32S-PIC-NEXT: .LBB0_4: # %c1
-; LA32S-PIC-NEXT: ori $a0, $zero, 11
-; LA32S-PIC-NEXT: b .LBB0_7
-; LA32S-PIC-NEXT: .LBB0_5: # %c2
+; LA32S-PIC-NEXT: b .LBB0_8
+; LA32S-PIC-NEXT: .LBB0_4:
+; LA32S-PIC-NEXT: ori $a1, $zero, 1234
+; LA32S-PIC-NEXT: .LBB0_5: # %merge
; LA32S-PIC-NEXT: move $a0, $a1
-; LA32S-PIC-NEXT: b .LBB0_7
-; LA32S-PIC-NEXT: .LBB0_6: # %c5
+; LA32S-PIC-NEXT: b .LBB0_8
+; LA32S-PIC-NEXT: .LBB0_6: # %c1
+; LA32S-PIC-NEXT: ori $a0, $zero, 11
+; LA32S-PIC-NEXT: b .LBB0_8
+; LA32S-PIC-NEXT: .LBB0_7: # %c5
; LA32S-PIC-NEXT: ori $a0, $zero, 15
-; LA32S-PIC-NEXT: .LBB0_7:
+; LA32S-PIC-NEXT: .LBB0_8:
; LA32S-PIC-NEXT: bl g
; LA32S-PIC-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
; LA32S-PIC-NEXT: addi.w $sp, $sp, 16
-; LA32S-PIC-NEXT: .LBB0_8: # %exit
+; LA32S-PIC-NEXT: .LBB0_9: # %exit
; LA32S-PIC-NEXT: ret
; LA32-LABEL: f:
; LA32: # %bb.0: # %entry
; LA32-NEXT: ori $a2, $zero, 5
-; LA32-NEXT: bltu $a2, $a0, .LBB0_8
+; LA32-NEXT: bltu $a2, $a0, .LBB0_9
; LA32-NEXT: # %bb.1: # %entry
; LA32-NEXT: addi.w $sp, $sp, -16
; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
@@ -239,33 +245,34 @@ define void @f(i32 %x, i32 %a) nounwind {
; LA32-NEXT: pcaddu12i $a2, %pcadd_hi20(.LJTI0_0)
; LA32-NEXT: addi.w $a2, $a2, %pcadd_lo12(.Lpcadd_hi0)
; LA32-NEXT: add.w $a0, $a2, $a0
-; LA32-NEXT: ld.w $a2, $a0, 0
-; LA32-NEXT: ori $a0, $zero, 1234
-; LA32-NEXT: jr $a2
+; LA32-NEXT: ld.w $a0, $a0, 0
+; LA32-NEXT: jr $a0
; LA32-NEXT: .LBB0_2: # %c0
; LA32-NEXT: ori $a0, $zero, 10
-; LA32-NEXT: b .LBB0_7
+; LA32-NEXT: b .LBB0_8
; LA32-NEXT: .LBB0_3: # %c4
; LA32-NEXT: ori $a0, $zero, 14
-; LA32-NEXT: b .LBB0_7
-; LA32-NEXT: .LBB0_4: # %c1
-; LA32-NEXT: ori $a0, $zero, 11
-; LA32-NEXT: b .LBB0_7
-; LA32-NEXT: .LBB0_5: # %c2
+; LA32-NEXT: b .LBB0_8
+; LA32-NEXT: .LBB0_4:
+; LA32-NEXT: ori $a1, $zero, 1234
+; LA32-NEXT: .LBB0_5: # %merge
; LA32-NEXT: move $a0, $a1
-; LA32-NEXT: b .LBB0_7
-; LA32-NEXT: .LBB0_6: # %c5
+; LA32-NEXT: b .LBB0_8
+; LA32-NEXT: .LBB0_6: # %c1
+; LA32-NEXT: ori $a0, $zero, 11
+; LA32-NEXT: b .LBB0_8
+; LA32-NEXT: .LBB0_7: # %c5
; LA32-NEXT: ori $a0, $zero, 15
-; LA32-NEXT: .LBB0_7:
+; LA32-NEXT: .LBB0_8:
; LA32-NEXT: bl g
; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
; LA32-NEXT: addi.w $sp, $sp, 16
-; LA32-NEXT: .LBB0_8: # %exit
+; LA32-NEXT: .LBB0_9: # %exit
; LA32-NEXT: ret
; LA32-PIC-LABEL: f:
; LA32-PIC: # %bb.0: # %entry
; LA32-PIC-NEXT: ori $a2, $zero, 5
-; LA32-PIC-NEXT: bltu $a2, $a0, .LBB0_8
+; LA32-PIC-NEXT: bltu $a2, $a0, .LBB0_9
; LA32-PIC-NEXT: # %bb.1: # %entry
; LA32-PIC-NEXT: addi.w $sp, $sp, -16
; LA32-PIC-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
@@ -275,28 +282,29 @@ define void @f(i32 %x, i32 %a) nounwind {
; LA32-PIC-NEXT: addi.w $a2, $a2, %pcadd_lo12(.Lpcadd_hi0)
; LA32-PIC-NEXT: add.w $a0, $a2, $a0
; LA32-PIC-NEXT: ld.w $a0, $a0, 0
-; LA32-PIC-NEXT: add.w $a2, $a2, $a0
-; LA32-PIC-NEXT: ori $a0, $zero, 1234
-; LA32-PIC-NEXT: jr $a2
+; LA32-PIC-NEXT: add.w $a0, $a2, $a0
+; LA32-PIC-NEXT: jr $a0
; LA32-PIC-NEXT: .LBB0_2: # %c0
; LA32-PIC-NEXT: ori $a0, $zero, 10
-; LA32-PIC-NEXT: b .LBB0_7
+; LA32-PIC-NEXT: b .LBB0_8
; LA32-PIC-NEXT: .LBB0_3: # %c4
; LA32-PIC-NEXT: ori $a0, $zero, 14
-; LA32-PIC-NEXT: b .LBB0_7
-; LA32-PIC-NEXT: .LBB0_4: # %c1
-; LA32-PIC-NEXT: ori $a0, $zero, 11
-; LA32-PIC-NEXT: b .LBB0_7
-; LA32-PIC-NEXT: .LBB0_5: # %c2
+; LA32-PIC-NEXT: b .LBB0_8
+; LA32-PIC-NEXT: .LBB0_4:
+; LA32-PIC-NEXT: ori $a1, $zero, 1234
+; LA32-PIC-NEXT: .LBB0_5: # %merge
; LA32-PIC-NEXT: move $a0, $a1
-; LA32-PIC-NEXT: b .LBB0_7
-; LA32-PIC-NEXT: .LBB0_6: # %c5
+; LA32-PIC-NEXT: b .LBB0_8
+; LA32-PIC-NEXT: .LBB0_6: # %c1
+; LA32-PIC-NEXT: ori $a0, $zero, 11
+; LA32-PIC-NEXT: b .LBB0_8
+; LA32-PIC-NEXT: .LBB0_7: # %c5
; LA32-PIC-NEXT: ori $a0, $zero, 15
-; LA32-PIC-NEXT: .LBB0_7:
+; LA32-PIC-NEXT: .LBB0_8:
; LA32-PIC-NEXT: bl g
; LA32-PIC-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
; LA32-PIC-NEXT: addi.w $sp, $sp, 16
-; LA32-PIC-NEXT: .LBB0_8: # %exit
+; LA32-PIC-NEXT: .LBB0_9: # %exit
; LA32-PIC-NEXT: ret
entry:
switch i32 %x, label %exit [
More information about the llvm-commits
mailing list