[llvm] ea8554e - Changed stat passes to count instructions before and after optimizations (#188837)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 10 18:47:57 PDT 2026
Author: IƱaki V Arrechea
Date: 2026-04-11T01:47:52Z
New Revision: ea8554e35bcbce927233cf93b709df4c3ba8752b
URL: https://github.com/llvm/llvm-project/commit/ea8554e35bcbce927233cf93b709df4c3ba8752b
DIFF: https://github.com/llvm/llvm-project/commit/ea8554e35bcbce927233cf93b709df4c3ba8752b.diff
LOG: Changed stat passes to count instructions before and after optimizations (#188837)
Created this for instcount and func-properties-analysis to be able to
see the change the optimization pipelines have on stats
Added:
llvm/test/Analysis/FunctionPropertiesAnalysis/function-properties-analysis.ll
llvm/test/Analysis/FunctionPropertiesAnalysis/pipeline.ll
llvm/test/Analysis/InstCount/pipeline.ll
Modified:
llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
llvm/include/llvm/Analysis/InstCount.h
llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
llvm/lib/Analysis/InstCount.cpp
llvm/lib/Passes/PassBuilder.cpp
llvm/lib/Passes/PassBuilderPipelines.cpp
llvm/lib/Passes/PassRegistry.def
llvm/test/Analysis/InstCount/instcount.ll
Removed:
llvm/test/Analysis/FunctionPropertiesAnalysis/properties-stats.ll
################################################################################
diff --git a/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h b/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
index 1619671d8f7dc..aa3e20c914ab7 100644
--- a/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
+++ b/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
@@ -185,8 +185,14 @@ class FunctionPropertiesPrinterPass
};
/// Statistics pass for the FunctionPropertiesAnalysis results.
-struct FunctionPropertiesStatisticsPass
- : PassInfoMixin<FunctionPropertiesStatisticsPass> {
+class FunctionPropertiesStatisticsPass
+ : public PassInfoMixin<FunctionPropertiesStatisticsPass> {
+ bool IsPreOptimization;
+
+public:
+ explicit FunctionPropertiesStatisticsPass(bool IsPreOptimization = false)
+ : IsPreOptimization(IsPreOptimization) {}
+
PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
};
diff --git a/llvm/include/llvm/Analysis/InstCount.h b/llvm/include/llvm/Analysis/InstCount.h
index e5ce822caf6ef..4a19dbad57513 100644
--- a/llvm/include/llvm/Analysis/InstCount.h
+++ b/llvm/include/llvm/Analysis/InstCount.h
@@ -19,8 +19,14 @@ namespace llvm {
class Function;
-struct InstCountPass : PassInfoMixin<InstCountPass> {
- PreservedAnalyses run(Function &F, FunctionAnalysisManager &);
+class InstCountPass : public PassInfoMixin<InstCountPass> {
+ bool IsPreOptimization;
+
+public:
+ explicit InstCountPass(bool IsPreOptimization = false)
+ : IsPreOptimization(IsPreOptimization) {}
+
+ PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
};
} // end namespace llvm
diff --git a/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp b/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
index 4a66d8835281a..21eeb05a9041c 100644
--- a/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
+++ b/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
@@ -29,8 +29,13 @@ using namespace llvm;
#define DEBUG_TYPE "func-properties-stats"
-#define FUNCTION_PROPERTY(Name, Description) STATISTIC(Num##Name, Description);
+#define FUNCTION_PROPERTY(Name, Description) \
+ STATISTIC(Num##Name##PreOptimization, \
+ Description " (before optimizations)"); \
+ STATISTIC(Num##Name, Description);
#define DETAILED_FUNCTION_PROPERTY(Name, Description) \
+ STATISTIC(Num##Name##PreOptimization, \
+ Description " (before optimizations)"); \
STATISTIC(Num##Name, Description);
#include "llvm/IR/FunctionProperties.def"
@@ -378,11 +383,22 @@ FunctionPropertiesStatisticsPass::run(Function &F,
LLVM_DEBUG(dbgs() << "STATSCOUNT: running on function " << F.getName()
<< "\n");
auto &AnalysisResults = FAM.getResult<FunctionPropertiesAnalysis>(F);
-
+ if (IsPreOptimization) {
+#define FUNCTION_PROPERTY(Name, Description) \
+ Num##Name##PreOptimization += AnalysisResults.Name;
+#define DETAILED_FUNCTION_PROPERTY(Name, Description) \
+ Num##Name##PreOptimization += AnalysisResults.Name;
+#include "llvm/IR/FunctionProperties.def"
+#undef FUNCTION_PROPERTY
+#undef DETAILED_FUNCTION_PROPERTY
+ } else {
#define FUNCTION_PROPERTY(Name, Description) Num##Name += AnalysisResults.Name;
#define DETAILED_FUNCTION_PROPERTY(Name, Description) \
Num##Name += AnalysisResults.Name;
#include "llvm/IR/FunctionProperties.def"
+#undef FUNCTION_PROPERTY
+#undef DETAILED_FUNCTION_PROPERTY
+ }
return PreservedAnalyses::all();
}
diff --git a/llvm/lib/Analysis/InstCount.cpp b/llvm/lib/Analysis/InstCount.cpp
index 7a797767f97cb..34a200dd879d2 100644
--- a/llvm/lib/Analysis/InstCount.cpp
+++ b/llvm/lib/Analysis/InstCount.cpp
@@ -21,15 +21,29 @@ using namespace llvm;
#define DEBUG_TYPE "instcount"
-STATISTIC(TotalInsts, "Number of instructions (of all types)");
+STATISTIC(TotalInstsPreOptimization,
+ "Number of instructions of all types (before optimizations)");
+STATISTIC(TotalInsts, "Number of instructions of all types");
+STATISTIC(TotalBlocksPreOptimization,
+ "Number of basic blocks (before optimizations)");
STATISTIC(TotalBlocks, "Number of basic blocks");
+STATISTIC(TotalFuncsPreOptimization,
+ "Number of non-external functions (before optimizations)");
STATISTIC(TotalFuncs, "Number of non-external functions");
+STATISTIC(LargestFunctionSizePreOptimization,
+ "Largest number of instructions in a single function (before "
+ "optimizations)");
STATISTIC(LargestFunctionSize,
"Largest number of instructions in a single function");
+STATISTIC(LargestFunctionBBCountPreOptimization,
+ "Largest number of basic blocks in a single function (before "
+ "optimizations)");
STATISTIC(LargestFunctionBBCount,
"Largest number of basic blocks in a single function");
#define HANDLE_INST(N, OPCODE, CLASS) \
+ STATISTIC(Num##OPCODE##InstPreOptimization, \
+ "Number of " #OPCODE " insts (before optimizations)"); \
STATISTIC(Num##OPCODE##Inst, "Number of " #OPCODE " insts");
#include "llvm/IR/Instruction.def"
@@ -37,18 +51,39 @@ STATISTIC(LargestFunctionBBCount,
namespace {
class InstCount : public InstVisitor<InstCount> {
friend class InstVisitor<InstCount>;
+ bool IsPreOptimization;
+
+public:
+ InstCount(bool IsPreOptimization) : IsPreOptimization(IsPreOptimization) {}
void visitFunction(Function &F) {
- ++TotalFuncs;
- LargestFunctionSize.updateMax(F.getInstructionCount());
- LargestFunctionBBCount.updateMax(F.size());
+ if (IsPreOptimization) {
+ ++TotalFuncsPreOptimization;
+ LargestFunctionSizePreOptimization.updateMax(F.getInstructionCount());
+ LargestFunctionBBCountPreOptimization.updateMax(F.size());
+ } else {
+ ++TotalFuncs;
+ LargestFunctionSize.updateMax(F.getInstructionCount());
+ LargestFunctionBBCount.updateMax(F.size());
+ }
+ }
+
+ void visitBasicBlock(BasicBlock &BB) {
+ if (IsPreOptimization)
+ ++TotalBlocksPreOptimization;
+ else
+ ++TotalBlocks;
}
- void visitBasicBlock(BasicBlock &BB) { ++TotalBlocks; }
#define HANDLE_INST(N, OPCODE, CLASS) \
void visit##OPCODE(CLASS &) { \
- ++Num##OPCODE##Inst; \
- ++TotalInsts; \
+ if (IsPreOptimization) { \
+ ++Num##OPCODE##InstPreOptimization; \
+ ++TotalInstsPreOptimization; \
+ } else { \
+ ++Num##OPCODE##Inst; \
+ ++TotalInsts; \
+ } \
}
#include "llvm/IR/Instruction.def"
@@ -64,7 +99,7 @@ PreservedAnalyses InstCountPass::run(Function &F,
FunctionAnalysisManager &FAM) {
LLVM_DEBUG(dbgs() << "INSTCOUNT: running on function " << F.getName()
<< "\n");
- InstCount().visit(F);
+ InstCount(this->IsPreOptimization).visit(F);
return PreservedAnalyses::all();
}
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index e1a04186967f0..715f4d2c0abc4 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -806,6 +806,17 @@ Expected<bool> parseLintOptions(StringRef Params) {
"LintPass");
}
+/// Parser of parameters for FunctionPropertiesStatistics pass.
+Expected<bool> parseFunctionPropertiesStatisticsOptions(StringRef Params) {
+ return PassBuilder::parseSinglePassOption(Params, "pre-opt",
+ "FunctionPropertiesStatisticsPass");
+}
+
+/// Parser of parameters for InstCount pass.
+Expected<bool> parseInstCountOptions(StringRef Params) {
+ return PassBuilder::parseSinglePassOption(Params, "pre-opt", "InstCountPass");
+}
+
/// Parser of parameters for LoopUnroll pass.
Expected<LoopUnrollOptions> parseLoopUnrollOptions(StringRef Params) {
LoopUnrollOptions UnrollOpts;
diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp
index 6f7ace93b78e3..f017419791a85 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -413,16 +413,20 @@ void PassBuilder::invokePipelineEarlySimplificationEPCallbacks(
C(MPM, Level, Phase);
}
-// Helper to add AnnotationRemarksPass.
-static void addAnnotationRemarksPass(ModulePassManager &MPM) {
- MPM.addPass(createModuleToFunctionPassAdaptor(AnnotationRemarksPass()));
- // Count the stats for InstCount and FunctionPropertiesAnalysis
+// Get IR stats with InstCount and FunctionPropertiesAnalysis.
+static void instructionCountersPass(ModulePassManager &MPM,
+ bool IsPreOptimization) {
if (AreStatisticsEnabled()) {
- MPM.addPass(createModuleToFunctionPassAdaptor(InstCountPass()));
MPM.addPass(
- createModuleToFunctionPassAdaptor(FunctionPropertiesStatisticsPass()));
+ createModuleToFunctionPassAdaptor(InstCountPass(IsPreOptimization)));
+ MPM.addPass(createModuleToFunctionPassAdaptor(
+ FunctionPropertiesStatisticsPass(IsPreOptimization)));
}
}
+// Helper to add AnnotationRemarksPass.
+static void addAnnotationRemarksPass(ModulePassManager &MPM) {
+ MPM.addPass(createModuleToFunctionPassAdaptor(AnnotationRemarksPass()));
+}
// Helper to check if the current compilation phase is preparing for LTO
static bool isLTOPreLink(ThinOrFullLTOPhase Phase) {
@@ -1712,6 +1716,7 @@ PassBuilder::buildPerModuleDefaultPipeline(OptimizationLevel Level,
return buildO0DefaultPipeline(Level, Phase);
ModulePassManager MPM;
+ instructionCountersPass(MPM, /*IsPreOptimization=*/true);
// Currently this pipeline is only invoked in an LTO pre link pass or when we
// are not running LTO. If that changes the below checks may need updating.
@@ -1750,6 +1755,9 @@ PassBuilder::buildPerModuleDefaultPipeline(OptimizationLevel Level,
if (isLTOPreLink(Phase))
addRequiredLTOPreLinkPasses(MPM);
+
+ instructionCountersPass(MPM, /*IsPreOptimization=*/false);
+
return MPM;
}
@@ -1757,6 +1765,9 @@ ModulePassManager
PassBuilder::buildFatLTODefaultPipeline(OptimizationLevel Level, bool ThinLTO,
bool EmitSummary) {
ModulePassManager MPM;
+
+ instructionCountersPass(MPM, /*IsPreOptimization=*/true);
+
if (ThinLTO)
MPM.addPass(buildThinLTOPreLinkDefaultPipeline(Level));
else
@@ -1799,6 +1810,9 @@ PassBuilder::buildFatLTODefaultPipeline(OptimizationLevel Level, bool ThinLTO,
// Emit annotation remarks.
addAnnotationRemarksPass(MPM);
}
+
+ instructionCountersPass(MPM, /*IsPreOptimization=*/false);
+
return MPM;
}
@@ -1809,6 +1823,8 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level) {
ModulePassManager MPM;
+ instructionCountersPass(MPM, /*IsPreOptimization=*/true);
+
// Convert @llvm.global.annotations to !annotation metadata.
MPM.addPass(Annotation2MetadataPass());
@@ -1861,6 +1877,8 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level) {
addRequiredLTOPreLinkPasses(MPM);
+ instructionCountersPass(MPM, /*IsPreOptimization=*/false);
+
return MPM;
}
@@ -1868,6 +1886,8 @@ ModulePassManager PassBuilder::buildThinLTODefaultPipeline(
OptimizationLevel Level, const ModuleSummaryIndex *ImportSummary) {
ModulePassManager MPM;
+ instructionCountersPass(MPM, /*IsPreOptimization=*/true);
+
// If we are invoking this without a summary index noting that we are linking
// with a library containing the necessary APIs, remove any MemProf related
// attributes and metadata.
@@ -1916,6 +1936,8 @@ ModulePassManager PassBuilder::buildThinLTODefaultPipeline(
// globals in the object file.
MPM.addPass(EliminateAvailableExternallyPass());
MPM.addPass(GlobalDCEPass());
+
+ instructionCountersPass(MPM, /*IsPreOptimization=*/false);
return MPM;
}
if (!UseCtxProfile.empty()) {
@@ -1933,6 +1955,8 @@ ModulePassManager PassBuilder::buildThinLTODefaultPipeline(
// Emit annotation remarks.
addAnnotationRemarksPass(MPM);
+ instructionCountersPass(MPM, /*IsPreOptimization=*/false);
+
return MPM;
}
@@ -1948,6 +1972,8 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
ModuleSummaryIndex *ExportSummary) {
ModulePassManager MPM;
+ instructionCountersPass(MPM, /*IsPreOptimization=*/true);
+
invokeFullLinkTimeOptimizationEarlyEPCallbacks(MPM, Level);
// If we are invoking this without a summary index noting that we are linking
@@ -2308,6 +2334,8 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
// Emit annotation remarks.
addAnnotationRemarksPass(MPM);
+ instructionCountersPass(MPM, /*IsPreOptimization=*/false);
+
return MPM;
}
@@ -2319,6 +2347,8 @@ PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
ModulePassManager MPM;
+ instructionCountersPass(MPM, /*IsPreOptimization=*/true);
+
// Perform pseudo probe instrumentation in O0 mode. This is for the
// consistency between
diff erent build modes. For example, a LTO build can be
// mixed with an O0 prelink and an O2 postlink. Loading a sample profile in
@@ -2432,6 +2462,8 @@ PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
// Emit annotation remarks.
addAnnotationRemarksPass(MPM);
+ instructionCountersPass(MPM, /*IsPreOptimization=*/false);
+
return MPM;
}
diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def
index c92d93d7ae396..9fe40d441e0af 100644
--- a/llvm/lib/Passes/PassRegistry.def
+++ b/llvm/lib/Passes/PassRegistry.def
@@ -440,7 +440,6 @@ FUNCTION_PASS("fix-irreducible", FixIrreduciblePass())
FUNCTION_PASS("flatten-cfg", FlattenCFGPass())
FUNCTION_PASS("float2int", Float2IntPass())
FUNCTION_PASS("free-machine-function", FreeMachineFunctionPass())
-FUNCTION_PASS("func-properties-stats", FunctionPropertiesStatisticsPass())
FUNCTION_PASS("gc-lowering", GCLoweringPass())
FUNCTION_PASS("guard-widening", GuardWideningPass())
FUNCTION_PASS("gvn-hoist", GVNHoistPass())
@@ -451,7 +450,6 @@ FUNCTION_PASS("infer-address-spaces", InferAddressSpacesPass())
FUNCTION_PASS("infer-alignment", InferAlignmentPass())
FUNCTION_PASS("inject-tli-mappings", InjectTLIMappings())
FUNCTION_PASS("inline-asm-prepare", InlineAsmPreparePass())
-FUNCTION_PASS("instcount", InstCountPass())
FUNCTION_PASS("instnamer", InstructionNamerPass())
FUNCTION_PASS("instsimplify", InstSimplifyPass())
FUNCTION_PASS("interleaved-access", InterleavedAccessPass(*TM))
@@ -589,6 +587,13 @@ FUNCTION_PASS_WITH_PARAMS(
"ee-instrument", "EntryExitInstrumenterPass",
[](bool PostInlining) { return EntryExitInstrumenterPass(PostInlining); },
parseEntryExitInstrumenterPassOptions, "post-inline")
+FUNCTION_PASS_WITH_PARAMS(
+ "func-properties-stats",
+ "FunctionPropertiesStatisticsPass",
+ [](bool IsPreOptimizations) {
+ return FunctionPropertiesStatisticsPass(IsPreOptimizations);
+ },
+ parseFunctionPropertiesStatisticsOptions, "pre-opt")
FUNCTION_PASS_WITH_PARAMS(
"function-simplification", "",
[this](OptimizationLevel OL) {
@@ -612,6 +617,12 @@ FUNCTION_PASS_WITH_PARAMS(
[](InstCombineOptions Opts) { return InstCombinePass(Opts); },
parseInstCombineOptions,
"no-verify-fixpoint;verify-fixpoint;max-iterations=N")
+FUNCTION_PASS_WITH_PARAMS(
+ "instcount", "InstCountPass",
+ [](bool IsPreOptimizations) {
+ return InstCountPass(IsPreOptimizations);
+ },
+ parseInstCountOptions, "pre-opt")
FUNCTION_PASS_WITH_PARAMS(
"lint", "LintPass",
[](bool AbortOnError) { return LintPass(AbortOnError); }, parseLintOptions,
diff --git a/llvm/test/Analysis/FunctionPropertiesAnalysis/properties-stats.ll b/llvm/test/Analysis/FunctionPropertiesAnalysis/function-properties-analysis.ll
similarity index 70%
rename from llvm/test/Analysis/FunctionPropertiesAnalysis/properties-stats.ll
rename to llvm/test/Analysis/FunctionPropertiesAnalysis/function-properties-analysis.ll
index f7907c73728a5..555d73c82b50b 100644
--- a/llvm/test/Analysis/FunctionPropertiesAnalysis/properties-stats.ll
+++ b/llvm/test/Analysis/FunctionPropertiesAnalysis/function-properties-analysis.ll
@@ -1,11 +1,5 @@
-; Testing with all of the below run lines that the pass gets added to the appropriate pipelines
; REQUIRES: asserts
; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes=func-properties-stats < %s 2>&1 | FileCheck %s
-; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes='thinlto<O3>' < %s 2>&1 | FileCheck %s
-; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes='thinlto-pre-link<O2>' < %s 2>&1 | FileCheck %s
-; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes='lto<O1>' < %s 2>&1 | FileCheck %s
-; RUN: opt -stats -enable-detailed-function-properties -disable-output -O3 < %s 2>&1 | FileCheck %s
-; RUN: opt -stats -enable-detailed-function-properties -disable-output -O0 < %s 2>&1 | FileCheck %s
; CHECK-DAG: 10 func-properties-stats - Number of basic blocks
; CHECK-DAG: 8 func-properties-stats - Number of branch instructions
@@ -17,7 +11,6 @@
; CHECK-DAG: 1 func-properties-stats - Number of switch instructions
; CHECK-DAG: 4 func-properties-stats - Number of switch successors
-
define void @foo(i32 %i, i32 %j, i32 %n) {
entry:
%cmp = icmp slt i32 %i, %j
diff --git a/llvm/test/Analysis/FunctionPropertiesAnalysis/pipeline.ll b/llvm/test/Analysis/FunctionPropertiesAnalysis/pipeline.ll
new file mode 100644
index 0000000000000..5ed52f5bf982d
--- /dev/null
+++ b/llvm/test/Analysis/FunctionPropertiesAnalysis/pipeline.ll
@@ -0,0 +1,41 @@
+; REQUIRES: asserts
+; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes='func-properties-stats<pre-opt>' < %s 2>&1 | FileCheck %s --check-prefix=PRE
+; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes='func-properties-stats' < %s 2>&1 | FileCheck %s --check-prefixes=POSTNOOPT
+; RUN: opt -stats -enable-detailed-function-properties -disable-output -O0 < %s 2>&1 | FileCheck %s --check-prefixes=PRE,POSTNOOPT
+; RUN: opt -stats -enable-detailed-function-properties -disable-output -O3 < %s 2>&1 | FileCheck %s --check-prefixes=PRE,POST
+; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes='lto<O3>' < %s 2>&1 | FileCheck %s --check-prefixes=PRE,POST
+; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes='lto-pre-link<Os>' < %s 2>&1 | FileCheck %s --check-prefixes=PRE,POST
+; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes='lto-pre-link<O3>' < %s 2>&1 | FileCheck %s --check-prefixes=PRE,POST
+; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes='thinlto<O3>' < %s 2>&1 | FileCheck %s --check-prefixes=PRE,POST
+; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes='thinlto-pre-link<O2>' < %s 2>&1 | FileCheck %s --check-prefixes=PRE,POST
+
+; --- <pre-opt> ---
+; PRE-DAG: 4 func-properties-stats - Number of basic blocks (before optimizations)
+; PRE-DAG: 5 func-properties-stats - Number of instructions (of all types) (before optimizations)
+; PRE-DAG: 4 func-properties-stats - Number of basic block successors (before optimizations)
+
+; --- No <pre-opt> in pass but no optimization passes run ---
+; POSTNOOPT-DAG: 4 func-properties-stats - Number of basic blocks
+; POSTNOOPT-DAG: 5 func-properties-stats - Number of instructions (of all types)
+; POSTNOOPT-DAG: 4 func-properties-stats - Number of basic block successors
+
+; --- Post optimization values ---
+; POST-DAG: 1 func-properties-stats - Number of basic blocks
+; POST-DAG: 1 func-properties-stats - Number of instructions (of all types)
+; POST-NOT: func-properties-stats - Number of basic block successors
+
+define i32 @test_count() {
+entry:
+ ; This branch is trivially resolvable
+ br i1 true, label %then, label %else
+
+then:
+ br label %end
+
+else:
+ br label %end
+
+end:
+ %phi = phi i32 [ 1, %then ], [ 2, %else ]
+ ret i32 %phi
+}
diff --git a/llvm/test/Analysis/InstCount/instcount.ll b/llvm/test/Analysis/InstCount/instcount.ll
index 9c4d3f3d06457..6c7ba690fdf04 100644
--- a/llvm/test/Analysis/InstCount/instcount.ll
+++ b/llvm/test/Analysis/InstCount/instcount.ll
@@ -1,11 +1,5 @@
; REQUIRES: asserts
; RUN: opt -stats -passes=instcount -disable-output < %s 2>&1 | FileCheck %s
-; RUN: opt -stats -passes='thinlto<O3>' -disable-output < %s 2>&1 | FileCheck %s
-; RUN: opt -stats -passes='thinlto-pre-link<O2>' -disable-output < %s 2>&1 | FileCheck %s
-; RUN: opt -stats -passes='lto<O1>' -disable-output < %s 2>&1 | FileCheck %s
-; RUN: opt -stats -passes='lto-pre-link<Os>' -disable-output < %s 2>&1 | FileCheck %s
-; RUN: opt -stats -O3 -disable-output < %s 2>&1 | FileCheck %s
-; RUN: opt -stats -O0 -disable-output < %s 2>&1 | FileCheck %s
; CHECK-DAG: 10 instcount - Largest number of basic blocks in a single function
; CHECK-DAG: 18 instcount - Largest number of instructions in a single function
@@ -17,7 +11,7 @@
; CHECK-DAG: 1 instcount - Number of Switch insts
; CHECK-DAG: 11 instcount - Number of basic blocks
; CHECK-DAG: 2 instcount - Number of non-external functions
-; CHECK-DAG: 19 instcount - Number of instructions (of all types)
+; CHECK-DAG: 19 instcount - Number of instructions of all types
define void @foo(i32 %i, i32 %j, i32 %n) {
entry:
diff --git a/llvm/test/Analysis/InstCount/pipeline.ll b/llvm/test/Analysis/InstCount/pipeline.ll
new file mode 100644
index 0000000000000..bb203cca0a974
--- /dev/null
+++ b/llvm/test/Analysis/InstCount/pipeline.ll
@@ -0,0 +1,41 @@
+; REQUIRES: asserts
+; RUN: opt -stats -disable-output -passes='instcount<pre-opt>' < %s 2>&1 | FileCheck %s --check-prefix=PRE
+; RUN: opt -stats -disable-output -passes='instcount' < %s 2>&1 | FileCheck %s --check-prefixes=POSTNOOPT
+; RUN: opt -stats -disable-output -O0 < %s 2>&1 | FileCheck %s --check-prefixes=PRE,POSTNOOPT
+; RUN: opt -stats -disable-output -O3 < %s 2>&1 | FileCheck %s --check-prefixes=PRE,POST
+; RUN: opt -stats -disable-output -passes='lto<O3>' < %s 2>&1 | FileCheck %s --check-prefixes=PRE,POST
+; RUN: opt -stats -disable-output -passes='lto-pre-link<Os>' < %s 2>&1 | FileCheck %s --check-prefixes=PRE,POST
+; RUN: opt -stats -disable-output -passes='lto-pre-link<O3>' < %s 2>&1 | FileCheck %s --check-prefixes=PRE,POST
+; RUN: opt -stats -disable-output -passes='thinlto<O3>' < %s 2>&1 | FileCheck %s --check-prefixes=PRE,POST
+; RUN: opt -stats -disable-output -passes='thinlto-pre-link<O2>' < %s 2>&1 | FileCheck %s --check-prefixes=PRE,POST
+
+; --- <pre-opt> ---
+; PRE-DAG: 4 instcount - Number of basic blocks (before optimizations)
+; PRE-DAG: 5 instcount - Number of instructions of all types (before optimizations)
+; PRE-DAG: 1 instcount - Number of CondBr insts (before optimizations)
+
+; --- No <pre-opt> in pass but no optimization passes run ---
+; POSTNOOPT-DAG: 4 instcount - Number of basic blocks
+; POSTNOOPT-DAG: 5 instcount - Number of instructions of all types
+; POSTNOOPT-DAG: 1 instcount - Number of CondBr insts
+
+; --- Post optimization values ---
+; POST-DAG: 1 instcount - Number of basic blocks
+; POST-DAG: 1 instcount - Number of instructions of all types
+; POST-NOT: instcount - Number of CondBr insts
+
+define i32 @test_count() {
+entry:
+ ; This branch is trivially resolvable
+ br i1 true, label %then, label %else
+
+then:
+ br label %end
+
+else:
+ br label %end
+
+end:
+ %phi = phi i32 [ 1, %then ], [ 2, %else ]
+ ret i32 %phi
+}
More information about the llvm-commits
mailing list