[llvm] 0628366 - Add new function properties to FunctionPropertiesAnalysis
Mircea Trofin via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 23 15:51:30 PDT 2020
Thanks!
+ Tarindu
On Thu, Jul 23, 2020 at 3:05 PM Eric Christopher <echristo at gmail.com> wrote:
> 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/db0feddd/attachment.html>
More information about the llvm-commits
mailing list