1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00

Introduce RegionInfoAnalysis, which compute Region Tree in the new PassManager. NFC

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

llvm-svn: 261884
This commit is contained in:
Hongbin Zheng 2016-02-25 16:33:26 +00:00
parent 10a5a19fa0
commit 4a56a70d94
22 changed files with 149 additions and 0 deletions

View File

@ -47,6 +47,11 @@
namespace llvm { 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 // Class to be specialized for different users of RegionInfo
// (i.e. BasicBlocks or MachineBasicBlocks). This is only to avoid needing to // (i.e. BasicBlocks or MachineBasicBlocks). This is only to avoid needing to
// pass around an unreasonable number of template parameters. // pass around an unreasonable number of template parameters.
@ -676,6 +681,22 @@ class RegionInfoBase {
RegionInfoBase(const RegionInfoBase &) = delete; RegionInfoBase(const RegionInfoBase &) = delete;
const RegionInfoBase &operator=(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; DomTreeT *DT;
PostDomTreeT *PDT; PostDomTreeT *PDT;
DomFrontierT *DF; DomFrontierT *DF;
@ -687,6 +708,18 @@ private:
/// Map every BB to the smallest region, that contains BB. /// Map every BB to the smallest region, that contains BB.
BBtoRegionMap BBtoRegion; 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 // Check whether the entries of BBtoRegion for the BBs of region
// SR are correct. Triggers an assertion if not. Calls itself recursively for // SR are correct. Triggers an assertion if not. Calls itself recursively for
// subregions. // subregions.
@ -836,10 +869,19 @@ public:
class RegionInfo : public RegionInfoBase<RegionTraits<Function>> { class RegionInfo : public RegionInfoBase<RegionTraits<Function>> {
public: public:
typedef RegionInfoBase<RegionTraits<Function>> Base;
explicit RegionInfo(); explicit RegionInfo();
~RegionInfo() override; ~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. // updateStatistics - Update statistic about created regions.
void updateStatistics(Region *R) final; void updateStatistics(Region *R) final;
@ -884,6 +926,40 @@ public:
//@} //@}
}; };
/// \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 <>
template <> template <>
inline BasicBlock * inline BasicBlock *

View File

@ -15,6 +15,7 @@
#include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/RegionInfoImpl.h" #include "llvm/Analysis/RegionInfoImpl.h"
#include "llvm/Analysis/RegionIterator.h" #include "llvm/Analysis/RegionIterator.h"
#include "llvm/IR/PassManager.h"
#include "llvm/Support/CommandLine.h" #include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h" #include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ErrorHandling.h"
@ -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();
}

View File

@ -26,6 +26,7 @@
#include "llvm/Analysis/LazyCallGraph.h" #include "llvm/Analysis/LazyCallGraph.h"
#include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/PostDominators.h" #include "llvm/Analysis/PostDominators.h"
#include "llvm/Analysis/RegionInfo.h"
#include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Analysis/ScalarEvolution.h"
#include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h" #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
#include "llvm/Analysis/ScopedNoAliasAA.h" #include "llvm/Analysis/ScopedNoAliasAA.h"

View File

@ -60,6 +60,7 @@ FUNCTION_ANALYSIS("domtree", DominatorTreeAnalysis())
FUNCTION_ANALYSIS("postdomtree", PostDominatorTreeAnalysis()) FUNCTION_ANALYSIS("postdomtree", PostDominatorTreeAnalysis())
FUNCTION_ANALYSIS("domfrontier", DominanceFrontierAnalysis()) FUNCTION_ANALYSIS("domfrontier", DominanceFrontierAnalysis())
FUNCTION_ANALYSIS("loops", LoopAnalysis()) FUNCTION_ANALYSIS("loops", LoopAnalysis())
FUNCTION_ANALYSIS("regions", RegionInfoAnalysis())
FUNCTION_ANALYSIS("no-op-function", NoOpFunctionAnalysis()) FUNCTION_ANALYSIS("no-op-function", NoOpFunctionAnalysis())
FUNCTION_ANALYSIS("scalar-evolution", ScalarEvolutionAnalysis()) FUNCTION_ANALYSIS("scalar-evolution", ScalarEvolutionAnalysis())
FUNCTION_ANALYSIS("targetlibinfo", TargetLibraryAnalysis()) FUNCTION_ANALYSIS("targetlibinfo", TargetLibraryAnalysis())
@ -94,11 +95,13 @@ FUNCTION_PASS("print<domtree>", DominatorTreePrinterPass(dbgs()))
FUNCTION_PASS("print<postdomtree>", PostDominatorTreePrinterPass(dbgs())) FUNCTION_PASS("print<postdomtree>", PostDominatorTreePrinterPass(dbgs()))
FUNCTION_PASS("print<domfrontier>", DominanceFrontierPrinterPass(dbgs())) FUNCTION_PASS("print<domfrontier>", DominanceFrontierPrinterPass(dbgs()))
FUNCTION_PASS("print<loops>", LoopPrinterPass(dbgs())) FUNCTION_PASS("print<loops>", LoopPrinterPass(dbgs()))
FUNCTION_PASS("print<regions>", RegionInfoPrinterPass(dbgs()))
FUNCTION_PASS("print<scalar-evolution>", ScalarEvolutionPrinterPass(dbgs())) FUNCTION_PASS("print<scalar-evolution>", ScalarEvolutionPrinterPass(dbgs()))
FUNCTION_PASS("simplify-cfg", SimplifyCFGPass()) FUNCTION_PASS("simplify-cfg", SimplifyCFGPass())
FUNCTION_PASS("sroa", SROA()) FUNCTION_PASS("sroa", SROA())
FUNCTION_PASS("verify", VerifierPass()) FUNCTION_PASS("verify", VerifierPass())
FUNCTION_PASS("verify<domtree>", DominatorTreeVerifierPass()) FUNCTION_PASS("verify<domtree>", DominatorTreeVerifierPass())
FUNCTION_PASS("verify<regions>", RegionInfoVerifierPass())
#undef FUNCTION_PASS #undef FUNCTION_PASS
#ifndef LOOP_ANALYSIS #ifndef LOOP_ANALYSIS

View File

@ -1,4 +1,6 @@
; RUN: opt -regions < %s ; RUN: opt -regions < %s
; RUN: opt < %s -passes='print<regions>'
define i32 @main() nounwind { define i32 @main() nounwind {
entry: entry:
br label %for.cond br label %for.cond

View File

@ -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=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 -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 { define void @BZ2_blockSort() nounwind {
start: start:
br label %while br label %while

View File

@ -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=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 -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 { define void @normal_condition() nounwind {
5: 5:
br label %"0" br label %"0"

View File

@ -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=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 -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 { define internal fastcc zeroext i8 @handle_compress() nounwind {
end165: end165:
br i1 1, label %false239, label %true181 br i1 1, label %false239, label %true181

View File

@ -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=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 -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 { define internal fastcc void @compress() nounwind {
end33: end33:
br i1 1, label %end124, label %lor.lhs.false95 br i1 1, label %end124, label %lor.lhs.false95

View File

@ -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=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 -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 { define void @normal_condition() nounwind {
0: 0:
br label %"1" br label %"1"

View File

@ -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=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 -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 { define void @normal_condition() nounwind {
0: 0:
br i1 1, label %"1", label %"4" br i1 1, label %"1", label %"4"

View File

@ -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=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 -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 { define void @normal_condition() nounwind {
0: 0:
br label %"1" br label %"1"

View File

@ -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=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 -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 { define internal fastcc zeroext i8 @handle_compress() nounwind {
entry: entry:
br label %outer br label %outer

View File

@ -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=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 -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 { define void @normal_condition() nounwind {
0: 0:
br label %"1" br label %"1"

View File

@ -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=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 -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 { define internal fastcc zeroext i8 @loops_1() nounwind {
entry: entry:
br i1 1, label %outer , label %a br i1 1, label %outer , label %a

View File

@ -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=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 -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 { define void @meread_() nounwind {
entry: entry:
br label %bb23 br label %bb23

View File

@ -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=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 -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 { define void @a_linear_impl_fig_1() nounwind {
0: 0:

View File

@ -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=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 -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 { define internal fastcc zeroext i8 @handle_compress() nounwind {
entry: entry:
br label %outer br label %outer

View File

@ -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=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 -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 { define void @MAIN__() nounwind {
entry: entry:
br label %__label_002001.outer br label %__label_002001.outer

View File

@ -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=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 -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 { define void @a_linear_impl_fig_1() nounwind {
0: 0:
br label %"1" br label %"1"

View File

@ -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=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 -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 { define internal fastcc zeroext i8 @handle_compress() nounwind {
entry: entry:
br label %outer br label %outer

View File

@ -1,4 +1,5 @@
; RUN: opt -regions -analyze < %s | FileCheck %s ; 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. ; We should not crash if there are some bbs that are not reachable.
define void @f() { define void @f() {