@@ -22,8 +22,6 @@ namespace opts {
22
22
extern cl::opt<unsigned > Verbosity;
23
23
extern cl::OptionCategory BoltOptCategory;
24
24
extern cl::opt<bool > InferStaleProfile;
25
- extern cl::opt<bool > MatchProfileWithFunctionHash;
26
- extern cl::opt<bool > Lite;
27
25
28
26
static llvm::cl::opt<bool >
29
27
IgnoreHash (" profile-ignore-hash" ,
@@ -365,19 +363,9 @@ Error YAMLProfileReader::readProfile(BinaryContext &BC) {
365
363
return Profile.Hash == static_cast <uint64_t >(BF.getHash ());
366
364
};
367
365
368
- uint64_t MatchedWithExactName = 0 ;
369
- uint64_t MatchedWithHash = 0 ;
370
- uint64_t MatchedWithLTOCommonName = 0 ;
371
-
372
- // Computes hash for binary functions.
373
- if (opts::MatchProfileWithFunctionHash)
374
- for (auto &[_, BF] : BC.getBinaryFunctions ())
375
- BF.computeHash (YamlBP.Header .IsDFSOrder , YamlBP.Header .HashFunction );
376
- else if (!opts::IgnoreHash)
377
- for (BinaryFunction *BF : ProfileBFs)
378
- BF->computeHash (YamlBP.Header .IsDFSOrder , YamlBP.Header .HashFunction );
379
-
380
- // This first pass assigns profiles that match 100% by name and by hash.
366
+ // We have to do 2 passes since LTO introduces an ambiguity in function
367
+ // names. The first pass assigns profiles that match 100% by name and
368
+ // by hash. The second pass allows name ambiguity for LTO private functions.
381
369
for (auto [YamlBF, BF] : llvm::zip_equal (YamlBP.Functions , ProfileBFs)) {
382
370
if (!BF)
383
371
continue ;
@@ -386,34 +374,15 @@ Error YAMLProfileReader::readProfile(BinaryContext &BC) {
386
374
// the profile.
387
375
Function.setExecutionCount (BinaryFunction::COUNT_NO_PROFILE);
388
376
389
- if (profileMatches (YamlBF, Function)) {
390
- matchProfileToFunction (YamlBF, Function);
391
- ++MatchedWithExactName;
392
- }
393
- }
394
-
395
- // Uses the strict hash of profiled and binary functions to match functions
396
- // that are not matched by name or common name.
397
- if (opts::MatchProfileWithFunctionHash) {
398
- std::unordered_map<size_t , BinaryFunction *> StrictHashToBF;
399
- StrictHashToBF.reserve (BC.getBinaryFunctions ().size ());
377
+ // Recompute hash once per function.
378
+ if (!opts::IgnoreHash)
379
+ Function.computeHash (YamlBP.Header .IsDFSOrder ,
380
+ YamlBP.Header .HashFunction );
400
381
401
- for (auto &[_, BF] : BC.getBinaryFunctions ())
402
- StrictHashToBF[BF.getHash ()] = &BF;
403
-
404
- for (yaml::bolt::BinaryFunctionProfile &YamlBF : YamlBP.Functions ) {
405
- if (YamlBF.Used )
406
- continue ;
407
- auto It = StrictHashToBF.find (YamlBF.Hash );
408
- if (It != StrictHashToBF.end () && !ProfiledFunctions.count (It->second )) {
409
- BinaryFunction *BF = It->second ;
410
- matchProfileToFunction (YamlBF, *BF);
411
- ++MatchedWithHash;
412
- }
413
- }
382
+ if (profileMatches (YamlBF, Function))
383
+ matchProfileToFunction (YamlBF, Function);
414
384
}
415
385
416
- // This second pass allows name ambiguity for LTO private functions.
417
386
for (const auto &[CommonName, LTOProfiles] : LTOCommonNameMap) {
418
387
if (!LTOCommonNameFunctionMap.contains (CommonName))
419
388
continue ;
@@ -427,7 +396,6 @@ Error YAMLProfileReader::readProfile(BinaryContext &BC) {
427
396
for (BinaryFunction *BF : Functions) {
428
397
if (!ProfiledFunctions.count (BF) && profileMatches (*YamlBF, *BF)) {
429
398
matchProfileToFunction (*YamlBF, *BF);
430
- ++MatchedWithLTOCommonName;
431
399
return true ;
432
400
}
433
401
}
@@ -439,10 +407,8 @@ Error YAMLProfileReader::readProfile(BinaryContext &BC) {
439
407
// partially.
440
408
if (!ProfileMatched && LTOProfiles.size () == 1 && Functions.size () == 1 &&
441
409
!LTOProfiles.front ()->Used &&
442
- !ProfiledFunctions.count (*Functions.begin ())) {
410
+ !ProfiledFunctions.count (*Functions.begin ()))
443
411
matchProfileToFunction (*LTOProfiles.front (), **Functions.begin ());
444
- ++MatchedWithLTOCommonName;
445
- }
446
412
}
447
413
448
414
for (auto [YamlBF, BF] : llvm::zip_equal (YamlBP.Functions , ProfileBFs))
@@ -454,15 +420,6 @@ Error YAMLProfileReader::readProfile(BinaryContext &BC) {
454
420
errs () << " BOLT-WARNING: profile ignored for function " << YamlBF.Name
455
421
<< ' \n ' ;
456
422
457
- if (opts::Verbosity >= 2 ) {
458
- outs () << " BOLT-INFO: matched " << MatchedWithExactName
459
- << " functions with identical names\n " ;
460
- outs () << " BOLT-INFO: matched " << MatchedWithHash
461
- << " functions with hash\n " ;
462
- outs () << " BOLT-INFO: matched " << MatchedWithLTOCommonName
463
- << " functions with matching LTO common names\n " ;
464
- }
465
-
466
423
// Set for parseFunctionProfile().
467
424
NormalizeByInsnCount = usesEvent (" cycles" ) || usesEvent (" instructions" );
468
425
NormalizeByCalls = usesEvent (" branches" );
@@ -482,11 +439,6 @@ Error YAMLProfileReader::readProfile(BinaryContext &BC) {
482
439
483
440
BC.setNumUnusedProfiledObjects (NumUnused);
484
441
485
- if (opts::Lite)
486
- for (BinaryFunction *BF : BC.getAllBinaryFunctions ())
487
- if (!BF->hasProfile ())
488
- BF->setIgnored ();
489
-
490
442
return Error::success ();
491
443
}
492
444
0 commit comments