[llvm] [LLVM] Successor count added to InstCount (PR #171670)

IƱaki V Arrechea via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 2 10:09:54 PST 2026


https://github.com/InakiVA updated https://github.com/llvm/llvm-project/pull/171670

>From 33666b5b6a92e0bf32aad1e1d917da1e4445ab7f Mon Sep 17 00:00:00 2001
From: Inaki Arrechea <inakiarrechea at google.com>
Date: Thu, 18 Dec 2025 18:18:07 +0000
Subject: [PATCH 1/9] Format correction and return of InstCount

---
 .../Analysis/FunctionPropertiesAnalysis.h     | 11 +++
 .../Analysis/FunctionPropertiesAnalysis.cpp   | 51 +++++++++++++-
 llvm/lib/Passes/PassBuilderPipelines.cpp      |  5 +-
 llvm/lib/Passes/PassRegistry.def              |  1 +
 llvm/test/Other/functionpropertiesanalysis.ll | 69 +++++++++++++++++++
 llvm/test/Other/instcount.ll                  |  2 +-
 6 files changed, 135 insertions(+), 4 deletions(-)
 create mode 100644 llvm/test/Other/functionpropertiesanalysis.ll

diff --git a/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h b/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
index 3dc241c0124e4..a2923f74805da 100644
--- a/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
+++ b/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
@@ -127,6 +127,11 @@ class FunctionPropertiesInfo {
   int64_t CriticalEdgeCount = 0;
   int64_t ControlFlowEdgeCount = 0;
   int64_t UnconditionalBranchCount = 0;
+  int64_t ConditionalBranchCount = 0;
+  int64_t BranchInstructionCount = 0;
+  int64_t BranchSuccessorCount = 0;
+  int64_t SwitchInstructionCount = 0;
+  int64_t SwitchSuccessorCount = 0;
 
   // Call related instructions
   int64_t IntrinsicCount = 0;
@@ -179,6 +184,12 @@ class FunctionPropertiesPrinterPass
   static bool isRequired() { return true; }
 };
 
+/// Statistics pass for the FunctionPropertiesAnalysis results.
+struct FunctionPropertiesStatisticsPass
+    : PassInfoMixin<FunctionPropertiesStatisticsPass> {
+  PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
+};
+
 /// Correctly update FunctionPropertiesInfo post-inlining. A
 /// FunctionPropertiesUpdater keeps the state necessary for tracking the changes
 /// llvm::InlineFunction makes. The idea is that inlining will at most modify
diff --git a/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp b/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
index c52a6de2bb71e..d70814c639d48 100644
--- a/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
+++ b/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
@@ -14,6 +14,7 @@
 #include "llvm/Analysis/FunctionPropertiesAnalysis.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SetVector.h"
+#include "llvm/ADT/Statistic.h"
 #include "llvm/Analysis/LoopInfo.h"
 #include "llvm/IR/CFG.h"
 #include "llvm/IR/Constants.h"
@@ -26,6 +27,19 @@
 
 using namespace llvm;
 
+#define DEBUG_TYPE "statscount"
+
+STATISTIC(TotalBlocks, "Number of basic blocks");
+STATISTIC(TotalInsts, "Number of instructions (of all types)");
+STATISTIC(TotalSuccs, "Number of basic block successors");
+STATISTIC(TotalUncondBranchInsts,
+          "Number of unconditional branch instructions");
+STATISTIC(TotalCondBranchInsts, "Number of conditional branch instructions");
+STATISTIC(TotalBranchInsts, "Number of branch instructions");
+STATISTIC(TotalBranchSuccs, "Number of branch successors");
+STATISTIC(TotalSwitchInsts, "Number of switch instructions");
+STATISTIC(TotalSwitchSuccs, "Number of switch successors");
+
 namespace llvm {
 LLVM_ABI cl::opt<bool> EnableDetailedFunctionProperties(
     "enable-detailed-function-properties", cl::Hidden, cl::init(false),
@@ -124,9 +138,19 @@ void FunctionPropertiesInfo::updateForBB(const BasicBlock &BB,
 
     ControlFlowEdgeCount += Direction * SuccessorCount;
 
-    if (const auto *BI = dyn_cast<BranchInst>(BB.getTerminator())) {
-      if (!BI->isConditional())
+    const Instruction *TI = BB.getTerminator();
+    const int64_t InstructionSuccessorCount = TI->getNumSuccessors();
+    if (isa<BranchInst>(TI)) {
+      BranchInstructionCount += Direction;
+      BranchSuccessorCount += Direction * InstructionSuccessorCount;
+      const auto *BI = dyn_cast<BranchInst>(TI);
+      if (BI->isConditional())
+        ConditionalBranchCount += Direction;
+      else
         UnconditionalBranchCount += Direction;
+    } else if (isa<SwitchInst>(TI)) {
+      SwitchInstructionCount += Direction;
+      SwitchSuccessorCount += Direction * InstructionSuccessorCount;
     }
 
     for (const Instruction &I : BB.instructionsWithoutDebug()) {
@@ -362,6 +386,11 @@ void FunctionPropertiesInfo::print(raw_ostream &OS) const {
     PRINT_PROPERTY(CriticalEdgeCount)
     PRINT_PROPERTY(ControlFlowEdgeCount)
     PRINT_PROPERTY(UnconditionalBranchCount)
+    PRINT_PROPERTY(ConditionalBranchCount)
+    PRINT_PROPERTY(BranchInstructionCount)
+    PRINT_PROPERTY(BranchSuccessorCount)
+    PRINT_PROPERTY(SwitchInstructionCount)
+    PRINT_PROPERTY(SwitchSuccessorCount)
     PRINT_PROPERTY(IntrinsicCount)
     PRINT_PROPERTY(DirectCallCount)
     PRINT_PROPERTY(IndirectCallCount)
@@ -396,6 +425,24 @@ FunctionPropertiesPrinterPass::run(Function &F, FunctionAnalysisManager &AM) {
   return PreservedAnalyses::all();
 }
 
+PreservedAnalyses
+FunctionPropertiesStatisticsPass::run(Function &F,
+                                      FunctionAnalysisManager &AM) {
+  LLVM_DEBUG(dbgs() << "STATSCOUNT: running on function " << F.getName()
+                    << "\n");
+  auto &AnalysisResults = AM.getResult<FunctionPropertiesAnalysis>(F);
+  TotalBlocks += AnalysisResults.BasicBlockCount;
+  TotalInsts += AnalysisResults.TotalInstructionCount;
+  TotalSuccs += AnalysisResults.ControlFlowEdgeCount;
+  TotalUncondBranchInsts += AnalysisResults.UnconditionalBranchCount;
+  TotalCondBranchInsts += AnalysisResults.ConditionalBranchCount;
+  TotalBranchInsts += AnalysisResults.BranchInstructionCount;
+  TotalBranchSuccs += AnalysisResults.BranchSuccessorCount;
+  TotalSwitchInsts += AnalysisResults.SwitchInstructionCount;
+  TotalSwitchSuccs += AnalysisResults.SwitchSuccessorCount;
+  return PreservedAnalyses::all();
+}
+
 FunctionPropertiesUpdater::FunctionPropertiesUpdater(
     FunctionPropertiesInfo &FPI, CallBase &CB)
     : FPI(FPI), CallSiteBB(*CB.getParent()), Caller(*CallSiteBB.getParent()) {
diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp
index 67b9a61cc576f..c50b424ce9c5d 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -19,6 +19,7 @@
 #include "llvm/Analysis/BasicAliasAnalysis.h"
 #include "llvm/Analysis/CGSCCPassManager.h"
 #include "llvm/Analysis/CtxProfAnalysis.h"
+#include "llvm/Analysis/FunctionPropertiesAnalysis.h"
 #include "llvm/Analysis/GlobalsModRef.h"
 #include "llvm/Analysis/InlineAdvisor.h"
 #include "llvm/Analysis/InstCount.h"
@@ -413,8 +414,10 @@ void PassBuilder::invokePipelineEarlySimplificationEPCallbacks(
 static void addAnnotationRemarksPass(ModulePassManager &MPM) {
   MPM.addPass(createModuleToFunctionPassAdaptor(AnnotationRemarksPass()));
   // Count the types of instructions used
-  if (AreStatisticsEnabled())
+  if (AreStatisticsEnabled()) {
     MPM.addPass(createModuleToFunctionPassAdaptor(InstCountPass()));
+    MPM.addPass(createModuleToFunctionPassAdaptor(FunctionPropertiesStatisticsPass()));
+  }    
 }
 
 // Helper to check if the current compilation phase is preparing for LTO
diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def
index daf6b3d6dbd28..55f1c309aaa95 100644
--- a/llvm/lib/Passes/PassRegistry.def
+++ b/llvm/lib/Passes/PassRegistry.def
@@ -542,6 +542,7 @@ FUNCTION_PASS("sjlj-eh-prepare", SjLjEHPreparePass(TM))
 FUNCTION_PASS("slp-vectorizer", SLPVectorizerPass())
 FUNCTION_PASS("slsr", StraightLineStrengthReducePass())
 FUNCTION_PASS("stack-protector", StackProtectorPass(*TM))
+FUNCTION_PASS("statscount", FunctionPropertiesStatisticsPass())
 FUNCTION_PASS("strip-gc-relocates", StripGCRelocates())
 FUNCTION_PASS("tailcallelim", TailCallElimPass())
 FUNCTION_PASS("transform-warning", WarnMissedTransformationsPass())
diff --git a/llvm/test/Other/functionpropertiesanalysis.ll b/llvm/test/Other/functionpropertiesanalysis.ll
new file mode 100644
index 0000000000000..54f1363e8fa83
--- /dev/null
+++ b/llvm/test/Other/functionpropertiesanalysis.ll
@@ -0,0 +1,69 @@
+; REQUIRES asserts
+; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes=statscount < %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 -passes='default<O3>' < %s 2>&1 | FileCheck %s
+; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes='default<O0>' < %s 2>&1 | FileCheck %s
+
+; CHECK-DAG: 10 statscount - Number of basic blocks
+; CHECK-DAG: 8 statscount - Number of branch instructions
+; CHECK-DAG: 10 statscount - Number of branch successors
+; CHECK-DAG: 2 statscount - Number of conditional branch instructions
+; CHECK-DAG: 18 statscount - Number of instructions (of all types)
+; CHECK-DAG: 14 statscount - Number of basic block successors
+; CHECK-DAG: 1 statscount - Number of switch instructions
+; CHECK-DAG: 4 statscount - Number of switch successors
+; CHECK-DAG: 6 statscount - Number of unconditional branch instructions
+
+
+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()
\ No newline at end of file
diff --git a/llvm/test/Other/instcount.ll b/llvm/test/Other/instcount.ll
index 931d547371958..c9dab9e93cfb7 100644
--- a/llvm/test/Other/instcount.ll
+++ b/llvm/test/Other/instcount.ll
@@ -66,4 +66,4 @@ declare void @g()
 declare void @h()
 declare void @k()
 declare void @l()
-declare void @m()
+declare void @m()
\ No newline at end of file

>From cfe6a41d9bc80f827ee0bf7907859d6bef015891 Mon Sep 17 00:00:00 2001
From: Inaki Arrechea <inakiarrechea at google.com>
Date: Thu, 18 Dec 2025 18:48:38 +0000
Subject: [PATCH 2/9] Clang format

---
 llvm/lib/Passes/PassBuilderPipelines.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp
index c50b424ce9c5d..7bb66600ab5e0 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -416,7 +416,8 @@ static void addAnnotationRemarksPass(ModulePassManager &MPM) {
   // Count the types of instructions used
   if (AreStatisticsEnabled()) {
     MPM.addPass(createModuleToFunctionPassAdaptor(InstCountPass()));
-    MPM.addPass(createModuleToFunctionPassAdaptor(FunctionPropertiesStatisticsPass()));
+    MPM.addPass(
+      createModuleToFunctionPassAdaptor(FunctionPropertiesStatisticsPass()));
   }    
 }
 

>From 8fad9c05459226b994292c4640d42a12b072e2bd Mon Sep 17 00:00:00 2001
From: Inaki Arrechea <inakiarrechea at google.com>
Date: Thu, 18 Dec 2025 18:55:58 +0000
Subject: [PATCH 3/9] Clang format again

---
 llvm/lib/Passes/PassBuilderPipelines.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp
index 7bb66600ab5e0..80497f5d7ca4e 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -413,7 +413,7 @@ void PassBuilder::invokePipelineEarlySimplificationEPCallbacks(
 // Helper to add AnnotationRemarksPass.
 static void addAnnotationRemarksPass(ModulePassManager &MPM) {
   MPM.addPass(createModuleToFunctionPassAdaptor(AnnotationRemarksPass()));
-  // Count the types of instructions used
+  // Count the types of instructions used in a module if statistics are enabled.
   if (AreStatisticsEnabled()) {
     MPM.addPass(createModuleToFunctionPassAdaptor(InstCountPass()));
     MPM.addPass(

>From 0d1c334c163c733f57f6e00b8b77b059bd93b8b8 Mon Sep 17 00:00:00 2001
From: Inaki Arrechea <inakiarrechea at google.com>
Date: Thu, 18 Dec 2025 18:59:11 +0000
Subject: [PATCH 4/9] Clang format again and again

---
 llvm/lib/Passes/PassBuilderPipelines.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp
index 80497f5d7ca4e..35300413e8ad2 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -417,7 +417,7 @@ static void addAnnotationRemarksPass(ModulePassManager &MPM) {
   if (AreStatisticsEnabled()) {
     MPM.addPass(createModuleToFunctionPassAdaptor(InstCountPass()));
     MPM.addPass(
-      createModuleToFunctionPassAdaptor(FunctionPropertiesStatisticsPass()));
+        createModuleToFunctionPassAdaptor(FunctionPropertiesStatisticsPass()));
   }    
 }
 

>From 0f36c80469a06c73feddd8d485555947bef862d2 Mon Sep 17 00:00:00 2001
From: Inaki Arrechea <inakiarrechea at google.com>
Date: Thu, 18 Dec 2025 19:01:57 +0000
Subject: [PATCH 5/9] Clang format again and again }

---
 llvm/lib/Passes/PassBuilderPipelines.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp
index 35300413e8ad2..89178f678a369 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -418,7 +418,7 @@ static void addAnnotationRemarksPass(ModulePassManager &MPM) {
     MPM.addPass(createModuleToFunctionPassAdaptor(InstCountPass()));
     MPM.addPass(
         createModuleToFunctionPassAdaptor(FunctionPropertiesStatisticsPass()));
-  }    
+  }
 }
 
 // Helper to check if the current compilation phase is preparing for LTO

>From 1c00df2d10213b294a2438f7f02fb0e0bfac9dc9 Mon Sep 17 00:00:00 2001
From: Inaki Arrechea <inakiarrechea at google.com>
Date: Fri, 19 Dec 2025 23:03:53 +0000
Subject: [PATCH 6/9] func-properties-count name of stat

---
 .../Analysis/FunctionPropertiesAnalysis.cpp   |  2 +-
 llvm/lib/Passes/PassRegistry.def              |  2 +-
 llvm/test/Other/functionpropertiesanalysis.ll | 24 +++++++++----------
 3 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp b/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
index d70814c639d48..e6c4b56c5cb04 100644
--- a/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
+++ b/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
@@ -27,7 +27,7 @@
 
 using namespace llvm;
 
-#define DEBUG_TYPE "statscount"
+#define DEBUG_TYPE "func-properties-count"
 
 STATISTIC(TotalBlocks, "Number of basic blocks");
 STATISTIC(TotalInsts, "Number of instructions (of all types)");
diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def
index 55f1c309aaa95..520d95ec30e83 100644
--- a/llvm/lib/Passes/PassRegistry.def
+++ b/llvm/lib/Passes/PassRegistry.def
@@ -441,6 +441,7 @@ FUNCTION_PASS("fix-irreducible", FixIrreduciblePass())
 FUNCTION_PASS("flatten-cfg", FlattenCFGPass())
 FUNCTION_PASS("float2int", Float2IntPass())
 FUNCTION_PASS("free-machine-function", FreeMachineFunctionPass())
+FUNCTION_PASS("func-properties-count", FunctionPropertiesStatisticsPass())
 FUNCTION_PASS("gc-lowering", GCLoweringPass())
 FUNCTION_PASS("guard-widening", GuardWideningPass())
 FUNCTION_PASS("gvn-hoist", GVNHoistPass())
@@ -542,7 +543,6 @@ FUNCTION_PASS("sjlj-eh-prepare", SjLjEHPreparePass(TM))
 FUNCTION_PASS("slp-vectorizer", SLPVectorizerPass())
 FUNCTION_PASS("slsr", StraightLineStrengthReducePass())
 FUNCTION_PASS("stack-protector", StackProtectorPass(*TM))
-FUNCTION_PASS("statscount", FunctionPropertiesStatisticsPass())
 FUNCTION_PASS("strip-gc-relocates", StripGCRelocates())
 FUNCTION_PASS("tailcallelim", TailCallElimPass())
 FUNCTION_PASS("transform-warning", WarnMissedTransformationsPass())
diff --git a/llvm/test/Other/functionpropertiesanalysis.ll b/llvm/test/Other/functionpropertiesanalysis.ll
index 54f1363e8fa83..9e1cc948e54f4 100644
--- a/llvm/test/Other/functionpropertiesanalysis.ll
+++ b/llvm/test/Other/functionpropertiesanalysis.ll
@@ -1,20 +1,20 @@
 ; REQUIRES asserts
-; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes=statscount < %s 2>&1 | FileCheck %s
+; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes=func-properties-count < %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 -passes='default<O3>' < %s 2>&1 | FileCheck %s
-; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes='default<O0>' < %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 statscount - Number of basic blocks
-; CHECK-DAG: 8 statscount - Number of branch instructions
-; CHECK-DAG: 10 statscount - Number of branch successors
-; CHECK-DAG: 2 statscount - Number of conditional branch instructions
-; CHECK-DAG: 18 statscount - Number of instructions (of all types)
-; CHECK-DAG: 14 statscount - Number of basic block successors
-; CHECK-DAG: 1 statscount - Number of switch instructions
-; CHECK-DAG: 4 statscount - Number of switch successors
-; CHECK-DAG: 6 statscount - Number of unconditional branch instructions
+; CHECK-DAG: 10 func-properties-count - Number of basic blocks
+; CHECK-DAG: 8 func-properties-count - Number of branch instructions
+; CHECK-DAG: 10 func-properties-count - Number of branch successors
+; CHECK-DAG: 2 func-properties-count - Number of conditional branch instructions
+; CHECK-DAG: 18 func-properties-count - Number of instructions (of all types)
+; CHECK-DAG: 14 func-properties-count - Number of basic block successors
+; CHECK-DAG: 1 func-properties-count - Number of switch instructions
+; CHECK-DAG: 4 func-properties-count - Number of switch successors
+; CHECK-DAG: 6 func-properties-count - Number of unconditional branch instructions
 
 
 define void @foo(i32 %i, i32 %j, i32 %n) {

>From deaf0210211ab0ddcd68ee8867c5435d0752d9e8 Mon Sep 17 00:00:00 2001
From: Inaki Arrechea <inakiarrechea at google.com>
Date: Fri, 26 Dec 2025 17:54:11 +0000
Subject: [PATCH 7/9] Updated colon

---
 .../Analysis/FunctionPropertiesAnalysis.h     |  2 +-
 .../Analysis/FunctionPropertiesAnalysis.cpp   |  6 ++---
 llvm/lib/Passes/PassBuilderPipelines.cpp      |  2 +-
 llvm/lib/Passes/PassRegistry.def              |  2 +-
 llvm/test/Other/functionpropertiesanalysis.ll | 25 ++++++++++---------
 llvm/test/Other/instcount.ll                  |  2 +-
 6 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h b/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
index a2923f74805da..1619671d8f7dc 100644
--- a/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
+++ b/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
@@ -187,7 +187,7 @@ class FunctionPropertiesPrinterPass
 /// Statistics pass for the FunctionPropertiesAnalysis results.
 struct FunctionPropertiesStatisticsPass
     : PassInfoMixin<FunctionPropertiesStatisticsPass> {
-  PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
+  PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
 };
 
 /// Correctly update FunctionPropertiesInfo post-inlining. A
diff --git a/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp b/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
index e6c4b56c5cb04..8dcda876a1202 100644
--- a/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
+++ b/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
@@ -27,7 +27,7 @@
 
 using namespace llvm;
 
-#define DEBUG_TYPE "func-properties-count"
+#define DEBUG_TYPE "func-properties-stats"
 
 STATISTIC(TotalBlocks, "Number of basic blocks");
 STATISTIC(TotalInsts, "Number of instructions (of all types)");
@@ -427,10 +427,10 @@ FunctionPropertiesPrinterPass::run(Function &F, FunctionAnalysisManager &AM) {
 
 PreservedAnalyses
 FunctionPropertiesStatisticsPass::run(Function &F,
-                                      FunctionAnalysisManager &AM) {
+                                      FunctionAnalysisManager &FAM) {
   LLVM_DEBUG(dbgs() << "STATSCOUNT: running on function " << F.getName()
                     << "\n");
-  auto &AnalysisResults = AM.getResult<FunctionPropertiesAnalysis>(F);
+  auto &AnalysisResults = FAM.getResult<FunctionPropertiesAnalysis>(F);
   TotalBlocks += AnalysisResults.BasicBlockCount;
   TotalInsts += AnalysisResults.TotalInstructionCount;
   TotalSuccs += AnalysisResults.ControlFlowEdgeCount;
diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp
index 89178f678a369..555d96838d758 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -413,7 +413,7 @@ void PassBuilder::invokePipelineEarlySimplificationEPCallbacks(
 // Helper to add AnnotationRemarksPass.
 static void addAnnotationRemarksPass(ModulePassManager &MPM) {
   MPM.addPass(createModuleToFunctionPassAdaptor(AnnotationRemarksPass()));
-  // Count the types of instructions used in a module if statistics are enabled.
+  // Count the stats for InstCount and FunctionPropertiesAnalysis
   if (AreStatisticsEnabled()) {
     MPM.addPass(createModuleToFunctionPassAdaptor(InstCountPass()));
     MPM.addPass(
diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def
index 520d95ec30e83..2cfb5b2592601 100644
--- a/llvm/lib/Passes/PassRegistry.def
+++ b/llvm/lib/Passes/PassRegistry.def
@@ -441,7 +441,7 @@ FUNCTION_PASS("fix-irreducible", FixIrreduciblePass())
 FUNCTION_PASS("flatten-cfg", FlattenCFGPass())
 FUNCTION_PASS("float2int", Float2IntPass())
 FUNCTION_PASS("free-machine-function", FreeMachineFunctionPass())
-FUNCTION_PASS("func-properties-count", FunctionPropertiesStatisticsPass())
+FUNCTION_PASS("func-properties-stats", FunctionPropertiesStatisticsPass())
 FUNCTION_PASS("gc-lowering", GCLoweringPass())
 FUNCTION_PASS("guard-widening", GuardWideningPass())
 FUNCTION_PASS("gvn-hoist", GVNHoistPass())
diff --git a/llvm/test/Other/functionpropertiesanalysis.ll b/llvm/test/Other/functionpropertiesanalysis.ll
index 9e1cc948e54f4..e7a526b385e44 100644
--- a/llvm/test/Other/functionpropertiesanalysis.ll
+++ b/llvm/test/Other/functionpropertiesanalysis.ll
@@ -1,20 +1,21 @@
-; REQUIRES asserts
-; RUN: opt -stats -enable-detailed-function-properties -disable-output -passes=func-properties-count < %s 2>&1 | FileCheck %s
+; 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-count - Number of basic blocks
-; CHECK-DAG: 8 func-properties-count - Number of branch instructions
-; CHECK-DAG: 10 func-properties-count - Number of branch successors
-; CHECK-DAG: 2 func-properties-count - Number of conditional branch instructions
-; CHECK-DAG: 18 func-properties-count - Number of instructions (of all types)
-; CHECK-DAG: 14 func-properties-count - Number of basic block successors
-; CHECK-DAG: 1 func-properties-count - Number of switch instructions
-; CHECK-DAG: 4 func-properties-count - Number of switch successors
-; CHECK-DAG: 6 func-properties-count - Number of unconditional branch instructions
+; CHECK-DAG: 10 func-properties-stats - Number of basic blocks
+; CHECK-DAG: 8 func-properties-stats - Number of branch instructions
+; CHECK-DAG: 10 func-properties-stats - Number of branch successors
+; CHECK-DAG: 2 func-properties-stats - Number of conditional branch instructions
+; CHECK-DAG: 18 func-properties-stats - Number of instructions (of all types)
+; CHECK-DAG: 14 func-properties-stats - Number of basic block successors
+; CHECK-DAG: 1 func-properties-stats - Number of switch instructions
+; CHECK-DAG: 4 func-properties-stats - Number of switch successors
+; CHECK-DAG: 6 func-properties-stats - Number of unconditional branch instructions
 
 
 define void @foo(i32 %i, i32 %j, i32 %n) {
@@ -66,4 +67,4 @@ declare void @g()
 declare void @h()
 declare void @k()
 declare void @l()
-declare void @m()
\ No newline at end of file
+declare void @m()
diff --git a/llvm/test/Other/instcount.ll b/llvm/test/Other/instcount.ll
index c9dab9e93cfb7..931d547371958 100644
--- a/llvm/test/Other/instcount.ll
+++ b/llvm/test/Other/instcount.ll
@@ -66,4 +66,4 @@ declare void @g()
 declare void @h()
 declare void @k()
 declare void @l()
-declare void @m()
\ No newline at end of file
+declare void @m()

>From 9b042e50877f01ab80e6ab5bcf8ca877eb735336 Mon Sep 17 00:00:00 2001
From: Inaki Arrechea <inakiarrechea at google.com>
Date: Mon, 29 Dec 2025 20:59:27 +0000
Subject: [PATCH 8/9] Added macro with stats

---
 llvm/include/llvm/IR/FunctionProperties.def   | 35 +++++++++++++++++++
 .../Analysis/FunctionPropertiesAnalysis.cpp   | 34 ++++++------------
 2 files changed, 46 insertions(+), 23 deletions(-)
 create mode 100644 llvm/include/llvm/IR/FunctionProperties.def

diff --git a/llvm/include/llvm/IR/FunctionProperties.def b/llvm/include/llvm/IR/FunctionProperties.def
new file mode 100644
index 0000000000000..42ee4b280978a
--- /dev/null
+++ b/llvm/include/llvm/IR/FunctionProperties.def
@@ -0,0 +1,35 @@
+//===-- llvm/FunctionProperties.def - File that describes Function Properties -*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file contains descriptions of the various LLVM function properties.  This is
+// used as a central place for enumerating the different function properties and
+// should eventually be the place to put comments about the function properties.
+//
+//===----------------------------------------------------------------------===//
+
+// NOTE: NO INCLUDE GUARD DESIRED!
+
+// Provide definitions of macros so that users of this file do not have to
+// define everything to use it...
+//
+
+#ifndef FUNCTION_PROPERTY
+#define FUNCTION_PROPERTY(Name, Description)
+#endif
+
+FUNCTION_PROPERTY(BasicBlockCount, "Number of basic blocks")
+FUNCTION_PROPERTY(TotalInstructionCount, "Number of instructions (of all types)")
+FUNCTION_PROPERTY(ControlFlowEdgeCount, "Number of basic block successors")
+FUNCTION_PROPERTY(UnconditionalBranchCount, "Number of unconditional branch instructions")
+FUNCTION_PROPERTY(ConditionalBranchCount, "Number of conditional branch instructions")
+FUNCTION_PROPERTY(BranchInstructionCount, "Number of branch instructions")
+FUNCTION_PROPERTY(BranchSuccessorCount, "Number of branch successors")
+FUNCTION_PROPERTY(SwitchInstructionCount, "Number of switch instructions")
+FUNCTION_PROPERTY(SwitchSuccessorCount, "Number of switch successors")
+
+#undef FUNCTION_PROPERTY
diff --git a/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp b/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
index 8dcda876a1202..c9519ea5d186e 100644
--- a/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
+++ b/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
@@ -29,16 +29,9 @@ using namespace llvm;
 
 #define DEBUG_TYPE "func-properties-stats"
 
-STATISTIC(TotalBlocks, "Number of basic blocks");
-STATISTIC(TotalInsts, "Number of instructions (of all types)");
-STATISTIC(TotalSuccs, "Number of basic block successors");
-STATISTIC(TotalUncondBranchInsts,
-          "Number of unconditional branch instructions");
-STATISTIC(TotalCondBranchInsts, "Number of conditional branch instructions");
-STATISTIC(TotalBranchInsts, "Number of branch instructions");
-STATISTIC(TotalBranchSuccs, "Number of branch successors");
-STATISTIC(TotalSwitchInsts, "Number of switch instructions");
-STATISTIC(TotalSwitchSuccs, "Number of switch successors");
+#define FUNCTION_PROPERTY(Name, Description) \
+    STATISTIC(Total##Name, Description);
+#include "llvm/IR/FunctionProperties.def"
 
 namespace llvm {
 LLVM_ABI cl::opt<bool> EnableDetailedFunctionProperties(
@@ -426,20 +419,15 @@ FunctionPropertiesPrinterPass::run(Function &F, FunctionAnalysisManager &AM) {
 }
 
 PreservedAnalyses
-FunctionPropertiesStatisticsPass::run(Function &F,
-                                      FunctionAnalysisManager &FAM) {
-  LLVM_DEBUG(dbgs() << "STATSCOUNT: running on function " << F.getName()
-                    << "\n");
+FunctionPropertiesStatisticsPass::run(Function &F, FunctionAnalysisManager &FAM) {
+  LLVM_DEBUG(dbgs() << "STATSCOUNT: running on function " << F.getName() << "\n");
   auto &AnalysisResults = FAM.getResult<FunctionPropertiesAnalysis>(F);
-  TotalBlocks += AnalysisResults.BasicBlockCount;
-  TotalInsts += AnalysisResults.TotalInstructionCount;
-  TotalSuccs += AnalysisResults.ControlFlowEdgeCount;
-  TotalUncondBranchInsts += AnalysisResults.UnconditionalBranchCount;
-  TotalCondBranchInsts += AnalysisResults.ConditionalBranchCount;
-  TotalBranchInsts += AnalysisResults.BranchInstructionCount;
-  TotalBranchSuccs += AnalysisResults.BranchSuccessorCount;
-  TotalSwitchInsts += AnalysisResults.SwitchInstructionCount;
-  TotalSwitchSuccs += AnalysisResults.SwitchSuccessorCount;
+
+  // Use the macro to generate the summation lines
+  #define FUNCTION_PROPERTY(Name, Description) \
+      Total##Name += AnalysisResults.Name;
+  #include "llvm/IR/FunctionProperties.def"
+
   return PreservedAnalyses::all();
 }
 

>From f9cf953c39b174deefe9c9d03c14d1b84fc82509 Mon Sep 17 00:00:00 2001
From: Inaki Arrechea <inakiarrechea at google.com>
Date: Tue, 30 Dec 2025 20:46:28 +0000
Subject: [PATCH 9/9] Clang format

---
 llvm/include/llvm/IR/FunctionProperties.def   | 95 ++++++++++++++++---
 .../Analysis/FunctionPropertiesAnalysis.cpp   | 85 +++++------------
 llvm/test/Other/functionpropertiesanalysis.ll |  2 +-
 3 files changed, 108 insertions(+), 74 deletions(-)

diff --git a/llvm/include/llvm/IR/FunctionProperties.def b/llvm/include/llvm/IR/FunctionProperties.def
index 42ee4b280978a..63084632b79d1 100644
--- a/llvm/include/llvm/IR/FunctionProperties.def
+++ b/llvm/include/llvm/IR/FunctionProperties.def
@@ -1,4 +1,5 @@
-//===-- llvm/FunctionProperties.def - File that describes Function Properties -*- C++ -*-===//
+//===-- llvm/FunctionProperties.def - File that describes Function Properties
+//-*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -6,9 +7,10 @@
 //
 //===----------------------------------------------------------------------===//
 //
-// This file contains descriptions of the various LLVM function properties.  This is
-// used as a central place for enumerating the different function properties and
-// should eventually be the place to put comments about the function properties.
+// This file contains descriptions of the various LLVM function properties. This
+// is used as a central place for enumerating the different function properties
+// and should eventually be the place to put comments about the function
+// properties.
 //
 //===----------------------------------------------------------------------===//
 
@@ -18,18 +20,87 @@
 // define everything to use it...
 //
 
+// Basic/Standard Properties
 #ifndef FUNCTION_PROPERTY
 #define FUNCTION_PROPERTY(Name, Description)
 #endif
 
+// Detailed Properties (only processed if DETAILED_FUNCTION_PROPERTY is defined)
+#ifndef DETAILED_FUNCTION_PROPERTY
+#define DETAILED_FUNCTION_PROPERTY(Name, Description)
+#endif
+
 FUNCTION_PROPERTY(BasicBlockCount, "Number of basic blocks")
-FUNCTION_PROPERTY(TotalInstructionCount, "Number of instructions (of all types)")
-FUNCTION_PROPERTY(ControlFlowEdgeCount, "Number of basic block successors")
-FUNCTION_PROPERTY(UnconditionalBranchCount, "Number of unconditional branch instructions")
-FUNCTION_PROPERTY(ConditionalBranchCount, "Number of conditional branch instructions")
-FUNCTION_PROPERTY(BranchInstructionCount, "Number of branch instructions")
-FUNCTION_PROPERTY(BranchSuccessorCount, "Number of branch successors")
-FUNCTION_PROPERTY(SwitchInstructionCount, "Number of switch instructions")
-FUNCTION_PROPERTY(SwitchSuccessorCount, "Number of switch successors")
+FUNCTION_PROPERTY(BlocksReachedFromConditionalInstruction,
+                  "Number of blocks reached from a conditional instruction, or "
+                  "that are 'cases' of a SwitchInstr")
+FUNCTION_PROPERTY(Uses, "Number of uses of this function, plus 1 if the "
+                        "function is callable outside the module")
+FUNCTION_PROPERTY(DirectCallsToDefinedFunctions,
+                  "Number of direct calls made from this function to other "
+                  "functions defined in this module")
+FUNCTION_PROPERTY(LoadInstCount, "Load Instruction Count")
+FUNCTION_PROPERTY(StoreInstCount, "Store Instruction Count")
+FUNCTION_PROPERTY(MaxLoopDepth, "Maximum Loop Depth in the Function")
+FUNCTION_PROPERTY(TopLevelLoopCount,
+                  "Number of Top Level Loops in the Function")
+FUNCTION_PROPERTY(TotalInstructionCount,
+                  "Number of instructions (of all types)")
+DETAILED_FUNCTION_PROPERTY(BasicBlocksWithSingleSuccessor,
+                  "Basic blocks with one successors")
+DETAILED_FUNCTION_PROPERTY(BasicBlocksWithTwoSuccessors,
+                  "Basic blocks with two successors")
+DETAILED_FUNCTION_PROPERTY(BasicBlocksWithMoreThanTwoSuccessors,
+                  "Basic blocks with more than two successors")
+DETAILED_FUNCTION_PROPERTY(BasicBlocksWithSinglePredecessor,
+                  "Basic blocks with one predecessors")
+DETAILED_FUNCTION_PROPERTY(BasicBlocksWithTwoPredecessors,
+                  "Basic blocks with two predecessors")
+DETAILED_FUNCTION_PROPERTY(BasicBlocksWithMoreThanTwoPredecessors,
+                  "Basic blocks with more than two predecessors")
+DETAILED_FUNCTION_PROPERTY(BigBasicBlocks, "Number of big basic blocks")
+DETAILED_FUNCTION_PROPERTY(MediumBasicBlocks, "Number of medium basic blocks")
+DETAILED_FUNCTION_PROPERTY(SmallBasicBlocks, "Number of small basic blocks")
+DETAILED_FUNCTION_PROPERTY(CastInstructionCount,
+                  "The number of cast instructions inside the function")
+DETAILED_FUNCTION_PROPERTY(
+    FloatingPointInstructionCount,
+    "The number of floating point instructions inside the function")
+DETAILED_FUNCTION_PROPERTY(IntegerInstructionCount,
+                  "The number of integer instructions inside the function")
+DETAILED_FUNCTION_PROPERTY(ConstantIntOperandCount, "Constant Int Operand Count")
+DETAILED_FUNCTION_PROPERTY(ConstantFPOperandCount, "Constant FP Operand Count")
+DETAILED_FUNCTION_PROPERTY(ConstantOperandCount, "Constant Operand Count")
+DETAILED_FUNCTION_PROPERTY(InstructionOperandCount, "Instruction Operand Count")
+DETAILED_FUNCTION_PROPERTY(BasicBlockOperandCount, "Basic Block Operand Count")
+DETAILED_FUNCTION_PROPERTY(GlobalValueOperandCount, "Global Value Operand Count")
+DETAILED_FUNCTION_PROPERTY(InlineAsmOperandCount, "Inline Asm Operand Count")
+DETAILED_FUNCTION_PROPERTY(ArgumentOperandCount, "Argument Operand Count")
+DETAILED_FUNCTION_PROPERTY(UnknownOperandCount, "Unknown Operand Count")
+DETAILED_FUNCTION_PROPERTY(CriticalEdgeCount, "Critical Edge Count")
+DETAILED_FUNCTION_PROPERTY(ControlFlowEdgeCount, "Number of basic block successors")
+DETAILED_FUNCTION_PROPERTY(UnconditionalBranchCount,
+                  "Number of unconditional branch instructions")
+DETAILED_FUNCTION_PROPERTY(ConditionalBranchCount,
+                  "Number of conditional branch instructions")
+DETAILED_FUNCTION_PROPERTY(BranchInstructionCount, "Number of branch instructions")
+DETAILED_FUNCTION_PROPERTY(BranchSuccessorCount, "Number of branch successors")
+DETAILED_FUNCTION_PROPERTY(SwitchInstructionCount, "Number of switch instructions")
+DETAILED_FUNCTION_PROPERTY(SwitchSuccessorCount, "Number of switch successors")
+DETAILED_FUNCTION_PROPERTY(IntrinsicCount, "Intrinsic Count")
+DETAILED_FUNCTION_PROPERTY(DirectCallCount, "Direct Call Count")
+DETAILED_FUNCTION_PROPERTY(IndirectCallCount, "Indirect Call Count")
+DETAILED_FUNCTION_PROPERTY(CallReturnsIntegerCount, "Call Returns Integer Count")
+DETAILED_FUNCTION_PROPERTY(CallReturnsFloatCount, "Call Returns Float Count")
+DETAILED_FUNCTION_PROPERTY(CallReturnsPointerCount, "Call Returns Pointer Count")
+DETAILED_FUNCTION_PROPERTY(CallReturnsVectorIntCount, "Call Returns Vector Int Count")
+DETAILED_FUNCTION_PROPERTY(CallReturnsVectorFloatCount,
+                  "Call Returns Vector Float Count")
+DETAILED_FUNCTION_PROPERTY(CallReturnsVectorPointerCount,
+                  "Call Returns Vector Pointer Count")
+DETAILED_FUNCTION_PROPERTY(CallWithManyArgumentsCount, "Call With Many Arguments Count")
+DETAILED_FUNCTION_PROPERTY(CallWithPointerArgumentCount,
+                  "Call With Pointer Argument Count")
 
 #undef FUNCTION_PROPERTY
+#undef DETAILED_FUNCTION_PROPERTY
diff --git a/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp b/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
index c9519ea5d186e..c6fb6b3c738dd 100644
--- a/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
+++ b/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
@@ -29,8 +29,12 @@ using namespace llvm;
 
 #define DEBUG_TYPE "func-properties-stats"
 
-#define FUNCTION_PROPERTY(Name, Description) \
-    STATISTIC(Total##Name, Description);
+#define FUNCTION_PROPERTY(Name, Description)                                   \
+  STATISTIC(Total##Name, Description);
+#include "llvm/IR/FunctionProperties.def"
+
+#define DETAILED_FUNCTION_PROPERTY(Name, Description)                                   \
+  STATISTIC(Total##Name, Description);
 #include "llvm/IR/FunctionProperties.def"
 
 namespace llvm {
@@ -342,62 +346,17 @@ bool FunctionPropertiesInfo::operator==(
 }
 
 void FunctionPropertiesInfo::print(raw_ostream &OS) const {
-#define PRINT_PROPERTY(PROP_NAME) OS << #PROP_NAME ": " << PROP_NAME << "\n";
-
-  PRINT_PROPERTY(BasicBlockCount)
-  PRINT_PROPERTY(BlocksReachedFromConditionalInstruction)
-  PRINT_PROPERTY(Uses)
-  PRINT_PROPERTY(DirectCallsToDefinedFunctions)
-  PRINT_PROPERTY(LoadInstCount)
-  PRINT_PROPERTY(StoreInstCount)
-  PRINT_PROPERTY(MaxLoopDepth)
-  PRINT_PROPERTY(TopLevelLoopCount)
-  PRINT_PROPERTY(TotalInstructionCount)
+#define FUNCTION_PROPERTY(Name, Description) OS << #Name ": " << Name << "\n";
 
-  if (EnableDetailedFunctionProperties) {
-    PRINT_PROPERTY(BasicBlocksWithSingleSuccessor)
-    PRINT_PROPERTY(BasicBlocksWithTwoSuccessors)
-    PRINT_PROPERTY(BasicBlocksWithMoreThanTwoSuccessors)
-    PRINT_PROPERTY(BasicBlocksWithSinglePredecessor)
-    PRINT_PROPERTY(BasicBlocksWithTwoPredecessors)
-    PRINT_PROPERTY(BasicBlocksWithMoreThanTwoPredecessors)
-    PRINT_PROPERTY(BigBasicBlocks)
-    PRINT_PROPERTY(MediumBasicBlocks)
-    PRINT_PROPERTY(SmallBasicBlocks)
-    PRINT_PROPERTY(CastInstructionCount)
-    PRINT_PROPERTY(FloatingPointInstructionCount)
-    PRINT_PROPERTY(IntegerInstructionCount)
-    PRINT_PROPERTY(ConstantIntOperandCount)
-    PRINT_PROPERTY(ConstantFPOperandCount)
-    PRINT_PROPERTY(ConstantOperandCount)
-    PRINT_PROPERTY(InstructionOperandCount)
-    PRINT_PROPERTY(BasicBlockOperandCount)
-    PRINT_PROPERTY(GlobalValueOperandCount)
-    PRINT_PROPERTY(InlineAsmOperandCount)
-    PRINT_PROPERTY(ArgumentOperandCount)
-    PRINT_PROPERTY(UnknownOperandCount)
-    PRINT_PROPERTY(CriticalEdgeCount)
-    PRINT_PROPERTY(ControlFlowEdgeCount)
-    PRINT_PROPERTY(UnconditionalBranchCount)
-    PRINT_PROPERTY(ConditionalBranchCount)
-    PRINT_PROPERTY(BranchInstructionCount)
-    PRINT_PROPERTY(BranchSuccessorCount)
-    PRINT_PROPERTY(SwitchInstructionCount)
-    PRINT_PROPERTY(SwitchSuccessorCount)
-    PRINT_PROPERTY(IntrinsicCount)
-    PRINT_PROPERTY(DirectCallCount)
-    PRINT_PROPERTY(IndirectCallCount)
-    PRINT_PROPERTY(CallReturnsIntegerCount)
-    PRINT_PROPERTY(CallReturnsFloatCount)
-    PRINT_PROPERTY(CallReturnsPointerCount)
-    PRINT_PROPERTY(CallReturnsVectorIntCount)
-    PRINT_PROPERTY(CallReturnsVectorFloatCount)
-    PRINT_PROPERTY(CallReturnsVectorPointerCount)
-    PRINT_PROPERTY(CallWithManyArgumentsCount)
-    PRINT_PROPERTY(CallWithPointerArgumentCount)
+#define DETAILED_FUNCTION_PROPERTY(Name, Description)                          \
+  if (EnableDetailedFunctionProperties) {                                      \
+    OS << #Name ": " << Name << "\n";                                          \
   }
 
-#undef PRINT_PROPERTY
+#include "llvm/IR/FunctionProperties.def"
+
+#undef FUNCTION_PROPERTY
+#undef DETAILED_FUNCTION_PROPERTY
 
   OS << "\n";
 }
@@ -419,14 +378,18 @@ FunctionPropertiesPrinterPass::run(Function &F, FunctionAnalysisManager &AM) {
 }
 
 PreservedAnalyses
-FunctionPropertiesStatisticsPass::run(Function &F, FunctionAnalysisManager &FAM) {
-  LLVM_DEBUG(dbgs() << "STATSCOUNT: running on function " << F.getName() << "\n");
+FunctionPropertiesStatisticsPass::run(Function &F,
+                                      FunctionAnalysisManager &FAM) {
+  LLVM_DEBUG(dbgs() << "STATSCOUNT: running on function " << F.getName()
+                    << "\n");
   auto &AnalysisResults = FAM.getResult<FunctionPropertiesAnalysis>(F);
 
-  // Use the macro to generate the summation lines
-  #define FUNCTION_PROPERTY(Name, Description) \
-      Total##Name += AnalysisResults.Name;
-  #include "llvm/IR/FunctionProperties.def"
+#define FUNCTION_PROPERTY(Name, Description)                                   \
+  Total##Name += AnalysisResults.Name;
+#include "llvm/IR/FunctionProperties.def"
+#define DETAILED_FUNCTION_PROPERTY(Name, Description)                          \
+  Total##Name += AnalysisResults.Name;
+#include "llvm/IR/FunctionProperties.def"
 
   return PreservedAnalyses::all();
 }
diff --git a/llvm/test/Other/functionpropertiesanalysis.ll b/llvm/test/Other/functionpropertiesanalysis.ll
index e7a526b385e44..06da908d63974 100644
--- a/llvm/test/Other/functionpropertiesanalysis.ll
+++ b/llvm/test/Other/functionpropertiesanalysis.ll
@@ -11,11 +11,11 @@
 ; CHECK-DAG: 8 func-properties-stats - Number of branch instructions
 ; CHECK-DAG: 10 func-properties-stats - Number of branch successors
 ; CHECK-DAG: 2 func-properties-stats - Number of conditional branch instructions
+; CHECK-DAG: 6 func-properties-stats - Number of unconditional branch instructions
 ; CHECK-DAG: 18 func-properties-stats - Number of instructions (of all types)
 ; CHECK-DAG: 14 func-properties-stats - Number of basic block successors
 ; CHECK-DAG: 1 func-properties-stats - Number of switch instructions
 ; CHECK-DAG: 4 func-properties-stats - Number of switch successors
-; CHECK-DAG: 6 func-properties-stats - Number of unconditional branch instructions
 
 
 define void @foo(i32 %i, i32 %j, i32 %n) {



More information about the llvm-commits mailing list