[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