[llvm] 0628366 - Add new function properties to FunctionPropertiesAnalysis
Eric Christopher via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 23 15:05:36 PDT 2020
Had an unused variable warning that I fixed thusly:
echristo at athyra ~/s/llvm-project> git push
To github.com:llvm/llvm-project.git
1d09ecf3617..3ac828b8f7a master -> master
:)
-eric
On Thu, Jul 23, 2020 at 12:47 PM Mircea Trofin via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
>
> Author: Tarindu Jayatilaka
> Date: 2020-07-23T12:46:47-07:00
> New Revision: 06283661b34244f2db87aa55f2a40fe65903410e
>
> URL:
> https://github.com/llvm/llvm-project/commit/06283661b34244f2db87aa55f2a40fe65903410e
> DIFF:
> https://github.com/llvm/llvm-project/commit/06283661b34244f2db87aa55f2a40fe65903410e.diff
>
> LOG: Add new function properties to FunctionPropertiesAnalysis
>
> Added LoadInstCount, StoreInstCount, MaxLoopDepth, LoopCount
>
> Reviewed By: jdoerfert, mtrofin
>
> Differential Revision: https://reviews.llvm.org/D82283
>
> Added:
>
>
> Modified:
> llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
> llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
> llvm/test/Analysis/FunctionPropertiesAnalysis/matmul.ll
> llvm/unittests/Analysis/FunctionPropertiesAnalysisTest.cpp
>
> Removed:
>
>
>
>
> ################################################################################
> diff --git a/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
> b/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
> index 99f91a92b31a..a39c4e5413d8 100644
> --- a/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
> +++ b/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
> @@ -14,6 +14,7 @@
> #ifndef LLVM_FUNCTIONPROPERTIESANALYSIS_H_
> #define LLVM_FUNCTIONPROPERTIESANALYSIS_H_
>
> +#include "llvm/Analysis/LoopInfo.h"
> #include "llvm/IR/PassManager.h"
>
> namespace llvm {
> @@ -21,6 +22,11 @@ class Function;
>
> class FunctionPropertiesInfo {
> public:
> + static FunctionPropertiesInfo getFunctionPropertiesInfo(const Function
> &F,
> + const LoopInfo
> &LI);
> +
> + void print(raw_ostream &OS) const;
> +
> /// Number of basic blocks
> int64_t BasicBlockCount = 0;
>
> @@ -40,9 +46,17 @@ class FunctionPropertiesInfo {
> /// defined in this module.
> int64_t DirectCallsToDefinedFunctions = 0;
>
> - static FunctionPropertiesInfo getFunctionPropertiesInfo(const Function
> &F);
> + // Load Instruction Count
> + int64_t LoadInstCount = 0;
>
> - void print(raw_ostream &OS) const;
> + // Store Instruction Count
> + int64_t StoreInstCount = 0;
> +
> + // Maximum Loop Depth in the Function
> + int64_t MaxLoopDepth = 0;
> +
> + // Number of Top Level Loops in the Function
> + int64_t TopLevelLoopCount = 0;
> };
>
> // Analysis pass
>
> diff --git a/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
> b/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
> index 9b7caf1579a3..3db108c94985 100644
> --- a/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
> +++ b/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
> @@ -17,7 +17,8 @@
> using namespace llvm;
>
> FunctionPropertiesInfo
> -FunctionPropertiesInfo::getFunctionPropertiesInfo(const Function &F) {
> +FunctionPropertiesInfo::getFunctionPropertiesInfo(const Function &F,
> + const LoopInfo &LI) {
>
> FunctionPropertiesInfo FPI;
>
> @@ -40,7 +41,20 @@ FunctionPropertiesInfo::getFunctionPropertiesInfo(const
> Function &F) {
> if (Callee && !Callee->isIntrinsic() && !Callee->isDeclaration())
> ++FPI.DirectCallsToDefinedFunctions;
> }
> + if (I.getOpcode() == Instruction::Load) {
> + ++FPI.LoadInstCount;
> + } else if (I.getOpcode() == Instruction::Store) {
> + ++FPI.StoreInstCount;
> + }
> }
> + // Loop Depth of the Basic Block
> + int64_t LoopDepth;
> + LoopDepth = LI.getLoopDepth(&BB);
> + if (FPI.MaxLoopDepth < LoopDepth)
> + FPI.MaxLoopDepth = LoopDepth;
> + }
> + for (Loop *L : LI) {
> + ++FPI.TopLevelLoopCount;
> }
> return FPI;
> }
> @@ -51,14 +65,19 @@ void FunctionPropertiesInfo::print(raw_ostream &OS)
> const {
> << BlocksReachedFromConditionalInstruction << "\n"
> << "Uses: " << Uses << "\n"
> << "DirectCallsToDefinedFunctions: " << DirectCallsToDefinedFunctions
> - << "\n\n";
> + << "\n"
> + << "LoadInstCount: " << LoadInstCount << "\n"
> + << "StoreInstCount: " << StoreInstCount << "\n"
> + << "MaxLoopDepth: " << MaxLoopDepth << "\n"
> + << "TopLevelLoopCount: " << TopLevelLoopCount << "\n\n";
> }
>
> AnalysisKey FunctionPropertiesAnalysis::Key;
>
> FunctionPropertiesInfo
> FunctionPropertiesAnalysis::run(Function &F, FunctionAnalysisManager
> &FAM) {
> - return FunctionPropertiesInfo::getFunctionPropertiesInfo(F);
> + return FunctionPropertiesInfo::getFunctionPropertiesInfo(
> + F, FAM.getResult<LoopAnalysis>(F));
> }
>
> PreservedAnalyses
>
> diff --git a/llvm/test/Analysis/FunctionPropertiesAnalysis/matmul.ll
> b/llvm/test/Analysis/FunctionPropertiesAnalysis/matmul.ll
> index 07e1fece5d3b..506914972a10 100644
> --- a/llvm/test/Analysis/FunctionPropertiesAnalysis/matmul.ll
> +++ b/llvm/test/Analysis/FunctionPropertiesAnalysis/matmul.ll
> @@ -21,6 +21,10 @@ entry:
> ; CHECK-DAG: BlocksReachedFromConditionalInstruction: 0
> ; CHECK-DAG: Uses: 1
> ; CHECK-DAG: DirectCallsToDefinedFunctions: 1
> +; CHECK-DAG: LoadInstCount: 0
> +; CHECK-DAG: StoreInstCount: 1
> +; CHECK-DAG: MaxLoopDepth: 0
> +; CHECK-DAG: TopLevelLoopCount: 0
>
> define void @multiply([2 x i32]* %mat1, [2 x i32]* %mat2, [2 x i32]*
> %res) {
> ; CHECK-DAG: Printing analysis results of CFA for function 'multiply':
> @@ -129,4 +133,8 @@ for.end26: ;
> preds = %for.cond
> ; CHECK-DAG: BasicBlockCount: 13
> ; CHECK-DAG: BlocksReachedFromConditionalInstruction: 6
> ; CHECK-DAG: Uses: 2
> -; CHECK-DAG: DirectCallsToDefinedFunctions: 0
> \ No newline at end of file
> +; CHECK-DAG: DirectCallsToDefinedFunctions: 0
> +; CHECK-DAG: LoadInstCount: 21
> +; CHECK-DAG: StoreInstCount: 11
> +; CHECK-DAG: MaxLoopDepth: 3
> +; CHECK-DAG: TopLevelLoopCount: 1
> \ No newline at end of file
>
> diff --git a/llvm/unittests/Analysis/FunctionPropertiesAnalysisTest.cpp
> b/llvm/unittests/Analysis/FunctionPropertiesAnalysisTest.cpp
> index b04d204b2703..7b2a985bba66 100644
> --- a/llvm/unittests/Analysis/FunctionPropertiesAnalysisTest.cpp
> +++ b/llvm/unittests/Analysis/FunctionPropertiesAnalysisTest.cpp
> @@ -8,6 +8,7 @@
>
> #include "llvm/Analysis/FunctionPropertiesAnalysis.h"
> #include "llvm/AsmParser/Parser.h"
> +#include "llvm/IR/Dominators.h"
> #include "llvm/IR/Instructions.h"
> #include "llvm/IR/LLVMContext.h"
> #include "llvm/IR/Module.h"
> @@ -15,42 +16,49 @@
> #include "gtest/gtest.h"
>
> using namespace llvm;
> +namespace {
>
> -static std::unique_ptr<Module> parseIR(LLVMContext &C, const char *IR) {
> - SMDiagnostic Err;
> - std::unique_ptr<Module> Mod = parseAssemblyString(IR, Err, C);
> - if (!Mod)
> - Err.print("MLAnalysisTests", errs());
> - return Mod;
> -}
> +class FunctionPropertiesAnalysisTest : public testing::Test {
> +protected:
> + std::unique_ptr<DominatorTree> DT;
> + std::unique_ptr<LoopInfo> LI;
> +
> + FunctionPropertiesInfo buildFPI(Function &F) {
> + DT.reset(new DominatorTree(F));
> + LI.reset(new LoopInfo(*DT));
> + return FunctionPropertiesInfo::getFunctionPropertiesInfo(F, *LI);
> + }
>
> -TEST(FunctionPropertiesTest, BasicTest) {
> + std::unique_ptr<Module> makeLLVMModule(LLVMContext &C, const char *IR) {
> + SMDiagnostic Err;
> + std::unique_ptr<Module> Mod = parseAssemblyString(IR, Err, C);
> + if (!Mod)
> + Err.print("MLAnalysisTests", errs());
> + return Mod;
> + }
> +};
> +
> +TEST_F(FunctionPropertiesAnalysisTest, BasicTest) {
> LLVMContext C;
> - std::unique_ptr<Module> M = parseIR(C,
> - R"IR(
> + std::unique_ptr<Module> M = makeLLVMModule(C,
> + R"IR(
> target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
> target triple = "x86_64-pc-linux-gnu"
> -
> declare i32 @f1(i32)
> declare i32 @f2(i32)
> -
> define i32 @branches(i32) {
> %cond = icmp slt i32 %0, 3
> br i1 %cond, label %then, label %else
> -
> then:
> %ret.1 = call i32 @f1(i32 %0)
> br label %last.block
> -
> else:
> %ret.2 = call i32 @f2(i32 %0)
> br label %last.block
> -
> last.block:
> %ret = phi i32 [%ret.1, %then], [%ret.2, %else]
> ret i32 %ret
> }
> -
> define internal i32 @top() {
> %1 = call i32 @branches(i32 2)
> %2 = call i32 @f1(i32 %1)
> @@ -58,20 +66,28 @@ define internal i32 @top() {
> }
> )IR");
>
> - FunctionAnalysisManager FAM;
> - FunctionPropertiesAnalysis FPA;
> -
> - auto BranchesFeatures = FPA.run(*M->getFunction("branches"), FAM);
> + Function *BranchesFunction = M->getFunction("branches");
> + FunctionPropertiesInfo BranchesFeatures = buildFPI(*BranchesFunction);
> EXPECT_EQ(BranchesFeatures.BasicBlockCount, 4);
> EXPECT_EQ(BranchesFeatures.BlocksReachedFromConditionalInstruction, 2);
> - EXPECT_EQ(BranchesFeatures.DirectCallsToDefinedFunctions, 0);
> // 2 Users: top is one. The other is added because @branches is not
> internal,
> // so it may have external callers.
> EXPECT_EQ(BranchesFeatures.Uses, 2);
> + EXPECT_EQ(BranchesFeatures.DirectCallsToDefinedFunctions, 0);
> + EXPECT_EQ(BranchesFeatures.LoadInstCount, 0);
> + EXPECT_EQ(BranchesFeatures.StoreInstCount, 0);
> + EXPECT_EQ(BranchesFeatures.MaxLoopDepth, 0);
> + EXPECT_EQ(BranchesFeatures.TopLevelLoopCount, 0);
>
> - auto TopFeatures = FPA.run(*M->getFunction("top"), FAM);
> + Function *TopFunction = M->getFunction("top");
> + FunctionPropertiesInfo TopFeatures = buildFPI(*TopFunction);
> EXPECT_EQ(TopFeatures.BasicBlockCount, 1);
> EXPECT_EQ(TopFeatures.BlocksReachedFromConditionalInstruction, 0);
> - EXPECT_EQ(TopFeatures.DirectCallsToDefinedFunctions, 1);
> EXPECT_EQ(TopFeatures.Uses, 0);
> + EXPECT_EQ(TopFeatures.DirectCallsToDefinedFunctions, 1);
> + EXPECT_EQ(BranchesFeatures.LoadInstCount, 0);
> + EXPECT_EQ(BranchesFeatures.StoreInstCount, 0);
> + EXPECT_EQ(BranchesFeatures.MaxLoopDepth, 0);
> + EXPECT_EQ(BranchesFeatures.TopLevelLoopCount, 0);
> }
> +} // end anonymous namespace
> \ No newline at end of file
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200723/7aefdcc0/attachment.html>
More information about the llvm-commits
mailing list