From 2b2827552ad7e0fbd30597d714e751516f83e0f9 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 23 Apr 2020 18:17:51 +0200 Subject: [PATCH] [CaptureTracking] Make MaxUsesToExplore cheaper (NFC) The change in D78624 had a noticeable negative compile-time impact. It seems that going through a function call for the MaxUsesToExplore default is fairly expensive, at least if LLVM is not built with LTO. This patch makes MaxUsesToExpore default to 0 and assigns the actual default in the implementation instead. This recovers most of the regression. Differential Revision: https://reviews.llvm.org/D78734 --- llvm/include/llvm/Analysis/CaptureTracking.h | 24 ++++++++++++------------ llvm/lib/Analysis/CaptureTracking.cpp | 3 +++ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/llvm/include/llvm/Analysis/CaptureTracking.h b/llvm/include/llvm/Analysis/CaptureTracking.h index f14149a..62d2264 100644 --- a/llvm/include/llvm/Analysis/CaptureTracking.h +++ b/llvm/include/llvm/Analysis/CaptureTracking.h @@ -33,12 +33,12 @@ namespace llvm { /// counts as capturing it or not. The boolean StoreCaptures specified /// whether storing the value (or part of it) into memory anywhere /// automatically counts as capturing it or not. - /// MaxUsesToExplore specifies how many uses should the analysis explore for - /// one value before giving up due too "too many uses". + /// MaxUsesToExplore specifies how many uses the analysis should explore for + /// one value before giving up due too "too many uses". If MaxUsesToExplore + /// is zero, a default value is assumed. bool PointerMayBeCaptured(const Value *V, bool ReturnCaptures, bool StoreCaptures, - unsigned MaxUsesToExplore = - getDefaultMaxUsesToExploreForCaptureTracking()); + unsigned MaxUsesToExplore = 0); /// PointerMayBeCapturedBefore - Return true if this pointer value may be /// captured by the enclosing function (which is required to exist). If a @@ -50,13 +50,13 @@ namespace llvm { /// (or part of it) into memory anywhere automatically counts as capturing it /// or not. Captures by the provided instruction are considered if the /// final parameter is true. - /// MaxUsesToExplore specifies how many uses should the analysis explore for - /// one value before giving up due too "too many uses". + /// MaxUsesToExplore specifies how many uses the analysis should explore for + /// one value before giving up due too "too many uses". If MaxUsesToExplore + /// is zero, a default value is assumed. bool PointerMayBeCapturedBefore( const Value *V, bool ReturnCaptures, bool StoreCaptures, const Instruction *I, const DominatorTree *DT, bool IncludeI = false, - unsigned MaxUsesToExplore = - getDefaultMaxUsesToExploreForCaptureTracking()); + unsigned MaxUsesToExplore = 0); /// This callback is used in conjunction with PointerMayBeCaptured. In /// addition to the interface here, you'll need to provide your own getters @@ -89,11 +89,11 @@ namespace llvm { /// PointerMayBeCaptured - Visit the value and the values derived from it and /// find values which appear to be capturing the pointer value. This feeds /// results into and is controlled by the CaptureTracker object. - /// MaxUsesToExplore specifies how many uses should the analysis explore for - /// one value before giving up due too "too many uses". + /// MaxUsesToExplore specifies how many uses the analysis should explore for + /// one value before giving up due too "too many uses". If MaxUsesToExplore + /// is zero, a default value is assumed. void PointerMayBeCaptured(const Value *V, CaptureTracker *Tracker, - unsigned MaxUsesToExplore = - getDefaultMaxUsesToExploreForCaptureTracking()); + unsigned MaxUsesToExplore = 0); } // end namespace llvm #endif diff --git a/llvm/lib/Analysis/CaptureTracking.cpp b/llvm/lib/Analysis/CaptureTracking.cpp index df35ccf..d7ddb7d 100644 --- a/llvm/lib/Analysis/CaptureTracking.cpp +++ b/llvm/lib/Analysis/CaptureTracking.cpp @@ -230,6 +230,9 @@ bool llvm::PointerMayBeCapturedBefore(const Value *V, bool ReturnCaptures, void llvm::PointerMayBeCaptured(const Value *V, CaptureTracker *Tracker, unsigned MaxUsesToExplore) { assert(V->getType()->isPointerTy() && "Capture is for pointers only!"); + if (MaxUsesToExplore == 0) + MaxUsesToExplore = DefaultMaxUsesToExplore; + SmallVector Worklist; Worklist.reserve(getDefaultMaxUsesToExploreForCaptureTracking()); SmallSet Visited; -- 2.7.4