From 2d55115aae165c16027e6c563de9e0486d3980de Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 10 Oct 2025 12:55:01 +0200 Subject: [PATCH 1/2] [DebugCounter] Add -print-debug-counter-queries option Add a `-print-debug-counter-queries` option which prints the current value of the counter and whether it is executed/skipped each time it is queried. This is useful when interleaving the output with the usual transform debug output, in order to find the correct counter value to use to hit a specific point in the transform. --- llvm/include/llvm/Support/DebugCounter.h | 3 ++ llvm/lib/Support/DebugCounter.cpp | 56 +++++++++++++++--------- llvm/test/Other/debugcounter-dce.ll | 10 ++++- 3 files changed, 48 insertions(+), 21 deletions(-) diff --git a/llvm/include/llvm/Support/DebugCounter.h b/llvm/include/llvm/Support/DebugCounter.h index 48fc60035b189..1b30efa740298 100644 --- a/llvm/include/llvm/Support/DebugCounter.h +++ b/llvm/include/llvm/Support/DebugCounter.h @@ -178,6 +178,7 @@ class DebugCounter { std::string Desc; SmallVector Chunks; }; + LLVM_ABI bool handleCounterIncrement(CounterInfo &Info); DenseMap Counters; CounterVector RegisteredCounters; @@ -188,6 +189,8 @@ class DebugCounter { bool ShouldPrintCounter = false; + bool ShouldPrintCounterQueries = false; + bool BreakOnLast = false; }; diff --git a/llvm/lib/Support/DebugCounter.cpp b/llvm/lib/Support/DebugCounter.cpp index 6b65720440f30..5ab1def43313b 100644 --- a/llvm/lib/Support/DebugCounter.cpp +++ b/llvm/lib/Support/DebugCounter.cpp @@ -136,6 +136,13 @@ struct DebugCounterOwner : DebugCounter { cl::location(this->ShouldPrintCounter), cl::init(false), cl::desc("Print out debug counter info after all counters accumulated")}; + cl::opt PrintDebugCounterQueries{ + "print-debug-counter-queries", + cl::Hidden, + cl::Optional, + cl::location(this->ShouldPrintCounterQueries), + cl::init(false), + cl::desc("Print out each query of an enabled debug counter")}; cl::opt BreakOnLastCount{ "debug-counter-break-on-last", cl::Hidden, @@ -221,31 +228,40 @@ void DebugCounter::print(raw_ostream &OS) const { } } +bool DebugCounter::handleCounterIncrement(CounterInfo &Info) { + int64_t CurrCount = Info.Count++; + uint64_t CurrIdx = Info.CurrChunkIdx; + + if (Info.Chunks.empty()) + return true; + if (CurrIdx >= Info.Chunks.size()) + return false; + + bool Res = Info.Chunks[CurrIdx].contains(CurrCount); + if (BreakOnLast && CurrIdx == (Info.Chunks.size() - 1) && + CurrCount == Info.Chunks[CurrIdx].End) { + LLVM_BUILTIN_DEBUGTRAP; + } + if (CurrCount > Info.Chunks[CurrIdx].End) { + Info.CurrChunkIdx++; + + /// Handle consecutive blocks. + if (Info.CurrChunkIdx < Info.Chunks.size() && + CurrCount == Info.Chunks[Info.CurrChunkIdx].Begin) + return true; + } + return Res; +} + bool DebugCounter::shouldExecuteImpl(unsigned CounterName) { auto &Us = instance(); auto Result = Us.Counters.find(CounterName); if (Result != Us.Counters.end()) { auto &CounterInfo = Result->second; - int64_t CurrCount = CounterInfo.Count++; - uint64_t CurrIdx = CounterInfo.CurrChunkIdx; - - if (CounterInfo.Chunks.empty()) - return true; - if (CurrIdx >= CounterInfo.Chunks.size()) - return false; - - bool Res = CounterInfo.Chunks[CurrIdx].contains(CurrCount); - if (Us.BreakOnLast && CurrIdx == (CounterInfo.Chunks.size() - 1) && - CurrCount == CounterInfo.Chunks[CurrIdx].End) { - LLVM_BUILTIN_DEBUGTRAP; - } - if (CurrCount > CounterInfo.Chunks[CurrIdx].End) { - CounterInfo.CurrChunkIdx++; - - /// Handle consecutive blocks. - if (CounterInfo.CurrChunkIdx < CounterInfo.Chunks.size() && - CurrCount == CounterInfo.Chunks[CounterInfo.CurrChunkIdx].Begin) - return true; + bool Res = Us.handleCounterIncrement(CounterInfo); + if (Us.ShouldPrintCounterQueries && CounterInfo.IsSet) { + dbgs() << "DebugCounter " << Us.RegisteredCounters[CounterName] << "=" + << (CounterInfo.Count - 1) << (Res ? " execute" : " skip") << "\n"; } return Res; } diff --git a/llvm/test/Other/debugcounter-dce.ll b/llvm/test/Other/debugcounter-dce.ll index 54d929f219aef..3b1dfb453593a 100644 --- a/llvm/test/Other/debugcounter-dce.ll +++ b/llvm/test/Other/debugcounter-dce.ll @@ -1,8 +1,16 @@ ; REQUIRES: asserts -; RUN: opt -passes=dce -S -debug-counter=dce-transform=1-2 < %s | FileCheck %s +; RUN: opt -passes=dce -S -debug-counter=dce-transform=1-2 < %s | FileCheck %s --check-prefixes=CHECK,NO-PRINT +; RUN: opt -passes=dce -S -debug-counter=dce-transform=1-2 -print-debug-counter-queries < %s 2>&1 | FileCheck %s --check-prefixes=CHECK,PRINT ;; Test that, with debug counters on, we will skip the first DCE opportunity, perform next 2, ;; and ignore all the others left. +; NO-PRINT-NOT: DebugCounter +; PRINT: DebugCounter dce-transform=0 skip +; PRINT-NEXT: DebugCounter dce-transform=1 execute +; PRINT-NEXT: DebugCounter dce-transform=2 execute +; PRINT-NEXT: DebugCounter dce-transform=3 skip +; PRINT-NEXT: DebugCounter dce-transform=4 skip + ; CHECK-LABEL: @test ; CHECK-NEXT: %add1 = add i32 1, 2 ; CHECK-NEXT: %sub1 = sub i32 %add1, 1 From f7bfbab248627b5e1db0cb6fc17d615a8deaeabc Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 13 Oct 2025 10:14:12 +0200 Subject: [PATCH 2/2] Drop LLVM_ABI --- llvm/include/llvm/Support/DebugCounter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/include/llvm/Support/DebugCounter.h b/llvm/include/llvm/Support/DebugCounter.h index 1b30efa740298..39a08d499b67e 100644 --- a/llvm/include/llvm/Support/DebugCounter.h +++ b/llvm/include/llvm/Support/DebugCounter.h @@ -178,7 +178,7 @@ class DebugCounter { std::string Desc; SmallVector Chunks; }; - LLVM_ABI bool handleCounterIncrement(CounterInfo &Info); + bool handleCounterIncrement(CounterInfo &Info); DenseMap Counters; CounterVector RegisteredCounters;