[PATCH] D16602: StructurizeCFG: Add an option for skipping regions with only uniform branches

Tom Stellard via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 27 07:02:57 PST 2016


cc Christian.

On Tue, Jan 26, 2016 at 09:57:45PM +0000, Tom Stellard wrote:
> tstellarAMD created this revision.
> tstellarAMD added a reviewer: arsenm.
> tstellarAMD added a subscriber: llvm-commits.
> 
> Tests for this will be added once the AMDGPU backend enables this
> option.
> 
> http://reviews.llvm.org/D16602
> 
> Files:
>   include/llvm/Transforms/Scalar.h
>   lib/Transforms/Scalar/StructurizeCFG.cpp
> 

> Index: lib/Transforms/Scalar/StructurizeCFG.cpp
> ===================================================================
> --- lib/Transforms/Scalar/StructurizeCFG.cpp
> +++ lib/Transforms/Scalar/StructurizeCFG.cpp
> @@ -11,6 +11,7 @@
>  #include "llvm/ADT/MapVector.h"
>  #include "llvm/ADT/PostOrderIterator.h"
>  #include "llvm/ADT/SCCIterator.h"
> +#include "llvm/Analysis/DivergenceAnalysis.h"
>  #include "llvm/Analysis/LoopInfo.h"
>  #include "llvm/Analysis/RegionInfo.h"
>  #include "llvm/Analysis/RegionIterator.h"
> @@ -161,6 +162,9 @@
>  /// consist of a network of PHI nodes where the true incoming values expresses
>  /// breaks and the false values expresses continue states.
>  class StructurizeCFG : public RegionPass {
> +  bool SkipUniformRegions;
> +  DivergenceAnalysis *DA;
> +
>    Type *Boolean;
>    ConstantInt *BoolTrue;
>    ConstantInt *BoolFalse;
> @@ -232,14 +236,21 @@
>  
>    void rebuildSSA();
>  
> +  bool hasOnlyUniformBranches(const Region *R);
> +
>  public:
>    static char ID;
>  
>    StructurizeCFG() :
>      RegionPass(ID) {
>      initializeStructurizeCFGPass(*PassRegistry::getPassRegistry());
>    }
>  
> +  StructurizeCFG(bool SkipUniformRegions) :
> +    RegionPass(ID), SkipUniformRegions(SkipUniformRegions) {
> +    initializeStructurizeCFGPass(*PassRegistry::getPassRegistry());
> +  }
> +
>    using Pass::doInitialization;
>    bool doInitialization(Region *R, RGPassManager &RGM) override;
>  
> @@ -250,6 +261,7 @@
>    }
>  
>    void getAnalysisUsage(AnalysisUsage &AU) const override {
> +    AU.addRequired<DivergenceAnalysis>();
>      AU.addRequiredID(LowerSwitchID);
>      AU.addRequired<DominatorTreeWrapperPass>();
>      AU.addRequired<LoopInfoWrapperPass>();
> @@ -264,6 +276,7 @@
>  
>  INITIALIZE_PASS_BEGIN(StructurizeCFG, "structurizecfg", "Structurize the CFG",
>                        false, false)
> +INITIALIZE_PASS_DEPENDENCY(DivergenceAnalysis)
>  INITIALIZE_PASS_DEPENDENCY(LowerSwitch)
>  INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
>  INITIALIZE_PASS_DEPENDENCY(RegionInfoPass)
> @@ -914,11 +927,33 @@
>      }
>  }
>  
> +bool StructurizeCFG::hasOnlyUniformBranches(const Region *R) {
> +  for (const BasicBlock *BB : R->blocks()) {
> +    const BranchInst *Br = dyn_cast<BranchInst>(BB->getTerminator());
> +    if (!Br || !Br->isConditional())
> +      continue;
> +
> +    if (!DA->isUniform(Br->getCondition()))
> +      return false;
> +    DEBUG(dbgs() << "BB: " << BB->getName() << " has uniform terminator\n");
> +  }
> +  return true;
> +}
> +
>  /// \brief Run the transformation for each region found
>  bool StructurizeCFG::runOnRegion(Region *R, RGPassManager &RGM) {
>    if (R->isTopLevelRegion())
>      return false;
>  
> +  if (SkipUniformRegions) {
> +    DA = &getAnalysis<DivergenceAnalysis>();
> +    // TODO: We could probably be smarter here with how we handle sub-regions.
> +    if (hasOnlyUniformBranches(R)) {
> +      DEBUG(dbgs() << "Skipping region with uniform control flow: " << *R << '\n');
> +      return false;
> +    }
> +  }
> +
>    Func = R->getEntry()->getParent();
>    ParentRegion = R;
>  
> @@ -947,7 +982,6 @@
>    return true;
>  }
>  
> -/// \brief Create the pass
> -Pass *llvm::createStructurizeCFGPass() {
> -  return new StructurizeCFG();
> +Pass *llvm::createStructurizeCFGPass(bool SkipUniformRegions) {
> +  return new StructurizeCFG(SkipUniformRegions);
>  }
> Index: include/llvm/Transforms/Scalar.h
> ===================================================================
> --- include/llvm/Transforms/Scalar.h
> +++ include/llvm/Transforms/Scalar.h
> @@ -262,7 +262,10 @@
>  //
>  // CFG Structurization - Remove irreducible control flow
>  //
> -Pass *createStructurizeCFGPass();
> +///
> +/// When \p SkipUniformRegions is true the structizer will not structurize
> +/// regions that only contain uniform branches.
> +Pass *createStructurizeCFGPass(bool SkipUniformRegions = false);
>  
>  //===----------------------------------------------------------------------===//
>  //



More information about the llvm-commits mailing list