diff --git a/llvm/lib/Target/RISCV/CMakeLists.txt b/llvm/lib/Target/RISCV/CMakeLists.txt index 2e40315c7b205..b0456aa25f09e 100644 --- a/llvm/lib/Target/RISCV/CMakeLists.txt +++ b/llvm/lib/Target/RISCV/CMakeLists.txt @@ -47,6 +47,7 @@ add_llvm_target(RISCVCodeGen RISCVISelDAGToDAG.cpp RISCVISelLowering.cpp RISCVLandingPadSetup.cpp + RISCVLateBranchOpt.cpp RISCVLoadStoreOptimizer.cpp RISCVMachineFunctionInfo.cpp RISCVMakeCompressible.cpp diff --git a/llvm/lib/Target/RISCV/RISCV.h b/llvm/lib/Target/RISCV/RISCV.h index 641e2eb4094f9..06de86269c8a9 100644 --- a/llvm/lib/Target/RISCV/RISCV.h +++ b/llvm/lib/Target/RISCV/RISCV.h @@ -40,6 +40,9 @@ void initializeRISCVLandingPadSetupPass(PassRegistry &); FunctionPass *createRISCVISelDag(RISCVTargetMachine &TM, CodeGenOptLevel OptLevel); +FunctionPass *createRISCVLateBranchOptPass(); +void initializeRISCVLateBranchOptPass(PassRegistry &); + FunctionPass *createRISCVMakeCompressibleOptPass(); void initializeRISCVMakeCompressibleOptPass(PassRegistry &); diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp index 02f56b7ce5326..de775f4f9a37b 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp @@ -993,7 +993,7 @@ static RISCVCC::CondCode getCondFromBranchOpc(unsigned Opc) { } } -static bool evaluateCondBranch(unsigned CC, int64_t C0, int64_t C1) { +bool RISCVInstrInfo::evaluateCondBranch(unsigned CC, int64_t C0, int64_t C1) { switch (CC) { default: llvm_unreachable("Unexpected CC"); @@ -1297,6 +1297,31 @@ bool RISCVInstrInfo::reverseBranchCondition( return false; } +// Return true if the instruction is a load immediate instruction (i.e. +// ADDI x0, imm). +static bool isLoadImm(const MachineInstr *MI, int64_t &Imm) { + if (MI->getOpcode() == RISCV::ADDI && MI->getOperand(1).isReg() && + MI->getOperand(1).getReg() == RISCV::X0) { + Imm = MI->getOperand(2).getImm(); + return true; + } + return false; +} + +bool RISCVInstrInfo::isFromLoadImm(const MachineRegisterInfo &MRI, + const MachineOperand &Op, int64_t &Imm) { + // Either a load from immediate instruction or X0. + if (!Op.isReg()) + return false; + + Register Reg = Op.getReg(); + if (Reg == RISCV::X0) { + Imm = 0; + return true; + } + return Reg.isVirtual() && isLoadImm(MRI.getVRegDef(Reg), Imm); +} + bool RISCVInstrInfo::optimizeCondBranch(MachineInstr &MI) const { MachineBasicBlock *MBB = MI.getParent(); MachineRegisterInfo &MRI = MBB->getParent()->getRegInfo(); @@ -1319,31 +1344,10 @@ bool RISCVInstrInfo::optimizeCondBranch(MachineInstr &MI) const { MI.eraseFromParent(); }; - // Right now we only care about LI (i.e. ADDI x0, imm) - auto isLoadImm = [](const MachineInstr *MI, int64_t &Imm) -> bool { - if (MI->getOpcode() == RISCV::ADDI && MI->getOperand(1).isReg() && - MI->getOperand(1).getReg() == RISCV::X0) { - Imm = MI->getOperand(2).getImm(); - return true; - } - return false; - }; - // Either a load from immediate instruction or X0. - auto isFromLoadImm = [&](const MachineOperand &Op, int64_t &Imm) -> bool { - if (!Op.isReg()) - return false; - Register Reg = Op.getReg(); - if (Reg == RISCV::X0) { - Imm = 0; - return true; - } - return Reg.isVirtual() && isLoadImm(MRI.getVRegDef(Reg), Imm); - }; - // Canonicalize conditional branches which can be constant folded into // beqz or bnez. We can't modify the CFG here. int64_t C0, C1; - if (isFromLoadImm(Cond[1], C0) && isFromLoadImm(Cond[2], C1)) { + if (isFromLoadImm(MRI, Cond[1], C0) && isFromLoadImm(MRI, Cond[2], C1)) { unsigned NewCC = evaluateCondBranch(CC, C0, C1) ? RISCVCC::COND_EQ : RISCVCC::COND_NE; Cond[0] = MachineOperand::CreateImm(NewCC); @@ -1389,7 +1393,7 @@ bool RISCVInstrInfo::optimizeCondBranch(MachineInstr &MI) const { return Register(); }; - if (isFromLoadImm(LHS, C0) && MRI.hasOneUse(LHS.getReg())) { + if (isFromLoadImm(MRI, LHS, C0) && MRI.hasOneUse(LHS.getReg())) { // Might be case 1. // Signed integer overflow is UB. (UINT64_MAX is bigger so we don't need // to worry about unsigned overflow here) @@ -1404,7 +1408,7 @@ bool RISCVInstrInfo::optimizeCondBranch(MachineInstr &MI) const { modifyBranch(); return true; } - } else if (isFromLoadImm(RHS, C0) && MRI.hasOneUse(RHS.getReg())) { + } else if (isFromLoadImm(MRI, RHS, C0) && MRI.hasOneUse(RHS.getReg())) { // Might be case 2. // For unsigned cases, we don't want C1 to wrap back to UINT64_MAX // when C0 is zero. diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.h b/llvm/lib/Target/RISCV/RISCVInstrInfo.h index fcf296fcba74b..bf0d6b2c59a45 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.h +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.h @@ -307,6 +307,15 @@ class RISCVInstrInfo : public RISCVGenInstrInfo { static bool isLdStSafeToPair(const MachineInstr &LdSt, const TargetRegisterInfo *TRI); + /// Return the result of the evaluation of C0 CC C1, where CC is a + /// RISCVCC::CondCode. + static bool evaluateCondBranch(unsigned CC, int64_t C0, int64_t C1); + + /// Return true if the operand is a load immediate instruction and + /// sets Imm to the immediate value. + static bool isFromLoadImm(const MachineRegisterInfo &MRI, + const MachineOperand &Op, int64_t &Imm); + protected: const RISCVSubtarget &STI; diff --git a/llvm/lib/Target/RISCV/RISCVLateBranchOpt.cpp b/llvm/lib/Target/RISCV/RISCVLateBranchOpt.cpp new file mode 100644 index 0000000000000..d304d86fd7fa7 --- /dev/null +++ b/llvm/lib/Target/RISCV/RISCVLateBranchOpt.cpp @@ -0,0 +1,111 @@ +//===-- RISCVLateBranchOpt.cpp - Late Stage Branch Optimization -----------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// This file provides RISC-V specific target optimizations, currently it's +/// limited to convert conditional branches into unconditional branches when +/// the condition can be statically evaluated. +/// +//===----------------------------------------------------------------------===// + +#include "RISCVInstrInfo.h" +#include "RISCVSubtarget.h" + +using namespace llvm; + +#define RISCV_LATE_BRANCH_OPT_NAME "RISC-V Late Branch Optimisation Pass" + +namespace { + +struct RISCVLateBranchOpt : public MachineFunctionPass { + static char ID; + + RISCVLateBranchOpt() : MachineFunctionPass(ID) {} + + StringRef getPassName() const override { return RISCV_LATE_BRANCH_OPT_NAME; } + + void getAnalysisUsage(AnalysisUsage &AU) const override { + MachineFunctionPass::getAnalysisUsage(AU); + } + + bool runOnMachineFunction(MachineFunction &Fn) override; + +private: + bool runOnBasicBlock(MachineBasicBlock &MBB) const; + + const RISCVInstrInfo *RII = nullptr; +}; +} // namespace + +char RISCVLateBranchOpt::ID = 0; +INITIALIZE_PASS(RISCVLateBranchOpt, "riscv-late-branch-opt", + RISCV_LATE_BRANCH_OPT_NAME, false, false) + +bool RISCVLateBranchOpt::runOnBasicBlock(MachineBasicBlock &MBB) const { + MachineBasicBlock *TBB, *FBB; + SmallVector Cond; + if (RII->analyzeBranch(MBB, TBB, FBB, Cond, /*AllowModify=*/false)) + return false; + + if (!TBB || Cond.size() != 3) + return false; + + RISCVCC::CondCode CC = static_cast(Cond[0].getImm()); + assert(CC != RISCVCC::COND_INVALID); + + MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo(); + + // Try and convert a conditional branch that can be evaluated statically + // into an unconditional branch. + int64_t C0, C1; + if (!RISCVInstrInfo::isFromLoadImm(MRI, Cond[1], C0) || + !RISCVInstrInfo::isFromLoadImm(MRI, Cond[2], C1)) + return false; + + MachineBasicBlock *Folded = + RISCVInstrInfo::evaluateCondBranch(CC, C0, C1) ? TBB : FBB; + + // At this point, its legal to optimize. + RII->removeBranch(MBB); + + // Only need to insert a branch if we're not falling through. + if (Folded) { + DebugLoc DL = MBB.findBranchDebugLoc(); + RII->insertBranch(MBB, Folded, nullptr, {}, DL); + } + + // Update the successors. Remove them all and add back the correct one. + while (!MBB.succ_empty()) + MBB.removeSuccessor(MBB.succ_end() - 1); + + // If it's a fallthrough, we need to figure out where MBB is going. + if (!Folded) { + MachineFunction::iterator Fallthrough = ++MBB.getIterator(); + if (Fallthrough != MBB.getParent()->end()) + MBB.addSuccessor(&*Fallthrough); + } else + MBB.addSuccessor(Folded); + + return true; +} + +bool RISCVLateBranchOpt::runOnMachineFunction(MachineFunction &Fn) { + if (skipFunction(Fn.getFunction())) + return false; + + auto &ST = Fn.getSubtarget(); + RII = ST.getInstrInfo(); + + bool Changed = false; + for (MachineBasicBlock &MBB : Fn) + Changed |= runOnBasicBlock(MBB); + return Changed; +} + +FunctionPass *llvm::createRISCVLateBranchOptPass() { + return new RISCVLateBranchOpt(); +} diff --git a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp index f78e5f8147d98..ec8ba3322a6e1 100644 --- a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp +++ b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp @@ -127,6 +127,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTarget() { initializeRISCVPostLegalizerCombinerPass(*PR); initializeKCFIPass(*PR); initializeRISCVDeadRegisterDefinitionsPass(*PR); + initializeRISCVLateBranchOptPass(*PR); initializeRISCVMakeCompressibleOptPass(*PR); initializeRISCVGatherScatterLoweringPass(*PR); initializeRISCVCodeGenPreparePass(*PR); @@ -565,6 +566,8 @@ void RISCVPassConfig::addPreEmitPass() { if (TM->getOptLevel() >= CodeGenOptLevel::Default && EnableRISCVCopyPropagation) addPass(createMachineCopyPropagationPass(true)); + if (TM->getOptLevel() >= CodeGenOptLevel::Default) + addPass(createRISCVLateBranchOptPass()); addPass(&BranchRelaxationPassID); addPass(createRISCVMakeCompressibleOptPass()); } diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/rv32zbb.ll b/llvm/test/CodeGen/RISCV/GlobalISel/rv32zbb.ll index 338925059862c..95af7861d4798 100644 --- a/llvm/test/CodeGen/RISCV/GlobalISel/rv32zbb.ll +++ b/llvm/test/CodeGen/RISCV/GlobalISel/rv32zbb.ll @@ -357,7 +357,7 @@ define i64 @ctpop_i64(i64 %a) nounwind { define i1 @ctpop_i64_ugt_two(i64 %a) nounwind { ; RV32I-LABEL: ctpop_i64_ugt_two: ; RV32I: # %bb.0: -; RV32I-NEXT: beqz zero, .LBB6_2 +; RV32I-NEXT: j .LBB6_2 ; RV32I-NEXT: # %bb.1: ; RV32I-NEXT: sltiu a0, zero, 0 ; RV32I-NEXT: ret @@ -404,7 +404,7 @@ define i1 @ctpop_i64_ugt_two(i64 %a) nounwind { ; ; RV32ZBB-LABEL: ctpop_i64_ugt_two: ; RV32ZBB: # %bb.0: -; RV32ZBB-NEXT: beqz zero, .LBB6_2 +; RV32ZBB-NEXT: j .LBB6_2 ; RV32ZBB-NEXT: # %bb.1: ; RV32ZBB-NEXT: sltiu a0, zero, 0 ; RV32ZBB-NEXT: ret @@ -422,7 +422,7 @@ define i1 @ctpop_i64_ugt_two(i64 %a) nounwind { define i1 @ctpop_i64_ugt_one(i64 %a) nounwind { ; RV32I-LABEL: ctpop_i64_ugt_one: ; RV32I: # %bb.0: -; RV32I-NEXT: beqz zero, .LBB7_2 +; RV32I-NEXT: j .LBB7_2 ; RV32I-NEXT: # %bb.1: ; RV32I-NEXT: snez a0, zero ; RV32I-NEXT: ret @@ -470,7 +470,7 @@ define i1 @ctpop_i64_ugt_one(i64 %a) nounwind { ; ; RV32ZBB-LABEL: ctpop_i64_ugt_one: ; RV32ZBB: # %bb.0: -; RV32ZBB-NEXT: beqz zero, .LBB7_2 +; RV32ZBB-NEXT: j .LBB7_2 ; RV32ZBB-NEXT: # %bb.1: ; RV32ZBB-NEXT: snez a0, zero ; RV32ZBB-NEXT: ret diff --git a/llvm/test/CodeGen/RISCV/O3-pipeline.ll b/llvm/test/CodeGen/RISCV/O3-pipeline.ll index beef7a574dc4f..19de864422bc5 100644 --- a/llvm/test/CodeGen/RISCV/O3-pipeline.ll +++ b/llvm/test/CodeGen/RISCV/O3-pipeline.ll @@ -194,6 +194,7 @@ ; CHECK-NEXT: Insert XRay ops ; CHECK-NEXT: Implement the 'patchable-function' attribute ; CHECK-NEXT: Machine Copy Propagation Pass +; CHECK-NEXT: RISC-V Late Branch Optimisation Pass ; CHECK-NEXT: Branch relaxation pass ; CHECK-NEXT: RISC-V Make Compressible ; CHECK-NEXT: Contiguously Lay Out Funclets diff --git a/llvm/test/CodeGen/RISCV/bfloat-br-fcmp.ll b/llvm/test/CodeGen/RISCV/bfloat-br-fcmp.ll index 2e8cf35a294f6..b2558cde29832 100644 --- a/llvm/test/CodeGen/RISCV/bfloat-br-fcmp.ll +++ b/llvm/test/CodeGen/RISCV/bfloat-br-fcmp.ll @@ -11,7 +11,7 @@ declare bfloat @dummy(bfloat) define void @br_fcmp_false(bfloat %a, bfloat %b) nounwind { ; RV32IZFBFMIN-LABEL: br_fcmp_false: ; RV32IZFBFMIN: # %bb.0: -; RV32IZFBFMIN-NEXT: beqz zero, .LBB0_2 +; RV32IZFBFMIN-NEXT: j .LBB0_2 ; RV32IZFBFMIN-NEXT: # %bb.1: # %if.then ; RV32IZFBFMIN-NEXT: ret ; RV32IZFBFMIN-NEXT: .LBB0_2: # %if.else @@ -21,7 +21,7 @@ define void @br_fcmp_false(bfloat %a, bfloat %b) nounwind { ; ; RV64IZFBFMIN-LABEL: br_fcmp_false: ; RV64IZFBFMIN: # %bb.0: -; RV64IZFBFMIN-NEXT: beqz zero, .LBB0_2 +; RV64IZFBFMIN-NEXT: j .LBB0_2 ; RV64IZFBFMIN-NEXT: # %bb.1: # %if.then ; RV64IZFBFMIN-NEXT: ret ; RV64IZFBFMIN-NEXT: .LBB0_2: # %if.else @@ -581,7 +581,7 @@ if.then: define void @br_fcmp_true(bfloat %a, bfloat %b) nounwind { ; RV32IZFBFMIN-LABEL: br_fcmp_true: ; RV32IZFBFMIN: # %bb.0: -; RV32IZFBFMIN-NEXT: beqz zero, .LBB16_2 +; RV32IZFBFMIN-NEXT: j .LBB16_2 ; RV32IZFBFMIN-NEXT: # %bb.1: # %if.else ; RV32IZFBFMIN-NEXT: ret ; RV32IZFBFMIN-NEXT: .LBB16_2: # %if.then @@ -591,7 +591,7 @@ define void @br_fcmp_true(bfloat %a, bfloat %b) nounwind { ; ; RV64IZFBFMIN-LABEL: br_fcmp_true: ; RV64IZFBFMIN: # %bb.0: -; RV64IZFBFMIN-NEXT: beqz zero, .LBB16_2 +; RV64IZFBFMIN-NEXT: j .LBB16_2 ; RV64IZFBFMIN-NEXT: # %bb.1: # %if.else ; RV64IZFBFMIN-NEXT: ret ; RV64IZFBFMIN-NEXT: .LBB16_2: # %if.then diff --git a/llvm/test/CodeGen/RISCV/branch_zero.ll b/llvm/test/CodeGen/RISCV/branch_zero.ll index fd0979977ba3b..9f96f0d94a27a 100644 --- a/llvm/test/CodeGen/RISCV/branch_zero.ll +++ b/llvm/test/CodeGen/RISCV/branch_zero.ll @@ -5,14 +5,11 @@ define void @foo(i16 %finder_idx) { ; CHECK-LABEL: foo: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: .LBB0_1: # %for.body -; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 +; CHECK-NEXT: # %bb.1: # %for.body ; CHECK-NEXT: slli a0, a0, 48 ; CHECK-NEXT: bltz a0, .LBB0_4 ; CHECK-NEXT: # %bb.2: # %while.cond.preheader.i -; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1 ; CHECK-NEXT: li a0, 0 -; CHECK-NEXT: bnez zero, .LBB0_1 ; CHECK-NEXT: # %bb.3: # %while.body ; CHECK-NEXT: .LBB0_4: # %while.cond1.preheader.i entry: @@ -46,14 +43,11 @@ if.then: define void @bar(i16 %finder_idx) { ; CHECK-LABEL: bar: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: .LBB1_1: # %for.body -; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 +; CHECK-NEXT: # %bb.1: # %for.body ; CHECK-NEXT: slli a0, a0, 48 ; CHECK-NEXT: bgez a0, .LBB1_4 ; CHECK-NEXT: # %bb.2: # %while.cond.preheader.i -; CHECK-NEXT: # in Loop: Header=BB1_1 Depth=1 ; CHECK-NEXT: li a0, 0 -; CHECK-NEXT: bnez zero, .LBB1_1 ; CHECK-NEXT: # %bb.3: # %while.body ; CHECK-NEXT: .LBB1_4: # %while.cond1.preheader.i entry: diff --git a/llvm/test/CodeGen/RISCV/double-br-fcmp.ll b/llvm/test/CodeGen/RISCV/double-br-fcmp.ll index 42f1b1360a2d3..b2c882878f8bc 100644 --- a/llvm/test/CodeGen/RISCV/double-br-fcmp.ll +++ b/llvm/test/CodeGen/RISCV/double-br-fcmp.ll @@ -14,7 +14,7 @@ declare void @exit(i32) define void @br_fcmp_false(double %a, double %b) nounwind { ; RV32IFD-LABEL: br_fcmp_false: ; RV32IFD: # %bb.0: -; RV32IFD-NEXT: beqz zero, .LBB0_2 +; RV32IFD-NEXT: j .LBB0_2 ; RV32IFD-NEXT: # %bb.1: # %if.then ; RV32IFD-NEXT: ret ; RV32IFD-NEXT: .LBB0_2: # %if.else @@ -24,7 +24,7 @@ define void @br_fcmp_false(double %a, double %b) nounwind { ; ; RV64IFD-LABEL: br_fcmp_false: ; RV64IFD: # %bb.0: -; RV64IFD-NEXT: beqz zero, .LBB0_2 +; RV64IFD-NEXT: j .LBB0_2 ; RV64IFD-NEXT: # %bb.1: # %if.then ; RV64IFD-NEXT: ret ; RV64IFD-NEXT: .LBB0_2: # %if.else @@ -34,7 +34,7 @@ define void @br_fcmp_false(double %a, double %b) nounwind { ; ; RV32IZFINXZDINX-LABEL: br_fcmp_false: ; RV32IZFINXZDINX: # %bb.0: -; RV32IZFINXZDINX-NEXT: beqz zero, .LBB0_2 +; RV32IZFINXZDINX-NEXT: j .LBB0_2 ; RV32IZFINXZDINX-NEXT: # %bb.1: # %if.then ; RV32IZFINXZDINX-NEXT: ret ; RV32IZFINXZDINX-NEXT: .LBB0_2: # %if.else @@ -44,7 +44,7 @@ define void @br_fcmp_false(double %a, double %b) nounwind { ; ; RV64IZFINXZDINX-LABEL: br_fcmp_false: ; RV64IZFINXZDINX: # %bb.0: -; RV64IZFINXZDINX-NEXT: beqz zero, .LBB0_2 +; RV64IZFINXZDINX-NEXT: j .LBB0_2 ; RV64IZFINXZDINX-NEXT: # %bb.1: # %if.then ; RV64IZFINXZDINX-NEXT: ret ; RV64IZFINXZDINX-NEXT: .LBB0_2: # %if.else @@ -893,7 +893,7 @@ if.then: define void @br_fcmp_true(double %a, double %b) nounwind { ; RV32IFD-LABEL: br_fcmp_true: ; RV32IFD: # %bb.0: -; RV32IFD-NEXT: beqz zero, .LBB16_2 +; RV32IFD-NEXT: j .LBB16_2 ; RV32IFD-NEXT: # %bb.1: # %if.else ; RV32IFD-NEXT: ret ; RV32IFD-NEXT: .LBB16_2: # %if.then @@ -903,7 +903,7 @@ define void @br_fcmp_true(double %a, double %b) nounwind { ; ; RV64IFD-LABEL: br_fcmp_true: ; RV64IFD: # %bb.0: -; RV64IFD-NEXT: beqz zero, .LBB16_2 +; RV64IFD-NEXT: j .LBB16_2 ; RV64IFD-NEXT: # %bb.1: # %if.else ; RV64IFD-NEXT: ret ; RV64IFD-NEXT: .LBB16_2: # %if.then @@ -913,7 +913,7 @@ define void @br_fcmp_true(double %a, double %b) nounwind { ; ; RV32IZFINXZDINX-LABEL: br_fcmp_true: ; RV32IZFINXZDINX: # %bb.0: -; RV32IZFINXZDINX-NEXT: beqz zero, .LBB16_2 +; RV32IZFINXZDINX-NEXT: j .LBB16_2 ; RV32IZFINXZDINX-NEXT: # %bb.1: # %if.else ; RV32IZFINXZDINX-NEXT: ret ; RV32IZFINXZDINX-NEXT: .LBB16_2: # %if.then @@ -923,7 +923,7 @@ define void @br_fcmp_true(double %a, double %b) nounwind { ; ; RV64IZFINXZDINX-LABEL: br_fcmp_true: ; RV64IZFINXZDINX: # %bb.0: -; RV64IZFINXZDINX-NEXT: beqz zero, .LBB16_2 +; RV64IZFINXZDINX-NEXT: j .LBB16_2 ; RV64IZFINXZDINX-NEXT: # %bb.1: # %if.else ; RV64IZFINXZDINX-NEXT: ret ; RV64IZFINXZDINX-NEXT: .LBB16_2: # %if.then diff --git a/llvm/test/CodeGen/RISCV/float-br-fcmp.ll b/llvm/test/CodeGen/RISCV/float-br-fcmp.ll index 00da1cc1c8bbe..b2892115cac7a 100644 --- a/llvm/test/CodeGen/RISCV/float-br-fcmp.ll +++ b/llvm/test/CodeGen/RISCV/float-br-fcmp.ll @@ -15,7 +15,7 @@ declare float @dummy(float) define void @br_fcmp_false(float %a, float %b) nounwind { ; RV32IF-LABEL: br_fcmp_false: ; RV32IF: # %bb.0: -; RV32IF-NEXT: beqz zero, .LBB0_2 +; RV32IF-NEXT: j .LBB0_2 ; RV32IF-NEXT: # %bb.1: # %if.then ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB0_2: # %if.else @@ -25,7 +25,7 @@ define void @br_fcmp_false(float %a, float %b) nounwind { ; ; RV64IF-LABEL: br_fcmp_false: ; RV64IF: # %bb.0: -; RV64IF-NEXT: beqz zero, .LBB0_2 +; RV64IF-NEXT: j .LBB0_2 ; RV64IF-NEXT: # %bb.1: # %if.then ; RV64IF-NEXT: ret ; RV64IF-NEXT: .LBB0_2: # %if.else @@ -35,7 +35,7 @@ define void @br_fcmp_false(float %a, float %b) nounwind { ; ; RV32IZFINX-LABEL: br_fcmp_false: ; RV32IZFINX: # %bb.0: -; RV32IZFINX-NEXT: beqz zero, .LBB0_2 +; RV32IZFINX-NEXT: j .LBB0_2 ; RV32IZFINX-NEXT: # %bb.1: # %if.then ; RV32IZFINX-NEXT: ret ; RV32IZFINX-NEXT: .LBB0_2: # %if.else @@ -45,7 +45,7 @@ define void @br_fcmp_false(float %a, float %b) nounwind { ; ; RV64IZFINX-LABEL: br_fcmp_false: ; RV64IZFINX: # %bb.0: -; RV64IZFINX-NEXT: beqz zero, .LBB0_2 +; RV64IZFINX-NEXT: j .LBB0_2 ; RV64IZFINX-NEXT: # %bb.1: # %if.then ; RV64IZFINX-NEXT: ret ; RV64IZFINX-NEXT: .LBB0_2: # %if.else @@ -894,7 +894,7 @@ if.then: define void @br_fcmp_true(float %a, float %b) nounwind { ; RV32IF-LABEL: br_fcmp_true: ; RV32IF: # %bb.0: -; RV32IF-NEXT: beqz zero, .LBB16_2 +; RV32IF-NEXT: j .LBB16_2 ; RV32IF-NEXT: # %bb.1: # %if.else ; RV32IF-NEXT: ret ; RV32IF-NEXT: .LBB16_2: # %if.then @@ -904,7 +904,7 @@ define void @br_fcmp_true(float %a, float %b) nounwind { ; ; RV64IF-LABEL: br_fcmp_true: ; RV64IF: # %bb.0: -; RV64IF-NEXT: beqz zero, .LBB16_2 +; RV64IF-NEXT: j .LBB16_2 ; RV64IF-NEXT: # %bb.1: # %if.else ; RV64IF-NEXT: ret ; RV64IF-NEXT: .LBB16_2: # %if.then @@ -914,7 +914,7 @@ define void @br_fcmp_true(float %a, float %b) nounwind { ; ; RV32IZFINX-LABEL: br_fcmp_true: ; RV32IZFINX: # %bb.0: -; RV32IZFINX-NEXT: beqz zero, .LBB16_2 +; RV32IZFINX-NEXT: j .LBB16_2 ; RV32IZFINX-NEXT: # %bb.1: # %if.else ; RV32IZFINX-NEXT: ret ; RV32IZFINX-NEXT: .LBB16_2: # %if.then @@ -924,7 +924,7 @@ define void @br_fcmp_true(float %a, float %b) nounwind { ; ; RV64IZFINX-LABEL: br_fcmp_true: ; RV64IZFINX: # %bb.0: -; RV64IZFINX-NEXT: beqz zero, .LBB16_2 +; RV64IZFINX-NEXT: j .LBB16_2 ; RV64IZFINX-NEXT: # %bb.1: # %if.else ; RV64IZFINX-NEXT: ret ; RV64IZFINX-NEXT: .LBB16_2: # %if.then diff --git a/llvm/test/CodeGen/RISCV/half-br-fcmp.ll b/llvm/test/CodeGen/RISCV/half-br-fcmp.ll index 1cee927662c14..ab8f7cd4e6bfd 100644 --- a/llvm/test/CodeGen/RISCV/half-br-fcmp.ll +++ b/llvm/test/CodeGen/RISCV/half-br-fcmp.ll @@ -23,7 +23,7 @@ declare half @dummy(half) define void @br_fcmp_false(half %a, half %b) nounwind { ; RV32IZFH-LABEL: br_fcmp_false: ; RV32IZFH: # %bb.0: -; RV32IZFH-NEXT: beqz zero, .LBB0_2 +; RV32IZFH-NEXT: j .LBB0_2 ; RV32IZFH-NEXT: # %bb.1: # %if.then ; RV32IZFH-NEXT: ret ; RV32IZFH-NEXT: .LBB0_2: # %if.else @@ -33,7 +33,7 @@ define void @br_fcmp_false(half %a, half %b) nounwind { ; ; RV64IZFH-LABEL: br_fcmp_false: ; RV64IZFH: # %bb.0: -; RV64IZFH-NEXT: beqz zero, .LBB0_2 +; RV64IZFH-NEXT: j .LBB0_2 ; RV64IZFH-NEXT: # %bb.1: # %if.then ; RV64IZFH-NEXT: ret ; RV64IZFH-NEXT: .LBB0_2: # %if.else @@ -43,7 +43,7 @@ define void @br_fcmp_false(half %a, half %b) nounwind { ; ; RV32IZHINX-LABEL: br_fcmp_false: ; RV32IZHINX: # %bb.0: -; RV32IZHINX-NEXT: beqz zero, .LBB0_2 +; RV32IZHINX-NEXT: j .LBB0_2 ; RV32IZHINX-NEXT: # %bb.1: # %if.then ; RV32IZHINX-NEXT: ret ; RV32IZHINX-NEXT: .LBB0_2: # %if.else @@ -53,7 +53,7 @@ define void @br_fcmp_false(half %a, half %b) nounwind { ; ; RV64IZHINX-LABEL: br_fcmp_false: ; RV64IZHINX: # %bb.0: -; RV64IZHINX-NEXT: beqz zero, .LBB0_2 +; RV64IZHINX-NEXT: j .LBB0_2 ; RV64IZHINX-NEXT: # %bb.1: # %if.then ; RV64IZHINX-NEXT: ret ; RV64IZHINX-NEXT: .LBB0_2: # %if.else @@ -63,7 +63,7 @@ define void @br_fcmp_false(half %a, half %b) nounwind { ; ; RV32IZFHMIN-LABEL: br_fcmp_false: ; RV32IZFHMIN: # %bb.0: -; RV32IZFHMIN-NEXT: beqz zero, .LBB0_2 +; RV32IZFHMIN-NEXT: j .LBB0_2 ; RV32IZFHMIN-NEXT: # %bb.1: # %if.then ; RV32IZFHMIN-NEXT: ret ; RV32IZFHMIN-NEXT: .LBB0_2: # %if.else @@ -73,7 +73,7 @@ define void @br_fcmp_false(half %a, half %b) nounwind { ; ; RV64IZFHMIN-LABEL: br_fcmp_false: ; RV64IZFHMIN: # %bb.0: -; RV64IZFHMIN-NEXT: beqz zero, .LBB0_2 +; RV64IZFHMIN-NEXT: j .LBB0_2 ; RV64IZFHMIN-NEXT: # %bb.1: # %if.then ; RV64IZFHMIN-NEXT: ret ; RV64IZFHMIN-NEXT: .LBB0_2: # %if.else @@ -83,7 +83,7 @@ define void @br_fcmp_false(half %a, half %b) nounwind { ; ; RV32IZHINXMIN-LABEL: br_fcmp_false: ; RV32IZHINXMIN: # %bb.0: -; RV32IZHINXMIN-NEXT: beqz zero, .LBB0_2 +; RV32IZHINXMIN-NEXT: j .LBB0_2 ; RV32IZHINXMIN-NEXT: # %bb.1: # %if.then ; RV32IZHINXMIN-NEXT: ret ; RV32IZHINXMIN-NEXT: .LBB0_2: # %if.else @@ -93,7 +93,7 @@ define void @br_fcmp_false(half %a, half %b) nounwind { ; ; RV64IZHINXMIN-LABEL: br_fcmp_false: ; RV64IZHINXMIN: # %bb.0: -; RV64IZHINXMIN-NEXT: beqz zero, .LBB0_2 +; RV64IZHINXMIN-NEXT: j .LBB0_2 ; RV64IZHINXMIN-NEXT: # %bb.1: # %if.then ; RV64IZHINXMIN-NEXT: ret ; RV64IZHINXMIN-NEXT: .LBB0_2: # %if.else @@ -1754,7 +1754,7 @@ if.then: define void @br_fcmp_true(half %a, half %b) nounwind { ; RV32IZFH-LABEL: br_fcmp_true: ; RV32IZFH: # %bb.0: -; RV32IZFH-NEXT: beqz zero, .LBB16_2 +; RV32IZFH-NEXT: j .LBB16_2 ; RV32IZFH-NEXT: # %bb.1: # %if.else ; RV32IZFH-NEXT: ret ; RV32IZFH-NEXT: .LBB16_2: # %if.then @@ -1764,7 +1764,7 @@ define void @br_fcmp_true(half %a, half %b) nounwind { ; ; RV64IZFH-LABEL: br_fcmp_true: ; RV64IZFH: # %bb.0: -; RV64IZFH-NEXT: beqz zero, .LBB16_2 +; RV64IZFH-NEXT: j .LBB16_2 ; RV64IZFH-NEXT: # %bb.1: # %if.else ; RV64IZFH-NEXT: ret ; RV64IZFH-NEXT: .LBB16_2: # %if.then @@ -1774,7 +1774,7 @@ define void @br_fcmp_true(half %a, half %b) nounwind { ; ; RV32IZHINX-LABEL: br_fcmp_true: ; RV32IZHINX: # %bb.0: -; RV32IZHINX-NEXT: beqz zero, .LBB16_2 +; RV32IZHINX-NEXT: j .LBB16_2 ; RV32IZHINX-NEXT: # %bb.1: # %if.else ; RV32IZHINX-NEXT: ret ; RV32IZHINX-NEXT: .LBB16_2: # %if.then @@ -1784,7 +1784,7 @@ define void @br_fcmp_true(half %a, half %b) nounwind { ; ; RV64IZHINX-LABEL: br_fcmp_true: ; RV64IZHINX: # %bb.0: -; RV64IZHINX-NEXT: beqz zero, .LBB16_2 +; RV64IZHINX-NEXT: j .LBB16_2 ; RV64IZHINX-NEXT: # %bb.1: # %if.else ; RV64IZHINX-NEXT: ret ; RV64IZHINX-NEXT: .LBB16_2: # %if.then @@ -1794,7 +1794,7 @@ define void @br_fcmp_true(half %a, half %b) nounwind { ; ; RV32IZFHMIN-LABEL: br_fcmp_true: ; RV32IZFHMIN: # %bb.0: -; RV32IZFHMIN-NEXT: beqz zero, .LBB16_2 +; RV32IZFHMIN-NEXT: j .LBB16_2 ; RV32IZFHMIN-NEXT: # %bb.1: # %if.else ; RV32IZFHMIN-NEXT: ret ; RV32IZFHMIN-NEXT: .LBB16_2: # %if.then @@ -1804,7 +1804,7 @@ define void @br_fcmp_true(half %a, half %b) nounwind { ; ; RV64IZFHMIN-LABEL: br_fcmp_true: ; RV64IZFHMIN: # %bb.0: -; RV64IZFHMIN-NEXT: beqz zero, .LBB16_2 +; RV64IZFHMIN-NEXT: j .LBB16_2 ; RV64IZFHMIN-NEXT: # %bb.1: # %if.else ; RV64IZFHMIN-NEXT: ret ; RV64IZFHMIN-NEXT: .LBB16_2: # %if.then @@ -1814,7 +1814,7 @@ define void @br_fcmp_true(half %a, half %b) nounwind { ; ; RV32IZHINXMIN-LABEL: br_fcmp_true: ; RV32IZHINXMIN: # %bb.0: -; RV32IZHINXMIN-NEXT: beqz zero, .LBB16_2 +; RV32IZHINXMIN-NEXT: j .LBB16_2 ; RV32IZHINXMIN-NEXT: # %bb.1: # %if.else ; RV32IZHINXMIN-NEXT: ret ; RV32IZHINXMIN-NEXT: .LBB16_2: # %if.then @@ -1824,7 +1824,7 @@ define void @br_fcmp_true(half %a, half %b) nounwind { ; ; RV64IZHINXMIN-LABEL: br_fcmp_true: ; RV64IZHINXMIN: # %bb.0: -; RV64IZHINXMIN-NEXT: beqz zero, .LBB16_2 +; RV64IZHINXMIN-NEXT: j .LBB16_2 ; RV64IZHINXMIN-NEXT: # %bb.1: # %if.else ; RV64IZHINXMIN-NEXT: ret ; RV64IZHINXMIN-NEXT: .LBB16_2: # %if.then diff --git a/llvm/test/CodeGen/RISCV/machine-sink-load-immediate.ll b/llvm/test/CodeGen/RISCV/machine-sink-load-immediate.ll index 4947423971c6b..6d3000a513538 100644 --- a/llvm/test/CodeGen/RISCV/machine-sink-load-immediate.ll +++ b/llvm/test/CodeGen/RISCV/machine-sink-load-immediate.ll @@ -16,66 +16,54 @@ define i1 @sink_li(ptr %text, ptr %text.addr.0) nounwind { ; CHECK-NEXT: beqz s0, .LBB0_25 ; CHECK-NEXT: .LBB0_1: # %while.body ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 -; CHECK-NEXT: beqz zero, .LBB0_3 +; CHECK-NEXT: j .LBB0_3 ; CHECK-NEXT: # %bb.2: # %while.body -; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1 -; CHECK-NEXT: beqz zero, .LBB0_15 +; CHECK-NEXT: j .LBB0_15 ; CHECK-NEXT: .LBB0_3: # %while.body.1 ; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1 -; CHECK-NEXT: beqz zero, .LBB0_5 +; CHECK-NEXT: j .LBB0_5 ; CHECK-NEXT: # %bb.4: # %while.body.1 -; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1 -; CHECK-NEXT: beqz zero, .LBB0_16 +; CHECK-NEXT: j .LBB0_16 ; CHECK-NEXT: .LBB0_5: # %while.body.3 ; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1 -; CHECK-NEXT: beqz zero, .LBB0_7 +; CHECK-NEXT: j .LBB0_7 ; CHECK-NEXT: # %bb.6: # %while.body.3 -; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1 -; CHECK-NEXT: beqz zero, .LBB0_18 +; CHECK-NEXT: j .LBB0_18 ; CHECK-NEXT: .LBB0_7: # %while.body.4 ; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1 -; CHECK-NEXT: beqz zero, .LBB0_9 +; CHECK-NEXT: j .LBB0_9 ; CHECK-NEXT: # %bb.8: # %while.body.4 -; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1 -; CHECK-NEXT: beqz zero, .LBB0_20 +; CHECK-NEXT: j .LBB0_20 ; CHECK-NEXT: .LBB0_9: # %while.body.5 ; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1 -; CHECK-NEXT: beqz zero, .LBB0_11 +; CHECK-NEXT: j .LBB0_11 ; CHECK-NEXT: # %bb.10: # %while.body.5 -; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1 -; CHECK-NEXT: beqz zero, .LBB0_22 +; CHECK-NEXT: j .LBB0_22 ; CHECK-NEXT: .LBB0_11: # %while.body.6 ; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1 -; CHECK-NEXT: beqz zero, .LBB0_1 +; CHECK-NEXT: j .LBB0_1 ; CHECK-NEXT: # %bb.12: # %while.body.6 -; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1 -; CHECK-NEXT: bnez zero, .LBB0_1 ; CHECK-NEXT: # %bb.13: # %while.body.6 -; CHECK-NEXT: bnez zero, .LBB0_23 ; CHECK-NEXT: # %bb.14: # %strdup.exit.split.loop.exit126 ; CHECK-NEXT: addi s0, s1, 7 ; CHECK-NEXT: j .LBB0_24 ; CHECK-NEXT: .LBB0_15: # %while.body -; CHECK-NEXT: bnez zero, .LBB0_25 ; CHECK-NEXT: j .LBB0_17 ; CHECK-NEXT: .LBB0_16: # %while.body.1 -; CHECK-NEXT: bnez zero, .LBB0_23 ; CHECK-NEXT: .LBB0_17: # %strdup.exit.loopexit ; CHECK-NEXT: li s0, 0 ; CHECK-NEXT: j .LBB0_24 ; CHECK-NEXT: .LBB0_18: # %while.body.3 -; CHECK-NEXT: bnez zero, .LBB0_23 ; CHECK-NEXT: # %bb.19: # %strdup.exit.split.loop.exit120 ; CHECK-NEXT: addi s0, s1, 4 ; CHECK-NEXT: j .LBB0_24 ; CHECK-NEXT: .LBB0_20: # %while.body.4 -; CHECK-NEXT: bnez zero, .LBB0_23 ; CHECK-NEXT: # %bb.21: # %strdup.exit.split.loop.exit122 ; CHECK-NEXT: addi s0, s1, 5 ; CHECK-NEXT: j .LBB0_24 ; CHECK-NEXT: .LBB0_22: # %while.body.5 -; CHECK-NEXT: beqz zero, .LBB0_24 -; CHECK-NEXT: .LBB0_23: +; CHECK-NEXT: j .LBB0_24 +; CHECK-NEXT: # %bb.23: ; CHECK-NEXT: li a1, 0 ; CHECK-NEXT: j .LBB0_25 ; CHECK-NEXT: .LBB0_24: # %strdup.exit diff --git a/llvm/test/CodeGen/RISCV/rvv/vxrm-insert-out-of-loop.ll b/llvm/test/CodeGen/RISCV/rvv/vxrm-insert-out-of-loop.ll index c35f05be304cc..75f4b977a98b0 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vxrm-insert-out-of-loop.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vxrm-insert-out-of-loop.ll @@ -26,10 +26,9 @@ define void @test1(ptr nocapture noundef writeonly %dst, i32 noundef signext %i_ ; RV32-NEXT: slli t1, t2, 1 ; RV32-NEXT: li t6, 32 ; RV32-NEXT: mv t0, t1 -; RV32-NEXT: bnez zero, .LBB0_4 ; RV32-NEXT: # %bb.3: # %for.cond1.preheader.us.preheader ; RV32-NEXT: li t0, 32 -; RV32-NEXT: .LBB0_4: # %for.cond1.preheader.us.preheader +; RV32-NEXT: # %bb.4: # %for.cond1.preheader.us.preheader ; RV32-NEXT: addi sp, sp, -16 ; RV32-NEXT: .cfi_def_cfa_offset 16 ; RV32-NEXT: sw s0, 12(sp) # 4-byte Folded Spill @@ -38,6 +37,7 @@ define void @test1(ptr nocapture noundef writeonly %dst, i32 noundef signext %i_ ; RV32-NEXT: .cfi_offset s0, -4 ; RV32-NEXT: .cfi_offset s1, -8 ; RV32-NEXT: .cfi_offset s2, -12 +; RV32-NEXT: .cfi_remember_state ; RV32-NEXT: add t3, a0, t3 ; RV32-NEXT: add t4, a2, t4 ; RV32-NEXT: add s0, a4, t5 @@ -48,10 +48,11 @@ define void @test1(ptr nocapture noundef writeonly %dst, i32 noundef signext %i_ ; RV32-NEXT: add t3, t3, a6 ; RV32-NEXT: add t5, t4, a6 ; RV32-NEXT: add t4, s0, a6 -; RV32-NEXT: beqz zero, .LBB0_8 +; RV32-NEXT: j .LBB0_8 ; RV32-NEXT: # %bb.7: # %for.cond1.preheader.us.preheader ; RV32-NEXT: mv t1, t0 ; RV32-NEXT: .LBB0_8: # %for.cond1.preheader.us.preheader +; RV32-NEXT: .cfi_restore_state ; RV32-NEXT: li t0, 0 ; RV32-NEXT: sltu t5, a0, t5 ; RV32-NEXT: sltu t6, a2, t3 diff --git a/llvm/test/CodeGen/RISCV/simplify-condbr.ll b/llvm/test/CodeGen/RISCV/simplify-condbr.ll index deda98c5c162a..3f9a73607103a 100644 --- a/llvm/test/CodeGen/RISCV/simplify-condbr.ll +++ b/llvm/test/CodeGen/RISCV/simplify-condbr.ll @@ -63,7 +63,6 @@ define fastcc i32 @S_regrepeat(ptr %startposp, i32 %max, i8 %0, i1 %cmp343) noun ; CHECK-NEXT: addi sp, sp, 32 ; CHECK-NEXT: ret ; CHECK-NEXT: .LBB0_10: -; CHECK-NEXT: bnez zero, .LBB0_9 ; CHECK-NEXT: j .LBB0_8 entry: switch i8 %0, label %if.else1492 [ @@ -129,7 +128,7 @@ define ptr @Perl_pp_refassign(ptr %PL_stack_sp, i1 %tobool.not, i1 %tobool3.not, ; CHECK-NEXT: andi a2, a2, 1 ; CHECK-NEXT: beqz a2, .LBB1_2 ; CHECK-NEXT: .LBB1_4: -; CHECK-NEXT: beqz zero, .LBB1_6 +; CHECK-NEXT: j .LBB1_6 ; CHECK-NEXT: .LBB1_5: # %sw.bb85 ; CHECK-NEXT: addi sp, sp, -16 ; CHECK-NEXT: sd ra, 8(sp) # 8-byte Folded Spill