1 //===-- InstrProfiling.cpp - Frontend instrumentation based profiling -----===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This pass lowers instrprof_* intrinsics emitted by a frontend for profiling. 11 // It also builds the data structures and initialization code needed for 12 // updating execution counts and emitting the profile at runtime. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #include "llvm/Transforms/InstrProfiling.h" 17 #include "llvm/ADT/ArrayRef.h" 18 #include "llvm/ADT/SmallVector.h" 19 #include "llvm/ADT/StringRef.h" 20 #include "llvm/ADT/Triple.h" 21 #include "llvm/ADT/Twine.h" 22 #include "llvm/Analysis/LoopInfo.h" 23 #include "llvm/Analysis/TargetLibraryInfo.h" 24 #include "llvm/IR/Attributes.h" 25 #include "llvm/IR/BasicBlock.h" 26 #include "llvm/IR/Constant.h" 27 #include "llvm/IR/Constants.h" 28 #include "llvm/IR/DerivedTypes.h" 29 #include "llvm/IR/Dominators.h" 30 #include "llvm/IR/Function.h" 31 #include "llvm/IR/GlobalValue.h" 32 #include "llvm/IR/GlobalVariable.h" 33 #include "llvm/IR/IRBuilder.h" 34 #include "llvm/IR/Instruction.h" 35 #include "llvm/IR/Instructions.h" 36 #include "llvm/IR/IntrinsicInst.h" 37 #include "llvm/IR/Module.h" 38 #include "llvm/IR/Type.h" 39 #include "llvm/Pass.h" 40 #include "llvm/ProfileData/InstrProf.h" 41 #include "llvm/Support/Casting.h" 42 #include "llvm/Support/CommandLine.h" 43 #include "llvm/Support/Error.h" 44 #include "llvm/Support/ErrorHandling.h" 45 #include "llvm/Transforms/Utils/BasicBlockUtils.h" 46 #include "llvm/Transforms/Utils/ModuleUtils.h" 47 #include "llvm/Transforms/Utils/SSAUpdater.h" 48 #include <algorithm> 49 #include <cassert> 50 #include <cstddef> 51 #include <cstdint> 52 #include <string> 53 54 using namespace llvm; 55 56 #define DEBUG_TYPE "instrprof" 57 58 // The start and end values of precise value profile range for memory 59 // intrinsic sizes 60 cl::opt<std::string> MemOPSizeRange( 61 "memop-size-range", 62 cl::desc("Set the range of size in memory intrinsic calls to be profiled " 63 "precisely, in a format of <start_val>:<end_val>"), 64 cl::init("")); 65 66 // The value that considered to be large value in memory intrinsic. 67 cl::opt<unsigned> MemOPSizeLarge( 68 "memop-size-large", 69 cl::desc("Set large value thresthold in memory intrinsic size profiling. " 70 "Value of 0 disables the large value profiling."), 71 cl::init(8192)); 72 73 namespace { 74 75 cl::opt<bool> DoNameCompression("enable-name-compression", 76 cl::desc("Enable name string compression"), 77 cl::init(true)); 78 79 cl::opt<bool> DoHashBasedCounterSplit( 80 "hash-based-counter-split", 81 cl::desc("Rename counter variable of a comdat function based on cfg hash"), 82 cl::init(true)); 83 84 cl::opt<bool> ValueProfileStaticAlloc( 85 "vp-static-alloc", 86 cl::desc("Do static counter allocation for value profiler"), 87 cl::init(true)); 88 89 cl::opt<double> NumCountersPerValueSite( 90 "vp-counters-per-site", 91 cl::desc("The average number of profile counters allocated " 92 "per value profiling site."), 93 // This is set to a very small value because in real programs, only 94 // a very small percentage of value sites have non-zero targets, e.g, 1/30. 95 // For those sites with non-zero profile, the average number of targets 96 // is usually smaller than 2. 97 cl::init(1.0)); 98 99 cl::opt<bool> AtomicCounterUpdatePromoted( 100 "atomic-counter-update-promoted", cl::ZeroOrMore, 101 cl::desc("Do counter update using atomic fetch add " 102 " for promoted counters only"), 103 cl::init(false)); 104 105 // If the option is not specified, the default behavior about whether 106 // counter promotion is done depends on how instrumentaiton lowering 107 // pipeline is setup, i.e., the default value of true of this option 108 // does not mean the promotion will be done by default. Explicitly 109 // setting this option can override the default behavior. 110 cl::opt<bool> DoCounterPromotion("do-counter-promotion", cl::ZeroOrMore, 111 cl::desc("Do counter register promotion"), 112 cl::init(false)); 113 cl::opt<unsigned> MaxNumOfPromotionsPerLoop( 114 cl::ZeroOrMore, "max-counter-promotions-per-loop", cl::init(20), 115 cl::desc("Max number counter promotions per loop to avoid" 116 " increasing register pressure too much")); 117 118 // A debug option 119 cl::opt<int> 120 MaxNumOfPromotions(cl::ZeroOrMore, "max-counter-promotions", cl::init(-1), 121 cl::desc("Max number of allowed counter promotions")); 122 123 cl::opt<unsigned> SpeculativeCounterPromotionMaxExiting( 124 cl::ZeroOrMore, "speculative-counter-promotion-max-exiting", cl::init(3), 125 cl::desc("The max number of exiting blocks of a loop to allow " 126 " speculative counter promotion")); 127 128 cl::opt<bool> SpeculativeCounterPromotionToLoop( 129 cl::ZeroOrMore, "speculative-counter-promotion-to-loop", cl::init(false), 130 cl::desc("When the option is false, if the target block is in a loop, " 131 "the promotion will be disallowed unless the promoted counter " 132 " update can be further/iteratively promoted into an acyclic " 133 " region.")); 134 135 cl::opt<bool> IterativeCounterPromotion( 136 cl::ZeroOrMore, "iterative-counter-promotion", cl::init(true), 137 cl::desc("Allow counter promotion across the whole loop nest.")); 138 139 class InstrProfilingLegacyPass : public ModulePass { 140 InstrProfiling InstrProf; 141 142 public: 143 static char ID; 144 145 InstrProfilingLegacyPass() : ModulePass(ID) {} 146 InstrProfilingLegacyPass(const InstrProfOptions &Options) 147 : ModulePass(ID), InstrProf(Options) {} 148 149 StringRef getPassName() const override { 150 return "Frontend instrumentation-based coverage lowering"; 151 } 152 153 bool runOnModule(Module &M) override { 154 return InstrProf.run(M, getAnalysis<TargetLibraryInfoWrapperPass>().getTLI()); 155 } 156 157 void getAnalysisUsage(AnalysisUsage &AU) const override { 158 AU.setPreservesCFG(); 159 AU.addRequired<TargetLibraryInfoWrapperPass>(); 160 } 161 }; 162 163 /// 164 /// A helper class to promote one counter RMW operation in the loop 165 /// into register update. 166 /// 167 /// RWM update for the counter will be sinked out of the loop after 168 /// the transformation. 169 /// 170 class PGOCounterPromoterHelper : public LoadAndStorePromoter { 171 public: 172 PGOCounterPromoterHelper( 173 Instruction *L, Instruction *S, SSAUpdater &SSA, Value *Init, 174 BasicBlock *PH, ArrayRef<BasicBlock *> ExitBlocks, 175 ArrayRef<Instruction *> InsertPts, 176 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCands, 177 LoopInfo &LI) 178 : LoadAndStorePromoter({L, S}, SSA), Store(S), ExitBlocks(ExitBlocks), 179 InsertPts(InsertPts), LoopToCandidates(LoopToCands), LI(LI) { 180 assert(isa<LoadInst>(L)); 181 assert(isa<StoreInst>(S)); 182 SSA.AddAvailableValue(PH, Init); 183 } 184 185 void doExtraRewritesBeforeFinalDeletion() const override { 186 for (unsigned i = 0, e = ExitBlocks.size(); i != e; ++i) { 187 BasicBlock *ExitBlock = ExitBlocks[i]; 188 Instruction *InsertPos = InsertPts[i]; 189 // Get LiveIn value into the ExitBlock. If there are multiple 190 // predecessors, the value is defined by a PHI node in this 191 // block. 192 Value *LiveInValue = SSA.GetValueInMiddleOfBlock(ExitBlock); 193 Value *Addr = cast<StoreInst>(Store)->getPointerOperand(); 194 IRBuilder<> Builder(InsertPos); 195 if (AtomicCounterUpdatePromoted) 196 // automic update currently can only be promoted across the current 197 // loop, not the whole loop nest. 198 Builder.CreateAtomicRMW(AtomicRMWInst::Add, Addr, LiveInValue, 199 AtomicOrdering::SequentiallyConsistent); 200 else { 201 LoadInst *OldVal = Builder.CreateLoad(Addr, "pgocount.promoted"); 202 auto *NewVal = Builder.CreateAdd(OldVal, LiveInValue); 203 auto *NewStore = Builder.CreateStore(NewVal, Addr); 204 205 // Now update the parent loop's candidate list: 206 if (IterativeCounterPromotion) { 207 auto *TargetLoop = LI.getLoopFor(ExitBlock); 208 if (TargetLoop) 209 LoopToCandidates[TargetLoop].emplace_back(OldVal, NewStore); 210 } 211 } 212 } 213 } 214 215 private: 216 Instruction *Store; 217 ArrayRef<BasicBlock *> ExitBlocks; 218 ArrayRef<Instruction *> InsertPts; 219 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCandidates; 220 LoopInfo &LI; 221 }; 222 223 /// A helper class to do register promotion for all profile counter 224 /// updates in a loop. 225 /// 226 class PGOCounterPromoter { 227 public: 228 PGOCounterPromoter( 229 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCands, 230 Loop &CurLoop, LoopInfo &LI) 231 : LoopToCandidates(LoopToCands), ExitBlocks(), InsertPts(), L(CurLoop), 232 LI(LI) { 233 234 SmallVector<BasicBlock *, 8> LoopExitBlocks; 235 SmallPtrSet<BasicBlock *, 8> BlockSet; 236 L.getExitBlocks(LoopExitBlocks); 237 238 for (BasicBlock *ExitBlock : LoopExitBlocks) { 239 if (BlockSet.insert(ExitBlock).second) { 240 ExitBlocks.push_back(ExitBlock); 241 InsertPts.push_back(&*ExitBlock->getFirstInsertionPt()); 242 } 243 } 244 } 245 246 bool run(int64_t *NumPromoted) { 247 // Skip 'infinite' loops: 248 if (ExitBlocks.size() == 0) 249 return false; 250 unsigned MaxProm = getMaxNumOfPromotionsInLoop(&L); 251 if (MaxProm == 0) 252 return false; 253 254 unsigned Promoted = 0; 255 for (auto &Cand : LoopToCandidates[&L]) { 256 257 SmallVector<PHINode *, 4> NewPHIs; 258 SSAUpdater SSA(&NewPHIs); 259 Value *InitVal = ConstantInt::get(Cand.first->getType(), 0); 260 261 PGOCounterPromoterHelper Promoter(Cand.first, Cand.second, SSA, InitVal, 262 L.getLoopPreheader(), ExitBlocks, 263 InsertPts, LoopToCandidates, LI); 264 Promoter.run(SmallVector<Instruction *, 2>({Cand.first, Cand.second})); 265 Promoted++; 266 if (Promoted >= MaxProm) 267 break; 268 269 (*NumPromoted)++; 270 if (MaxNumOfPromotions != -1 && *NumPromoted >= MaxNumOfPromotions) 271 break; 272 } 273 274 DEBUG(dbgs() << Promoted << " counters promoted for loop (depth=" 275 << L.getLoopDepth() << ")\n"); 276 return Promoted != 0; 277 } 278 279 private: 280 bool allowSpeculativeCounterPromotion(Loop *LP) { 281 SmallVector<BasicBlock *, 8> ExitingBlocks; 282 L.getExitingBlocks(ExitingBlocks); 283 // Not considierered speculative. 284 if (ExitingBlocks.size() == 1) 285 return true; 286 if (ExitingBlocks.size() > SpeculativeCounterPromotionMaxExiting) 287 return false; 288 return true; 289 } 290 291 // Returns the max number of Counter Promotions for LP. 292 unsigned getMaxNumOfPromotionsInLoop(Loop *LP) { 293 // We can't insert into a catchswitch. 294 SmallVector<BasicBlock *, 8> LoopExitBlocks; 295 LP->getExitBlocks(LoopExitBlocks); 296 if (llvm::any_of(LoopExitBlocks, [](BasicBlock *Exit) { 297 return isa<CatchSwitchInst>(Exit->getTerminator()); 298 })) 299 return 0; 300 301 if (!LP->hasDedicatedExits()) 302 return 0; 303 304 BasicBlock *PH = LP->getLoopPreheader(); 305 if (!PH) 306 return 0; 307 308 SmallVector<BasicBlock *, 8> ExitingBlocks; 309 LP->getExitingBlocks(ExitingBlocks); 310 // Not considierered speculative. 311 if (ExitingBlocks.size() == 1) 312 return MaxNumOfPromotionsPerLoop; 313 314 if (ExitingBlocks.size() > SpeculativeCounterPromotionMaxExiting) 315 return 0; 316 317 // Whether the target block is in a loop does not matter: 318 if (SpeculativeCounterPromotionToLoop) 319 return MaxNumOfPromotionsPerLoop; 320 321 // Now check the target block: 322 unsigned MaxProm = MaxNumOfPromotionsPerLoop; 323 for (auto *TargetBlock : LoopExitBlocks) { 324 auto *TargetLoop = LI.getLoopFor(TargetBlock); 325 if (!TargetLoop) 326 continue; 327 unsigned MaxPromForTarget = getMaxNumOfPromotionsInLoop(TargetLoop); 328 unsigned PendingCandsInTarget = LoopToCandidates[TargetLoop].size(); 329 MaxProm = 330 std::min(MaxProm, std::max(MaxPromForTarget, PendingCandsInTarget) - 331 PendingCandsInTarget); 332 } 333 return MaxProm; 334 } 335 336 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> &LoopToCandidates; 337 SmallVector<BasicBlock *, 8> ExitBlocks; 338 SmallVector<Instruction *, 8> InsertPts; 339 Loop &L; 340 LoopInfo &LI; 341 }; 342 343 } // end anonymous namespace 344 345 PreservedAnalyses InstrProfiling::run(Module &M, ModuleAnalysisManager &AM) { 346 auto &TLI = AM.getResult<TargetLibraryAnalysis>(M); 347 if (!run(M, TLI)) 348 return PreservedAnalyses::all(); 349 350 return PreservedAnalyses::none(); 351 } 352 353 char InstrProfilingLegacyPass::ID = 0; 354 INITIALIZE_PASS_BEGIN( 355 InstrProfilingLegacyPass, "instrprof", 356 "Frontend instrumentation-based coverage lowering.", false, false) 357 INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass) 358 INITIALIZE_PASS_END( 359 InstrProfilingLegacyPass, "instrprof", 360 "Frontend instrumentation-based coverage lowering.", false, false) 361 362 ModulePass * 363 llvm::createInstrProfilingLegacyPass(const InstrProfOptions &Options) { 364 return new InstrProfilingLegacyPass(Options); 365 } 366 367 static InstrProfIncrementInst *castToIncrementInst(Instruction *Instr) { 368 InstrProfIncrementInst *Inc = dyn_cast<InstrProfIncrementInstStep>(Instr); 369 if (Inc) 370 return Inc; 371 return dyn_cast<InstrProfIncrementInst>(Instr); 372 } 373 374 bool InstrProfiling::lowerIntrinsics(Function *F) { 375 bool MadeChange = false; 376 PromotionCandidates.clear(); 377 for (BasicBlock &BB : *F) { 378 for (auto I = BB.begin(), E = BB.end(); I != E;) { 379 auto Instr = I++; 380 InstrProfIncrementInst *Inc = castToIncrementInst(&*Instr); 381 if (Inc) { 382 lowerIncrement(Inc); 383 MadeChange = true; 384 } else if (auto *Ind = dyn_cast<InstrProfValueProfileInst>(Instr)) { 385 lowerValueProfileInst(Ind); 386 MadeChange = true; 387 } 388 } 389 } 390 391 if (!MadeChange) 392 return false; 393 394 promoteCounterLoadStores(F); 395 return true; 396 } 397 398 bool InstrProfiling::isCounterPromotionEnabled() const { 399 if (DoCounterPromotion.getNumOccurrences() > 0) 400 return DoCounterPromotion; 401 402 return Options.DoCounterPromotion; 403 } 404 405 void InstrProfiling::promoteCounterLoadStores(Function *F) { 406 if (!isCounterPromotionEnabled()) 407 return; 408 409 DominatorTree DT(*F); 410 LoopInfo LI(DT); 411 DenseMap<Loop *, SmallVector<LoadStorePair, 8>> LoopPromotionCandidates; 412 413 for (const auto &LoadStore : PromotionCandidates) { 414 auto *CounterLoad = LoadStore.first; 415 auto *CounterStore = LoadStore.second; 416 BasicBlock *BB = CounterLoad->getParent(); 417 Loop *ParentLoop = LI.getLoopFor(BB); 418 if (!ParentLoop) 419 continue; 420 LoopPromotionCandidates[ParentLoop].emplace_back(CounterLoad, CounterStore); 421 } 422 423 SmallVector<Loop *, 4> Loops = LI.getLoopsInPreorder(); 424 425 // Do a post-order traversal of the loops so that counter updates can be 426 // iteratively hoisted outside the loop nest. 427 for (auto *Loop : llvm::reverse(Loops)) { 428 PGOCounterPromoter Promoter(LoopPromotionCandidates, *Loop, LI); 429 Promoter.run(&TotalCountersPromoted); 430 } 431 } 432 433 bool InstrProfiling::run(Module &M, const TargetLibraryInfo &TLI) { 434 bool MadeChange = false; 435 436 this->M = &M; 437 this->TLI = &TLI; 438 NamesVar = nullptr; 439 NamesSize = 0; 440 ProfileDataMap.clear(); 441 UsedVars.clear(); 442 getMemOPSizeRangeFromOption(MemOPSizeRange, MemOPSizeRangeStart, 443 MemOPSizeRangeLast); 444 TT = Triple(M.getTargetTriple()); 445 446 // We did not know how many value sites there would be inside 447 // the instrumented function. This is counting the number of instrumented 448 // target value sites to enter it as field in the profile data variable. 449 for (Function &F : M) { 450 InstrProfIncrementInst *FirstProfIncInst = nullptr; 451 for (BasicBlock &BB : F) 452 for (auto I = BB.begin(), E = BB.end(); I != E; I++) 453 if (auto *Ind = dyn_cast<InstrProfValueProfileInst>(I)) 454 computeNumValueSiteCounts(Ind); 455 else if (FirstProfIncInst == nullptr) 456 FirstProfIncInst = dyn_cast<InstrProfIncrementInst>(I); 457 458 // Value profiling intrinsic lowering requires per-function profile data 459 // variable to be created first. 460 if (FirstProfIncInst != nullptr) 461 static_cast<void>(getOrCreateRegionCounters(FirstProfIncInst)); 462 } 463 464 for (Function &F : M) 465 MadeChange |= lowerIntrinsics(&F); 466 467 if (GlobalVariable *CoverageNamesVar = 468 M.getNamedGlobal(getCoverageUnusedNamesVarName())) { 469 lowerCoverageData(CoverageNamesVar); 470 MadeChange = true; 471 } 472 473 if (!MadeChange) 474 return false; 475 476 emitVNodes(); 477 emitNameData(); 478 emitRegistration(); 479 emitRuntimeHook(); 480 emitUses(); 481 emitInitialization(); 482 return true; 483 } 484 485 static Constant *getOrInsertValueProfilingCall(Module &M, 486 const TargetLibraryInfo &TLI, 487 bool IsRange = false) { 488 LLVMContext &Ctx = M.getContext(); 489 auto *ReturnTy = Type::getVoidTy(M.getContext()); 490 491 Constant *Res; 492 if (!IsRange) { 493 Type *ParamTypes[] = { 494 #define VALUE_PROF_FUNC_PARAM(ParamType, ParamName, ParamLLVMType) ParamLLVMType 495 #include "llvm/ProfileData/InstrProfData.inc" 496 }; 497 auto *ValueProfilingCallTy = 498 FunctionType::get(ReturnTy, makeArrayRef(ParamTypes), false); 499 Res = M.getOrInsertFunction(getInstrProfValueProfFuncName(), 500 ValueProfilingCallTy); 501 } else { 502 Type *RangeParamTypes[] = { 503 #define VALUE_RANGE_PROF 1 504 #define VALUE_PROF_FUNC_PARAM(ParamType, ParamName, ParamLLVMType) ParamLLVMType 505 #include "llvm/ProfileData/InstrProfData.inc" 506 #undef VALUE_RANGE_PROF 507 }; 508 auto *ValueRangeProfilingCallTy = 509 FunctionType::get(ReturnTy, makeArrayRef(RangeParamTypes), false); 510 Res = M.getOrInsertFunction(getInstrProfValueRangeProfFuncName(), 511 ValueRangeProfilingCallTy); 512 } 513 514 if (Function *FunRes = dyn_cast<Function>(Res)) { 515 if (auto AK = TLI.getExtAttrForI32Param(false)) 516 FunRes->addParamAttr(2, AK); 517 } 518 return Res; 519 } 520 521 void InstrProfiling::computeNumValueSiteCounts(InstrProfValueProfileInst *Ind) { 522 GlobalVariable *Name = Ind->getName(); 523 uint64_t ValueKind = Ind->getValueKind()->getZExtValue(); 524 uint64_t Index = Ind->getIndex()->getZExtValue(); 525 auto It = ProfileDataMap.find(Name); 526 if (It == ProfileDataMap.end()) { 527 PerFunctionProfileData PD; 528 PD.NumValueSites[ValueKind] = Index + 1; 529 ProfileDataMap[Name] = PD; 530 } else if (It->second.NumValueSites[ValueKind] <= Index) 531 It->second.NumValueSites[ValueKind] = Index + 1; 532 } 533 534 void InstrProfiling::lowerValueProfileInst(InstrProfValueProfileInst *Ind) { 535 GlobalVariable *Name = Ind->getName(); 536 auto It = ProfileDataMap.find(Name); 537 assert(It != ProfileDataMap.end() && It->second.DataVar && 538 "value profiling detected in function with no counter incerement"); 539 540 GlobalVariable *DataVar = It->second.DataVar; 541 uint64_t ValueKind = Ind->getValueKind()->getZExtValue(); 542 uint64_t Index = Ind->getIndex()->getZExtValue(); 543 for (uint32_t Kind = IPVK_First; Kind < ValueKind; ++Kind) 544 Index += It->second.NumValueSites[Kind]; 545 546 IRBuilder<> Builder(Ind); 547 bool IsRange = (Ind->getValueKind()->getZExtValue() == 548 llvm::InstrProfValueKind::IPVK_MemOPSize); 549 CallInst *Call = nullptr; 550 if (!IsRange) { 551 Value *Args[3] = {Ind->getTargetValue(), 552 Builder.CreateBitCast(DataVar, Builder.getInt8PtrTy()), 553 Builder.getInt32(Index)}; 554 Call = Builder.CreateCall(getOrInsertValueProfilingCall(*M, *TLI), Args); 555 } else { 556 Value *Args[6] = { 557 Ind->getTargetValue(), 558 Builder.CreateBitCast(DataVar, Builder.getInt8PtrTy()), 559 Builder.getInt32(Index), 560 Builder.getInt64(MemOPSizeRangeStart), 561 Builder.getInt64(MemOPSizeRangeLast), 562 Builder.getInt64(MemOPSizeLarge == 0 ? INT64_MIN : MemOPSizeLarge)}; 563 Call = 564 Builder.CreateCall(getOrInsertValueProfilingCall(*M, *TLI, true), Args); 565 } 566 if (auto AK = TLI->getExtAttrForI32Param(false)) 567 Call->addParamAttr(2, AK); 568 Ind->replaceAllUsesWith(Call); 569 Ind->eraseFromParent(); 570 } 571 572 void InstrProfiling::lowerIncrement(InstrProfIncrementInst *Inc) { 573 GlobalVariable *Counters = getOrCreateRegionCounters(Inc); 574 575 IRBuilder<> Builder(Inc); 576 uint64_t Index = Inc->getIndex()->getZExtValue(); 577 Value *Addr = Builder.CreateConstInBoundsGEP2_64(Counters, 0, Index); 578 Value *Load = Builder.CreateLoad(Addr, "pgocount"); 579 auto *Count = Builder.CreateAdd(Load, Inc->getStep()); 580 auto *Store = Builder.CreateStore(Count, Addr); 581 Inc->replaceAllUsesWith(Store); 582 if (isCounterPromotionEnabled()) 583 PromotionCandidates.emplace_back(cast<Instruction>(Load), Store); 584 Inc->eraseFromParent(); 585 } 586 587 void InstrProfiling::lowerCoverageData(GlobalVariable *CoverageNamesVar) { 588 ConstantArray *Names = 589 cast<ConstantArray>(CoverageNamesVar->getInitializer()); 590 for (unsigned I = 0, E = Names->getNumOperands(); I < E; ++I) { 591 Constant *NC = Names->getOperand(I); 592 Value *V = NC->stripPointerCasts(); 593 assert(isa<GlobalVariable>(V) && "Missing reference to function name"); 594 GlobalVariable *Name = cast<GlobalVariable>(V); 595 596 Name->setLinkage(GlobalValue::PrivateLinkage); 597 ReferencedNames.push_back(Name); 598 NC->dropAllReferences(); 599 } 600 CoverageNamesVar->eraseFromParent(); 601 } 602 603 /// Get the name of a profiling variable for a particular function. 604 static std::string getVarName(InstrProfIncrementInst *Inc, StringRef Prefix) { 605 StringRef NamePrefix = getInstrProfNameVarPrefix(); 606 StringRef Name = Inc->getName()->getName().substr(NamePrefix.size()); 607 Function *F = Inc->getParent()->getParent(); 608 Module *M = F->getParent(); 609 if (!DoHashBasedCounterSplit || !isIRPGOFlagSet(M) || 610 !canRenameComdatFunc(*F)) 611 return (Prefix + Name).str(); 612 uint64_t FuncHash = Inc->getHash()->getZExtValue(); 613 SmallVector<char, 24> HashPostfix; 614 if (Name.endswith((Twine(".") + Twine(FuncHash)).toStringRef(HashPostfix))) 615 return (Prefix + Name).str(); 616 return (Prefix + Name + "." + Twine(FuncHash)).str(); 617 } 618 619 static inline bool shouldRecordFunctionAddr(Function *F) { 620 // Check the linkage 621 bool HasAvailableExternallyLinkage = F->hasAvailableExternallyLinkage(); 622 if (!F->hasLinkOnceLinkage() && !F->hasLocalLinkage() && 623 !HasAvailableExternallyLinkage) 624 return true; 625 626 // A function marked 'alwaysinline' with available_externally linkage can't 627 // have its address taken. Doing so would create an undefined external ref to 628 // the function, which would fail to link. 629 if (HasAvailableExternallyLinkage && 630 F->hasFnAttribute(Attribute::AlwaysInline)) 631 return false; 632 633 // Prohibit function address recording if the function is both internal and 634 // COMDAT. This avoids the profile data variable referencing internal symbols 635 // in COMDAT. 636 if (F->hasLocalLinkage() && F->hasComdat()) 637 return false; 638 639 // Check uses of this function for other than direct calls or invokes to it. 640 // Inline virtual functions have linkeOnceODR linkage. When a key method 641 // exists, the vtable will only be emitted in the TU where the key method 642 // is defined. In a TU where vtable is not available, the function won't 643 // be 'addresstaken'. If its address is not recorded here, the profile data 644 // with missing address may be picked by the linker leading to missing 645 // indirect call target info. 646 return F->hasAddressTaken() || F->hasLinkOnceLinkage(); 647 } 648 649 static inline Comdat *getOrCreateProfileComdat(Module &M, Function &F, 650 InstrProfIncrementInst *Inc) { 651 if (!needsComdatForCounter(F, M)) 652 return nullptr; 653 654 // COFF format requires a COMDAT section to have a key symbol with the same 655 // name. The linker targeting COFF also requires that the COMDAT 656 // a section is associated to must precede the associating section. For this 657 // reason, we must choose the counter var's name as the name of the comdat. 658 StringRef ComdatPrefix = (Triple(M.getTargetTriple()).isOSBinFormatCOFF() 659 ? getInstrProfCountersVarPrefix() 660 : getInstrProfComdatPrefix()); 661 return M.getOrInsertComdat(StringRef(getVarName(Inc, ComdatPrefix))); 662 } 663 664 static bool needsRuntimeRegistrationOfSectionRange(const Module &M) { 665 // Don't do this for Darwin. compiler-rt uses linker magic. 666 if (Triple(M.getTargetTriple()).isOSDarwin()) 667 return false; 668 669 // Use linker script magic to get data/cnts/name start/end. 670 if (Triple(M.getTargetTriple()).isOSLinux() || 671 Triple(M.getTargetTriple()).isOSFreeBSD() || 672 Triple(M.getTargetTriple()).isPS4CPU()) 673 return false; 674 675 return true; 676 } 677 678 GlobalVariable * 679 InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) { 680 GlobalVariable *NamePtr = Inc->getName(); 681 auto It = ProfileDataMap.find(NamePtr); 682 PerFunctionProfileData PD; 683 if (It != ProfileDataMap.end()) { 684 if (It->second.RegionCounters) 685 return It->second.RegionCounters; 686 PD = It->second; 687 } 688 689 // Move the name variable to the right section. Place them in a COMDAT group 690 // if the associated function is a COMDAT. This will make sure that 691 // only one copy of counters of the COMDAT function will be emitted after 692 // linking. 693 Function *Fn = Inc->getParent()->getParent(); 694 Comdat *ProfileVarsComdat = nullptr; 695 ProfileVarsComdat = getOrCreateProfileComdat(*M, *Fn, Inc); 696 697 uint64_t NumCounters = Inc->getNumCounters()->getZExtValue(); 698 LLVMContext &Ctx = M->getContext(); 699 ArrayType *CounterTy = ArrayType::get(Type::getInt64Ty(Ctx), NumCounters); 700 701 // Create the counters variable. 702 auto *CounterPtr = 703 new GlobalVariable(*M, CounterTy, false, NamePtr->getLinkage(), 704 Constant::getNullValue(CounterTy), 705 getVarName(Inc, getInstrProfCountersVarPrefix())); 706 CounterPtr->setVisibility(NamePtr->getVisibility()); 707 CounterPtr->setSection( 708 getInstrProfSectionName(IPSK_cnts, TT.getObjectFormat())); 709 CounterPtr->setAlignment(8); 710 CounterPtr->setComdat(ProfileVarsComdat); 711 712 auto *Int8PtrTy = Type::getInt8PtrTy(Ctx); 713 // Allocate statically the array of pointers to value profile nodes for 714 // the current function. 715 Constant *ValuesPtrExpr = ConstantPointerNull::get(Int8PtrTy); 716 if (ValueProfileStaticAlloc && !needsRuntimeRegistrationOfSectionRange(*M)) { 717 uint64_t NS = 0; 718 for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind) 719 NS += PD.NumValueSites[Kind]; 720 if (NS) { 721 ArrayType *ValuesTy = ArrayType::get(Type::getInt64Ty(Ctx), NS); 722 723 auto *ValuesVar = 724 new GlobalVariable(*M, ValuesTy, false, NamePtr->getLinkage(), 725 Constant::getNullValue(ValuesTy), 726 getVarName(Inc, getInstrProfValuesVarPrefix())); 727 ValuesVar->setVisibility(NamePtr->getVisibility()); 728 ValuesVar->setSection( 729 getInstrProfSectionName(IPSK_vals, TT.getObjectFormat())); 730 ValuesVar->setAlignment(8); 731 ValuesVar->setComdat(ProfileVarsComdat); 732 ValuesPtrExpr = 733 ConstantExpr::getBitCast(ValuesVar, Type::getInt8PtrTy(Ctx)); 734 } 735 } 736 737 // Create data variable. 738 auto *Int16Ty = Type::getInt16Ty(Ctx); 739 auto *Int16ArrayTy = ArrayType::get(Int16Ty, IPVK_Last + 1); 740 Type *DataTypes[] = { 741 #define INSTR_PROF_DATA(Type, LLVMType, Name, Init) LLVMType, 742 #include "llvm/ProfileData/InstrProfData.inc" 743 }; 744 auto *DataTy = StructType::get(Ctx, makeArrayRef(DataTypes)); 745 746 Constant *FunctionAddr = shouldRecordFunctionAddr(Fn) 747 ? ConstantExpr::getBitCast(Fn, Int8PtrTy) 748 : ConstantPointerNull::get(Int8PtrTy); 749 750 Constant *Int16ArrayVals[IPVK_Last + 1]; 751 for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind) 752 Int16ArrayVals[Kind] = ConstantInt::get(Int16Ty, PD.NumValueSites[Kind]); 753 754 Constant *DataVals[] = { 755 #define INSTR_PROF_DATA(Type, LLVMType, Name, Init) Init, 756 #include "llvm/ProfileData/InstrProfData.inc" 757 }; 758 auto *Data = new GlobalVariable(*M, DataTy, false, NamePtr->getLinkage(), 759 ConstantStruct::get(DataTy, DataVals), 760 getVarName(Inc, getInstrProfDataVarPrefix())); 761 Data->setVisibility(NamePtr->getVisibility()); 762 Data->setSection(getInstrProfSectionName(IPSK_data, TT.getObjectFormat())); 763 Data->setAlignment(INSTR_PROF_DATA_ALIGNMENT); 764 Data->setComdat(ProfileVarsComdat); 765 766 PD.RegionCounters = CounterPtr; 767 PD.DataVar = Data; 768 ProfileDataMap[NamePtr] = PD; 769 770 // Mark the data variable as used so that it isn't stripped out. 771 UsedVars.push_back(Data); 772 // Now that the linkage set by the FE has been passed to the data and counter 773 // variables, reset Name variable's linkage and visibility to private so that 774 // it can be removed later by the compiler. 775 NamePtr->setLinkage(GlobalValue::PrivateLinkage); 776 // Collect the referenced names to be used by emitNameData. 777 ReferencedNames.push_back(NamePtr); 778 779 return CounterPtr; 780 } 781 782 void InstrProfiling::emitVNodes() { 783 if (!ValueProfileStaticAlloc) 784 return; 785 786 // For now only support this on platforms that do 787 // not require runtime registration to discover 788 // named section start/end. 789 if (needsRuntimeRegistrationOfSectionRange(*M)) 790 return; 791 792 size_t TotalNS = 0; 793 for (auto &PD : ProfileDataMap) { 794 for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind) 795 TotalNS += PD.second.NumValueSites[Kind]; 796 } 797 798 if (!TotalNS) 799 return; 800 801 uint64_t NumCounters = TotalNS * NumCountersPerValueSite; 802 // Heuristic for small programs with very few total value sites. 803 // The default value of vp-counters-per-site is chosen based on 804 // the observation that large apps usually have a low percentage 805 // of value sites that actually have any profile data, and thus 806 // the average number of counters per site is low. For small 807 // apps with very few sites, this may not be true. Bump up the 808 // number of counters in this case. 809 #define INSTR_PROF_MIN_VAL_COUNTS 10 810 if (NumCounters < INSTR_PROF_MIN_VAL_COUNTS) 811 NumCounters = std::max(INSTR_PROF_MIN_VAL_COUNTS, (int)NumCounters * 2); 812 813 auto &Ctx = M->getContext(); 814 Type *VNodeTypes[] = { 815 #define INSTR_PROF_VALUE_NODE(Type, LLVMType, Name, Init) LLVMType, 816 #include "llvm/ProfileData/InstrProfData.inc" 817 }; 818 auto *VNodeTy = StructType::get(Ctx, makeArrayRef(VNodeTypes)); 819 820 ArrayType *VNodesTy = ArrayType::get(VNodeTy, NumCounters); 821 auto *VNodesVar = new GlobalVariable( 822 *M, VNodesTy, false, GlobalValue::PrivateLinkage, 823 Constant::getNullValue(VNodesTy), getInstrProfVNodesVarName()); 824 VNodesVar->setSection( 825 getInstrProfSectionName(IPSK_vnodes, TT.getObjectFormat())); 826 UsedVars.push_back(VNodesVar); 827 } 828 829 void InstrProfiling::emitNameData() { 830 std::string UncompressedData; 831 832 if (ReferencedNames.empty()) 833 return; 834 835 std::string CompressedNameStr; 836 if (Error E = collectPGOFuncNameStrings(ReferencedNames, CompressedNameStr, 837 DoNameCompression)) { 838 report_fatal_error(toString(std::move(E)), false); 839 } 840 841 auto &Ctx = M->getContext(); 842 auto *NamesVal = ConstantDataArray::getString( 843 Ctx, StringRef(CompressedNameStr), false); 844 NamesVar = new GlobalVariable(*M, NamesVal->getType(), true, 845 GlobalValue::PrivateLinkage, NamesVal, 846 getInstrProfNamesVarName()); 847 NamesSize = CompressedNameStr.size(); 848 NamesVar->setSection( 849 getInstrProfSectionName(IPSK_name, TT.getObjectFormat())); 850 UsedVars.push_back(NamesVar); 851 852 for (auto *NamePtr : ReferencedNames) 853 NamePtr->eraseFromParent(); 854 } 855 856 void InstrProfiling::emitRegistration() { 857 if (!needsRuntimeRegistrationOfSectionRange(*M)) 858 return; 859 860 // Construct the function. 861 auto *VoidTy = Type::getVoidTy(M->getContext()); 862 auto *VoidPtrTy = Type::getInt8PtrTy(M->getContext()); 863 auto *Int64Ty = Type::getInt64Ty(M->getContext()); 864 auto *RegisterFTy = FunctionType::get(VoidTy, false); 865 auto *RegisterF = Function::Create(RegisterFTy, GlobalValue::InternalLinkage, 866 getInstrProfRegFuncsName(), M); 867 RegisterF->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); 868 if (Options.NoRedZone) 869 RegisterF->addFnAttr(Attribute::NoRedZone); 870 871 auto *RuntimeRegisterTy = FunctionType::get(VoidTy, VoidPtrTy, false); 872 auto *RuntimeRegisterF = 873 Function::Create(RuntimeRegisterTy, GlobalVariable::ExternalLinkage, 874 getInstrProfRegFuncName(), M); 875 876 IRBuilder<> IRB(BasicBlock::Create(M->getContext(), "", RegisterF)); 877 for (Value *Data : UsedVars) 878 if (Data != NamesVar) 879 IRB.CreateCall(RuntimeRegisterF, IRB.CreateBitCast(Data, VoidPtrTy)); 880 881 if (NamesVar) { 882 Type *ParamTypes[] = {VoidPtrTy, Int64Ty}; 883 auto *NamesRegisterTy = 884 FunctionType::get(VoidTy, makeArrayRef(ParamTypes), false); 885 auto *NamesRegisterF = 886 Function::Create(NamesRegisterTy, GlobalVariable::ExternalLinkage, 887 getInstrProfNamesRegFuncName(), M); 888 IRB.CreateCall(NamesRegisterF, {IRB.CreateBitCast(NamesVar, VoidPtrTy), 889 IRB.getInt64(NamesSize)}); 890 } 891 892 IRB.CreateRetVoid(); 893 } 894 895 void InstrProfiling::emitRuntimeHook() { 896 // We expect the linker to be invoked with -u<hook_var> flag for linux, 897 // for which case there is no need to emit the user function. 898 if (Triple(M->getTargetTriple()).isOSLinux()) 899 return; 900 901 // If the module's provided its own runtime, we don't need to do anything. 902 if (M->getGlobalVariable(getInstrProfRuntimeHookVarName())) 903 return; 904 905 // Declare an external variable that will pull in the runtime initialization. 906 auto *Int32Ty = Type::getInt32Ty(M->getContext()); 907 auto *Var = 908 new GlobalVariable(*M, Int32Ty, false, GlobalValue::ExternalLinkage, 909 nullptr, getInstrProfRuntimeHookVarName()); 910 911 // Make a function that uses it. 912 auto *User = Function::Create(FunctionType::get(Int32Ty, false), 913 GlobalValue::LinkOnceODRLinkage, 914 getInstrProfRuntimeHookVarUseFuncName(), M); 915 User->addFnAttr(Attribute::NoInline); 916 if (Options.NoRedZone) 917 User->addFnAttr(Attribute::NoRedZone); 918 User->setVisibility(GlobalValue::HiddenVisibility); 919 if (Triple(M->getTargetTriple()).supportsCOMDAT()) 920 User->setComdat(M->getOrInsertComdat(User->getName())); 921 922 IRBuilder<> IRB(BasicBlock::Create(M->getContext(), "", User)); 923 auto *Load = IRB.CreateLoad(Var); 924 IRB.CreateRet(Load); 925 926 // Mark the user variable as used so that it isn't stripped out. 927 UsedVars.push_back(User); 928 } 929 930 void InstrProfiling::emitUses() { 931 if (!UsedVars.empty()) 932 appendToUsed(*M, UsedVars); 933 } 934 935 void InstrProfiling::emitInitialization() { 936 StringRef InstrProfileOutput = Options.InstrProfileOutput; 937 938 if (!InstrProfileOutput.empty()) { 939 // Create variable for profile name. 940 Constant *ProfileNameConst = 941 ConstantDataArray::getString(M->getContext(), InstrProfileOutput, true); 942 GlobalVariable *ProfileNameVar = new GlobalVariable( 943 *M, ProfileNameConst->getType(), true, GlobalValue::WeakAnyLinkage, 944 ProfileNameConst, INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_NAME_VAR)); 945 if (TT.supportsCOMDAT()) { 946 ProfileNameVar->setLinkage(GlobalValue::ExternalLinkage); 947 ProfileNameVar->setComdat(M->getOrInsertComdat( 948 StringRef(INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_NAME_VAR)))); 949 } 950 } 951 952 Constant *RegisterF = M->getFunction(getInstrProfRegFuncsName()); 953 if (!RegisterF) 954 return; 955 956 // Create the initialization function. 957 auto *VoidTy = Type::getVoidTy(M->getContext()); 958 auto *F = Function::Create(FunctionType::get(VoidTy, false), 959 GlobalValue::InternalLinkage, 960 getInstrProfInitFuncName(), M); 961 F->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); 962 F->addFnAttr(Attribute::NoInline); 963 if (Options.NoRedZone) 964 F->addFnAttr(Attribute::NoRedZone); 965 966 // Add the basic block and the necessary calls. 967 IRBuilder<> IRB(BasicBlock::Create(M->getContext(), "", F)); 968 if (RegisterF) 969 IRB.CreateCall(RegisterF, {}); 970 IRB.CreateRetVoid(); 971 972 appendToGlobalCtors(*M, F, 0); 973 } 974