diff --git a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp index 2dd0fde6b34d6..4642da0abdc13 100644 --- a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp +++ b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp @@ -99,6 +99,7 @@ #include "llvm/IR/ProfDataUtils.h" #include "llvm/Support/Casting.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/DebugCounter.h" #include "llvm/Support/Errc.h" #include "llvm/Support/Error.h" #include "llvm/Support/FileSystem.h" @@ -130,6 +131,8 @@ STATISTIC(NumUniqueRetVal, "Number of unique return value optimizations"); STATISTIC(NumVirtConstProp1Bit, "Number of 1 bit virtual constant propagations"); STATISTIC(NumVirtConstProp, "Number of virtual constant propagations"); +DEBUG_COUNTER(CallsToDevirt, "calls-to-devirt", + "Controls how many calls should be devirtualized."); namespace llvm { @@ -219,14 +222,6 @@ static cl::opt WholeProgramDevirtKeepUnreachableFunction( cl::desc("Regard unreachable functions as possible devirtualize targets."), cl::Hidden, cl::init(true)); -/// If explicitly specified, the devirt module pass will stop transformation -/// once the total number of devirtualizations reach the cutoff value. Setting -/// this option to 0 explicitly will do 0 devirtualization. -static cl::opt WholeProgramDevirtCutoff( - "wholeprogramdevirt-cutoff", - cl::desc("Max number of devirtualizations for devirt module pass"), - cl::init(0)); - /// Mechanism to add runtime checking of devirtualization decisions, optionally /// trapping or falling back to indirect call on any that are not correct. /// Trapping mode is useful for debugging undefined behavior leading to failures @@ -377,9 +372,6 @@ VirtualCallTarget::VirtualCallTarget(GlobalValue *Fn, const TypeMemberInfo *TM) namespace { -// Tracks the number of devirted calls in the IR transformation. -static unsigned NumDevirtCalls = 0; - // A slot in a set of virtual tables. The TypeID identifies the set of virtual // tables, and the ByteOffset is the offset in bytes from the address point to // the virtual function pointer. @@ -1216,15 +1208,13 @@ void DevirtModule::applySingleImplDevirt(VTableSlotInfo &SlotInfo, continue; // Stop when the number of devirted calls reaches the cutoff. - if (WholeProgramDevirtCutoff.getNumOccurrences() > 0 && - NumDevirtCalls >= WholeProgramDevirtCutoff) - return; + if (!DebugCounter::shouldExecute(CallsToDevirt)) + continue; if (RemarksEnabled) VCallSite.emitRemark("single-impl", TheFn->stripPointerCasts()->getName(), OREGetter); NumSingleImpl++; - NumDevirtCalls++; auto &CB = VCallSite.CB; assert(!CB.getCalledFunction() && "devirtualizing direct call?"); IRBuilder<> Builder(&CB); diff --git a/llvm/test/Transforms/WholeProgramDevirt/import.ll b/llvm/test/Transforms/WholeProgramDevirt/import.ll index de25bc10a7c12..153f18e4fbc3a 100644 --- a/llvm/test/Transforms/WholeProgramDevirt/import.ll +++ b/llvm/test/Transforms/WholeProgramDevirt/import.ll @@ -8,12 +8,12 @@ ; RUN: opt -S -passes=wholeprogramdevirt -wholeprogramdevirt-summary-action=import -wholeprogramdevirt-read-summary=%S/Inputs/import-vcp-branch-funnel.yaml < %s | FileCheck --check-prefixes=CHECK,VCP,VCP-X86,VCP64,BRANCH-FUNNEL %s ; RUN: opt -S -passes=wholeprogramdevirt -wholeprogramdevirt-summary-action=import -wholeprogramdevirt-read-summary=%S/Inputs/import-branch-funnel.yaml < %s | FileCheck --check-prefixes=CHECK,BRANCH-FUNNEL,BRANCH-FUNNEL-NOVCP %s -; Cutoff value is not explicitly set. Expect 3 remark messages. +; Devirt calls debug counter is not explicitly set. Expect 3 remark messages. ; RUN: opt -S -passes=wholeprogramdevirt -wholeprogramdevirt-summary-action=import -pass-remarks=wholeprogramdevirt -wholeprogramdevirt-read-summary=%S/Inputs/import-single-impl.yaml < %s 2>&1 | grep "single-impl" | count 3 -; Cutoff value is set to 1. Expect one remark messages. -; RUN: opt -S -passes=wholeprogramdevirt -wholeprogramdevirt-summary-action=import -pass-remarks=wholeprogramdevirt -wholeprogramdevirt-cutoff=1 -wholeprogramdevirt-read-summary=%S/Inputs/import-single-impl.yaml < %s 2>&1 | grep "single-impl" | count 1 -; Cutoff value is explicitly set to zero. Expect no remark message. -; RUN: opt -S -passes=wholeprogramdevirt -wholeprogramdevirt-summary-action=import -pass-remarks=wholeprogramdevirt -wholeprogramdevirt-cutoff=0 -wholeprogramdevirt-read-summary=%S/Inputs/import-single-impl.yaml < %s 2>&1 | FileCheck -implicit-check-not="remark" %s +; Devirt calls debug counter is set to 1. Expect one remark messages. +; RUN: opt -S -passes=wholeprogramdevirt -wholeprogramdevirt-summary-action=import -pass-remarks=wholeprogramdevirt -debug-counter=calls-to-devirt=0 -wholeprogramdevirt-read-summary=%S/Inputs/import-single-impl.yaml < %s 2>&1 | grep "single-impl" | count 1 +; Devirt calls debug counter is set outside the range of calls. Expect no remark message. +; RUN: opt -S -passes=wholeprogramdevirt -wholeprogramdevirt-summary-action=import -pass-remarks=wholeprogramdevirt -debug-counter=calls-to-devirt=9999 -wholeprogramdevirt-read-summary=%S/Inputs/import-single-impl.yaml < %s 2>&1 | FileCheck -implicit-check-not="remark" %s target datalayout = "e-p:64:64" target triple = "x86_64-unknown-linux-gnu"