[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