diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp index 4de527d9ef85e..67b9a61cc576f 100644 --- a/llvm/lib/Passes/PassBuilderPipelines.cpp +++ b/llvm/lib/Passes/PassBuilderPipelines.cpp @@ -21,6 +21,7 @@ #include "llvm/Analysis/CtxProfAnalysis.h" #include "llvm/Analysis/GlobalsModRef.h" #include "llvm/Analysis/InlineAdvisor.h" +#include "llvm/Analysis/InstCount.h" #include "llvm/Analysis/ProfileSummaryInfo.h" #include "llvm/Analysis/ScopedNoAliasAA.h" #include "llvm/Analysis/TypeBasedAliasAnalysis.h" @@ -411,6 +412,9 @@ void PassBuilder::invokePipelineEarlySimplificationEPCallbacks( // Helper to add AnnotationRemarksPass. static void addAnnotationRemarksPass(ModulePassManager &MPM) { MPM.addPass(createModuleToFunctionPassAdaptor(AnnotationRemarksPass())); + // Count the types of instructions used + if (AreStatisticsEnabled()) + MPM.addPass(createModuleToFunctionPassAdaptor(InstCountPass())); } // Helper to check if the current compilation phase is preparing for LTO @@ -2420,7 +2424,8 @@ PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level, if (isLTOPreLink(Phase)) addRequiredLTOPreLinkPasses(MPM); - MPM.addPass(createModuleToFunctionPassAdaptor(AnnotationRemarksPass())); + // Emit annotation remarks. + addAnnotationRemarksPass(MPM); return MPM; } diff --git a/llvm/test/Other/instcount.ll b/llvm/test/Other/instcount.ll new file mode 100644 index 0000000000000..931d547371958 --- /dev/null +++ b/llvm/test/Other/instcount.ll @@ -0,0 +1,69 @@ +; REQUIRES: asserts +; RUN: opt -stats -passes=instcount -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt -stats -passes='thinlto' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt -stats -passes='thinlto-pre-link' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt -stats -passes='lto' -disable-output < %s 2>&1 | FileCheck %s +; RUN: opt -stats -passes='lto-pre-link' -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: 8 instcount - Number of Br insts +; CHECK-DAG: 6 instcount - Number of Call insts +; CHECK-DAG: 2 instcount - Number of ICmp insts +; CHECK-DAG: 1 instcount - Number of Ret insts +; CHECK-DAG: 1 instcount - Number of Switch insts +; CHECK-DAG: 10 instcount - Number of basic blocks +; CHECK-DAG: 1 instcount - Number of non-external functions +; CHECK-DAG: 18 instcount - Number of instructions (of all types) + + +define void @foo(i32 %i, i32 %j, i32 %n) { +entry: + %cmp = icmp slt i32 %i, %j + br i1 %cmp, label %if.then, label %if.end + +if.then: + call void @f() + br label %if.end + +if.end: + switch i32 %i, label %sw.default [ + i32 1, label %sw.bb + i32 2, label %sw.bb1 + i32 3, label %sw.bb1 + ] + +sw.bb: + call void @g() + br label %sw.epilog + +sw.bb1: + call void @h() + br label %sw.epilog + +sw.default: + call void @k() + br label %sw.epilog + +sw.epilog: + %cmp2 = icmp sgt i32 %i, %n + br i1 %cmp2, label %if.then3, label %if.else + +if.then3: + call void @l() + br label %if.end4 + +if.else: + call void @m() + br label %if.end4 + +if.end4: + ret void +} + +declare void @f() +declare void @g() +declare void @h() +declare void @k() +declare void @l() +declare void @m()