Skip to content

Commit

Permalink
Introduce RegionInfoAnalysis, which compute Region Tree in the new Pa…
Browse files Browse the repository at this point in the history
…ssManager. NFC

Differential Revision: http://reviews.llvm.org/D17571

llvm-svn: 261884
  • Loading branch information
etherzhhb committed Feb 25, 2016
1 parent 237197b commit 2fa386f
Show file tree
Hide file tree
Showing 22 changed files with 149 additions and 0 deletions.
76 changes: 76 additions & 0 deletions llvm/include/llvm/Analysis/RegionInfo.h
Expand Up @@ -47,6 +47,11 @@

namespace llvm {

// FIXME: Replace this brittle forward declaration with the include of the new
// PassManager.h when doing so doesn't break the PassManagerBuilder.
template <typename IRUnitT> class AnalysisManager;
class PreservedAnalyses;

// Class to be specialized for different users of RegionInfo
// (i.e. BasicBlocks or MachineBasicBlocks). This is only to avoid needing to
// pass around an unreasonable number of template parameters.
Expand Down Expand Up @@ -676,6 +681,22 @@ class RegionInfoBase {
RegionInfoBase(const RegionInfoBase &) = delete;
const RegionInfoBase &operator=(const RegionInfoBase &) = delete;

RegionInfoBase(RegionInfoBase &&Arg)
: DT(std::move(Arg.DT)), PDT(std::move(Arg.PDT)), DF(std::move(Arg.DF)),
TopLevelRegion(std::move(Arg.TopLevelRegion)),
BBtoRegion(std::move(Arg.BBtoRegion)) {
Arg.wipe();
}
RegionInfoBase &operator=(RegionInfoBase &&RHS) {
DT = std::move(RHS.DT);
PDT = std::move(RHS.PDT);
DF = std::move(RHS.DF);
TopLevelRegion = std::move(RHS.TopLevelRegion);
BBtoRegion = std::move(RHS.BBtoRegion);
RHS.wipe();
return *this;
}

DomTreeT *DT;
PostDomTreeT *PDT;
DomFrontierT *DF;
Expand All @@ -687,6 +708,18 @@ class RegionInfoBase {
/// Map every BB to the smallest region, that contains BB.
BBtoRegionMap BBtoRegion;

/// \brief Wipe this region tree's state without releasing any resources.
///
/// This is essentially a post-move helper only. It leaves the object in an
/// assignable and destroyable state, but otherwise invalid.
void wipe() {
DT = nullptr;
PDT = nullptr;
DF = nullptr;
TopLevelRegion = nullptr;
BBtoRegion.clear();
}

// Check whether the entries of BBtoRegion for the BBs of region
// SR are correct. Triggers an assertion if not. Calls itself recursively for
// subregions.
Expand Down Expand Up @@ -836,10 +869,19 @@ class Region : public RegionBase<RegionTraits<Function>> {

class RegionInfo : public RegionInfoBase<RegionTraits<Function>> {
public:
typedef RegionInfoBase<RegionTraits<Function>> Base;

explicit RegionInfo();

~RegionInfo() override;

RegionInfo(RegionInfo &&Arg)
: Base(std::move(static_cast<Base &>(Arg))) {}
RegionInfo &operator=(RegionInfo &&RHS) {
Base::operator=(std::move(static_cast<Base &>(RHS)));
return *this;
}

// updateStatistics - Update statistic about created regions.
void updateStatistics(Region *R) final;

Expand Down Expand Up @@ -884,6 +926,40 @@ class RegionInfoPass : public FunctionPass {
//@}
};

/// \brief Analysis pass that exposes the \c RegionInfo for a function.
class RegionInfoAnalysis {
static char PassID;

public:
typedef RegionInfo Result;

/// \brief Opaque, unique identifier for this analysis pass.
static void *ID() { return (void *)&PassID; }

/// \brief Provide a name for the analysis for debugging and logging.
static StringRef name() { return "RegionInfoAnalysis"; }

RegionInfo run(Function &F, AnalysisManager<Function> *AM);
};

/// \brief Printer pass for the \c RegionInfo.
class RegionInfoPrinterPass {
raw_ostream &OS;

public:
explicit RegionInfoPrinterPass(raw_ostream &OS);
PreservedAnalyses run(Function &F, AnalysisManager<Function> *AM);

static StringRef name() { return "RegionInfoPrinterPass"; }
};

/// \brief Verifier pass for the \c RegionInfo.
struct RegionInfoVerifierPass {
PreservedAnalyses run(Function &F, AnalysisManager<Function> *AM);

static StringRef name() { return "RegionInfoVerifierPass"; }
};

template <>
template <>
inline BasicBlock *
Expand Down
34 changes: 34 additions & 0 deletions llvm/lib/Analysis/RegionInfo.cpp
Expand Up @@ -15,6 +15,7 @@
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/RegionInfoImpl.h"
#include "llvm/Analysis/RegionIterator.h"
#include "llvm/IR/PassManager.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
Expand Down Expand Up @@ -180,3 +181,36 @@ namespace llvm {
}
}

//===----------------------------------------------------------------------===//
// RegionInfoAnalysis implementation
//

char RegionInfoAnalysis::PassID;

RegionInfo RegionInfoAnalysis::run(Function &F, AnalysisManager<Function> *AM) {
RegionInfo RI;
auto *DT = &AM->getResult<DominatorTreeAnalysis>(F);
auto *PDT = &AM->getResult<PostDominatorTreeAnalysis>(F);
auto *DF = &AM->getResult<DominanceFrontierAnalysis>(F);

RI.recalculate(F, DT, PDT, DF);
return RI;
}

RegionInfoPrinterPass::RegionInfoPrinterPass(raw_ostream &OS)
: OS(OS) {}

PreservedAnalyses
RegionInfoPrinterPass::run(Function &F, FunctionAnalysisManager *AM) {
OS << "Region Tree for function: " << F.getName() << "\n";
AM->getResult<RegionInfoAnalysis>(F).print(OS);

return PreservedAnalyses::all();
}

PreservedAnalyses RegionInfoVerifierPass::run(Function &F,
AnalysisManager<Function> *AM) {
AM->getResult<RegionInfoAnalysis>(F).verifyAnalysis();

return PreservedAnalyses::all();
}
1 change: 1 addition & 0 deletions llvm/lib/Passes/PassBuilder.cpp
Expand Up @@ -26,6 +26,7 @@
#include "llvm/Analysis/LazyCallGraph.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/PostDominators.h"
#include "llvm/Analysis/RegionInfo.h"
#include "llvm/Analysis/ScalarEvolution.h"
#include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
#include "llvm/Analysis/ScopedNoAliasAA.h"
Expand Down
3 changes: 3 additions & 0 deletions llvm/lib/Passes/PassRegistry.def
Expand Up @@ -60,6 +60,7 @@ FUNCTION_ANALYSIS("domtree", DominatorTreeAnalysis())
FUNCTION_ANALYSIS("postdomtree", PostDominatorTreeAnalysis())
FUNCTION_ANALYSIS("domfrontier", DominanceFrontierAnalysis())
FUNCTION_ANALYSIS("loops", LoopAnalysis())
FUNCTION_ANALYSIS("regions", RegionInfoAnalysis())
FUNCTION_ANALYSIS("no-op-function", NoOpFunctionAnalysis())
FUNCTION_ANALYSIS("scalar-evolution", ScalarEvolutionAnalysis())
FUNCTION_ANALYSIS("targetlibinfo", TargetLibraryAnalysis())
Expand Down Expand Up @@ -94,11 +95,13 @@ FUNCTION_PASS("print<domtree>", DominatorTreePrinterPass(dbgs()))
FUNCTION_PASS("print<postdomtree>", PostDominatorTreePrinterPass(dbgs()))
FUNCTION_PASS("print<domfrontier>", DominanceFrontierPrinterPass(dbgs()))
FUNCTION_PASS("print<loops>", LoopPrinterPass(dbgs()))
FUNCTION_PASS("print<regions>", RegionInfoPrinterPass(dbgs()))
FUNCTION_PASS("print<scalar-evolution>", ScalarEvolutionPrinterPass(dbgs()))
FUNCTION_PASS("simplify-cfg", SimplifyCFGPass())
FUNCTION_PASS("sroa", SROA())
FUNCTION_PASS("verify", VerifierPass())
FUNCTION_PASS("verify<domtree>", DominatorTreeVerifierPass())
FUNCTION_PASS("verify<regions>", RegionInfoVerifierPass())
#undef FUNCTION_PASS

#ifndef LOOP_ANALYSIS
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/20100809_bb_not_in_domtree.ll
@@ -1,4 +1,6 @@
; RUN: opt -regions < %s
; RUN: opt < %s -passes='print<regions>'

define i32 @main() nounwind {
entry:
br label %for.cond
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/block_sort.ll
Expand Up @@ -4,6 +4,8 @@
; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s
; RUN: opt -regions -print-region-style=rn -analyze < %s 2>&1 | FileCheck -check-prefix=RNIT %s

; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

define void @BZ2_blockSort() nounwind {
start:
br label %while
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/cond_loop.ll
Expand Up @@ -4,6 +4,8 @@
; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s
; RUN: opt -regions -print-region-style=rn -analyze < %s 2>&1 | FileCheck -check-prefix=RNIT %s

; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

define void @normal_condition() nounwind {
5:
br label %"0"
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/condition_complicated.ll
Expand Up @@ -4,6 +4,8 @@
; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s
; RUN: opt -regions -print-region-style=rn -analyze < %s 2>&1 | FileCheck -check-prefix=RNIT %s

; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

define internal fastcc zeroext i8 @handle_compress() nounwind {
end165:
br i1 1, label %false239, label %true181
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/condition_complicated_2.ll
Expand Up @@ -4,6 +4,8 @@
; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s
; RUN: opt -regions -print-region-style=rn -analyze < %s 2>&1 | FileCheck -check-prefix=RNIT %s

; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

define internal fastcc void @compress() nounwind {
end33:
br i1 1, label %end124, label %lor.lhs.false95
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/condition_forward_edge.ll
Expand Up @@ -4,6 +4,8 @@
; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s
; RUN: opt -regions -print-region-style=rn -analyze < %s 2>&1 | FileCheck -check-prefix=RNIT %s

; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

define void @normal_condition() nounwind {
0:
br label %"1"
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/condition_same_exit.ll
Expand Up @@ -4,6 +4,8 @@
; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s
; RUN: opt -regions -print-region-style=rn -analyze < %s 2>&1 | FileCheck -check-prefix=RNIT %s

; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

define void @normal_condition() nounwind {
0:
br i1 1, label %"1", label %"4"
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/condition_simple.ll
Expand Up @@ -4,6 +4,8 @@
; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s
; RUN: opt -regions -print-region-style=rn -analyze < %s 2>&1 | FileCheck -check-prefix=RNIT %s

; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

define void @normal_condition() nounwind {
0:
br label %"1"
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/exit_in_condition.ll
Expand Up @@ -4,6 +4,8 @@
; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s
; RUN: opt -regions -print-region-style=rn -analyze < %s 2>&1 | FileCheck -check-prefix=RNIT %s

; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

define internal fastcc zeroext i8 @handle_compress() nounwind {
entry:
br label %outer
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/loop_with_condition.ll
Expand Up @@ -5,6 +5,8 @@
; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s
; RUN: opt -regions -print-region-style=rn -analyze < %s 2>&1 | FileCheck -check-prefix=RNIT %s

; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

define void @normal_condition() nounwind {
0:
br label %"1"
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/loops_1.ll
Expand Up @@ -4,6 +4,8 @@
; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s
; RUN: opt -regions -print-region-style=rn -analyze < %s 2>&1 | FileCheck -check-prefix=RNIT %s

; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

define internal fastcc zeroext i8 @loops_1() nounwind {
entry:
br i1 1, label %outer , label %a
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/loops_2.ll
Expand Up @@ -4,6 +4,8 @@
; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s
; RUN: opt -regions -print-region-style=rn -analyze < %s 2>&1 | FileCheck -check-prefix=RNIT %s

; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

define void @meread_() nounwind {
entry:
br label %bb23
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/mix_1.ll
Expand Up @@ -5,6 +5,8 @@
; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s
; RUN: opt -regions -print-region-style=rn -analyze < %s 2>&1 | FileCheck -check-prefix=RNIT %s

; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

define void @a_linear_impl_fig_1() nounwind {
0:

Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/nested_loops.ll
Expand Up @@ -5,6 +5,8 @@
; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s
; RUN: opt -regions -print-region-style=rn -analyze < %s 2>&1 | FileCheck -check-prefix=RNIT %s

; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

define internal fastcc zeroext i8 @handle_compress() nounwind {
entry:
br label %outer
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/next.ll
Expand Up @@ -4,6 +4,8 @@
; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s
; RUN: opt -regions -print-region-style=rn -analyze < %s 2>&1 | FileCheck -check-prefix=RNIT %s

; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

define void @MAIN__() nounwind {
entry:
br label %__label_002001.outer
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/paper.ll
Expand Up @@ -4,6 +4,8 @@
; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s
; RUN: opt -regions -print-region-style=rn -analyze < %s 2>&1 | FileCheck -check-prefix=RNIT %s

; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

define void @a_linear_impl_fig_1() nounwind {
0:
br label %"1"
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/Analysis/RegionInfo/two_loops_same_header.ll
Expand Up @@ -4,6 +4,8 @@
; RUN: opt -regions -print-region-style=bb -analyze < %s 2>&1 | FileCheck -check-prefix=BBIT %s
; RUN: opt -regions -print-region-style=rn -analyze < %s 2>&1 | FileCheck -check-prefix=RNIT %s

; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

define internal fastcc zeroext i8 @handle_compress() nounwind {
entry:
br label %outer
Expand Down
1 change: 1 addition & 0 deletions llvm/test/Analysis/RegionInfo/unreachable_bb.ll
@@ -1,4 +1,5 @@
; RUN: opt -regions -analyze < %s | FileCheck %s
; RUN: opt < %s -passes='print<regions>' 2>&1 | FileCheck %s

; We should not crash if there are some bbs that are not reachable.
define void @f() {
Expand Down

0 comments on commit 2fa386f

Please sign in to comment.