diff options
Diffstat (limited to 'contrib/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp')
| -rw-r--r-- | contrib/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp | 38 | 
1 files changed, 30 insertions, 8 deletions
diff --git a/contrib/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp b/contrib/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp index d650264176aa..0db762d846f2 100644 --- a/contrib/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp +++ b/contrib/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp @@ -13,7 +13,8 @@  #include "llvm/ADT/STLExtras.h"  #include "llvm/ADT/SmallPtrSet.h"  #include "llvm/ADT/SmallVector.h" -#include "llvm/Analysis/DivergenceAnalysis.h" +#include "llvm/Analysis/InstructionSimplify.h" +#include "llvm/Analysis/LegacyDivergenceAnalysis.h"  #include "llvm/Analysis/LoopInfo.h"  #include "llvm/Analysis/RegionInfo.h"  #include "llvm/Analysis/RegionIterator.h" @@ -183,7 +184,7 @@ class StructurizeCFG : public RegionPass {    Function *Func;    Region *ParentRegion; -  DivergenceAnalysis *DA; +  LegacyDivergenceAnalysis *DA;    DominatorTree *DT;    LoopInfo *LI; @@ -269,7 +270,7 @@ public:    void getAnalysisUsage(AnalysisUsage &AU) const override {      if (SkipUniformRegions) -      AU.addRequired<DivergenceAnalysis>(); +      AU.addRequired<LegacyDivergenceAnalysis>();      AU.addRequiredID(LowerSwitchID);      AU.addRequired<DominatorTreeWrapperPass>();      AU.addRequired<LoopInfoWrapperPass>(); @@ -285,7 +286,7 @@ char StructurizeCFG::ID = 0;  INITIALIZE_PASS_BEGIN(StructurizeCFG, "structurizecfg", "Structurize the CFG",                        false, false) -INITIALIZE_PASS_DEPENDENCY(DivergenceAnalysis) +INITIALIZE_PASS_DEPENDENCY(LegacyDivergenceAnalysis)  INITIALIZE_PASS_DEPENDENCY(LowerSwitch)  INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)  INITIALIZE_PASS_DEPENDENCY(RegionInfoPass) @@ -596,7 +597,8 @@ void StructurizeCFG::addPhiValues(BasicBlock *From, BasicBlock *To) {  /// Add the real PHI value as soon as everything is set up  void StructurizeCFG::setPhiValues() { -  SSAUpdater Updater; +  SmallVector<PHINode *, 8> InsertedPhis; +  SSAUpdater Updater(&InsertedPhis);    for (const auto &AddedPhi : AddedPhis) {      BasicBlock *To = AddedPhi.first;      const BBVector &From = AddedPhi.second; @@ -632,11 +634,31 @@ void StructurizeCFG::setPhiValues() {      DeletedPhis.erase(To);    }    assert(DeletedPhis.empty()); + +  // Simplify any phis inserted by the SSAUpdater if possible +  bool Changed; +  do { +    Changed = false; + +    SimplifyQuery Q(Func->getParent()->getDataLayout()); +    Q.DT = DT; +    for (size_t i = 0; i < InsertedPhis.size(); ++i) { +      PHINode *Phi = InsertedPhis[i]; +      if (Value *V = SimplifyInstruction(Phi, Q)) { +        Phi->replaceAllUsesWith(V); +        Phi->eraseFromParent(); +        InsertedPhis[i] = InsertedPhis.back(); +        InsertedPhis.pop_back(); +        i--; +        Changed = true; +      } +    } +  } while (Changed);  }  /// Remove phi values from all successors and then remove the terminator.  void StructurizeCFG::killTerminator(BasicBlock *BB) { -  TerminatorInst *Term = BB->getTerminator(); +  Instruction *Term = BB->getTerminator();    if (!Term)      return; @@ -914,7 +936,7 @@ void StructurizeCFG::rebuildSSA() {  }  static bool hasOnlyUniformBranches(Region *R, unsigned UniformMDKindID, -                                   const DivergenceAnalysis &DA) { +                                   const LegacyDivergenceAnalysis &DA) {    for (auto E : R->elements()) {      if (!E->isSubRegion()) {        auto Br = dyn_cast<BranchInst>(E->getEntry()->getTerminator()); @@ -962,7 +984,7 @@ bool StructurizeCFG::runOnRegion(Region *R, RGPassManager &RGM) {      // but we shouldn't rely on metadata for correctness!      unsigned UniformMDKindID =          R->getEntry()->getContext().getMDKindID("structurizecfg.uniform"); -    DA = &getAnalysis<DivergenceAnalysis>(); +    DA = &getAnalysis<LegacyDivergenceAnalysis>();      if (hasOnlyUniformBranches(R, UniformMDKindID, *DA)) {        LLVM_DEBUG(dbgs() << "Skipping region with uniform control flow: " << *R  | 
