diff options
Diffstat (limited to 'lib/CodeGen/IfConversion.cpp')
| -rw-r--r-- | lib/CodeGen/IfConversion.cpp | 142 | 
1 files changed, 94 insertions, 48 deletions
| diff --git a/lib/CodeGen/IfConversion.cpp b/lib/CodeGen/IfConversion.cpp index e2d0eb44da06..1502d5f23efe 100644 --- a/lib/CodeGen/IfConversion.cpp +++ b/lib/CodeGen/IfConversion.cpp @@ -11,19 +11,18 @@  //  //===----------------------------------------------------------------------===// -#define DEBUG_TYPE "ifcvt"  #include "llvm/CodeGen/Passes.h"  #include "BranchFolding.h"  #include "llvm/ADT/STLExtras.h"  #include "llvm/ADT/SmallSet.h"  #include "llvm/ADT/Statistic.h" +#include "llvm/CodeGen/LivePhysRegs.h"  #include "llvm/CodeGen/MachineBranchProbabilityInfo.h"  #include "llvm/CodeGen/MachineFunctionPass.h"  #include "llvm/CodeGen/MachineInstrBuilder.h"  #include "llvm/CodeGen/MachineModuleInfo.h"  #include "llvm/CodeGen/MachineRegisterInfo.h"  #include "llvm/CodeGen/TargetSchedule.h" -#include "llvm/CodeGen/LiveRegUnits.h"  #include "llvm/MC/MCInstrItineraries.h"  #include "llvm/Support/CommandLine.h"  #include "llvm/Support/Debug.h" @@ -37,6 +36,8 @@  using namespace llvm; +#define DEBUG_TYPE "ifcvt" +  // Hidden options for help debugging.  static cl::opt<int> IfCvtFnStart("ifcvt-fn-start", cl::init(-1), cl::Hidden);  static cl::opt<int> IfCvtFnStop("ifcvt-fn-stop", cl::init(-1), cl::Hidden); @@ -127,7 +128,8 @@ namespace {                   IsAnalyzed(false), IsEnqueued(false), IsBrAnalyzable(false),                   HasFallThrough(false), IsUnpredicable(false),                   CannotBeCopied(false), ClobbersPred(false), NonPredSize(0), -                 ExtraCost(0), ExtraCost2(0), BB(0), TrueBB(0), FalseBB(0) {} +                 ExtraCost(0), ExtraCost2(0), BB(nullptr), TrueBB(nullptr), +                 FalseBB(nullptr) {}      };      /// IfcvtToken - Record information about pending if-conversions to attempt: @@ -162,8 +164,8 @@ namespace {      const MachineBranchProbabilityInfo *MBPI;      MachineRegisterInfo *MRI; -    LiveRegUnits Redefs; -    LiveRegUnits DontKill; +    LivePhysRegs Redefs; +    LivePhysRegs DontKill;      bool PreRegAlloc;      bool MadeChange; @@ -174,12 +176,12 @@ namespace {        initializeIfConverterPass(*PassRegistry::getPassRegistry());      } -    virtual void getAnalysisUsage(AnalysisUsage &AU) const { +    void getAnalysisUsage(AnalysisUsage &AU) const override {        AU.addRequired<MachineBranchProbabilityInfo>();        MachineFunctionPass::getAnalysisUsage(AU);      } -    virtual bool runOnMachineFunction(MachineFunction &MF); +    bool runOnMachineFunction(MachineFunction &MF) override;    private:      bool ReverseBranchCondition(BBInfo &BBI); @@ -205,7 +207,7 @@ namespace {      void PredicateBlock(BBInfo &BBI,                          MachineBasicBlock::iterator E,                          SmallVectorImpl<MachineOperand> &Cond, -                        SmallSet<unsigned, 4> *LaterRedefs = 0); +                        SmallSet<unsigned, 4> *LaterRedefs = nullptr);      void CopyAndPredicateBlock(BBInfo &ToBBI, BBInfo &FromBBI,                                 SmallVectorImpl<MachineOperand> &Cond,                                 bool IgnoreBr = false); @@ -230,7 +232,7 @@ namespace {      // blockAlwaysFallThrough - Block ends without a terminator.      bool blockAlwaysFallThrough(BBInfo &BBI) const { -      return BBI.IsBrAnalyzable && BBI.TrueBB == NULL; +      return BBI.IsBrAnalyzable && BBI.TrueBB == nullptr;      }      // IfcvtTokenCmp - Used to sort if-conversion candidates. @@ -438,7 +440,7 @@ static MachineBasicBlock *findFalseBlock(MachineBasicBlock *BB,      if (SuccBB != TrueBB)        return SuccBB;    } -  return NULL; +  return nullptr;  }  /// ReverseBranchCondition - Reverse the condition of the end of the block @@ -460,7 +462,7 @@ static inline MachineBasicBlock *getNextBlock(MachineBasicBlock *BB) {    MachineFunction::iterator I = BB;    MachineFunction::iterator E = BB->getParent()->end();    if (++I == E) -    return NULL; +    return nullptr;    return I;  } @@ -551,7 +553,7 @@ bool IfConverter::ValidDiamond(BBInfo &TrueBBI, BBInfo &FalseBBI,      FT = getNextBlock(FalseBBI.BB);    if (TT != FT)      return false; -  if (TT == NULL && (TrueBBI.IsBrAnalyzable || FalseBBI.IsBrAnalyzable)) +  if (!TT && (TrueBBI.IsBrAnalyzable || FalseBBI.IsBrAnalyzable))      return false;    if  (TrueBBI.BB->pred_size() > 1 || FalseBBI.BB->pred_size() > 1)      return false; @@ -641,11 +643,11 @@ void IfConverter::ScanInstructions(BBInfo &BBI) {    bool AlreadyPredicated = !BBI.Predicate.empty();    // First analyze the end of BB branches. -  BBI.TrueBB = BBI.FalseBB = NULL; +  BBI.TrueBB = BBI.FalseBB = nullptr;    BBI.BrCond.clear();    BBI.IsBrAnalyzable =      !TII->AnalyzeBranch(*BBI.BB, BBI.TrueBB, BBI.FalseBB, BBI.BrCond); -  BBI.HasFallThrough = BBI.IsBrAnalyzable && BBI.FalseBB == NULL; +  BBI.HasFallThrough = BBI.IsBrAnalyzable && BBI.FalseBB == nullptr;    if (BBI.BrCond.size()) {      // No false branch. This BB must end with a conditional branch and a @@ -921,7 +923,7 @@ void IfConverter::AnalyzeBlocks(MachineFunction &MF,  /// next block).  static bool canFallThroughTo(MachineBasicBlock *BB, MachineBasicBlock *ToBB) {    MachineFunction::iterator PI = BB; -  MachineFunction::iterator I = llvm::next(PI); +  MachineFunction::iterator I = std::next(PI);    MachineFunction::iterator TI = ToBB;    MachineFunction::iterator E = BB->getParent()->end();    while (I != TI) { @@ -954,13 +956,13 @@ static void InsertUncondBranch(MachineBasicBlock *BB, MachineBasicBlock *ToBB,                                 const TargetInstrInfo *TII) {    DebugLoc dl;  // FIXME: this is nowhere    SmallVector<MachineOperand, 0> NoCond; -  TII->InsertBranch(*BB, ToBB, NULL, NoCond, dl); +  TII->InsertBranch(*BB, ToBB, nullptr, NoCond, dl);  }  /// RemoveExtraEdges - Remove true / false edges if either / both are no longer  /// successors.  void IfConverter::RemoveExtraEdges(BBInfo &BBI) { -  MachineBasicBlock *TBB = NULL, *FBB = NULL; +  MachineBasicBlock *TBB = nullptr, *FBB = nullptr;    SmallVector<MachineOperand, 4> Cond;    if (!TII->AnalyzeBranch(*BBI.BB, TBB, FBB, Cond))      BBI.BB->CorrectExtraCFGEdges(TBB, FBB, !Cond.empty()); @@ -968,23 +970,22 @@ void IfConverter::RemoveExtraEdges(BBInfo &BBI) {  /// Behaves like LiveRegUnits::StepForward() but also adds implicit uses to all  /// values defined in MI which are not live/used by MI. -static void UpdatePredRedefs(MachineInstr *MI, LiveRegUnits &Redefs, -                             const TargetRegisterInfo *TRI) { +static void UpdatePredRedefs(MachineInstr *MI, LivePhysRegs &Redefs) {    for (ConstMIBundleOperands Ops(MI); Ops.isValid(); ++Ops) {      if (!Ops->isReg() || !Ops->isKill())        continue;      unsigned Reg = Ops->getReg();      if (Reg == 0)        continue; -    Redefs.removeReg(Reg, *TRI); +    Redefs.removeReg(Reg);    }    for (MIBundleOperands Ops(MI); Ops.isValid(); ++Ops) {      if (!Ops->isReg() || !Ops->isDef())        continue;      unsigned Reg = Ops->getReg(); -    if (Reg == 0 || Redefs.contains(Reg, *TRI)) +    if (Reg == 0 || Redefs.contains(Reg))        continue; -    Redefs.addReg(Reg, *TRI); +    Redefs.addReg(Reg);      MachineOperand &Op = *Ops;      MachineInstr *MI = Op.getParent(); @@ -996,12 +997,11 @@ static void UpdatePredRedefs(MachineInstr *MI, LiveRegUnits &Redefs,  /**   * Remove kill flags from operands with a registers in the @p DontKill set.   */ -static void RemoveKills(MachineInstr &MI, const LiveRegUnits &DontKill, -                        const MCRegisterInfo &MCRI) { +static void RemoveKills(MachineInstr &MI, const LivePhysRegs &DontKill) {    for (MIBundleOperands O(&MI); O.isValid(); ++O) {      if (!O->isReg() || !O->isKill())        continue; -    if (DontKill.contains(O->getReg(), MCRI)) +    if (DontKill.contains(O->getReg()))        O->setIsKill(false);    }  } @@ -1012,10 +1012,10 @@ static void RemoveKills(MachineInstr &MI, const LiveRegUnits &DontKill,   */  static void RemoveKills(MachineBasicBlock::iterator I,                          MachineBasicBlock::iterator E, -                        const LiveRegUnits &DontKill, +                        const LivePhysRegs &DontKill,                          const MCRegisterInfo &MCRI) {    for ( ; I != E; ++I) -    RemoveKills(*I, DontKill, MCRI); +    RemoveKills(*I, DontKill);  }  /// IfConvertSimple - If convert a simple (split, no rejoin) sub-CFG. @@ -1049,13 +1049,13 @@ bool IfConverter::IfConvertSimple(BBInfo &BBI, IfcvtKind Kind) {    // Initialize liveins to the first BB. These are potentiall redefined by    // predicated instructions.    Redefs.init(TRI); -  Redefs.addLiveIns(CvtBBI->BB, *TRI); -  Redefs.addLiveIns(NextBBI->BB, *TRI); +  Redefs.addLiveIns(CvtBBI->BB); +  Redefs.addLiveIns(NextBBI->BB);    // Compute a set of registers which must not be killed by instructions in    // BB1: This is everything live-in to BB2.    DontKill.init(TRI); -  DontKill.addLiveIns(NextBBI->BB, *TRI); +  DontKill.addLiveIns(NextBBI->BB);    if (CvtBBI->BB->pred_size() > 1) {      BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB); @@ -1104,6 +1104,28 @@ bool IfConverter::IfConvertSimple(BBInfo &BBI, IfcvtKind Kind) {    return true;  } +/// Scale down weights to fit into uint32_t. NewTrue is the new weight +/// for successor TrueBB, and NewFalse is the new weight for successor +/// FalseBB. +static void ScaleWeights(uint64_t NewTrue, uint64_t NewFalse, +                         MachineBasicBlock *MBB, +                         const MachineBasicBlock *TrueBB, +                         const MachineBasicBlock *FalseBB, +                         const MachineBranchProbabilityInfo *MBPI) { +  uint64_t NewMax = (NewTrue > NewFalse) ? NewTrue : NewFalse; +  uint32_t Scale = (NewMax / UINT32_MAX) + 1; +  for (MachineBasicBlock::succ_iterator SI = MBB->succ_begin(), +                                        SE = MBB->succ_end(); +       SI != SE; ++SI) { +    if (*SI == TrueBB) +      MBB->setSuccWeight(SI, (uint32_t)(NewTrue / Scale)); +    else if (*SI == FalseBB) +      MBB->setSuccWeight(SI, (uint32_t)(NewFalse / Scale)); +    else +      MBB->setSuccWeight(SI, MBPI->getEdgeWeight(MBB, SI) / Scale); +  } +} +  /// IfConvertTriangle - If convert a triangle sub-CFG.  ///  bool IfConverter::IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind) { @@ -1154,12 +1176,22 @@ bool IfConverter::IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind) {    // Initialize liveins to the first BB. These are potentially redefined by    // predicated instructions.    Redefs.init(TRI); -  Redefs.addLiveIns(CvtBBI->BB, *TRI); -  Redefs.addLiveIns(NextBBI->BB, *TRI); +  Redefs.addLiveIns(CvtBBI->BB); +  Redefs.addLiveIns(NextBBI->BB);    DontKill.clear(); -  bool HasEarlyExit = CvtBBI->FalseBB != NULL; +  bool HasEarlyExit = CvtBBI->FalseBB != nullptr; +  uint64_t CvtNext = 0, CvtFalse = 0, BBNext = 0, BBCvt = 0, SumWeight = 0; +  uint32_t WeightScale = 0; +  if (HasEarlyExit) { +    // Get weights before modifying CvtBBI->BB and BBI.BB. +    CvtNext = MBPI->getEdgeWeight(CvtBBI->BB, NextBBI->BB); +    CvtFalse = MBPI->getEdgeWeight(CvtBBI->BB, CvtBBI->FalseBB); +    BBNext = MBPI->getEdgeWeight(BBI.BB, NextBBI->BB); +    BBCvt = MBPI->getEdgeWeight(BBI.BB, CvtBBI->BB); +    SumWeight = MBPI->getSumForBlock(CvtBBI->BB, WeightScale); +  }    if (CvtBBI->BB->pred_size() > 1) {      BBI.NonPredSize -= TII->RemoveBranch(*BBI.BB);      // Copy instructions in the true block, predicate them, and add them to @@ -1185,8 +1217,22 @@ bool IfConverter::IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind) {                                             CvtBBI->BrCond.end());      if (TII->ReverseBranchCondition(RevCond))        llvm_unreachable("Unable to reverse branch condition!"); -    TII->InsertBranch(*BBI.BB, CvtBBI->FalseBB, NULL, RevCond, dl); +    TII->InsertBranch(*BBI.BB, CvtBBI->FalseBB, nullptr, RevCond, dl);      BBI.BB->addSuccessor(CvtBBI->FalseBB); +    // Update the edge weight for both CvtBBI->FalseBB and NextBBI. +    // New_Weight(BBI.BB, NextBBI->BB) = +    //   Weight(BBI.BB, NextBBI->BB) * getSumForBlock(CvtBBI->BB) + +    //   Weight(BBI.BB, CvtBBI->BB) * Weight(CvtBBI->BB, NextBBI->BB) +    // New_Weight(BBI.BB, CvtBBI->FalseBB) = +    //   Weight(BBI.BB, CvtBBI->BB) * Weight(CvtBBI->BB, CvtBBI->FalseBB) + +    uint64_t NewNext = BBNext * SumWeight + (BBCvt * CvtNext) / WeightScale; +    uint64_t NewFalse = (BBCvt * CvtFalse) / WeightScale; +    // We need to scale down all weights of BBI.BB to fit uint32_t. +    // Here BBI.BB is connected to CvtBBI->FalseBB and will fall through to +    // the next block. +    ScaleWeights(NewNext, NewFalse, BBI.BB, getNextBlock(BBI.BB), +                 CvtBBI->FalseBB, MBPI);    }    // Merge in the 'false' block if the 'false' block has no other @@ -1284,7 +1330,7 @@ bool IfConverter::IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,    // Initialize liveins to the first BB. These are potentially redefined by    // predicated instructions.    Redefs.init(TRI); -  Redefs.addLiveIns(BBI1->BB, *TRI); +  Redefs.addLiveIns(BBI1->BB);    // Remove the duplicated instructions at the beginnings of both paths.    MachineBasicBlock::iterator DI1 = BBI1->BB->begin(); @@ -1317,12 +1363,12 @@ bool IfConverter::IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,    DontKill.init(TRI);    for (MachineBasicBlock::reverse_iterator I = BBI2->BB->rbegin(),         E = MachineBasicBlock::reverse_iterator(DI2); I != E; ++I) { -    DontKill.stepBackward(*I, *TRI); +    DontKill.stepBackward(*I);    }    for (MachineBasicBlock::const_iterator I = BBI1->BB->begin(), E = DI1; I != E;         ++I) { -    Redefs.stepForward(*I, *TRI); +    Redefs.stepForward(*I);    }    BBI.BB->splice(BBI.BB->end(), BBI1->BB, BBI1->BB->begin(), DI1);    BBI2->BB->erase(BBI2->BB->begin(), DI2); @@ -1409,8 +1455,8 @@ bool IfConverter::IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,    PredicateBlock(*BBI2, DI2, *Cond2);    // Merge the true block into the entry of the diamond. -  MergeBlocks(BBI, *BBI1, TailBB == 0); -  MergeBlocks(BBI, *BBI2, TailBB == 0); +  MergeBlocks(BBI, *BBI1, TailBB == nullptr); +  MergeBlocks(BBI, *BBI2, TailBB == nullptr);    // If the if-converted block falls through or unconditionally branches into    // the tail block, and the tail block does not have other predecessors, then @@ -1459,7 +1505,7 @@ static bool MaySpeculate(const MachineInstr *MI,                           SmallSet<unsigned, 4> &LaterRedefs,                           const TargetInstrInfo *TII) {    bool SawStore = true; -  if (!MI->isSafeToMove(TII, 0, SawStore)) +  if (!MI->isSafeToMove(TII, nullptr, SawStore))      return false;    for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { @@ -1483,7 +1529,7 @@ void IfConverter::PredicateBlock(BBInfo &BBI,                                   SmallVectorImpl<MachineOperand> &Cond,                                   SmallSet<unsigned, 4> *LaterRedefs) {    bool AnyUnpred = false; -  bool MaySpec = LaterRedefs != 0; +  bool MaySpec = LaterRedefs != nullptr;    for (MachineBasicBlock::iterator I = BBI.BB->begin(); I != E; ++I) {      if (I->isDebugValue() || TII->isPredicated(I))        continue; @@ -1501,12 +1547,12 @@ void IfConverter::PredicateBlock(BBInfo &BBI,  #ifndef NDEBUG        dbgs() << "Unable to predicate " << *I << "!\n";  #endif -      llvm_unreachable(0); +      llvm_unreachable(nullptr);      }      // If the predicated instruction now redefines a register as the result of      // if-conversion, add an implicit kill. -    UpdatePredRedefs(I, Redefs, TRI); +    UpdatePredRedefs(I, Redefs);    }    std::copy(Cond.begin(), Cond.end(), std::back_inserter(BBI.Predicate)); @@ -1546,24 +1592,24 @@ void IfConverter::CopyAndPredicateBlock(BBInfo &ToBBI, BBInfo &FromBBI,  #ifndef NDEBUG          dbgs() << "Unable to predicate " << *I << "!\n";  #endif -        llvm_unreachable(0); +        llvm_unreachable(nullptr);        }      }      // If the predicated instruction now redefines a register as the result of      // if-conversion, add an implicit kill. -    UpdatePredRedefs(MI, Redefs, TRI); +    UpdatePredRedefs(MI, Redefs);      // Some kill flags may not be correct anymore.      if (!DontKill.empty()) -      RemoveKills(*MI, DontKill, *TRI); +      RemoveKills(*MI, DontKill);    }    if (!IgnoreBr) {      std::vector<MachineBasicBlock *> Succs(FromBBI.BB->succ_begin(),                                             FromBBI.BB->succ_end());      MachineBasicBlock *NBB = getNextBlock(FromBBI.BB); -    MachineBasicBlock *FallThrough = FromBBI.HasFallThrough ? NBB : NULL; +    MachineBasicBlock *FallThrough = FromBBI.HasFallThrough ? NBB : nullptr;      for (unsigned i = 0, e = Succs.size(); i != e; ++i) {        MachineBasicBlock *Succ = Succs[i]; @@ -1599,7 +1645,7 @@ void IfConverter::MergeBlocks(BBInfo &ToBBI, BBInfo &FromBBI, bool AddEdges) {    std::vector<MachineBasicBlock *> Succs(FromBBI.BB->succ_begin(),                                           FromBBI.BB->succ_end());    MachineBasicBlock *NBB = getNextBlock(FromBBI.BB); -  MachineBasicBlock *FallThrough = FromBBI.HasFallThrough ? NBB : NULL; +  MachineBasicBlock *FallThrough = FromBBI.HasFallThrough ? NBB : nullptr;    for (unsigned i = 0, e = Succs.size(); i != e; ++i) {      MachineBasicBlock *Succ = Succs[i]; | 
