[llvm] [LoongArch] Fold conditional branches with constant conditions (PR #185161)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 6 23:36:44 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-loongarch
Author: Pranshu Goyal (pranshoe)
<details>
<summary>Changes</summary>
Prequel to fix regression in #<!-- -->184010
---
Full diff: https://github.com/llvm/llvm-project/pull/185161.diff
4 Files Affected:
- (modified) llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp (+8)
- (modified) llvm/test/CodeGen/LoongArch/jr-without-ra.ll (+66-71)
- (modified) llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/loongarch_generated_funcs.ll.generated.expected (+3-2)
- (modified) llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/loongarch_generated_funcs.ll.nogenerated.expected (+3-2)
``````````diff
diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
index 7b050c3715f6c..0fe42ecdbad71 100644
--- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
+++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
@@ -1239,6 +1239,14 @@ SDValue LoongArchTargetLowering::lowerBRCOND(SDValue Op,
SDLoc DL(Op);
MVT GRLenVT = Subtarget.getGRLenVT();
+ if (auto *cond = dyn_cast<ConstantSDNode>(CondV)) {
+ if (cond->isZero()) {
+ return Op.getOperand(0);
+ }
+ return DAG.getNode(ISD::BR, DL, Op.getValueType(), Op.getOperand(0),
+ Op.getOperand(2));
+ }
+
if (CondV.getOpcode() == ISD::SETCC) {
if (CondV.getOperand(0).getValueType() == GRLenVT) {
SDValue LHS = CondV.getOperand(0);
diff --git a/llvm/test/CodeGen/LoongArch/jr-without-ra.ll b/llvm/test/CodeGen/LoongArch/jr-without-ra.ll
index 1a1fe0e2b19e2..de3caccd70069 100644
--- a/llvm/test/CodeGen/LoongArch/jr-without-ra.ll
+++ b/llvm/test/CodeGen/LoongArch/jr-without-ra.ll
@@ -20,7 +20,7 @@ define void @jr_without_ra(ptr %rtwdev, ptr %chan, ptr %h2c, i8 %.pre, i1 %cmp.i
; CHECK-NEXT: st.d $s6, $sp, 24 # 8-byte Folded Spill
; CHECK-NEXT: st.d $s7, $sp, 16 # 8-byte Folded Spill
; CHECK-NEXT: st.d $s8, $sp, 8 # 8-byte Folded Spill
-; CHECK-NEXT: move $s7, $zero
+; CHECK-NEXT: move $s8, $zero
; CHECK-NEXT: move $s0, $zero
; CHECK-NEXT: ld.d $t0, $sp, 184
; CHECK-NEXT: ld.d $s2, $sp, 176
@@ -41,88 +41,83 @@ define void @jr_without_ra(ptr %rtwdev, ptr %chan, ptr %h2c, i8 %.pre, i1 %cmp.i
; CHECK-NEXT: slli.d $s3, $s2, 2
; CHECK-NEXT: alsl.d $s2, $s2, $s3, 1
; CHECK-NEXT: add.d $s2, $t5, $s2
-; CHECK-NEXT: addi.w $s4, $zero, -41
-; CHECK-NEXT: ori $s3, $zero, 1
-; CHECK-NEXT: slli.d $s4, $s4, 3
-; CHECK-NEXT: ori $s6, $zero, 3
-; CHECK-NEXT: lu32i.d $s6, 262144
-; CHECK-NEXT: b .LBB0_4
+; CHECK-NEXT: addi.w $s3, $zero, -41
+; CHECK-NEXT: slli.d $s3, $s3, 3
+; CHECK-NEXT: pcalau12i $s4, %pc_hi20(.LJTI0_1)
+; CHECK-NEXT: addi.d $s4, $s4, %pc_lo12(.LJTI0_1)
+; CHECK-NEXT: ori $s6, $zero, 1
+; CHECK-NEXT: ori $s7, $zero, 3
+; CHECK-NEXT: lu32i.d $s7, 262144
; CHECK-NEXT: .p2align 4, , 16
-; CHECK-NEXT: .LBB0_1: # %sw.bb27.i.i
-; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
+; CHECK-NEXT: .LBB0_1: # %for.body
+; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
+; CHECK-NEXT: beqz $a4, .LBB0_6
+; CHECK-NEXT: # %bb.2: # %calc_6g.i
+; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
+; CHECK-NEXT: move $s8, $zero
+; CHECK-NEXT: b .LBB0_5
+; CHECK-NEXT: # %bb.3: # %calc_6g.i
+; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
+; CHECK-NEXT: slli.d $ra, $zero, 3
+; CHECK-NEXT: ldx.d $s5, $s1, $ra
+; CHECK-NEXT: jr $s5
+; CHECK-NEXT: .LBB0_4: # %sw.bb12.i.i
+; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
; CHECK-NEXT: ori $s8, $zero, 1
-; CHECK-NEXT: .LBB0_2: # %if.else.i106
-; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
+; CHECK-NEXT: .LBB0_5: # %if.else58.i
+; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
+; CHECK-NEXT: ldx.bu $s8, $a6, $s8
+; CHECK-NEXT: b .LBB0_8
+; CHECK-NEXT: .p2align 4, , 16
+; CHECK-NEXT: .LBB0_6: # %if.end.i
+; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
+; CHECK-NEXT: andi $s8, $s8, 255
+; CHECK-NEXT: ori $s5, $zero, 50
+; CHECK-NEXT: bltu $s5, $s8, .LBB0_13
+; CHECK-NEXT: # %bb.7: # %if.end.i
+; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
+; CHECK-NEXT: sll.d $s8, $s6, $s8
+; CHECK-NEXT: and $ra, $s8, $s7
+; CHECK-NEXT: move $s8, $fp
+; CHECK-NEXT: beqz $ra, .LBB0_13
+; CHECK-NEXT: .LBB0_8: # %phy_tssi_get_ofdm_trim_de.exit
+; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
+; CHECK-NEXT: move $ra, $zero
+; CHECK-NEXT: st.b $zero, $t7, 0
+; CHECK-NEXT: ldx.b $s5, $s2, $t4
+; CHECK-NEXT: st.b $zero, $a2, 0
+; CHECK-NEXT: st.b $zero, $a7, 0
+; CHECK-NEXT: st.b $zero, $t6, 0
+; CHECK-NEXT: st.b $s5, $a0, 0
+; CHECK-NEXT: b .LBB0_10
+; CHECK-NEXT: # %bb.9: # %phy_tssi_get_ofdm_trim_de.exit
+; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
+; CHECK-NEXT: ldx.d $s5, $s4, $s3
+; CHECK-NEXT: jr $s5
+; CHECK-NEXT: .LBB0_10: # %sw.bb27.i.i
+; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
+; CHECK-NEXT: ori $ra, $zero, 1
+; CHECK-NEXT: b .LBB0_12
+; CHECK-NEXT: .p2align 4, , 16
+; CHECK-NEXT: .LBB0_11: # %if.else.i106
+; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
; CHECK-NEXT: alsl.d $s5, $s0, $s0, 3
; CHECK-NEXT: alsl.d $s0, $s5, $s0, 1
; CHECK-NEXT: add.d $s0, $t0, $s0
-; CHECK-NEXT: ldx.bu $s8, $s0, $s8
-; CHECK-NEXT: .LBB0_3: # %phy_tssi_get_ofdm_de.exit
-; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
+; CHECK-NEXT: ldx.bu $ra, $s0, $ra
+; CHECK-NEXT: .LBB0_12: # %phy_tssi_get_ofdm_de.exit
+; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
; CHECK-NEXT: st.b $zero, $t5, 0
-; CHECK-NEXT: st.b $s7, $t3, 0
+; CHECK-NEXT: st.b $s8, $t3, 0
; CHECK-NEXT: st.b $zero, $t8, 0
; CHECK-NEXT: st.b $zero, $t1, 0
; CHECK-NEXT: st.b $zero, $a1, 0
; CHECK-NEXT: st.b $zero, $t2, 0
-; CHECK-NEXT: st.b $s8, $a5, 0
+; CHECK-NEXT: st.b $ra, $a5, 0
; CHECK-NEXT: ori $s0, $zero, 1
-; CHECK-NEXT: move $s7, $a3
-; CHECK-NEXT: .LBB0_4: # %for.body
-; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
-; CHECK-NEXT: beqz $a4, .LBB0_9
-; CHECK-NEXT: # %bb.5: # %calc_6g.i
-; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
-; CHECK-NEXT: move $s7, $zero
-; CHECK-NEXT: bnez $zero, .LBB0_8
-; CHECK-NEXT: # %bb.6: # %calc_6g.i
-; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
-; CHECK-NEXT: slli.d $s8, $zero, 3
-; CHECK-NEXT: ldx.d $s8, $s1, $s8
-; CHECK-NEXT: jr $s8
-; CHECK-NEXT: .LBB0_7: # %sw.bb12.i.i
-; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
-; CHECK-NEXT: ori $s7, $zero, 1
-; CHECK-NEXT: .LBB0_8: # %if.else58.i
-; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
-; CHECK-NEXT: ldx.bu $s7, $a6, $s7
+; CHECK-NEXT: move $s8, $a3
; CHECK-NEXT: b .LBB0_11
-; CHECK-NEXT: .p2align 4, , 16
-; CHECK-NEXT: .LBB0_9: # %if.end.i
-; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
-; CHECK-NEXT: andi $s7, $s7, 255
-; CHECK-NEXT: ori $s5, $zero, 50
-; CHECK-NEXT: bltu $s5, $s7, .LBB0_15
-; CHECK-NEXT: # %bb.10: # %if.end.i
-; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
-; CHECK-NEXT: sll.d $s7, $s3, $s7
-; CHECK-NEXT: and $s8, $s7, $s6
-; CHECK-NEXT: move $s7, $fp
-; CHECK-NEXT: beqz $s8, .LBB0_15
-; CHECK-NEXT: .LBB0_11: # %phy_tssi_get_ofdm_trim_de.exit
-; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
-; CHECK-NEXT: move $s8, $zero
-; CHECK-NEXT: st.b $zero, $t7, 0
-; CHECK-NEXT: ldx.b $ra, $s2, $t4
-; CHECK-NEXT: st.b $zero, $a2, 0
-; CHECK-NEXT: st.b $zero, $a7, 0
-; CHECK-NEXT: st.b $zero, $t6, 0
-; CHECK-NEXT: st.b $ra, $a0, 0
-; CHECK-NEXT: bnez $s3, .LBB0_13
-; CHECK-NEXT: # %bb.12: # %phy_tssi_get_ofdm_trim_de.exit
-; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
-; CHECK-NEXT: pcalau12i $ra, %pc_hi20(.LJTI0_1)
-; CHECK-NEXT: addi.d $ra, $ra, %pc_lo12(.LJTI0_1)
-; CHECK-NEXT: ldx.d $s5, $ra, $s4
-; CHECK-NEXT: jr $s5
-; CHECK-NEXT: .LBB0_13: # %phy_tssi_get_ofdm_trim_de.exit
-; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
-; CHECK-NEXT: bnez $s3, .LBB0_1
-; CHECK-NEXT: # %bb.14: # %phy_tssi_get_ofdm_trim_de.exit
-; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
-; CHECK-NEXT: bnez $zero, .LBB0_3
-; CHECK-NEXT: b .LBB0_2
-; CHECK-NEXT: .LBB0_15: # %sw.bb9.i.i
+; CHECK-NEXT: .LBB0_13: # %sw.bb9.i.i
; CHECK-NEXT: ld.d $s8, $sp, 8 # 8-byte Folded Reload
; CHECK-NEXT: ld.d $s7, $sp, 16 # 8-byte Folded Reload
; CHECK-NEXT: ld.d $s6, $sp, 24 # 8-byte Folded Reload
diff --git a/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/loongarch_generated_funcs.ll.generated.expected b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/loongarch_generated_funcs.ll.generated.expected
index c2f5f345624bc..53e16b5a3b9d4 100644
--- a/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/loongarch_generated_funcs.ll.generated.expected
+++ b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/loongarch_generated_funcs.ll.generated.expected
@@ -74,9 +74,9 @@ attributes #0 = { noredzone nounwind ssp uwtable "frame-pointer"="all" }
; CHECK-NEXT: .cfi_def_cfa 22, 0
; CHECK-NEXT: st.w $zero, $fp, -12
; CHECK-NEXT: st.w $zero, $fp, -16
-; CHECK-NEXT: ori $a0, $zero, 1
-; CHECK-NEXT: beq $zero, $zero, .LBB0_3
+; CHECK-NEXT: b .LBB0_3
; CHECK-NEXT: # %bb.1:
+; CHECK-NEXT: ori $a0, $zero, 1
; CHECK-NEXT: st.w $a0, $fp, -24
; CHECK-NEXT: ld.w $a0, $fp, -16
; CHECK-NEXT: beq $a0, $zero, .LBB0_4
@@ -85,6 +85,7 @@ attributes #0 = { noredzone nounwind ssp uwtable "frame-pointer"="all" }
; CHECK-NEXT: st.w $a0, $fp, -24
; CHECK-NEXT: b .LBB0_5
; CHECK-NEXT: .LBB0_3:
+; CHECK-NEXT: ori $a0, $zero, 1
; CHECK-NEXT: st.w $a0, $fp, -16
; CHECK-NEXT: ori $a0, $zero, 2
; CHECK-NEXT: st.w $a0, $fp, -20
diff --git a/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/loongarch_generated_funcs.ll.nogenerated.expected b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/loongarch_generated_funcs.ll.nogenerated.expected
index 1ab256f6fa268..cdfbda1d1f078 100644
--- a/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/loongarch_generated_funcs.ll.nogenerated.expected
+++ b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/loongarch_generated_funcs.ll.nogenerated.expected
@@ -15,9 +15,9 @@ define dso_local i32 @check_boundaries() #0 {
; CHECK-NEXT: .cfi_def_cfa 22, 0
; CHECK-NEXT: st.w $zero, $fp, -12
; CHECK-NEXT: st.w $zero, $fp, -16
-; CHECK-NEXT: ori $a0, $zero, 1
-; CHECK-NEXT: beq $zero, $zero, .LBB0_3
+; CHECK-NEXT: b .LBB0_3
; CHECK-NEXT: # %bb.1:
+; CHECK-NEXT: ori $a0, $zero, 1
; CHECK-NEXT: st.w $a0, $fp, -24
; CHECK-NEXT: ld.w $a0, $fp, -16
; CHECK-NEXT: beq $a0, $zero, .LBB0_4
@@ -26,6 +26,7 @@ define dso_local i32 @check_boundaries() #0 {
; CHECK-NEXT: st.w $a0, $fp, -24
; CHECK-NEXT: b .LBB0_5
; CHECK-NEXT: .LBB0_3:
+; CHECK-NEXT: ori $a0, $zero, 1
; CHECK-NEXT: st.w $a0, $fp, -16
; CHECK-NEXT: ori $a0, $zero, 2
; CHECK-NEXT: st.w $a0, $fp, -20
``````````
</details>
https://github.com/llvm/llvm-project/pull/185161
More information about the llvm-commits
mailing list