From: Xinliang David Li Date: Thu, 5 May 2016 21:13:27 +0000 (+0000) Subject: [PM] port Branch Frequency Analaysis pass to new PM X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=da713ca23f8381170e5aec8538944fe0bdc3149c;p=llvm [PM] port Branch Frequency Analaysis pass to new PM git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@268687 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Analysis/BlockFrequencyInfo.h b/include/llvm/Analysis/BlockFrequencyInfo.h index 875775439b1..ca9b129feb7 100644 --- a/include/llvm/Analysis/BlockFrequencyInfo.h +++ b/include/llvm/Analysis/BlockFrequencyInfo.h @@ -15,6 +15,7 @@ #define LLVM_ANALYSIS_BLOCKFREQUENCYINFO_H #include "llvm/ADT/Optional.h" +#include "llvm/IR/PassManager.h" #include "llvm/Pass.h" #include "llvm/Support/BlockFrequency.h" #include @@ -31,10 +32,16 @@ class BlockFrequencyInfo { typedef BlockFrequencyInfoImpl ImplType; std::unique_ptr BFI; + void operator=(const BlockFrequencyInfo &) = delete; + BlockFrequencyInfo(const BlockFrequencyInfo &) = delete; + public: BlockFrequencyInfo(); BlockFrequencyInfo(const Function &F, const BranchProbabilityInfo &BPI, const LoopInfo &LI); + BlockFrequencyInfo(BlockFrequencyInfo &&Arg); + + BlockFrequencyInfo &operator=(BlockFrequencyInfo &&RHS); const Function *getFunction() const; void view() const; @@ -71,6 +78,30 @@ public: void print(raw_ostream &OS) const; }; +/// \brief Analysis pass which computes \c BlockFrequencyInfo. +class BlockFrequencyAnalysis + : public AnalysisInfoMixin { + friend AnalysisInfoMixin; + static char PassID; + +public: + /// \brief Provide the result typedef for this analysis pass. + typedef BlockFrequencyInfo Result; + + /// \brief Run the analysis pass over a function and produce BPI. + BlockFrequencyInfo run(Function &F, AnalysisManager &AM); +}; + +/// \brief Printer pass for the \c BlockFrequencyInfo results. +class BlockFrequencyPrinterPass + : public PassInfoMixin { + raw_ostream &OS; + +public: + explicit BlockFrequencyPrinterPass(raw_ostream &OS) : OS(OS) {} + PreservedAnalyses run(Function &F, AnalysisManager &AM); +}; + /// \brief Legacy analysis pass which computes \c BlockFrequencyInfo. class BlockFrequencyInfoWrapperPass : public FunctionPass { BlockFrequencyInfo BFI; diff --git a/lib/Analysis/BlockFrequencyInfo.cpp b/lib/Analysis/BlockFrequencyInfo.cpp index 8b19b2e19c4..a0c472d7c72 100644 --- a/lib/Analysis/BlockFrequencyInfo.cpp +++ b/lib/Analysis/BlockFrequencyInfo.cpp @@ -113,6 +113,15 @@ BlockFrequencyInfo::BlockFrequencyInfo(const Function &F, calculate(F, BPI, LI); } +BlockFrequencyInfo::BlockFrequencyInfo(BlockFrequencyInfo &&Arg) + : BFI(std::move(Arg.BFI)) {} + +BlockFrequencyInfo &BlockFrequencyInfo::operator=(BlockFrequencyInfo &&RHS) { + releaseMemory(); + BFI = std::move(RHS.BFI); + return *this; +} + void BlockFrequencyInfo::calculate(const Function &F, const BranchProbabilityInfo &BPI, const LoopInfo &LI) { @@ -225,3 +234,21 @@ bool BlockFrequencyInfoWrapperPass::runOnFunction(Function &F) { BFI.calculate(F, BPI, LI); return false; } + +char BlockFrequencyAnalysis::PassID; +BlockFrequencyInfo BlockFrequencyAnalysis::run(Function &F, + AnalysisManager &AM) { + BlockFrequencyInfo BFI; + BFI.calculate(F, AM.getResult(F), + AM.getResult(F)); + return BFI; +} + +PreservedAnalyses +BlockFrequencyPrinterPass::run(Function &F, AnalysisManager &AM) { + OS << "Printing analysis results of BFI for function " + << "'" << F.getName() << "':" + << "\n"; + AM.getResult(F).print(OS); + return PreservedAnalyses::all(); +} diff --git a/lib/Passes/PassBuilder.cpp b/lib/Passes/PassBuilder.cpp index d26e796bb54..a81634cbb96 100644 --- a/lib/Passes/PassBuilder.cpp +++ b/lib/Passes/PassBuilder.cpp @@ -21,6 +21,8 @@ #include "llvm/Analysis/AliasAnalysisEvaluator.h" #include "llvm/Analysis/AssumptionCache.h" #include "llvm/Analysis/BasicAliasAnalysis.h" +#include "llvm/Analysis/BlockFrequencyInfo.h" +#include "llvm/Analysis/BlockFrequencyInfoImpl.h" #include "llvm/Analysis/BranchProbabilityInfo.h" #include "llvm/Analysis/CFLAliasAnalysis.h" #include "llvm/Analysis/CGSCCPassManager.h" diff --git a/lib/Passes/PassRegistry.def b/lib/Passes/PassRegistry.def index d8c56070ce0..ca8b1033499 100644 --- a/lib/Passes/PassRegistry.def +++ b/lib/Passes/PassRegistry.def @@ -72,6 +72,7 @@ CGSCC_PASS("no-op-cgscc", NoOpCGSCCPass()) #endif FUNCTION_ANALYSIS("aa", AAManager()) FUNCTION_ANALYSIS("assumptions", AssumptionAnalysis()) +FUNCTION_ANALYSIS("block-freq", BlockFrequencyAnalysis()) FUNCTION_ANALYSIS("branch-prob", BranchProbabilityAnalysis()) FUNCTION_ANALYSIS("domtree", DominatorTreeAnalysis()) FUNCTION_ANALYSIS("postdomtree", PostDominatorTreeAnalysis()) @@ -112,6 +113,7 @@ FUNCTION_PASS("lower-expect", LowerExpectIntrinsicPass()) FUNCTION_PASS("gvn", GVN()) FUNCTION_PASS("print", PrintFunctionPass(dbgs())) FUNCTION_PASS("print", AssumptionPrinterPass(dbgs())) +FUNCTION_PASS("print", BlockFrequencyPrinterPass(dbgs())) FUNCTION_PASS("print", BranchProbabilityPrinterPass(dbgs())) FUNCTION_PASS("print", DominatorTreePrinterPass(dbgs())) FUNCTION_PASS("print", PostDominatorTreePrinterPass(dbgs())) diff --git a/test/Analysis/BlockFrequencyInfo/bad_input.ll b/test/Analysis/BlockFrequencyInfo/bad_input.ll index 20b87e6dfcb..39009a5ba83 100644 --- a/test/Analysis/BlockFrequencyInfo/bad_input.ll +++ b/test/Analysis/BlockFrequencyInfo/bad_input.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -analyze -block-freq | FileCheck %s +; RUN: opt < %s -passes='print' -disable-output 2>&1 | FileCheck %s declare void @g(i32 %x) diff --git a/test/Analysis/BlockFrequencyInfo/basic.ll b/test/Analysis/BlockFrequencyInfo/basic.ll index 8e81cc2ea31..44bfc36a711 100644 --- a/test/Analysis/BlockFrequencyInfo/basic.ll +++ b/test/Analysis/BlockFrequencyInfo/basic.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -analyze -block-freq | FileCheck %s +; RUN: opt < %s -passes='print' -disable-output 2>&1 | FileCheck %s define i32 @test1(i32 %i, i32* %a) { ; CHECK-LABEL: Printing analysis {{.*}} for function 'test1': diff --git a/test/Analysis/BlockFrequencyInfo/double_backedge.ll b/test/Analysis/BlockFrequencyInfo/double_backedge.ll index 597bf8329b2..4431c3a6821 100644 --- a/test/Analysis/BlockFrequencyInfo/double_backedge.ll +++ b/test/Analysis/BlockFrequencyInfo/double_backedge.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -analyze -block-freq | FileCheck %s +; RUN: opt < %s -passes='print' -disable-output 2>&1 | FileCheck %s define void @double_backedge(i1 %x) { ; CHECK-LABEL: Printing analysis {{.*}} for function 'double_backedge': diff --git a/test/Analysis/BlockFrequencyInfo/double_exit.ll b/test/Analysis/BlockFrequencyInfo/double_exit.ll index 3063ba70173..5e9dded162c 100644 --- a/test/Analysis/BlockFrequencyInfo/double_exit.ll +++ b/test/Analysis/BlockFrequencyInfo/double_exit.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -analyze -block-freq | FileCheck %s +; RUN: opt < %s -passes='print' -disable-output 2>&1 | FileCheck %s ; CHECK-LABEL: Printing analysis {{.*}} for function 'double_exit': ; CHECK-NEXT: block-frequency-info: double_exit diff --git a/test/Analysis/BlockFrequencyInfo/extremely-likely-loop-successor.ll b/test/Analysis/BlockFrequencyInfo/extremely-likely-loop-successor.ll index e55deaff428..b9623683fe5 100644 --- a/test/Analysis/BlockFrequencyInfo/extremely-likely-loop-successor.ll +++ b/test/Analysis/BlockFrequencyInfo/extremely-likely-loop-successor.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -analyze -block-freq | FileCheck %s +; RUN: opt < %s -passes='print' -disable-output 2>&1 | FileCheck %s ; PR21622: Check for a crasher when the sum of exits to the same successor of a ; loop overflows. diff --git a/test/Analysis/BlockFrequencyInfo/irreducible.ll b/test/Analysis/BlockFrequencyInfo/irreducible.ll index c1b1c2a7a23..83b0056636c 100644 --- a/test/Analysis/BlockFrequencyInfo/irreducible.ll +++ b/test/Analysis/BlockFrequencyInfo/irreducible.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -analyze -block-freq | FileCheck %s +; RUN: opt < %s -passes='print' -disable-output 2>&1 | FileCheck %s ; A loop with multiple exits isn't irreducible. It should be handled ; correctly. diff --git a/test/Analysis/BlockFrequencyInfo/irreducible_loop_crash.ll b/test/Analysis/BlockFrequencyInfo/irreducible_loop_crash.ll index 2bcd088dd16..8cd334f04bc 100644 --- a/test/Analysis/BlockFrequencyInfo/irreducible_loop_crash.ll +++ b/test/Analysis/BlockFrequencyInfo/irreducible_loop_crash.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -analyze -block-freq +; RUN: opt < %s -passes='print' -disable-output target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" diff --git a/test/Analysis/BlockFrequencyInfo/loop_with_branch.ll b/test/Analysis/BlockFrequencyInfo/loop_with_branch.ll index 9a86564c548..40d9e82351f 100644 --- a/test/Analysis/BlockFrequencyInfo/loop_with_branch.ll +++ b/test/Analysis/BlockFrequencyInfo/loop_with_branch.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -analyze -block-freq | FileCheck %s +; RUN: opt < %s -passes='print' -disable-output 2>&1 | FileCheck %s ; CHECK-LABEL: Printing analysis {{.*}} for function 'loop_with_branch': ; CHECK-NEXT: block-frequency-info: loop_with_branch diff --git a/test/Analysis/BlockFrequencyInfo/loops_with_profile_info.ll b/test/Analysis/BlockFrequencyInfo/loops_with_profile_info.ll index 29a9f3b29fb..3133e167de5 100644 --- a/test/Analysis/BlockFrequencyInfo/loops_with_profile_info.ll +++ b/test/Analysis/BlockFrequencyInfo/loops_with_profile_info.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -analyze -block-freq | FileCheck %s +; RUN: opt < %s -passes='print' -disable-output 2>&1 | FileCheck %s ; This code contains three loops. One is triple-nested, the ; second is double nested and the third is a single loop. At diff --git a/test/Analysis/BlockFrequencyInfo/nested_loop_with_branches.ll b/test/Analysis/BlockFrequencyInfo/nested_loop_with_branches.ll index 19d165805b0..7025b5d16a4 100644 --- a/test/Analysis/BlockFrequencyInfo/nested_loop_with_branches.ll +++ b/test/Analysis/BlockFrequencyInfo/nested_loop_with_branches.ll @@ -1,4 +1,5 @@ ; RUN: opt < %s -analyze -block-freq | FileCheck %s +; RUN: opt < %s -passes='print' -disable-output 2>&1 | FileCheck %s ; CHECK-LABEL: Printing analysis {{.*}} for function 'nested_loop_with_branches' ; CHECK-NEXT: block-frequency-info: nested_loop_with_branches