From 803dd6fe6bb493e34a8747dc286a88aa05f353e1 Mon Sep 17 00:00:00 2001 From: Hiroshi Yamauchi Date: Mon, 3 Feb 2020 12:22:03 -0800 Subject: [PATCH] [BFI] Add a debug check for unknown block queries. Summary: Add a debug check for frequency queries for unknown blocks (typically blocks that are created after BFI is computed but their frequencies are not communicated to BFI.) This is useful for detecting and debugging missed BFI updates. This is debug build only and disabled behind a flag. Reviewers: davidxl Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D73920 --- llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h | 12 ++++++++++++ llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp | 17 ++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h b/llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h index 1b8832a..4d80591 100644 --- a/llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h +++ b/llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h @@ -26,6 +26,7 @@ #include "llvm/IR/BasicBlock.h" #include "llvm/Support/BlockFrequency.h" #include "llvm/Support/BranchProbability.h" +#include "llvm/Support/CommandLine.h" #include "llvm/Support/DOTGraphTraits.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" @@ -46,6 +47,8 @@ #define DEBUG_TYPE "block-freq" +extern llvm::cl::opt CheckBFIUnknownBlockQueries; + namespace llvm { class BranchProbabilityInfo; @@ -1043,6 +1046,15 @@ void BlockFrequencyInfoImpl::calculate(const FunctionT &F, computeMassInFunction(); unwrapLoops(); finalizeMetrics(); + + if (CheckBFIUnknownBlockQueries) { + // To detect BFI queries for unknown blocks, add entries for unreachable + // blocks, if any. This is to distinguish between known/existing unreachable + // blocks and unknown blocks. + for (const BlockT &BB : F) + if (!Nodes.count(&BB)) + setBlockFreq(&BB, 0); + } } template diff --git a/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp b/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp index 0db6dd0..e4fda24 100644 --- a/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp +++ b/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp @@ -40,6 +40,12 @@ using namespace llvm::bfi_detail; #define DEBUG_TYPE "block-freq" +cl::opt CheckBFIUnknownBlockQueries( + "check-bfi-unknown-block-queries", + cl::init(false), cl::Hidden, + cl::desc("Check if block frequency is queried for an unknown block " + "for debugging missed BFI updates")); + ScaledNumber BlockMass::toScaled() const { if (isFull()) return ScaledNumber(1, 0); @@ -550,8 +556,17 @@ void BlockFrequencyInfoImplBase::finalizeMetrics() { BlockFrequency BlockFrequencyInfoImplBase::getBlockFreq(const BlockNode &Node) const { - if (!Node.isValid()) + if (!Node.isValid()) { +#ifndef NDEBUG + if (CheckBFIUnknownBlockQueries) { + SmallString<256> Msg; + raw_svector_ostream OS(Msg); + OS << "*** Detected BFI query for unknown block " << getBlockName(Node); + report_fatal_error(OS.str()); + } +#endif return 0; + } return Freqs[Node.Index].Integer; } -- 2.7.4