diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:17:04 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:17:04 +0000 |
commit | b915e9e0fc85ba6f398b3fab0db6a81a8913af94 (patch) | |
tree | 98b8f811c7aff2547cab8642daf372d6c59502fb /lib/Target/Hexagon/HexagonEarlyIfConv.cpp | |
parent | 6421cca32f69ac849537a3cff78c352195e99f1b (diff) | |
download | src-b915e9e0fc85ba6f398b3fab0db6a81a8913af94.tar.gz src-b915e9e0fc85ba6f398b3fab0db6a81a8913af94.zip |
Notes
Diffstat (limited to 'lib/Target/Hexagon/HexagonEarlyIfConv.cpp')
-rw-r--r-- | lib/Target/Hexagon/HexagonEarlyIfConv.cpp | 266 |
1 files changed, 118 insertions, 148 deletions
diff --git a/lib/Target/Hexagon/HexagonEarlyIfConv.cpp b/lib/Target/Hexagon/HexagonEarlyIfConv.cpp index 2665acd19fb1..a5351cd08da5 100644 --- a/lib/Target/Hexagon/HexagonEarlyIfConv.cpp +++ b/lib/Target/Hexagon/HexagonEarlyIfConv.cpp @@ -52,7 +52,7 @@ // %vreg41<def> = S2_tstbit_i %vreg40<kill>, 0 // spec-> %vreg11<def> = A2_addp %vreg6, %vreg10 // pred-> S2_pstorerdf_io %vreg41, %vreg32, 16, %vreg11 -// %vreg46<def> = MUX64_rr %vreg41, %vreg6, %vreg11 +// %vreg46<def> = PS_pselect %vreg41, %vreg6, %vreg11 // %vreg13<def> = A2_addp %vreg7, %vreg46 // %vreg42<def> = C2_cmpeqi %vreg9, 10 // J2_jumpf %vreg42<kill>, <BB#3>, %PC<imp-def,dead> @@ -61,32 +61,46 @@ #define DEBUG_TYPE "hexagon-eif" +#include "Hexagon.h" +#include "HexagonInstrInfo.h" +#include "HexagonSubtarget.h" #include "llvm/ADT/DenseSet.h" -#include "llvm/ADT/SetVector.h" +#include "llvm/ADT/iterator_range.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineBranchProbabilityInfo.h" #include "llvm/CodeGen/MachineDominators.h" +#include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineLoopInfo.h" +#include "llvm/CodeGen/MachineOperand.h" #include "llvm/CodeGen/MachineRegisterInfo.h" -#include "llvm/CodeGen/Passes.h" +#include "llvm/IR/DebugLoc.h" +#include "llvm/Pass.h" +#include "llvm/Support/BranchProbability.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" +#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/Target/TargetInstrInfo.h" -#include "llvm/Target/TargetMachine.h" -#include "HexagonTargetMachine.h" - -#include <functional> +#include "llvm/Target/TargetRegisterInfo.h" +#include <cassert> +#include <iterator> using namespace llvm; namespace llvm { + FunctionPass *createHexagonEarlyIfConversion(); void initializeHexagonEarlyIfConversionPass(PassRegistry& Registry); -} + +} // end namespace llvm namespace { + cl::opt<bool> EnableHexagonBP("enable-hexagon-br-prob", cl::Hidden, cl::init(false), cl::desc("Enable branch probability info")); cl::opt<unsigned> SizeLimit("eif-limit", cl::init(6), cl::Hidden, @@ -103,18 +117,22 @@ namespace { } struct FlowPattern { - FlowPattern() : SplitB(0), TrueB(0), FalseB(0), JoinB(0), PredR(0) {} + FlowPattern() = default; FlowPattern(MachineBasicBlock *B, unsigned PR, MachineBasicBlock *TB, MachineBasicBlock *FB, MachineBasicBlock *JB) : SplitB(B), TrueB(TB), FalseB(FB), JoinB(JB), PredR(PR) {} - MachineBasicBlock *SplitB; - MachineBasicBlock *TrueB, *FalseB, *JoinB; - unsigned PredR; + MachineBasicBlock *SplitB = nullptr; + MachineBasicBlock *TrueB = nullptr; + MachineBasicBlock *FalseB = nullptr; + MachineBasicBlock *JoinB = nullptr; + unsigned PredR = 0; }; + struct PrintFP { PrintFP(const FlowPattern &P, const TargetRegisterInfo &T) : FP(P), TRI(T) {} + const FlowPattern &FP; const TargetRegisterInfo &TRI; friend raw_ostream &operator<< (raw_ostream &OS, const PrintFP &P); @@ -133,13 +151,17 @@ namespace { class HexagonEarlyIfConversion : public MachineFunctionPass { public: static char ID; + HexagonEarlyIfConversion() : MachineFunctionPass(ID), - TII(0), TRI(0), MFN(0), MRI(0), MDT(0), MLI(0) { + HII(nullptr), TRI(nullptr), MFN(nullptr), MRI(nullptr), MDT(nullptr), + MLI(nullptr) { initializeHexagonEarlyIfConversionPass(*PassRegistry::getPassRegistry()); } - const char *getPassName() const override { + + StringRef getPassName() const override { return "Hexagon early if conversion"; } + void getAnalysisUsage(AnalysisUsage &AU) const override { AU.addRequired<MachineBranchProbabilityInfo>(); AU.addRequired<MachineDominatorTree>(); @@ -147,6 +169,7 @@ namespace { AU.addRequired<MachineLoopInfo>(); MachineFunctionPass::getAnalysisUsage(AU); } + bool runOnMachineFunction(MachineFunction &MF) override; private: @@ -185,7 +208,7 @@ namespace { void mergeBlocks(MachineBasicBlock *PredB, MachineBasicBlock *SuccB); void simplifyFlowGraph(const FlowPattern &FP); - const TargetInstrInfo *TII; + const HexagonInstrInfo *HII; const TargetRegisterInfo *TRI; MachineFunction *MFN; MachineRegisterInfo *MRI; @@ -196,7 +219,8 @@ namespace { }; char HexagonEarlyIfConversion::ID = 0; -} + +} // end anonymous namespace INITIALIZE_PASS(HexagonEarlyIfConversion, "hexagon-eif", "Hexagon early if conversion", false, false) @@ -209,7 +233,6 @@ bool HexagonEarlyIfConversion::isPreheader(const MachineBasicBlock *B) const { return L && SB == L->getHeader(); } - bool HexagonEarlyIfConversion::matchFlowPattern(MachineBasicBlock *B, MachineLoop *L, FlowPattern &FP) { DEBUG(dbgs() << "Checking flow pattern at BB#" << B->getNumber() << "\n"); @@ -217,7 +240,7 @@ bool HexagonEarlyIfConversion::matchFlowPattern(MachineBasicBlock *B, // Interested only in conditional branches, no .new, no new-value, etc. // Check the terminators directly, it's easier than handling all responses // from AnalyzeBranch. - MachineBasicBlock *TB = 0, *FB = 0; + MachineBasicBlock *TB = nullptr, *FB = nullptr; MachineBasicBlock::const_iterator T1I = B->getFirstTerminator(); if (T1I == B->end()) return false; @@ -228,7 +251,7 @@ bool HexagonEarlyIfConversion::matchFlowPattern(MachineBasicBlock *B, // Get the layout successor, or 0 if B does not have one. MachineFunction::iterator NextBI = std::next(MachineFunction::iterator(B)); - MachineBasicBlock *NextB = (NextBI != MFN->end()) ? &*NextBI : 0; + MachineBasicBlock *NextB = (NextBI != MFN->end()) ? &*NextBI : nullptr; MachineBasicBlock *T1B = T1I->getOperand(1).getMBB(); MachineBasicBlock::const_iterator T2I = std::next(T1I); @@ -273,9 +296,9 @@ bool HexagonEarlyIfConversion::matchFlowPattern(MachineBasicBlock *B, if (!TOk && !FOk) return false; - MachineBasicBlock *TSB = (TNS > 0) ? *TB->succ_begin() : 0; - MachineBasicBlock *FSB = (FNS > 0) ? *FB->succ_begin() : 0; - MachineBasicBlock *JB = 0; + MachineBasicBlock *TSB = (TNS > 0) ? *TB->succ_begin() : nullptr; + MachineBasicBlock *FSB = (FNS > 0) ? *FB->succ_begin() : nullptr; + MachineBasicBlock *JB = nullptr; if (TOk) { if (FOk) { @@ -286,14 +309,14 @@ bool HexagonEarlyIfConversion::matchFlowPattern(MachineBasicBlock *B, // TOk && !FOk if (TSB == FB) { JB = FB; - FB = 0; + FB = nullptr; } } } else { // !TOk && FOk (at least one must be true by now). if (FSB == TB) { JB = TB; - TB = 0; + TB = nullptr; } } // Don't try to predicate loop preheaders. @@ -308,7 +331,6 @@ bool HexagonEarlyIfConversion::matchFlowPattern(MachineBasicBlock *B, return true; } - // KLUDGE: HexagonInstrInfo::AnalyzeBranch won't work on a block that // contains EH_LABEL. bool HexagonEarlyIfConversion::hasEHLabel(const MachineBasicBlock *B) const { @@ -318,7 +340,6 @@ bool HexagonEarlyIfConversion::hasEHLabel(const MachineBasicBlock *B) const { return false; } - // KLUDGE: HexagonInstrInfo::AnalyzeBranch may be unable to recognize // that a block can never fall-through. bool HexagonEarlyIfConversion::hasUncondBranch(const MachineBasicBlock *B) @@ -332,7 +353,6 @@ bool HexagonEarlyIfConversion::hasUncondBranch(const MachineBasicBlock *B) return false; } - bool HexagonEarlyIfConversion::isValidCandidate(const MachineBasicBlock *B) const { if (!B) @@ -357,10 +377,10 @@ bool HexagonEarlyIfConversion::isValidCandidate(const MachineBasicBlock *B) // update the use of it after predication). PHI uses will be updated // to use a result of a MUX, and a MUX cannot be created for predicate // registers. - for (ConstMIOperands MO(MI); MO.isValid(); ++MO) { - if (!MO->isReg() || !MO->isDef()) + for (const MachineOperand &MO : MI.operands()) { + if (!MO.isReg() || !MO.isDef()) continue; - unsigned R = MO->getReg(); + unsigned R = MO.getReg(); if (!TargetRegisterInfo::isVirtualRegister(R)) continue; if (MRI->getRegClass(R) != &Hexagon::PredRegsRegClass) @@ -373,12 +393,11 @@ bool HexagonEarlyIfConversion::isValidCandidate(const MachineBasicBlock *B) return true; } - bool HexagonEarlyIfConversion::usesUndefVReg(const MachineInstr *MI) const { - for (ConstMIOperands MO(*MI); MO.isValid(); ++MO) { - if (!MO->isReg() || !MO->isUse()) + for (const MachineOperand &MO : MI->operands()) { + if (!MO.isReg() || !MO.isUse()) continue; - unsigned R = MO->getReg(); + unsigned R = MO.getReg(); if (!TargetRegisterInfo::isVirtualRegister(R)) continue; const MachineInstr *DefI = MRI->getVRegDef(R); @@ -390,7 +409,6 @@ bool HexagonEarlyIfConversion::usesUndefVReg(const MachineInstr *MI) const { return false; } - bool HexagonEarlyIfConversion::isValid(const FlowPattern &FP) const { if (hasEHLabel(FP.SplitB)) // KLUDGE: see function definition return false; @@ -424,7 +442,6 @@ bool HexagonEarlyIfConversion::isValid(const FlowPattern &FP) const { return true; } - unsigned HexagonEarlyIfConversion::computePhiCost(MachineBasicBlock *B) const { assert(B->pred_size() <= 2); if (B->pred_size() < 2) @@ -443,21 +460,20 @@ unsigned HexagonEarlyIfConversion::computePhiCost(MachineBasicBlock *B) const { } MachineInstr *Def1 = MRI->getVRegDef(RO1.getReg()); MachineInstr *Def3 = MRI->getVRegDef(RO3.getReg()); - if (!TII->isPredicable(*Def1) || !TII->isPredicable(*Def3)) + if (!HII->isPredicable(*Def1) || !HII->isPredicable(*Def3)) Cost++; } return Cost; } - unsigned HexagonEarlyIfConversion::countPredicateDefs( const MachineBasicBlock *B) const { unsigned PredDefs = 0; for (auto &MI : *B) { - for (ConstMIOperands MO(MI); MO.isValid(); ++MO) { - if (!MO->isReg() || !MO->isDef()) + for (const MachineOperand &MO : MI.operands()) { + if (!MO.isReg() || !MO.isDef()) continue; - unsigned R = MO->getReg(); + unsigned R = MO.getReg(); if (!TargetRegisterInfo::isVirtualRegister(R)) continue; if (MRI->getRegClass(R) == &Hexagon::PredRegsRegClass) @@ -467,7 +483,6 @@ unsigned HexagonEarlyIfConversion::countPredicateDefs( return PredDefs; } - bool HexagonEarlyIfConversion::isProfitable(const FlowPattern &FP) const { if (FP.TrueB && FP.FalseB) { @@ -547,7 +562,6 @@ bool HexagonEarlyIfConversion::isProfitable(const FlowPattern &FP) const { return true; } - bool HexagonEarlyIfConversion::visitBlock(MachineBasicBlock *B, MachineLoop *L) { bool Changed = false; @@ -593,9 +607,8 @@ bool HexagonEarlyIfConversion::visitBlock(MachineBasicBlock *B, return true; } - bool HexagonEarlyIfConversion::visitLoop(MachineLoop *L) { - MachineBasicBlock *HB = L ? L->getHeader() : 0; + MachineBasicBlock *HB = L ? L->getHeader() : nullptr; DEBUG((L ? dbgs() << "Visiting loop H:" << PrintMB(HB) : dbgs() << "Visiting function") << "\n"); bool Changed = false; @@ -609,34 +622,29 @@ bool HexagonEarlyIfConversion::visitLoop(MachineLoop *L) { return Changed; } - bool HexagonEarlyIfConversion::isPredicableStore(const MachineInstr *MI) const { - // Exclude post-increment stores. Those return a value, so we cannot - // predicate them. + // HexagonInstrInfo::isPredicable will consider these stores are non- + // -predicable if the offset would become constant-extended after + // predication. unsigned Opc = MI->getOpcode(); - using namespace Hexagon; switch (Opc) { - // Store byte: - case S2_storerb_io: case S4_storerb_rr: - case S2_storerbabs: case S4_storeirb_io: case S2_storerbgp: - // Store halfword: - case S2_storerh_io: case S4_storerh_rr: - case S2_storerhabs: case S4_storeirh_io: case S2_storerhgp: - // Store upper halfword: - case S2_storerf_io: case S4_storerf_rr: - case S2_storerfabs: case S2_storerfgp: - // Store word: - case S2_storeri_io: case S4_storeri_rr: - case S2_storeriabs: case S4_storeiri_io: case S2_storerigp: - // Store doubleword: - case S2_storerd_io: case S4_storerd_rr: - case S2_storerdabs: case S2_storerdgp: + case Hexagon::S2_storerb_io: + case Hexagon::S2_storerbnew_io: + case Hexagon::S2_storerh_io: + case Hexagon::S2_storerhnew_io: + case Hexagon::S2_storeri_io: + case Hexagon::S2_storerinew_io: + case Hexagon::S2_storerd_io: + case Hexagon::S4_storeirb_io: + case Hexagon::S4_storeirh_io: + case Hexagon::S4_storeiri_io: return true; } - return false; -} + // TargetInstrInfo::isPredicable takes a non-const pointer. + return MI->mayStore() && HII->isPredicable(const_cast<MachineInstr&>(*MI)); +} bool HexagonEarlyIfConversion::isSafeToSpeculate(const MachineInstr *MI) const { @@ -650,59 +658,11 @@ bool HexagonEarlyIfConversion::isSafeToSpeculate(const MachineInstr *MI) return true; } - unsigned HexagonEarlyIfConversion::getCondStoreOpcode(unsigned Opc, bool IfTrue) const { - // Exclude post-increment stores. - using namespace Hexagon; - switch (Opc) { - case S2_storerb_io: - return IfTrue ? S2_pstorerbt_io : S2_pstorerbf_io; - case S4_storerb_rr: - return IfTrue ? S4_pstorerbt_rr : S4_pstorerbf_rr; - case S2_storerbabs: - case S2_storerbgp: - return IfTrue ? S4_pstorerbt_abs : S4_pstorerbf_abs; - case S4_storeirb_io: - return IfTrue ? S4_storeirbt_io : S4_storeirbf_io; - case S2_storerh_io: - return IfTrue ? S2_pstorerht_io : S2_pstorerhf_io; - case S4_storerh_rr: - return IfTrue ? S4_pstorerht_rr : S4_pstorerhf_rr; - case S2_storerhabs: - case S2_storerhgp: - return IfTrue ? S4_pstorerht_abs : S4_pstorerhf_abs; - case S2_storerf_io: - return IfTrue ? S2_pstorerft_io : S2_pstorerff_io; - case S4_storerf_rr: - return IfTrue ? S4_pstorerft_rr : S4_pstorerff_rr; - case S2_storerfabs: - case S2_storerfgp: - return IfTrue ? S4_pstorerft_abs : S4_pstorerff_abs; - case S4_storeirh_io: - return IfTrue ? S4_storeirht_io : S4_storeirhf_io; - case S2_storeri_io: - return IfTrue ? S2_pstorerit_io : S2_pstorerif_io; - case S4_storeri_rr: - return IfTrue ? S4_pstorerit_rr : S4_pstorerif_rr; - case S2_storeriabs: - case S2_storerigp: - return IfTrue ? S4_pstorerit_abs : S4_pstorerif_abs; - case S4_storeiri_io: - return IfTrue ? S4_storeirit_io : S4_storeirif_io; - case S2_storerd_io: - return IfTrue ? S2_pstorerdt_io : S2_pstorerdf_io; - case S4_storerd_rr: - return IfTrue ? S4_pstorerdt_rr : S4_pstorerdf_rr; - case S2_storerdabs: - case S2_storerdgp: - return IfTrue ? S4_pstorerdt_abs : S4_pstorerdf_abs; - } - llvm_unreachable("Unexpected opcode"); - return 0; + return HII->getCondOpcode(Opc, !IfTrue); } - void HexagonEarlyIfConversion::predicateInstr(MachineBasicBlock *ToB, MachineBasicBlock::iterator At, MachineInstr *MI, unsigned PredR, bool IfTrue) { @@ -717,10 +677,15 @@ void HexagonEarlyIfConversion::predicateInstr(MachineBasicBlock *ToB, if (isPredicableStore(MI)) { unsigned COpc = getCondStoreOpcode(Opc, IfTrue); assert(COpc); - MachineInstrBuilder MIB = BuildMI(*ToB, At, DL, TII->get(COpc)) - .addReg(PredR); - for (MIOperands MO(*MI); MO.isValid(); ++MO) - MIB.addOperand(*MO); + MachineInstrBuilder MIB = BuildMI(*ToB, At, DL, HII->get(COpc)); + MachineInstr::mop_iterator MOI = MI->operands_begin(); + if (HII->isPostIncrement(*MI)) { + MIB.addOperand(*MOI); + ++MOI; + } + MIB.addReg(PredR); + for (const MachineOperand &MO : make_range(MOI, MI->operands_end())) + MIB.addOperand(MO); // Set memory references. MachineInstr::mmo_iterator MMOBegin = MI->memoperands_begin(); @@ -733,7 +698,7 @@ void HexagonEarlyIfConversion::predicateInstr(MachineBasicBlock *ToB, if (Opc == Hexagon::J2_jump) { MachineBasicBlock *TB = MI->getOperand(0).getMBB(); - const MCInstrDesc &D = TII->get(IfTrue ? Hexagon::J2_jumpt + const MCInstrDesc &D = HII->get(IfTrue ? Hexagon::J2_jumpt : Hexagon::J2_jumpf); BuildMI(*ToB, At, DL, D) .addReg(PredR) @@ -748,7 +713,6 @@ void HexagonEarlyIfConversion::predicateInstr(MachineBasicBlock *ToB, llvm_unreachable("Unexpected instruction"); } - // Predicate/speculate non-branch instructions from FromB into block ToB. // Leave the branches alone, they will be handled later. Btw, at this point // FromB should have at most one branch, and it should be unconditional. @@ -769,7 +733,6 @@ void HexagonEarlyIfConversion::predicateBlockNB(MachineBasicBlock *ToB, } } - void HexagonEarlyIfConversion::updatePhiNodes(MachineBasicBlock *WhereB, const FlowPattern &FP) { // Visit all PHI nodes in the WhereB block and generate MUX instructions @@ -799,10 +762,25 @@ void HexagonEarlyIfConversion::updatePhiNodes(MachineBasicBlock *WhereB, assert(TR && FR); using namespace Hexagon; + unsigned DR = PN->getOperand(0).getReg(); const TargetRegisterClass *RC = MRI->getRegClass(DR); - const MCInstrDesc &D = RC == &IntRegsRegClass ? TII->get(C2_mux) - : TII->get(MUX64_rr); + unsigned Opc = 0; + if (RC == &IntRegsRegClass) + Opc = C2_mux; + else if (RC == &DoubleRegsRegClass) + Opc = PS_pselect; + else if (RC == &VectorRegsRegClass) + Opc = PS_vselect; + else if (RC == &VecDblRegsRegClass) + Opc = PS_wselect; + else if (RC == &VectorRegs128BRegClass) + Opc = PS_vselect_128B; + else if (RC == &VecDblRegs128BRegClass) + Opc = PS_wselect_128B; + else + llvm_unreachable("unexpected register type"); + const MCInstrDesc &D = HII->get(Opc); MachineBasicBlock::iterator MuxAt = FP.SplitB->getFirstTerminator(); DebugLoc DL; @@ -819,9 +797,8 @@ void HexagonEarlyIfConversion::updatePhiNodes(MachineBasicBlock *WhereB, } } - void HexagonEarlyIfConversion::convert(const FlowPattern &FP) { - MachineBasicBlock *TSB = 0, *FSB = 0; + MachineBasicBlock *TSB = nullptr, *FSB = nullptr; MachineBasicBlock::iterator OldTI = FP.SplitB->getFirstTerminator(); assert(OldTI != FP.SplitB->end()); DebugLoc DL = OldTI->getDebugLoc(); @@ -839,7 +816,7 @@ void HexagonEarlyIfConversion::convert(const FlowPattern &FP) { // Regenerate new terminators in the split block and update the successors. // First, remember any information that may be needed later and remove the // existing terminators/successors from the split block. - MachineBasicBlock *SSB = 0; + MachineBasicBlock *SSB = nullptr; FP.SplitB->erase(OldTI, FP.SplitB->end()); while (FP.SplitB->succ_size() > 0) { MachineBasicBlock *T = *FP.SplitB->succ_begin(); @@ -870,21 +847,21 @@ void HexagonEarlyIfConversion::convert(const FlowPattern &FP) { // generated. if (FP.JoinB) { assert(!SSB || SSB == FP.JoinB); - BuildMI(*FP.SplitB, FP.SplitB->end(), DL, TII->get(Hexagon::J2_jump)) + BuildMI(*FP.SplitB, FP.SplitB->end(), DL, HII->get(Hexagon::J2_jump)) .addMBB(FP.JoinB); FP.SplitB->addSuccessor(FP.JoinB); } else { bool HasBranch = false; if (TSB) { - BuildMI(*FP.SplitB, FP.SplitB->end(), DL, TII->get(Hexagon::J2_jumpt)) + BuildMI(*FP.SplitB, FP.SplitB->end(), DL, HII->get(Hexagon::J2_jumpt)) .addReg(FP.PredR) .addMBB(TSB); FP.SplitB->addSuccessor(TSB); HasBranch = true; } if (FSB) { - const MCInstrDesc &D = HasBranch ? TII->get(Hexagon::J2_jump) - : TII->get(Hexagon::J2_jumpf); + const MCInstrDesc &D = HasBranch ? HII->get(Hexagon::J2_jump) + : HII->get(Hexagon::J2_jumpf); MachineInstrBuilder MIB = BuildMI(*FP.SplitB, FP.SplitB->end(), DL, D); if (!HasBranch) MIB.addReg(FP.PredR); @@ -896,7 +873,7 @@ void HexagonEarlyIfConversion::convert(const FlowPattern &FP) { // successor blocks of the TrueB and FalseB (or null of the TrueB // or FalseB block is null). SSB is the potential successor block // of the SplitB that is neither TrueB nor FalseB. - BuildMI(*FP.SplitB, FP.SplitB->end(), DL, TII->get(Hexagon::J2_jump)) + BuildMI(*FP.SplitB, FP.SplitB->end(), DL, HII->get(Hexagon::J2_jump)) .addMBB(SSB); FP.SplitB->addSuccessor(SSB); } @@ -915,7 +892,6 @@ void HexagonEarlyIfConversion::convert(const FlowPattern &FP) { } } - void HexagonEarlyIfConversion::removeBlock(MachineBasicBlock *B) { DEBUG(dbgs() << "Removing block " << PrintMB(B) << "\n"); @@ -944,7 +920,6 @@ void HexagonEarlyIfConversion::removeBlock(MachineBasicBlock *B) { MFN->erase(B->getIterator()); } - void HexagonEarlyIfConversion::eliminatePhis(MachineBasicBlock *B) { DEBUG(dbgs() << "Removing phi nodes from block " << PrintMB(B) << "\n"); MachineBasicBlock::iterator I, NextI, NonPHI = B->getFirstNonPHI(); @@ -963,7 +938,7 @@ void HexagonEarlyIfConversion::eliminatePhis(MachineBasicBlock *B) { const DebugLoc &DL = PN->getDebugLoc(); const TargetRegisterClass *RC = MRI->getRegClass(DefR); NewR = MRI->createVirtualRegister(RC); - NonPHI = BuildMI(*B, NonPHI, DL, TII->get(TargetOpcode::COPY), NewR) + NonPHI = BuildMI(*B, NonPHI, DL, HII->get(TargetOpcode::COPY), NewR) .addReg(UseR, 0, UseSR); } MRI->replaceRegWith(DefR, NewR); @@ -971,7 +946,6 @@ void HexagonEarlyIfConversion::eliminatePhis(MachineBasicBlock *B) { } } - void HexagonEarlyIfConversion::replacePhiEdges(MachineBasicBlock *OldB, MachineBasicBlock *NewB) { for (auto I = OldB->succ_begin(), E = OldB->succ_end(); I != E; ++I) { @@ -979,21 +953,20 @@ void HexagonEarlyIfConversion::replacePhiEdges(MachineBasicBlock *OldB, MachineBasicBlock::iterator P, N = SB->getFirstNonPHI(); for (P = SB->begin(); P != N; ++P) { MachineInstr &PN = *P; - for (MIOperands MO(PN); MO.isValid(); ++MO) - if (MO->isMBB() && MO->getMBB() == OldB) - MO->setMBB(NewB); + for (MachineOperand &MO : PN.operands()) + if (MO.isMBB() && MO.getMBB() == OldB) + MO.setMBB(NewB); } } } - void HexagonEarlyIfConversion::mergeBlocks(MachineBasicBlock *PredB, MachineBasicBlock *SuccB) { DEBUG(dbgs() << "Merging blocks " << PrintMB(PredB) << " and " << PrintMB(SuccB) << "\n"); bool TermOk = hasUncondBranch(SuccB); eliminatePhis(SuccB); - TII->RemoveBranch(*PredB); + HII->removeBranch(*PredB); PredB->removeSuccessor(SuccB); PredB->splice(PredB->end(), SuccB, SuccB->begin(), SuccB->end()); MachineBasicBlock::succ_iterator I, E = SuccB->succ_end(); @@ -1006,7 +979,6 @@ void HexagonEarlyIfConversion::mergeBlocks(MachineBasicBlock *PredB, PredB->updateTerminator(); } - void HexagonEarlyIfConversion::simplifyFlowGraph(const FlowPattern &FP) { if (FP.TrueB) removeBlock(FP.TrueB); @@ -1030,13 +1002,12 @@ void HexagonEarlyIfConversion::simplifyFlowGraph(const FlowPattern &FP) { mergeBlocks(FP.SplitB, SB); } - bool HexagonEarlyIfConversion::runOnMachineFunction(MachineFunction &MF) { if (skipFunction(*MF.getFunction())) return false; - auto &ST = MF.getSubtarget(); - TII = ST.getInstrInfo(); + auto &ST = MF.getSubtarget<HexagonSubtarget>(); + HII = ST.getInstrInfo(); TRI = ST.getRegisterInfo(); MFN = &MF; MRI = &MF.getRegInfo(); @@ -1050,7 +1021,7 @@ bool HexagonEarlyIfConversion::runOnMachineFunction(MachineFunction &MF) { for (MachineLoopInfo::iterator I = MLI->begin(), E = MLI->end(); I != E; ++I) Changed |= visitLoop(*I); - Changed |= visitLoop(0); + Changed |= visitLoop(nullptr); return Changed; } @@ -1061,4 +1032,3 @@ bool HexagonEarlyIfConversion::runOnMachineFunction(MachineFunction &MF) { FunctionPass *llvm::createHexagonEarlyIfConversion() { return new HexagonEarlyIfConversion(); } - |