diff --git a/llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td b/llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td index a3c37c306c541..27d5fa1fab62a 100644 --- a/llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td +++ b/llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td @@ -232,6 +232,9 @@ def : PatFPSetcc; def : PatFPSetcc; def : PatFPSetcc; +def : Pat<(loongarch_brcond (GRLenVT 0), bb:$imm21), (BNEZ R0, bb:$imm21)>; +def : Pat<(loongarch_brcond (GRLenVT 1), bb:$imm21), (BEQZ R0, bb:$imm21)>; + multiclass PatFPBrcond { def : Pat<(loongarch_brcond (NotBoolXor (GRLenVT (setcc RegTy:$fj, RegTy:$fk, cc))), bb:$imm21), diff --git a/llvm/test/CodeGen/LoongArch/pr215935.ll b/llvm/test/CodeGen/LoongArch/pr215935.ll new file mode 100644 index 0000000000000..661f7f9f60f88 --- /dev/null +++ b/llvm/test/CodeGen/LoongArch/pr215935.ll @@ -0,0 +1,50 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 +; RUN: llc --mtriple=loongarch64 -mattr=+lsx < %s | FileCheck %s + +define i64 @brcond_const_1(i64 %0) nounwind { +; CHECK-LABEL: brcond_const_1: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: beqz $zero, .LBB0_2 +; CHECK-NEXT: # %bb.1: +; CHECK-NEXT: move $a0, $zero +; CHECK-NEXT: ret +; CHECK-NEXT: .LBB0_2: +; CHECK-NEXT: ori $a0, $zero, 1 +; CHECK-NEXT: ret +entry: + %2 = trunc i64 %0 to i32 + %3 = trunc i64 %0 to i8 + %4 = uitofp i8 %3 to double + %5 = and i32 %2, 255 + %6 = uitofp i32 %5 to double + %7 = fcmp one double %4, %6 + br i1 %7, label %8, label %9 +8: + ret i64 0 +9: + ret i64 1 +} + +define i64 @brcond_const_0(i64 %0) nounwind { +; CHECK-LABEL: brcond_const_0: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: bnez $zero, .LBB1_2 +; CHECK-NEXT: # %bb.1: +; CHECK-NEXT: move $a0, $zero +; CHECK-NEXT: ret +; CHECK-NEXT: .LBB1_2: +; CHECK-NEXT: ori $a0, $zero, 1 +; CHECK-NEXT: ret +entry: + %2 = trunc i64 %0 to i32 + %3 = trunc i64 %0 to i8 + %4 = uitofp i8 %3 to double + %5 = and i32 %2, 255 + %6 = uitofp i32 %5 to double + %7 = fcmp oeq double %4, %6 + br i1 %7, label %8, label %9 +8: + ret i64 0 +9: + ret i64 1 +}