[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