[llvm] 2dd434c - [LoongArch] Support lowering br_jt

Weining Lu via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 2 03:08:57 PDT 2022


Author: WANG Xuerui
Date: 2022-09-02T17:57:50+08:00
New Revision: 2dd434c3ee1709b981f7c29744f3e17cf40f42d1

URL: https://github.com/llvm/llvm-project/commit/2dd434c3ee1709b981f7c29744f3e17cf40f42d1
DIFF: https://github.com/llvm/llvm-project/commit/2dd434c3ee1709b981f7c29744f3e17cf40f42d1.diff

LOG: [LoongArch] Support lowering br_jt

Jump tables cannot be generated yet, due to missing support for emitting
local addresses.

Differential Revision: https://reviews.llvm.org/D132653

Added: 
    llvm/test/CodeGen/LoongArch/jump-table.ll

Modified: 
    llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
index d5efdf73b1ae1..054ef3c19ad60 100644
--- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
+++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
@@ -114,6 +114,10 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM,
     setLoadExtAction(ISD::EXTLOAD, MVT::f64, MVT::f32, Expand);
   }
 
+  // Effectively disable jump table generation.
+  setMinimumJumpTableEntries(INT_MAX);
+  setOperationAction(ISD::BR_JT, MVT::Other, Expand);
+
   setOperationAction(ISD::BR_CC, GRLenVT, Expand);
   setOperationAction(ISD::SELECT_CC, GRLenVT, Expand);
   setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Expand);

diff  --git a/llvm/test/CodeGen/LoongArch/jump-table.ll b/llvm/test/CodeGen/LoongArch/jump-table.ll
new file mode 100644
index 0000000000000..db0fb059df271
--- /dev/null
+++ b/llvm/test/CodeGen/LoongArch/jump-table.ll
@@ -0,0 +1,93 @@
+; 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
+
+define void @switch_4_arms(i32 %in, ptr %out) nounwind {
+; LA32-LABEL: switch_4_arms:
+; LA32:       # %bb.0: # %entry
+; LA32-NEXT:    ori $a2, $zero, 2
+; LA32-NEXT:    blt $a2, $a0, .LBB0_4
+; LA32-NEXT:  # %bb.1: # %entry
+; LA32-NEXT:    ori $a3, $zero, 1
+; LA32-NEXT:    beq $a0, $a3, .LBB0_8
+; LA32-NEXT:  # %bb.2: # %entry
+; LA32-NEXT:    bne $a0, $a2, .LBB0_10
+; LA32-NEXT:  # %bb.3: # %bb2
+; LA32-NEXT:    ori $a0, $zero, 3
+; LA32-NEXT:    st.w $a0, $a1, 0
+; LA32-NEXT:    ret
+; LA32-NEXT:  .LBB0_4: # %entry
+; LA32-NEXT:    ori $a3, $zero, 3
+; LA32-NEXT:    beq $a0, $a3, .LBB0_9
+; LA32-NEXT:  # %bb.5: # %entry
+; LA32-NEXT:    ori $a2, $zero, 4
+; LA32-NEXT:    bne $a0, $a2, .LBB0_10
+; LA32-NEXT:  # %bb.6: # %bb4
+; LA32-NEXT:    ori $a0, $zero, 1
+; LA32-NEXT:    st.w $a0, $a1, 0
+; LA32-NEXT:    ret
+; LA32-NEXT:  .LBB0_8: # %bb1
+; LA32-NEXT:    ori $a0, $zero, 4
+; LA32-NEXT:    st.w $a0, $a1, 0
+; LA32-NEXT:    ret
+; LA32-NEXT:  .LBB0_9: # %bb3
+; LA32-NEXT:    st.w $a2, $a1, 0
+; LA32-NEXT:  .LBB0_10: # %exit
+; LA32-NEXT:    ret
+;
+; LA64-LABEL: switch_4_arms:
+; LA64:       # %bb.0: # %entry
+; LA64-NEXT:    bstrpick.d $a0, $a0, 31, 0
+; LA64-NEXT:    ori $a2, $zero, 2
+; LA64-NEXT:    blt $a2, $a0, .LBB0_4
+; LA64-NEXT:  # %bb.1: # %entry
+; LA64-NEXT:    ori $a3, $zero, 1
+; LA64-NEXT:    beq $a0, $a3, .LBB0_8
+; LA64-NEXT:  # %bb.2: # %entry
+; LA64-NEXT:    bne $a0, $a2, .LBB0_10
+; LA64-NEXT:  # %bb.3: # %bb2
+; LA64-NEXT:    ori $a0, $zero, 3
+; LA64-NEXT:    st.w $a0, $a1, 0
+; LA64-NEXT:    ret
+; LA64-NEXT:  .LBB0_4: # %entry
+; LA64-NEXT:    ori $a3, $zero, 3
+; LA64-NEXT:    beq $a0, $a3, .LBB0_9
+; LA64-NEXT:  # %bb.5: # %entry
+; LA64-NEXT:    ori $a2, $zero, 4
+; LA64-NEXT:    bne $a0, $a2, .LBB0_10
+; LA64-NEXT:  # %bb.6: # %bb4
+; LA64-NEXT:    ori $a0, $zero, 1
+; LA64-NEXT:    st.w $a0, $a1, 0
+; LA64-NEXT:    ret
+; LA64-NEXT:  .LBB0_8: # %bb1
+; LA64-NEXT:    ori $a0, $zero, 4
+; LA64-NEXT:    st.w $a0, $a1, 0
+; LA64-NEXT:    ret
+; LA64-NEXT:  .LBB0_9: # %bb3
+; LA64-NEXT:    st.w $a2, $a1, 0
+; LA64-NEXT:  .LBB0_10: # %exit
+; LA64-NEXT:    ret
+entry:
+  switch i32 %in, label %exit [
+    i32 1, label %bb1
+    i32 2, label %bb2
+    i32 3, label %bb3
+    i32 4, label %bb4
+  ]
+bb1:
+  store i32 4, ptr %out
+  br label %exit
+bb2:
+  store i32 3, ptr %out
+  br label %exit
+bb3:
+  store i32 2, ptr %out
+  br label %exit
+bb4:
+  store i32 1, ptr %out
+  br label %exit
+exit:
+  ret void
+}


        


More information about the llvm-commits mailing list