1 //===--- CodeGenPGO.cpp - PGO Instrumentation for LLVM CodeGen --*- C++ -*-===// 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 // Instrumentation-based profile-guided optimization 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "CodeGenPGO.h" 15 #include "CodeGenFunction.h" 16 #include "clang/AST/RecursiveASTVisitor.h" 17 #include "clang/AST/StmtVisitor.h" 18 #include "llvm/Config/config.h" // for strtoull()/strtoll() define 19 #include "llvm/IR/MDBuilder.h" 20 #include "llvm/Support/FileSystem.h" 21 22 using namespace clang; 23 using namespace CodeGen; 24 25 static void ReportBadPGOData(CodeGenModule &CGM, const char *Message) { 26 DiagnosticsEngine &Diags = CGM.getDiags(); 27 unsigned diagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, "%0"); 28 Diags.Report(diagID) << Message; 29 } 30 31 PGOProfileData::PGOProfileData(CodeGenModule &CGM, std::string Path) 32 : CGM(CGM) { 33 if (llvm::MemoryBuffer::getFile(Path, DataBuffer)) { 34 ReportBadPGOData(CGM, "failed to open pgo data file"); 35 return; 36 } 37 38 if (DataBuffer->getBufferSize() > std::numeric_limits<unsigned>::max()) { 39 ReportBadPGOData(CGM, "pgo data file too big"); 40 return; 41 } 42 43 // Scan through the data file and map each function to the corresponding 44 // file offset where its counts are stored. 45 const char *BufferStart = DataBuffer->getBufferStart(); 46 const char *BufferEnd = DataBuffer->getBufferEnd(); 47 const char *CurPtr = BufferStart; 48 uint64_t MaxCount = 0; 49 while (CurPtr < BufferEnd) { 50 // Read the function name. 51 const char *FuncStart = CurPtr; 52 // For Objective-C methods, the name may include whitespace, so search 53 // backward from the end of the line to find the space that separates the 54 // name from the number of counters. (This is a temporary hack since we are 55 // going to completely replace this file format in the near future.) 56 CurPtr = strchr(CurPtr, '\n'); 57 if (!CurPtr) { 58 ReportBadPGOData(CGM, "pgo data file has malformed function entry"); 59 return; 60 } 61 while (*--CurPtr != ' ') 62 ; 63 StringRef FuncName(FuncStart, CurPtr - FuncStart); 64 65 // Read the number of counters. 66 char *EndPtr; 67 unsigned NumCounters = strtol(++CurPtr, &EndPtr, 10); 68 if (EndPtr == CurPtr || *EndPtr != '\n' || NumCounters <= 0) { 69 ReportBadPGOData(CGM, "pgo data file has unexpected number of counters"); 70 return; 71 } 72 CurPtr = EndPtr; 73 74 // Read function count. 75 uint64_t Count = strtoll(CurPtr, &EndPtr, 10); 76 if (EndPtr == CurPtr || *EndPtr != '\n') { 77 ReportBadPGOData(CGM, "pgo-data file has bad count value"); 78 return; 79 } 80 CurPtr = EndPtr; // Point to '\n'. 81 FunctionCounts[FuncName] = Count; 82 MaxCount = Count > MaxCount ? Count : MaxCount; 83 84 // There is one line for each counter; skip over those lines. 85 // Since function count is already read, we start the loop from 1. 86 for (unsigned N = 1; N < NumCounters; ++N) { 87 CurPtr = strchr(++CurPtr, '\n'); 88 if (!CurPtr) { 89 ReportBadPGOData(CGM, "pgo data file is missing some counter info"); 90 return; 91 } 92 } 93 94 // Skip over the blank line separating functions. 95 CurPtr += 2; 96 97 DataOffsets[FuncName] = FuncStart - BufferStart; 98 } 99 MaxFunctionCount = MaxCount; 100 } 101 102 /// Return true if a function is hot. If we know nothing about the function, 103 /// return false. 104 bool PGOProfileData::isHotFunction(StringRef FuncName) { 105 llvm::StringMap<uint64_t>::const_iterator CountIter = 106 FunctionCounts.find(FuncName); 107 // If we know nothing about the function, return false. 108 if (CountIter == FunctionCounts.end()) 109 return false; 110 // FIXME: functions with >= 30% of the maximal function count are 111 // treated as hot. This number is from preliminary tuning on SPEC. 112 return CountIter->getValue() >= (uint64_t)(0.3 * (double)MaxFunctionCount); 113 } 114 115 /// Return true if a function is cold. If we know nothing about the function, 116 /// return false. 117 bool PGOProfileData::isColdFunction(StringRef FuncName) { 118 llvm::StringMap<uint64_t>::const_iterator CountIter = 119 FunctionCounts.find(FuncName); 120 // If we know nothing about the function, return false. 121 if (CountIter == FunctionCounts.end()) 122 return false; 123 // FIXME: functions with <= 1% of the maximal function count are treated as 124 // cold. This number is from preliminary tuning on SPEC. 125 return CountIter->getValue() <= (uint64_t)(0.01 * (double)MaxFunctionCount); 126 } 127 128 bool PGOProfileData::getFunctionCounts(StringRef FuncName, 129 std::vector<uint64_t> &Counts) { 130 // Find the relevant section of the pgo-data file. 131 llvm::StringMap<unsigned>::const_iterator OffsetIter = 132 DataOffsets.find(FuncName); 133 if (OffsetIter == DataOffsets.end()) 134 return true; 135 const char *CurPtr = DataBuffer->getBufferStart() + OffsetIter->getValue(); 136 137 // Skip over the function name. 138 CurPtr = strchr(CurPtr, '\n'); 139 assert(CurPtr && "pgo-data has corrupted function entry"); 140 while (*--CurPtr != ' ') 141 ; 142 143 // Read the number of counters. 144 char *EndPtr; 145 unsigned NumCounters = strtol(++CurPtr, &EndPtr, 10); 146 assert(EndPtr != CurPtr && *EndPtr == '\n' && NumCounters > 0 && 147 "pgo-data file has corrupted number of counters"); 148 CurPtr = EndPtr; 149 150 Counts.reserve(NumCounters); 151 152 for (unsigned N = 0; N < NumCounters; ++N) { 153 // Read the count value. 154 uint64_t Count = strtoll(CurPtr, &EndPtr, 10); 155 if (EndPtr == CurPtr || *EndPtr != '\n') { 156 ReportBadPGOData(CGM, "pgo-data file has bad count value"); 157 return true; 158 } 159 Counts.push_back(Count); 160 CurPtr = EndPtr + 1; 161 } 162 163 // Make sure the number of counters matches up. 164 if (Counts.size() != NumCounters) { 165 ReportBadPGOData(CGM, "pgo-data file has inconsistent counters"); 166 return true; 167 } 168 169 return false; 170 } 171 172 void CodeGenPGO::setFuncName(llvm::Function *Fn) { 173 StringRef Func = Fn->getName(); 174 175 // Function names may be prefixed with a binary '1' to indicate 176 // that the backend should not modify the symbols due to any platform 177 // naming convention. Do not include that '1' in the PGO profile name. 178 if (Func[0] == '\1') 179 Func = Func.substr(1); 180 181 if (!Fn->hasLocalLinkage()) { 182 FuncName = new std::string(Func); 183 return; 184 } 185 186 // For local symbols, prepend the main file name to distinguish them. 187 // Do not include the full path in the file name since there's no guarantee 188 // that it will stay the same, e.g., if the files are checked out from 189 // version control in different locations. 190 FuncName = new std::string(CGM.getCodeGenOpts().MainFileName); 191 if (FuncName->empty()) 192 FuncName->assign("<unknown>"); 193 FuncName->append(":"); 194 FuncName->append(Func); 195 } 196 197 void CodeGenPGO::emitWriteoutFunction() { 198 if (!CGM.getCodeGenOpts().ProfileInstrGenerate) 199 return; 200 201 llvm::LLVMContext &Ctx = CGM.getLLVMContext(); 202 203 llvm::Type *Int32Ty = llvm::Type::getInt32Ty(Ctx); 204 llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(Ctx); 205 206 llvm::Function *WriteoutF = 207 CGM.getModule().getFunction("__llvm_pgo_writeout"); 208 if (!WriteoutF) { 209 llvm::FunctionType *WriteoutFTy = 210 llvm::FunctionType::get(llvm::Type::getVoidTy(Ctx), false); 211 WriteoutF = llvm::Function::Create(WriteoutFTy, 212 llvm::GlobalValue::InternalLinkage, 213 "__llvm_pgo_writeout", &CGM.getModule()); 214 } 215 WriteoutF->setUnnamedAddr(true); 216 WriteoutF->addFnAttr(llvm::Attribute::NoInline); 217 if (CGM.getCodeGenOpts().DisableRedZone) 218 WriteoutF->addFnAttr(llvm::Attribute::NoRedZone); 219 220 llvm::BasicBlock *BB = WriteoutF->empty() ? 221 llvm::BasicBlock::Create(Ctx, "", WriteoutF) : &WriteoutF->getEntryBlock(); 222 223 CGBuilderTy PGOBuilder(BB); 224 225 llvm::Instruction *I = BB->getTerminator(); 226 if (!I) 227 I = PGOBuilder.CreateRetVoid(); 228 PGOBuilder.SetInsertPoint(I); 229 230 llvm::Type *Int64PtrTy = llvm::Type::getInt64PtrTy(Ctx); 231 llvm::Type *Args[] = { 232 Int8PtrTy, // const char *FuncName 233 Int32Ty, // uint32_t NumCounters 234 Int64PtrTy // uint64_t *Counters 235 }; 236 llvm::FunctionType *FTy = 237 llvm::FunctionType::get(PGOBuilder.getVoidTy(), Args, false); 238 llvm::Constant *EmitFunc = 239 CGM.getModule().getOrInsertFunction("llvm_pgo_emit", FTy); 240 241 llvm::Constant *NameString = 242 CGM.GetAddrOfConstantCString(getFuncName(), "__llvm_pgo_name"); 243 NameString = llvm::ConstantExpr::getBitCast(NameString, Int8PtrTy); 244 PGOBuilder.CreateCall3(EmitFunc, NameString, 245 PGOBuilder.getInt32(NumRegionCounters), 246 PGOBuilder.CreateBitCast(RegionCounters, Int64PtrTy)); 247 } 248 249 llvm::Function *CodeGenPGO::emitInitialization(CodeGenModule &CGM) { 250 llvm::Function *WriteoutF = 251 CGM.getModule().getFunction("__llvm_pgo_writeout"); 252 if (!WriteoutF) 253 return NULL; 254 255 // Create a small bit of code that registers the "__llvm_pgo_writeout" to 256 // be executed at exit. 257 llvm::Function *F = CGM.getModule().getFunction("__llvm_pgo_init"); 258 if (F) 259 return NULL; 260 261 llvm::LLVMContext &Ctx = CGM.getLLVMContext(); 262 llvm::FunctionType *FTy = llvm::FunctionType::get(llvm::Type::getVoidTy(Ctx), 263 false); 264 F = llvm::Function::Create(FTy, llvm::GlobalValue::InternalLinkage, 265 "__llvm_pgo_init", &CGM.getModule()); 266 F->setUnnamedAddr(true); 267 F->setLinkage(llvm::GlobalValue::InternalLinkage); 268 F->addFnAttr(llvm::Attribute::NoInline); 269 if (CGM.getCodeGenOpts().DisableRedZone) 270 F->addFnAttr(llvm::Attribute::NoRedZone); 271 272 llvm::BasicBlock *BB = llvm::BasicBlock::Create(CGM.getLLVMContext(), "", F); 273 CGBuilderTy PGOBuilder(BB); 274 275 FTy = llvm::FunctionType::get(PGOBuilder.getVoidTy(), false); 276 llvm::Type *Params[] = { 277 llvm::PointerType::get(FTy, 0) 278 }; 279 FTy = llvm::FunctionType::get(PGOBuilder.getVoidTy(), Params, false); 280 281 // Inialize the environment and register the local writeout function. 282 llvm::Constant *PGOInit = 283 CGM.getModule().getOrInsertFunction("llvm_pgo_init", FTy); 284 PGOBuilder.CreateCall(PGOInit, WriteoutF); 285 PGOBuilder.CreateRetVoid(); 286 287 return F; 288 } 289 290 namespace { 291 /// A StmtVisitor that fills a map of statements to PGO counters. 292 struct MapRegionCounters : public ConstStmtVisitor<MapRegionCounters> { 293 /// The next counter value to assign. 294 unsigned NextCounter; 295 /// The map of statements to counters. 296 llvm::DenseMap<const Stmt*, unsigned> *CounterMap; 297 298 MapRegionCounters(llvm::DenseMap<const Stmt*, unsigned> *CounterMap) : 299 NextCounter(0), CounterMap(CounterMap) { 300 } 301 302 void VisitChildren(const Stmt *S) { 303 for (Stmt::const_child_range I = S->children(); I; ++I) 304 if (*I) 305 this->Visit(*I); 306 } 307 void VisitStmt(const Stmt *S) { VisitChildren(S); } 308 309 /// Assign a counter to track entry to the function body. 310 void VisitFunctionDecl(const FunctionDecl *S) { 311 (*CounterMap)[S->getBody()] = NextCounter++; 312 Visit(S->getBody()); 313 } 314 void VisitObjCMethodDecl(const ObjCMethodDecl *S) { 315 (*CounterMap)[S->getBody()] = NextCounter++; 316 Visit(S->getBody()); 317 } 318 void VisitBlockDecl(const BlockDecl *S) { 319 (*CounterMap)[S->getBody()] = NextCounter++; 320 Visit(S->getBody()); 321 } 322 /// Assign a counter to track the block following a label. 323 void VisitLabelStmt(const LabelStmt *S) { 324 (*CounterMap)[S] = NextCounter++; 325 Visit(S->getSubStmt()); 326 } 327 /// Assign a counter for the body of a while loop. 328 void VisitWhileStmt(const WhileStmt *S) { 329 (*CounterMap)[S] = NextCounter++; 330 Visit(S->getCond()); 331 Visit(S->getBody()); 332 } 333 /// Assign a counter for the body of a do-while loop. 334 void VisitDoStmt(const DoStmt *S) { 335 (*CounterMap)[S] = NextCounter++; 336 Visit(S->getBody()); 337 Visit(S->getCond()); 338 } 339 /// Assign a counter for the body of a for loop. 340 void VisitForStmt(const ForStmt *S) { 341 (*CounterMap)[S] = NextCounter++; 342 if (S->getInit()) 343 Visit(S->getInit()); 344 const Expr *E; 345 if ((E = S->getCond())) 346 Visit(E); 347 if ((E = S->getInc())) 348 Visit(E); 349 Visit(S->getBody()); 350 } 351 /// Assign a counter for the body of a for-range loop. 352 void VisitCXXForRangeStmt(const CXXForRangeStmt *S) { 353 (*CounterMap)[S] = NextCounter++; 354 Visit(S->getRangeStmt()); 355 Visit(S->getBeginEndStmt()); 356 Visit(S->getCond()); 357 Visit(S->getLoopVarStmt()); 358 Visit(S->getBody()); 359 Visit(S->getInc()); 360 } 361 /// Assign a counter for the body of a for-collection loop. 362 void VisitObjCForCollectionStmt(const ObjCForCollectionStmt *S) { 363 (*CounterMap)[S] = NextCounter++; 364 Visit(S->getElement()); 365 Visit(S->getBody()); 366 } 367 /// Assign a counter for the exit block of the switch statement. 368 void VisitSwitchStmt(const SwitchStmt *S) { 369 (*CounterMap)[S] = NextCounter++; 370 Visit(S->getCond()); 371 Visit(S->getBody()); 372 } 373 /// Assign a counter for a particular case in a switch. This counts jumps 374 /// from the switch header as well as fallthrough from the case before this 375 /// one. 376 void VisitCaseStmt(const CaseStmt *S) { 377 (*CounterMap)[S] = NextCounter++; 378 Visit(S->getSubStmt()); 379 } 380 /// Assign a counter for the default case of a switch statement. The count 381 /// is the number of branches from the loop header to the default, and does 382 /// not include fallthrough from previous cases. If we have multiple 383 /// conditional branch blocks from the switch instruction to the default 384 /// block, as with large GNU case ranges, this is the counter for the last 385 /// edge in that series, rather than the first. 386 void VisitDefaultStmt(const DefaultStmt *S) { 387 (*CounterMap)[S] = NextCounter++; 388 Visit(S->getSubStmt()); 389 } 390 /// Assign a counter for the "then" part of an if statement. The count for 391 /// the "else" part, if it exists, will be calculated from this counter. 392 void VisitIfStmt(const IfStmt *S) { 393 (*CounterMap)[S] = NextCounter++; 394 Visit(S->getCond()); 395 Visit(S->getThen()); 396 if (S->getElse()) 397 Visit(S->getElse()); 398 } 399 /// Assign a counter for the continuation block of a C++ try statement. 400 void VisitCXXTryStmt(const CXXTryStmt *S) { 401 (*CounterMap)[S] = NextCounter++; 402 Visit(S->getTryBlock()); 403 for (unsigned I = 0, E = S->getNumHandlers(); I < E; ++I) 404 Visit(S->getHandler(I)); 405 } 406 /// Assign a counter for a catch statement's handler block. 407 void VisitCXXCatchStmt(const CXXCatchStmt *S) { 408 (*CounterMap)[S] = NextCounter++; 409 Visit(S->getHandlerBlock()); 410 } 411 /// Assign a counter for the "true" part of a conditional operator. The 412 /// count in the "false" part will be calculated from this counter. 413 void VisitConditionalOperator(const ConditionalOperator *E) { 414 (*CounterMap)[E] = NextCounter++; 415 Visit(E->getCond()); 416 Visit(E->getTrueExpr()); 417 Visit(E->getFalseExpr()); 418 } 419 /// Assign a counter for the right hand side of a logical and operator. 420 void VisitBinLAnd(const BinaryOperator *E) { 421 (*CounterMap)[E] = NextCounter++; 422 Visit(E->getLHS()); 423 Visit(E->getRHS()); 424 } 425 /// Assign a counter for the right hand side of a logical or operator. 426 void VisitBinLOr(const BinaryOperator *E) { 427 (*CounterMap)[E] = NextCounter++; 428 Visit(E->getLHS()); 429 Visit(E->getRHS()); 430 } 431 }; 432 433 /// A StmtVisitor that propagates the raw counts through the AST and 434 /// records the count at statements where the value may change. 435 struct ComputeRegionCounts : public ConstStmtVisitor<ComputeRegionCounts> { 436 /// PGO state. 437 CodeGenPGO &PGO; 438 439 /// A flag that is set when the current count should be recorded on the 440 /// next statement, such as at the exit of a loop. 441 bool RecordNextStmtCount; 442 443 /// The map of statements to count values. 444 llvm::DenseMap<const Stmt*, uint64_t> *CountMap; 445 446 /// BreakContinueStack - Keep counts of breaks and continues inside loops. 447 struct BreakContinue { 448 uint64_t BreakCount; 449 uint64_t ContinueCount; 450 BreakContinue() : BreakCount(0), ContinueCount(0) {} 451 }; 452 SmallVector<BreakContinue, 8> BreakContinueStack; 453 454 ComputeRegionCounts(llvm::DenseMap<const Stmt*, uint64_t> *CountMap, 455 CodeGenPGO &PGO) : 456 PGO(PGO), RecordNextStmtCount(false), CountMap(CountMap) { 457 } 458 459 void RecordStmtCount(const Stmt *S) { 460 if (RecordNextStmtCount) { 461 (*CountMap)[S] = PGO.getCurrentRegionCount(); 462 RecordNextStmtCount = false; 463 } 464 } 465 466 void VisitStmt(const Stmt *S) { 467 RecordStmtCount(S); 468 for (Stmt::const_child_range I = S->children(); I; ++I) { 469 if (*I) 470 this->Visit(*I); 471 } 472 } 473 474 void VisitFunctionDecl(const FunctionDecl *S) { 475 RegionCounter Cnt(PGO, S->getBody()); 476 Cnt.beginRegion(); 477 (*CountMap)[S->getBody()] = PGO.getCurrentRegionCount(); 478 Visit(S->getBody()); 479 } 480 481 void VisitObjCMethodDecl(const ObjCMethodDecl *S) { 482 RegionCounter Cnt(PGO, S->getBody()); 483 Cnt.beginRegion(); 484 (*CountMap)[S->getBody()] = PGO.getCurrentRegionCount(); 485 Visit(S->getBody()); 486 } 487 488 void VisitBlockDecl(const BlockDecl *S) { 489 RegionCounter Cnt(PGO, S->getBody()); 490 Cnt.beginRegion(); 491 (*CountMap)[S->getBody()] = PGO.getCurrentRegionCount(); 492 Visit(S->getBody()); 493 } 494 495 void VisitReturnStmt(const ReturnStmt *S) { 496 RecordStmtCount(S); 497 if (S->getRetValue()) 498 Visit(S->getRetValue()); 499 PGO.setCurrentRegionUnreachable(); 500 RecordNextStmtCount = true; 501 } 502 503 void VisitGotoStmt(const GotoStmt *S) { 504 RecordStmtCount(S); 505 PGO.setCurrentRegionUnreachable(); 506 RecordNextStmtCount = true; 507 } 508 509 void VisitLabelStmt(const LabelStmt *S) { 510 RecordNextStmtCount = false; 511 RegionCounter Cnt(PGO, S); 512 Cnt.beginRegion(); 513 (*CountMap)[S] = PGO.getCurrentRegionCount(); 514 Visit(S->getSubStmt()); 515 } 516 517 void VisitBreakStmt(const BreakStmt *S) { 518 RecordStmtCount(S); 519 assert(!BreakContinueStack.empty() && "break not in a loop or switch!"); 520 BreakContinueStack.back().BreakCount += PGO.getCurrentRegionCount(); 521 PGO.setCurrentRegionUnreachable(); 522 RecordNextStmtCount = true; 523 } 524 525 void VisitContinueStmt(const ContinueStmt *S) { 526 RecordStmtCount(S); 527 assert(!BreakContinueStack.empty() && "continue stmt not in a loop!"); 528 BreakContinueStack.back().ContinueCount += PGO.getCurrentRegionCount(); 529 PGO.setCurrentRegionUnreachable(); 530 RecordNextStmtCount = true; 531 } 532 533 void VisitWhileStmt(const WhileStmt *S) { 534 RecordStmtCount(S); 535 RegionCounter Cnt(PGO, S); 536 BreakContinueStack.push_back(BreakContinue()); 537 // Visit the body region first so the break/continue adjustments can be 538 // included when visiting the condition. 539 Cnt.beginRegion(); 540 (*CountMap)[S->getBody()] = PGO.getCurrentRegionCount(); 541 Visit(S->getBody()); 542 Cnt.adjustForControlFlow(); 543 544 // ...then go back and propagate counts through the condition. The count 545 // at the start of the condition is the sum of the incoming edges, 546 // the backedge from the end of the loop body, and the edges from 547 // continue statements. 548 BreakContinue BC = BreakContinueStack.pop_back_val(); 549 Cnt.setCurrentRegionCount(Cnt.getParentCount() + 550 Cnt.getAdjustedCount() + BC.ContinueCount); 551 (*CountMap)[S->getCond()] = PGO.getCurrentRegionCount(); 552 Visit(S->getCond()); 553 Cnt.adjustForControlFlow(); 554 Cnt.applyAdjustmentsToRegion(BC.BreakCount + BC.ContinueCount); 555 RecordNextStmtCount = true; 556 } 557 558 void VisitDoStmt(const DoStmt *S) { 559 RecordStmtCount(S); 560 RegionCounter Cnt(PGO, S); 561 BreakContinueStack.push_back(BreakContinue()); 562 Cnt.beginRegion(/*AddIncomingFallThrough=*/true); 563 (*CountMap)[S->getBody()] = PGO.getCurrentRegionCount(); 564 Visit(S->getBody()); 565 Cnt.adjustForControlFlow(); 566 567 BreakContinue BC = BreakContinueStack.pop_back_val(); 568 // The count at the start of the condition is equal to the count at the 569 // end of the body. The adjusted count does not include either the 570 // fall-through count coming into the loop or the continue count, so add 571 // both of those separately. This is coincidentally the same equation as 572 // with while loops but for different reasons. 573 Cnt.setCurrentRegionCount(Cnt.getParentCount() + 574 Cnt.getAdjustedCount() + BC.ContinueCount); 575 (*CountMap)[S->getCond()] = PGO.getCurrentRegionCount(); 576 Visit(S->getCond()); 577 Cnt.adjustForControlFlow(); 578 Cnt.applyAdjustmentsToRegion(BC.BreakCount + BC.ContinueCount); 579 RecordNextStmtCount = true; 580 } 581 582 void VisitForStmt(const ForStmt *S) { 583 RecordStmtCount(S); 584 if (S->getInit()) 585 Visit(S->getInit()); 586 RegionCounter Cnt(PGO, S); 587 BreakContinueStack.push_back(BreakContinue()); 588 // Visit the body region first. (This is basically the same as a while 589 // loop; see further comments in VisitWhileStmt.) 590 Cnt.beginRegion(); 591 (*CountMap)[S->getBody()] = PGO.getCurrentRegionCount(); 592 Visit(S->getBody()); 593 Cnt.adjustForControlFlow(); 594 595 // The increment is essentially part of the body but it needs to include 596 // the count for all the continue statements. 597 if (S->getInc()) { 598 Cnt.setCurrentRegionCount(PGO.getCurrentRegionCount() + 599 BreakContinueStack.back().ContinueCount); 600 (*CountMap)[S->getInc()] = PGO.getCurrentRegionCount(); 601 Visit(S->getInc()); 602 Cnt.adjustForControlFlow(); 603 } 604 605 BreakContinue BC = BreakContinueStack.pop_back_val(); 606 607 // ...then go back and propagate counts through the condition. 608 if (S->getCond()) { 609 Cnt.setCurrentRegionCount(Cnt.getParentCount() + 610 Cnt.getAdjustedCount() + 611 BC.ContinueCount); 612 (*CountMap)[S->getCond()] = PGO.getCurrentRegionCount(); 613 Visit(S->getCond()); 614 Cnt.adjustForControlFlow(); 615 } 616 Cnt.applyAdjustmentsToRegion(BC.BreakCount + BC.ContinueCount); 617 RecordNextStmtCount = true; 618 } 619 620 void VisitCXXForRangeStmt(const CXXForRangeStmt *S) { 621 RecordStmtCount(S); 622 Visit(S->getRangeStmt()); 623 Visit(S->getBeginEndStmt()); 624 RegionCounter Cnt(PGO, S); 625 BreakContinueStack.push_back(BreakContinue()); 626 // Visit the body region first. (This is basically the same as a while 627 // loop; see further comments in VisitWhileStmt.) 628 Cnt.beginRegion(); 629 (*CountMap)[S->getLoopVarStmt()] = PGO.getCurrentRegionCount(); 630 Visit(S->getLoopVarStmt()); 631 Visit(S->getBody()); 632 Cnt.adjustForControlFlow(); 633 634 // The increment is essentially part of the body but it needs to include 635 // the count for all the continue statements. 636 Cnt.setCurrentRegionCount(PGO.getCurrentRegionCount() + 637 BreakContinueStack.back().ContinueCount); 638 (*CountMap)[S->getInc()] = PGO.getCurrentRegionCount(); 639 Visit(S->getInc()); 640 Cnt.adjustForControlFlow(); 641 642 BreakContinue BC = BreakContinueStack.pop_back_val(); 643 644 // ...then go back and propagate counts through the condition. 645 Cnt.setCurrentRegionCount(Cnt.getParentCount() + 646 Cnt.getAdjustedCount() + 647 BC.ContinueCount); 648 (*CountMap)[S->getCond()] = PGO.getCurrentRegionCount(); 649 Visit(S->getCond()); 650 Cnt.adjustForControlFlow(); 651 Cnt.applyAdjustmentsToRegion(BC.BreakCount + BC.ContinueCount); 652 RecordNextStmtCount = true; 653 } 654 655 void VisitObjCForCollectionStmt(const ObjCForCollectionStmt *S) { 656 RecordStmtCount(S); 657 Visit(S->getElement()); 658 RegionCounter Cnt(PGO, S); 659 BreakContinueStack.push_back(BreakContinue()); 660 Cnt.beginRegion(); 661 (*CountMap)[S->getBody()] = PGO.getCurrentRegionCount(); 662 Visit(S->getBody()); 663 BreakContinue BC = BreakContinueStack.pop_back_val(); 664 Cnt.adjustForControlFlow(); 665 Cnt.applyAdjustmentsToRegion(BC.BreakCount + BC.ContinueCount); 666 RecordNextStmtCount = true; 667 } 668 669 void VisitSwitchStmt(const SwitchStmt *S) { 670 RecordStmtCount(S); 671 Visit(S->getCond()); 672 PGO.setCurrentRegionUnreachable(); 673 BreakContinueStack.push_back(BreakContinue()); 674 Visit(S->getBody()); 675 // If the switch is inside a loop, add the continue counts. 676 BreakContinue BC = BreakContinueStack.pop_back_val(); 677 if (!BreakContinueStack.empty()) 678 BreakContinueStack.back().ContinueCount += BC.ContinueCount; 679 RegionCounter ExitCnt(PGO, S); 680 ExitCnt.beginRegion(); 681 RecordNextStmtCount = true; 682 } 683 684 void VisitCaseStmt(const CaseStmt *S) { 685 RecordNextStmtCount = false; 686 RegionCounter Cnt(PGO, S); 687 Cnt.beginRegion(/*AddIncomingFallThrough=*/true); 688 (*CountMap)[S] = Cnt.getCount(); 689 RecordNextStmtCount = true; 690 Visit(S->getSubStmt()); 691 } 692 693 void VisitDefaultStmt(const DefaultStmt *S) { 694 RecordNextStmtCount = false; 695 RegionCounter Cnt(PGO, S); 696 Cnt.beginRegion(/*AddIncomingFallThrough=*/true); 697 (*CountMap)[S] = Cnt.getCount(); 698 RecordNextStmtCount = true; 699 Visit(S->getSubStmt()); 700 } 701 702 void VisitIfStmt(const IfStmt *S) { 703 RecordStmtCount(S); 704 RegionCounter Cnt(PGO, S); 705 Visit(S->getCond()); 706 707 Cnt.beginRegion(); 708 (*CountMap)[S->getThen()] = PGO.getCurrentRegionCount(); 709 Visit(S->getThen()); 710 Cnt.adjustForControlFlow(); 711 712 if (S->getElse()) { 713 Cnt.beginElseRegion(); 714 (*CountMap)[S->getElse()] = PGO.getCurrentRegionCount(); 715 Visit(S->getElse()); 716 Cnt.adjustForControlFlow(); 717 } 718 Cnt.applyAdjustmentsToRegion(0); 719 RecordNextStmtCount = true; 720 } 721 722 void VisitCXXTryStmt(const CXXTryStmt *S) { 723 RecordStmtCount(S); 724 Visit(S->getTryBlock()); 725 for (unsigned I = 0, E = S->getNumHandlers(); I < E; ++I) 726 Visit(S->getHandler(I)); 727 RegionCounter Cnt(PGO, S); 728 Cnt.beginRegion(); 729 RecordNextStmtCount = true; 730 } 731 732 void VisitCXXCatchStmt(const CXXCatchStmt *S) { 733 RecordNextStmtCount = false; 734 RegionCounter Cnt(PGO, S); 735 Cnt.beginRegion(); 736 (*CountMap)[S] = PGO.getCurrentRegionCount(); 737 Visit(S->getHandlerBlock()); 738 } 739 740 void VisitConditionalOperator(const ConditionalOperator *E) { 741 RecordStmtCount(E); 742 RegionCounter Cnt(PGO, E); 743 Visit(E->getCond()); 744 745 Cnt.beginRegion(); 746 (*CountMap)[E->getTrueExpr()] = PGO.getCurrentRegionCount(); 747 Visit(E->getTrueExpr()); 748 Cnt.adjustForControlFlow(); 749 750 Cnt.beginElseRegion(); 751 (*CountMap)[E->getFalseExpr()] = PGO.getCurrentRegionCount(); 752 Visit(E->getFalseExpr()); 753 Cnt.adjustForControlFlow(); 754 755 Cnt.applyAdjustmentsToRegion(0); 756 RecordNextStmtCount = true; 757 } 758 759 void VisitBinLAnd(const BinaryOperator *E) { 760 RecordStmtCount(E); 761 RegionCounter Cnt(PGO, E); 762 Visit(E->getLHS()); 763 Cnt.beginRegion(); 764 (*CountMap)[E->getRHS()] = PGO.getCurrentRegionCount(); 765 Visit(E->getRHS()); 766 Cnt.adjustForControlFlow(); 767 Cnt.applyAdjustmentsToRegion(0); 768 RecordNextStmtCount = true; 769 } 770 771 void VisitBinLOr(const BinaryOperator *E) { 772 RecordStmtCount(E); 773 RegionCounter Cnt(PGO, E); 774 Visit(E->getLHS()); 775 Cnt.beginRegion(); 776 (*CountMap)[E->getRHS()] = PGO.getCurrentRegionCount(); 777 Visit(E->getRHS()); 778 Cnt.adjustForControlFlow(); 779 Cnt.applyAdjustmentsToRegion(0); 780 RecordNextStmtCount = true; 781 } 782 }; 783 } 784 785 void CodeGenPGO::assignRegionCounters(const Decl *D, llvm::Function *Fn) { 786 bool InstrumentRegions = CGM.getCodeGenOpts().ProfileInstrGenerate; 787 PGOProfileData *PGOData = CGM.getPGOData(); 788 if (!InstrumentRegions && !PGOData) 789 return; 790 if (!D) 791 return; 792 setFuncName(Fn); 793 mapRegionCounters(D); 794 if (InstrumentRegions) 795 emitCounterVariables(); 796 if (PGOData) { 797 loadRegionCounts(PGOData); 798 computeRegionCounts(D); 799 800 // Turn on InlineHint attribute for hot functions. 801 if (PGOData->isHotFunction(getFuncName())) 802 Fn->addFnAttr(llvm::Attribute::InlineHint); 803 // Turn on Cold attribute for cold functions. 804 else if (PGOData->isColdFunction(getFuncName())) 805 Fn->addFnAttr(llvm::Attribute::Cold); 806 } 807 } 808 809 void CodeGenPGO::mapRegionCounters(const Decl *D) { 810 RegionCounterMap = new llvm::DenseMap<const Stmt*, unsigned>(); 811 MapRegionCounters Walker(RegionCounterMap); 812 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) 813 Walker.VisitFunctionDecl(FD); 814 else if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D)) 815 Walker.VisitObjCMethodDecl(MD); 816 else if (const BlockDecl *BD = dyn_cast_or_null<BlockDecl>(D)) 817 Walker.VisitBlockDecl(BD); 818 NumRegionCounters = Walker.NextCounter; 819 } 820 821 void CodeGenPGO::computeRegionCounts(const Decl *D) { 822 StmtCountMap = new llvm::DenseMap<const Stmt*, uint64_t>(); 823 ComputeRegionCounts Walker(StmtCountMap, *this); 824 if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) 825 Walker.VisitFunctionDecl(FD); 826 else if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D)) 827 Walker.VisitObjCMethodDecl(MD); 828 else if (const BlockDecl *BD = dyn_cast_or_null<BlockDecl>(D)) 829 Walker.VisitBlockDecl(BD); 830 } 831 832 void CodeGenPGO::emitCounterVariables() { 833 llvm::LLVMContext &Ctx = CGM.getLLVMContext(); 834 llvm::ArrayType *CounterTy = llvm::ArrayType::get(llvm::Type::getInt64Ty(Ctx), 835 NumRegionCounters); 836 RegionCounters = 837 new llvm::GlobalVariable(CGM.getModule(), CounterTy, false, 838 llvm::GlobalVariable::PrivateLinkage, 839 llvm::Constant::getNullValue(CounterTy), 840 "__llvm_pgo_ctr"); 841 } 842 843 void CodeGenPGO::emitCounterIncrement(CGBuilderTy &Builder, unsigned Counter) { 844 if (!RegionCounters) 845 return; 846 llvm::Value *Addr = 847 Builder.CreateConstInBoundsGEP2_64(RegionCounters, 0, Counter); 848 llvm::Value *Count = Builder.CreateLoad(Addr, "pgocount"); 849 Count = Builder.CreateAdd(Count, Builder.getInt64(1)); 850 Builder.CreateStore(Count, Addr); 851 } 852 853 void CodeGenPGO::loadRegionCounts(PGOProfileData *PGOData) { 854 // For now, ignore the counts from the PGO data file only if the number of 855 // counters does not match. This could be tightened down in the future to 856 // ignore counts when the input changes in various ways, e.g., by comparing a 857 // hash value based on some characteristics of the input. 858 RegionCounts = new std::vector<uint64_t>(); 859 if (PGOData->getFunctionCounts(getFuncName(), *RegionCounts) || 860 RegionCounts->size() != NumRegionCounters) { 861 delete RegionCounts; 862 RegionCounts = 0; 863 } 864 } 865 866 void CodeGenPGO::destroyRegionCounters() { 867 if (RegionCounterMap != 0) 868 delete RegionCounterMap; 869 if (StmtCountMap != 0) 870 delete StmtCountMap; 871 if (RegionCounts != 0) 872 delete RegionCounts; 873 } 874 875 llvm::MDNode *CodeGenPGO::createBranchWeights(uint64_t TrueCount, 876 uint64_t FalseCount) { 877 if (!TrueCount && !FalseCount) 878 return 0; 879 880 llvm::MDBuilder MDHelper(CGM.getLLVMContext()); 881 // TODO: need to scale down to 32-bits 882 // According to Laplace's Rule of Succession, it is better to compute the 883 // weight based on the count plus 1. 884 return MDHelper.createBranchWeights(TrueCount + 1, FalseCount + 1); 885 } 886 887 llvm::MDNode *CodeGenPGO::createBranchWeights(ArrayRef<uint64_t> Weights) { 888 llvm::MDBuilder MDHelper(CGM.getLLVMContext()); 889 // TODO: need to scale down to 32-bits, instead of just truncating. 890 // According to Laplace's Rule of Succession, it is better to compute the 891 // weight based on the count plus 1. 892 SmallVector<uint32_t, 16> ScaledWeights; 893 ScaledWeights.reserve(Weights.size()); 894 for (ArrayRef<uint64_t>::iterator WI = Weights.begin(), WE = Weights.end(); 895 WI != WE; ++WI) { 896 ScaledWeights.push_back(*WI + 1); 897 } 898 return MDHelper.createBranchWeights(ScaledWeights); 899 } 900 901 llvm::MDNode *CodeGenPGO::createLoopWeights(const Stmt *Cond, 902 RegionCounter &Cnt) { 903 if (!haveRegionCounts()) 904 return 0; 905 uint64_t LoopCount = Cnt.getCount(); 906 uint64_t CondCount = 0; 907 bool Found = getStmtCount(Cond, CondCount); 908 assert(Found && "missing expected loop condition count"); 909 (void)Found; 910 if (CondCount == 0) 911 return 0; 912 return createBranchWeights(LoopCount, 913 std::max(CondCount, LoopCount) - LoopCount); 914 } 915