LLVM: lib/Analysis/ModuleSummaryAnalysis.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

56#include

57#include

58#include

59

60using namespace llvm;

62

63#define DEBUG_TYPE "module-summary-analysis"

64

65

66

67namespace llvm {

70

73 cl::desc("Force all edges in the function summary to cold"),

76 "all-non-critical", "All non-critical edges."),

78

81 cl::desc("File to emit dot graph of new summary into"));

82

86 "Enable MemProf support for summarizing and cloning indirect calls"));

87

89

91

93}

94

95

96

97

98

99

100

101

102

103

104

105

106

107static bool

111 bool &RefLocalLinkageIFunc) {

112 bool HasBlockAddress = false;

114 if (Visited.insert(CurUser).second)

116

117 while (!Worklist.empty()) {

120

121 for (const auto &OI : U->operands()) {

123 if (!Operand)

124 continue;

126 HasBlockAddress = true;

127 continue;

128 }

130

131

132

133 if (!(CB && CB->isCallee(&OI))) {

134

135

136

137

139 GI && GI->hasLocalLinkage()) {

140 RefLocalLinkageIFunc = true;

141 continue;

142 }

143 RefEdges.insert(Index.getOrInsertValueInfo(GV));

144 }

145 continue;

146 }

147 if (Visited.insert(Operand).second)

149 }

150 }

151

153 if (I) {

155

156

159

160 for (const auto &V : ValueDataArray)

161 RefEdges.insert(Index.getOrInsertValueInfo(

162 V.Value));

163 }

164 return HasBlockAddress;

165}

166

177

181

182

183

187 &VCalls,

189 std::vectorFunctionSummary::ConstVCall> &ConstVCalls) {

190 std::vector<uint64_t> Args;

191

194 if (!CI || CI->getBitWidth() > 64) {

195 VCalls.insert({Guid, Call.Offset});

196 return;

197 }

198 Args.push_back(CI->getZExtValue());

199 }

200 ConstVCalls.insert({{Guid, Call.Offset}, std::move(Args)});

201}

202

203

204

209 &TypeTestAssumeVCalls,

211 &TypeCheckedLoadVCalls,

213 std::vectorFunctionSummary::ConstVCall>

214 &TypeTestAssumeConstVCalls,

216 std::vectorFunctionSummary::ConstVCall>

217 &TypeCheckedLoadConstVCalls,

220 case Intrinsic::type_test:

221 case Intrinsic::public_type_test: {

224 if (!TypeId)

225 break;

228

229

230

231

232

234 return !isa(CIU.getUser());

235 });

236 if (HasNonAssumeUses)

237 TypeTests.insert(Guid);

238

242 for (auto &Call : DevirtCalls)

244 TypeTestAssumeConstVCalls);

245

246 break;

247 }

248

249 case Intrinsic::type_checked_load_relative:

250 case Intrinsic::type_checked_load: {

253 if (!TypeId)

254 break;

257

261 bool HasNonCallUses = false;

263 HasNonCallUses, CI, DT);

264

265

266 if (HasNonCallUses)

267 TypeTests.insert(Guid);

268 for (auto &Call : DevirtCalls)

270 TypeCheckedLoadConstVCalls);

271

272 break;

273 }

274 default:

275 break;

276 }

277}

278

281 return !LI->isVolatile();

282

283 return false;

284}

285

288 return SI->isVolatile();

289

290 return false;

291}

292

293

294

295

296

297

299

300

301 assert(F.isDeclaration());

303}

304

309 bool IsThinLTO,

311

312

314

315 unsigned NumInsts = 0;

316

317

320 CallGraphEdges;

322 StoreRefEdges;

325 TypeTestAssumeVCalls, TypeCheckedLoadVCalls;

327 std::vectorFunctionSummary::ConstVCall>

328 TypeTestAssumeConstVCalls, TypeCheckedLoadConstVCalls;

331

332

333

334 bool HasLocalIFuncCallOrRef = false;

335 findRefEdges(Index, &F, RefEdges, Visited, HasLocalIFuncCallOrRef);

336 std::vector<const Instruction *> NonVolatileLoads;

337 std::vector<const Instruction *> NonVolatileStores;

338

339 std::vector Callsites;

340 std::vector Allocs;

341

342#ifndef NDEBUG

344#endif

345

346 bool HasInlineAsmMaybeReferencingInternal = false;

347 bool HasIndirBranchToBlockAddress = false;

348 bool HasUnknownCall = false;

349 bool MayThrow = false;

351

352

353

354

355 if (BB.hasAddressTaken()) {

358 HasIndirBranchToBlockAddress = true;

359 break;

360 }

361 }

362

364 if (I.isDebugOrPseudoInst())

365 continue;

366 ++NumInsts;

367

368

369

370

371 if (IsThinLTO) {

373

374

376 NonVolatileLoads.push_back(&I);

377 continue;

380 NonVolatileStores.push_back(&I);

381

382

383

384

385

386

387 Value *Stored = I.getOperand(0);

389

390

391 RefEdges.insert(Index.getOrInsertValueInfo(GV));

393 findRefEdges(Index, U, RefEdges, Visited, HasLocalIFuncCallOrRef);

394 continue;

395 }

396 }

397 findRefEdges(Index, &I, RefEdges, Visited, HasLocalIFuncCallOrRef);

399 if (!CB) {

400 if (I.mayThrow())

401 MayThrow = true;

402 continue;

403 }

404

406

407

408

409

410

411 if (HasLocalsInUsedOrAsm && CI && CI->isInlineAsm())

412 HasInlineAsmMaybeReferencingInternal = true;

413

414

418

419 auto *CalledValue = CB->getCalledOperand();

420 auto *CalledFunction = CB->getCalledFunction();

421 if (CalledValue && !CalledFunction) {

422 CalledValue = CalledValue->stripPointerCasts();

423

425 }

426

427

429 assert(!CalledFunction && "Expected null called function in callsite for alias");

431 }

432

433

434 if (CalledFunction) {

435 if (CI && CalledFunction->isIntrinsic()) {

437 CI, TypeTests, TypeTestAssumeVCalls, TypeCheckedLoadVCalls,

438 TypeTestAssumeConstVCalls, TypeCheckedLoadConstVCalls, DT);

439 continue;

440 }

441

442 assert(CalledFunction->hasName());

444 auto Hotness = ScaledCount ? getHotness(*ScaledCount, PSI)

448

449

450

451

452

453 auto &ValueInfo = CallGraphEdges[Index.getOrInsertValueInfo(

455 ValueInfo.updateHotness(Hotness);

456 if (CB->isTailCall())

458

459

464 }

465 } else {

466 HasUnknownCall = true;

467

468

469

470

471

472

473

475 if (GI->hasLocalLinkage())

476 HasLocalIFuncCallOrRef = true;

477

478 if (CI && CI->isInlineAsm())

479 continue;

480

482 continue;

483

484

485

486

487

488 if (auto *MD = I.getMetadata(LLVMContext::MD_callees)) {

489 for (const auto &Op : MD->operands()) {

491 if (Callee)

492 CallGraphEdges[Index.getOrInsertValueInfo(Callee)];

493 }

494 }

495

496 CandidateProfileData =

498 NumCandidates);

499 for (const auto &Candidate : CandidateProfileData)

500 CallGraphEdges[Index.getOrInsertValueInfo(Candidate.Value)]

501 .updateHotness(getHotness(Candidate.Count, PSI));

502 }

503

504

505 if (!IsThinLTO)

506 continue;

507

508

510 continue;

511

512

513

514

516#ifndef NDEBUG

517 CallsThatMayHaveMemprofSummary.insert(CB);

518#endif

519

520

521

523 I.getMetadata(LLVMContext::MD_callsite));

524 auto *MemProfMD = I.getMetadata(LLVMContext::MD_memprof);

525 if (MemProfMD) {

526 std::vector MIBs;

527 std::vector<std::vector> ContextSizeInfos;

528 bool HasNonZeroContextSizeInfos = false;

529 for (auto &MDOp : MemProfMD->operands()) {

535

536 for (auto ContextIter =

538 ContextIter != StackContext.end(); ++ContextIter) {

539 unsigned StackIdIdx = Index.addOrGetStackIdIndex(*ContextIter);

540

541

542

543 if (StackIdIndices.empty() || StackIdIndices.back() != StackIdIdx)

544 StackIdIndices.push_back(StackIdIdx);

545 }

546

547

548 assert(MIBMD->getNumOperands() > 2 ||

550 if (MIBMD->getNumOperands() > 2) {

551 std::vector ContextSizes;

552 for (unsigned I = 2; I < MIBMD->getNumOperands(); I++) {

557 ->getZExtValue();

560 ->getZExtValue();

561 ContextSizes.push_back({FullStackId, TS});

562 }

563

564

565 HasNonZeroContextSizeInfos = true;

566 ContextSizeInfos.push_back(std::move(ContextSizes));

567 } else {

568

569

570

571

572

573

574

575 ContextSizeInfos.push_back({{0, 0}});

576 }

577 MIBs.push_back(

579 }

580 Allocs.push_back(AllocInfo(std::move(MIBs)));

581 assert(HasNonZeroContextSizeInfos ||

583

584

585

586

587 if (HasNonZeroContextSizeInfos) {

588 assert(Allocs.back().MIBs.size() == ContextSizeInfos.size());

589 Allocs.back().ContextSizeInfos = std::move(ContextSizeInfos);

590 }

591 } else if (!InstCallsite.empty()) {

593 for (auto StackId : InstCallsite)

594 StackIdIndices.push_back(Index.addOrGetStackIdIndex(StackId));

595 if (CalledFunction) {

596

597

598

599

600 auto CalleeValueInfo =

602 Callsites.push_back({CalleeValueInfo, StackIdIndices});

603 } else {

605

606

607

608

609 for (const auto &Candidate : CandidateProfileData) {

610 auto CalleeValueInfo = Index.getOrInsertValueInfo(Candidate.Value);

611 Callsites.push_back({CalleeValueInfo, StackIdIndices});

612 }

613 }

614 }

615 }

616 }

617

619 Index.addBlockCount(F.size());

620

622 if (IsThinLTO) {

623 auto AddRefEdges =

624 [&](const std::vector<const Instruction *> &Instrs,

627 for (const auto *I : Instrs) {

628 Cache.erase(I);

629 findRefEdges(Index, I, Edges, Cache, HasLocalIFuncCallOrRef);

630 }

631 };

632

633

634

635

636 AddRefEdges(NonVolatileLoads, LoadRefEdges, Visited);

637

638

639

640

641

642

643

644

645

646

648 AddRefEdges(NonVolatileStores, StoreRefEdges, StoreCache);

649

650

651

652

653 for (const auto &VI : StoreRefEdges)

654 if (LoadRefEdges.remove(VI))

656

657 unsigned RefCnt = RefEdges.size();

658

659

660

662

663 unsigned FirstWORef = RefEdges.size();

665

667 for (; RefCnt < FirstWORef; ++RefCnt)

668 Refs[RefCnt].setReadOnly();

669

670 for (; RefCnt < Refs.size(); ++RefCnt)

671 Refs[RefCnt].setWriteOnly();

672 } else {

674 }

675

676

677 for (auto &I : F.getImportGUIDs())

678 CallGraphEdges[Index.getOrInsertValueInfo(I)].updateHotness(

682

683#ifndef NDEBUG

684

685

686

687 if (IsThinLTO) {

691 if (!CB)

692 continue;

693

694 if (CallsThatMayHaveMemprofSummary.count(CB))

695 continue;

697 }

698 }

699 }

700#endif

701

703 bool NotEligibleForImport =

704 NonRenamableLocal || HasInlineAsmMaybeReferencingInternal ||

705 HasIndirBranchToBlockAddress || HasLocalIFuncCallOrRef;

707 F.getLinkage(), F.getVisibility(), NotEligibleForImport,

708 false, F.isDSOLocal(), F.canBeOmittedFromSymbolTable(),

711 F.doesNotAccessMemory(), F.onlyReadsMemory() && F.doesNotAccessMemory(),

712 F.hasFnAttribute(Attribute::NoRecurse), F.returnDoesNotAlias(),

713

714

715 F.getAttributes().hasFnAttr(Attribute::NoInline),

716 F.hasFnAttribute(Attribute::AlwaysInline),

717 F.hasFnAttribute(Attribute::NoUnwind), MayThrow, HasUnknownCall,

719 std::vectorFunctionSummary::ParamAccess ParamAccesses;

720 if (auto *SSI = GetSSICallback(F))

721 ParamAccesses = SSI->getParamAccesses(Index);

722 auto FuncSummary = std::make_unique(

723 Flags, NumInsts, FunFlags, std::move(Refs), CallGraphEdges.takeVector(),

726 TypeTestAssumeConstVCalls.takeVector(),

727 TypeCheckedLoadConstVCalls.takeVector(), std::move(ParamAccesses),

728 std::move(Callsites), std::move(Allocs));

729 if (NonRenamableLocal)

730 CantBePromoted.insert(F.getGUID());

731 Index.addGlobalValueSummary(F, std::move(FuncSummary));

732}

733

734

735

736

737

738

743

744 if (I->getType()->isPointerTy()) {

745 auto C = I->stripPointerCasts();

750

751

752 if (GV && GV->getName() != "__cxa_pure_virtual")

753 VTableFuncs.push_back({Index.getOrInsertValueInfo(GV), StartingOffset});

754 return;

755 }

756 }

757

758

759

764 const StructLayout *SL = DL.getStructLayout(C->getType());

765

770 StartingOffset + Offset, M, Index, VTableFuncs, OrigGV);

771 }

774 Type *EltTy = ATy->getElementType();

775 uint64_t EltSize = DL.getTypeAllocSize(EltTy);

776 for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i) {

778 StartingOffset + i * EltSize, M, Index, VTableFuncs,

779 OrigGV);

780 }

782

783 if (CE->getOpcode() != Instruction::Trunc ||

785 return;

786

787

788

789

790 if (CE->getOpcode() == Instruction::Sub) {

792 APSInt LHSOffset, RHSOffset;

795 RHS == &OrigGV &&

796

797

798

799 LHSOffset == 0 &&

800

801

802 RHSOffset <=

805 }

806 }

807 }

808}

809

810

814 if (!V.isConstant())

815 return;

816

817 findFuncPointers(V.getInitializer(), 0, M, Index,

818 VTableFuncs, V);

819

820#ifndef NDEBUG

821

823 for (auto &P : VTableFuncs) {

824

825

826

827 assert(P.VTableOffset >= PrevOffset);

828 PrevOffset = P.VTableOffset;

829 }

830#endif

831}

832

833

834static void

839 auto TypeID = Type->getOperand(1).get();

840

844 ->getZExtValue();

845

847 Index.getOrInsertTypeIdCompatibleVtableSummary(TypeId->getString())

848 .push_back({Offset, Index.getOrInsertValueInfo(&V)});

849 }

850}

851

859 bool RefLocalIFunc = false;

860 bool HasBlockAddress =

861 findRefEdges(Index, &V, RefEdges, Visited, RefLocalIFunc);

862 const bool NotEligibleForImport = (HasBlockAddress || RefLocalIFunc);

865 V.getLinkage(), V.getVisibility(), NonRenamableLocal,

866 false, V.isDSOLocal(), V.canBeOmittedFromSymbolTable(),

868

870

871

872 if (!Index.enableSplitLTOUnit()) {

873 Types.clear();

874 V.getMetadata(LLVMContext::MD_type, Types);

875 if (!Types.empty()) {

876

878

879

881 }

882 }

883

884

885 bool CanBeInternalized =

886 !V.hasComdat() && !V.hasAppendingLinkage() && !V.isInterposable() &&

887 !V.hasAvailableExternallyLinkage() && !V.hasDLLExportStorageClass();

888 bool Constant = V.isConstant();

890 Constant ? false : CanBeInternalized,

891 Constant, V.getVCallVisibility());

892 auto GVarSummary = std::make_unique(Flags, VarFlags,

894 if (NonRenamableLocal)

895 CantBePromoted.insert(V.getGUID());

896 if (NotEligibleForImport)

897 GVarSummary->setNotEligibleToImport();

898 if (!VTableFuncs.empty())

899 GVarSummary->setVTableFuncs(VTableFuncs);

900 Index.addGlobalValueSummary(V, std::move(GVarSummary));

901}

902

905

906

907 const GlobalObject *Aliasee = A.getAliaseeObject();

909 return;

912 A.getLinkage(), A.getVisibility(), NonRenamableLocal,

913 false, A.isDSOLocal(), A.canBeOmittedFromSymbolTable(),

915 auto AS = std::make_unique(Flags);

916 auto AliaseeVI = Index.getValueInfo(Aliasee->getGUID());

917 assert(AliaseeVI && "Alias expects aliasee summary to be available");

918 assert(AliaseeVI.getSummaryList().size() == 1 &&

919 "Expected a single entry per aliasee in per-module index");

920 AS->setAliasee(AliaseeVI, AliaseeVI.getSummaryList()[0].get());

921 if (NonRenamableLocal)

922 CantBePromoted.insert(A.getGUID());

923 Index.addGlobalValueSummary(A, std::move(AS));

924}

925

926

930 for (const auto &Summary : VI.getSummaryList())

931 Summary->setLive(true);

932}

933

940 bool EnableSplitLTOUnit = false;

941 bool UnifiedLTO = false;

943 M.getModuleFlag("EnableSplitLTOUnit")))

944 EnableSplitLTOUnit = MD->getZExtValue();

945 if (auto *MD =

947 UnifiedLTO = MD->getZExtValue();

948 ModuleSummaryIndex Index(true, EnableSplitLTOUnit, UnifiedLTO);

949

950

951

952

953

954

957

959

962 for (auto *V : Used) {

963 if (V->hasLocalLinkage()) {

964 LocalsUsed.insert(V);

965 CantBePromoted.insert(V->getGUID());

966 }

967 }

968

969 bool HasLocalInlineAsmSymbol = false;

970 if (!M.getModuleInlineAsm().empty()) {

971

972

973

974

975

976

977

978

979

982

985 return;

986 HasLocalInlineAsmSymbol = true;

988 if (!GV)

989 return;

990 assert(GV->isDeclaration() && "Def in module asm already has definition");

993 true,

994 true,

998

1000 std::unique_ptr Summary =

1001 std::make_unique(

1002 GVFlags, 0,

1004 F->hasFnAttribute(Attribute::ReadNone),

1005 F->hasFnAttribute(Attribute::ReadOnly),

1006 F->hasFnAttribute(Attribute::NoRecurse),

1007 F->returnDoesNotAlias(),

1008 false,

1009 F->hasFnAttribute(Attribute::AlwaysInline),

1010 F->hasFnAttribute(Attribute::NoUnwind),

1011 true,

1012 true,

1013 false},

1023 Index.addGlobalValueSummary(*GV, std::move(Summary));

1024 } else {

1025 std::unique_ptr Summary =

1026 std::make_unique(

1027 GVFlags,

1032 Index.addGlobalValueSummary(*GV, std::move(Summary));

1033 }

1034 });

1035 }

1036

1037 bool IsThinLTO = true;

1038 if (auto *MD =

1040 IsThinLTO = MD->getZExtValue();

1041

1042

1043

1044 for (const auto &F : M) {

1045 if (F.isDeclaration())

1046 continue;

1047

1050 std::unique_ptr BFIPtr;

1051 if (GetBFICallback)

1052 BFI = GetBFICallback(F);

1053 else if (F.hasProfileData()) {

1056 BFIPtr = std::make_unique(F, BPI, LI);

1057 BFI = BFIPtr.get();

1058 }

1059

1061 !LocalsUsed.empty() || HasLocalInlineAsmSymbol,

1062 CantBePromoted, IsThinLTO, GetSSICallback);

1063 }

1064

1065

1066

1069 if (G.isDeclaration())

1070 continue;

1072 }

1073

1074

1075

1078

1079

1081 I.applyAlongResolverPath([&Index](const GlobalValue &GV) {

1082 Index.getGlobalValueSummary(GV)->setLive(true);

1083 });

1084 }

1085

1086 for (auto *V : LocalsUsed) {

1087 auto *Summary = Index.getGlobalValueSummary(*V);

1088 assert(Summary && "Missing summary for global value");

1089 Summary->setNotEligibleToImport();

1090 }

1091

1092

1093

1094

1096 setLiveRoot(Index, "llvm.compiler.used");

1097 setLiveRoot(Index, "llvm.global_ctors");

1098 setLiveRoot(Index, "llvm.global_dtors");

1099 setLiveRoot(Index, "llvm.global.annotations");

1100

1101 for (auto &GlobalList : Index) {

1102

1103 if (GlobalList.second.getSummaryList().empty())

1104 continue;

1105

1106 assert(GlobalList.second.getSummaryList().size() == 1 &&

1107 "Expected module's index to have one summary per GUID");

1108 auto &Summary = GlobalList.second.getSummaryList()[0];

1109 if (!IsThinLTO) {

1110 Summary->setNotEligibleToImport();

1111 continue;

1112 }

1113

1114 bool AllRefsCanBeExternallyReferenced =

1116 return !CantBePromoted.count(VI.getGUID());

1117 });

1118 if (!AllRefsCanBeExternallyReferenced) {

1119 Summary->setNotEligibleToImport();

1120 continue;

1121 }

1122

1124 bool AllCallsCanBeExternallyReferenced = llvm::all_of(

1126 return !CantBePromoted.count(Edge.first.getGUID());

1127 });

1128 if (!AllCallsCanBeExternallyReferenced)

1129 Summary->setNotEligibleToImport();

1130 }

1131 }

1132

1134 std::error_code EC;

1136 if (EC)

1139 Index.exportToDot(OSDot, {});

1140 }

1141

1142 return Index;

1143}

1144

1145AnalysisKey ModuleSummaryIndexAnalysis::Key;

1146

1153 M,

1157 },

1158 &PSI,

1162 : nullptr;

1163 });

1164}

1165

1167

1169 "Module Summary Analysis", false, true)

1175

1179

1182

1187 M,

1191 .getBFI());

1192 },

1193 PSI,

1197 .getResult()

1198 : nullptr;

1199 }));

1200 return false;

1201}

1202

1204 Index.reset();

1205 return false;

1206}

1207

1214

1216

1220

1225

1230

1232 "Module summary info", false, true)

1233

1235 if (!CB)

1236 return false;

1237 if (CB->isDebugOrPseudoInst())

1238 return false;

1240 auto *CalledValue = CB->getCalledOperand();

1241 auto *CalledFunction = CB->getCalledFunction();

1242 if (CalledValue && !CalledFunction) {

1243 CalledValue = CalledValue->stripPointerCasts();

1244

1246 }

1247

1248

1250 assert(!CalledFunction &&

1251 "Expected null called function in callsite for alias");

1253 }

1254

1255

1256 if (CalledFunction) {

1257 if (CI && CalledFunction->isIntrinsic())

1258 return false;

1259 } else {

1260

1262 return false;

1263

1264 if (CI && CI->isInlineAsm())

1265 return false;

1266

1268 return false;

1269 return true;

1270 }

1271 return true;

1272}

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

static bool isConstant(const MachineInstr &MI)

MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL

This file contains the simple types necessary to represent the attributes associated with functions a...

static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")

#define clEnumValN(ENUMVAL, FLAGNAME, DESC)

This file contains the declarations for the subclasses of Constant, which represent the different fla...

This file defines the DenseSet and SmallDenseSet classes.

Module.h This file contains the declarations for the Module class.

This defines the Use class.

This file implements a map that provides insertion order iteration.

static void addVCallToSet(DevirtCallSite Call, GlobalValue::GUID Guid, SetVector< FunctionSummary::VFuncId, std::vector< FunctionSummary::VFuncId > > &VCalls, SetVector< FunctionSummary::ConstVCall, std::vector< FunctionSummary::ConstVCall > > &ConstVCalls)

Determine whether this call has all constant integer arguments (excluding "this") and summarize it to...

Definition ModuleSummaryAnalysis.cpp:184

static void computeVTableFuncs(ModuleSummaryIndex &Index, const GlobalVariable &V, const Module &M, VTableFuncList &VTableFuncs)

Definition ModuleSummaryAnalysis.cpp:811

static void computeAliasSummary(ModuleSummaryIndex &Index, const GlobalAlias &A, DenseSet< GlobalValue::GUID > &CantBePromoted)

Definition ModuleSummaryAnalysis.cpp:903

static void findFuncPointers(const Constant *I, uint64_t StartingOffset, const Module &M, ModuleSummaryIndex &Index, VTableFuncList &VTableFuncs, const GlobalVariable &OrigGV)

Find function pointers referenced within the given vtable initializer (or subset of an initializer) I...

Definition ModuleSummaryAnalysis.cpp:739

static void computeVariableSummary(ModuleSummaryIndex &Index, const GlobalVariable &V, DenseSet< GlobalValue::GUID > &CantBePromoted, const Module &M, SmallVectorImpl< MDNode * > &Types)

Definition ModuleSummaryAnalysis.cpp:852

static void setLiveRoot(ModuleSummaryIndex &Index, StringRef Name)

Definition ModuleSummaryAnalysis.cpp:927

static CalleeInfo::HotnessType getHotness(uint64_t ProfileCount, ProfileSummaryInfo *PSI)

Definition ModuleSummaryAnalysis.cpp:167

static bool isNonVolatileLoad(const Instruction *I)

Definition ModuleSummaryAnalysis.cpp:279

static bool isNonRenamableLocal(const GlobalValue &GV)

Definition ModuleSummaryAnalysis.cpp:178

static void computeFunctionSummary(ModuleSummaryIndex &Index, const Module &M, const Function &F, BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI, DominatorTree &DT, bool HasLocalsInUsedOrAsm, DenseSet< GlobalValue::GUID > &CantBePromoted, bool IsThinLTO, std::function< const StackSafetyInfo *(const Function &F)> GetSSICallback)

Definition ModuleSummaryAnalysis.cpp:305

static bool mustBeUnreachableFunction(const Function &F)

Definition ModuleSummaryAnalysis.cpp:298

static bool isNonVolatileStore(const Instruction *I)

Definition ModuleSummaryAnalysis.cpp:286

static bool findRefEdges(ModuleSummaryIndex &Index, const User *CurUser, SetVector< ValueInfo, SmallVector< ValueInfo, 0 > > &RefEdges, SmallPtrSet< const User *, 8 > &Visited, bool &RefLocalLinkageIFunc)

Definition ModuleSummaryAnalysis.cpp:108

static void addIntrinsicToSummary(const CallInst *CI, SetVector< GlobalValue::GUID, std::vector< GlobalValue::GUID > > &TypeTests, SetVector< FunctionSummary::VFuncId, std::vector< FunctionSummary::VFuncId > > &TypeTestAssumeVCalls, SetVector< FunctionSummary::VFuncId, std::vector< FunctionSummary::VFuncId > > &TypeCheckedLoadVCalls, SetVector< FunctionSummary::ConstVCall, std::vector< FunctionSummary::ConstVCall > > &TypeTestAssumeConstVCalls, SetVector< FunctionSummary::ConstVCall, std::vector< FunctionSummary::ConstVCall > > &TypeCheckedLoadConstVCalls, DominatorTree &DT)

If this intrinsic call requires that we add information to the function summary, do so via the non-co...

Definition ModuleSummaryAnalysis.cpp:205

static void recordTypeIdCompatibleVtableReferences(ModuleSummaryIndex &Index, const GlobalVariable &V, SmallVectorImpl< MDNode * > &Types)

Record vtable definition V for each type metadata it references.

Definition ModuleSummaryAnalysis.cpp:835

This is the interface to build a ModuleSummaryIndex for a module.

ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...

FunctionAnalysisManager FAM

#define INITIALIZE_PASS_DEPENDENCY(depName)

#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)

#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)

#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)

This file implements a set that has insertion order iteration characteristics.

This file defines the SmallPtrSet class.

This file defines the SmallVector class.

An arbitrary precision integer that knows its signedness.

PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)

Get the result of an analysis pass for a given IR unit.

Represent the analysis usage information of a pass.

AnalysisUsage & addRequired()

void setPreservesAll()

Set by analyses that do not transform their input at all.

ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...

LLVM Basic Block Representation.

static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)

Return a BlockAddress for the specified function and basic block.

Analysis pass which computes BlockFrequencyInfo.

Legacy analysis pass which computes BlockFrequencyInfo.

BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...

LLVM_ABI BlockFrequency getEntryFreq() const

LLVM_ABI BlockFrequency getBlockFreq(const BasicBlock *BB) const

getblockFreq - Return block frequency.

uint64_t getFrequency() const

Returns the frequency as a fixpoint number scaled by the entry frequency.

Analysis providing branch probability information.

Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...

Function * getCalledFunction() const

Returns the function called, or null if this is an indirect function invocation or the function signa...

Value * getArgOperand(unsigned i) const

This class represents a function call, abstracting a target machine's calling convention.

This is an important base class in LLVM.

A parsed version of the target data layout string in and methods for querying it.

Implements a dense probed hash-table based set.

Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.

std::pair< ValueInfo, CalleeInfo > EdgeTy

<CalleeValueInfo, CalleeInfo> call edge pair.

ForceSummaryHotnessType

Types for -force-summary-edges-cold debugging option.

Intrinsic::ID getIntrinsicID() const LLVM_READONLY

getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...

static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)

Return a 64-bit global unique ID constructed from the name of a global symbol.

LLVM_ABI bool isDeclaration() const

Return true if the primary definition of this global value is outside of the current translation unit...

uint64_t GUID

Declare a type to represent a global unique identifier for a global value.

bool hasLocalLinkage() const

GUID getGUID() const

Return a 64-bit global unique ID constructed from global value name (i.e.

@ DefaultVisibility

The GV is visible.

LLVM_ABI bool canBeOmittedFromSymbolTable() const

True if GV can be left out of the object symbol table.

@ InternalLinkage

Rename collisions when linking (static functions).

const Constant * getInitializer() const

getInitializer - Return the initializer for this global variable.

Legacy wrapper pass to provide the ModuleSummaryIndex object.

ImmutableModuleSummaryIndexWrapperPass(const ModuleSummaryIndex *Index=nullptr)

Definition ModuleSummaryAnalysis.cpp:1217

void getAnalysisUsage(AnalysisUsage &AU) const override

getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...

Definition ModuleSummaryAnalysis.cpp:1221

ImmutablePass class - This class is used to provide information that does not need to be run.

const MDOperand & getOperand(unsigned I) const

unsigned getNumOperands() const

Return number of MDNode operands.

This class implements a map that also provides access to all stored values in a deterministic order.

VectorType takeVector()

Clear the MapVector and return the underlying vector.

ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...

LLVM_ABI Result run(Module &M, ModuleAnalysisManager &AM)

Definition ModuleSummaryAnalysis.cpp:1148

Legacy wrapper pass to provide the ModuleSummaryIndex object.

void getAnalysisUsage(AnalysisUsage &AU) const override

getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...

Definition ModuleSummaryAnalysis.cpp:1208

bool doFinalization(Module &M) override

doFinalization - Virtual method overriden by subclasses to do any necessary clean up after all passes...

Definition ModuleSummaryAnalysis.cpp:1203

ModuleSummaryIndexWrapperPass()

Definition ModuleSummaryAnalysis.cpp:1180

bool runOnModule(Module &M) override

runOnModule - Virtual method overriden by subclasses to process the module being operated on.

Definition ModuleSummaryAnalysis.cpp:1183

Class to hold module path string table and global value map, and encapsulate methods for operating on...

static LLVM_ABI void CollectAsmSymbols(const Module &M, function_ref< void(StringRef, object::BasicSymbolRef::Flags)> AsmSymbol)

Parse inline ASM and collect the symbols that are defined or referenced in the current module.

A Module instance is used to store all the information related to an LLVM module.

MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...

AnalysisType & getAnalysis() const

getAnalysis() - This function is used by subclasses to get to the analysis information ...

An analysis pass based on the new PM to deliver ProfileSummaryInfo.

An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo.

Analysis providing profile information.

LLVM_ABI std::optional< uint64_t > getProfileCount(const CallBase &CallInst, BlockFrequencyInfo *BFI, bool AllowSynthetic=false) const

Returns the profile count for CallInst.

LLVM_ABI bool isColdCount(uint64_t C) const

Returns true if count C is considered cold.

LLVM_ABI bool hasPartialSampleProfile() const

Returns true if module M has partial-profile sample profile.

LLVM_ABI bool isHotCount(uint64_t C) const

Returns true if count C is considered hot.

A vector that has set insertion semantics.

bool remove(const value_type &X)

Remove an item from the set vector.

size_type size() const

Determine the number of elements in the SetVector.

void insert_range(Range &&R)

Vector takeVector()

Clear the SetVector and return the underlying vector.

bool insert(const value_type &X)

Insert a new element into the SetVector.

std::pair< iterator, bool > insert(PtrType Ptr)

Inserts Ptr if and only if there is no element in the container equal to Ptr.

SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.

This class consists of common code factored out of the SmallVector class to reduce code duplication b...

void push_back(const T &Elt)

This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.

StackSafetyInfo wrapper for the new pass manager.

StackSafetyInfo wrapper for the legacy pass manager.

Interface to access stack safety analysis results for single function.

StringRef - Represent a constant reference to a string, i.e.

Used to lazily calculate structure layout information for a target machine, based on the DataLayout s...

LLVM_ABI unsigned getElementContainingOffset(uint64_t FixedOffset) const

Given a valid byte offset into the structure, returns the structure index that contains it.

TypeSize getElementOffset(unsigned Idx) const

Class to represent struct types.

ArrayRef< Type * > elements() const

Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...

The instances of the Type class are immutable: once they are created, they are never changed.

A Use represents the edge between a Value definition and its users.

LLVM Value Representation.

Type * getType() const

All values are typed, get the type of this value.

iterator_range< use_iterator > uses()

std::pair< iterator, bool > insert(const ValueT &V)

size_type count(const_arg_type_t< ValueT > V) const

Return 1 if the specified key is in the set, 0 otherwise.

Helper class to iterate through stack ids in both metadata (memprof MIB and callsite) and the corresp...

CallStackIterator beginAfterSharedPrefix(const CallStack &Other)

CallStackIterator end() const

A raw_ostream that writes to a file descriptor.

@ C

The default llvm calling convention, compatible with C.

ValuesClass values(OptsTy... Options)

Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...

initializer< Ty > init(const Ty &Val)

LocationClass< Ty > location(Ty &L)

std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract_or_null(Y &&MD)

Extract a Value from Metadata, allowing null.

std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract(Y &&MD)

Extract a Value from Metadata, if any.

LLVM_ABI bool metadataIncludesAllContextSizeInfo()

Whether the alloc memeprof metadata will include context size info for all MIBs.

LLVM_ABI AllocationType getMIBAllocType(const MDNode *MIB)

Returns the allocation type from an MIB metadata node.

LLVM_ABI MDNode * getMIBStackNode(const MDNode *MIB)

Returns the stack node from an MIB metadata node.

@ OF_Text

The file should be opened in text mode on platforms like z/OS that make this distinction.

This is an optimization pass for GlobalISel generic memory operations.

auto drop_begin(T &&RangeOrContainer, size_t N=1)

Return a range covering RangeOrContainer with the first N elements excluded.

cl::opt< bool > MemProfReportHintedSizes("memprof-report-hinted-sizes", cl::init(false), cl::Hidden, cl::desc("Report total allocation sizes of hinted allocations"))

Definition ModuleSummaryAnalysis.cpp:92

std::vector< VirtFuncOffset > VTableFuncList

List of functions referenced by a particular vtable definition.

bool all_of(R &&range, UnaryPredicate P)

Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.

auto enumerate(FirstRange &&First, RestRanges &&...Rest)

Given two or more input ranges, returns a new range whose values are tuples (A, B,...

decltype(auto) dyn_cast(const From &Val)

dyn_cast - Return the argument parameter cast to the specified type.

LLVM_ABI bool mayHaveMemprofSummary(const CallBase *CB)

Returns true if the instruction could have memprof metadata, used to ensure consistency between summa...

LLVM_ABI bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV, APInt &Offset, const DataLayout &DL, DSOLocalEquivalent **DSOEquiv=nullptr)

If this constant is a constant offset from a global, return the global and the constant.

auto dyn_cast_if_present(const Y &Val)

dyn_cast_if_present - Functionally identical to dyn_cast, except that a null (or none in the case ...

FunctionSummary::ForceSummaryHotnessType ForceSummaryEdgesCold

Definition ModuleSummaryAnalysis.cpp:68

bool needsParamAccessSummary(const Module &M)

static cl::opt< std::string > ModuleSummaryDotFile("module-summary-dot-file", cl::Hidden, cl::value_desc("filename"), cl::desc("File to emit dot graph of new summary into"))

InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy

Provide the FunctionAnalysisManager to Module proxy.

LLVM_ABI ModuleSummaryIndex buildModuleSummaryIndex(const Module &M, std::function< BlockFrequencyInfo *(const Function &F)> GetBFICallback, ProfileSummaryInfo *PSI, std::function< const StackSafetyInfo *(const Function &F)> GetSSICallback=[](const Function &F) -> const StackSafetyInfo *{ return nullptr;})

Direct function to compute a ModuleSummaryIndex from a given module.

Definition ModuleSummaryAnalysis.cpp:934

cl::opt< unsigned > MaxNumVTableAnnotations("icp-max-num-vtables", cl::init(6), cl::Hidden, cl::desc("Max number of vtables annotated for a vtable load instruction."))

Definition ModuleSummaryAnalysis.cpp:90

LLVM_ABI cl::opt< bool > ScalePartialSampleProfileWorkingSetSize

bool any_of(R &&range, UnaryPredicate P)

Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.

LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)

void findDevirtualizableCallsForTypeCheckedLoad(SmallVectorImpl< DevirtCallSite > &DevirtCalls, SmallVectorImpl< Instruction * > &LoadedPtrs, SmallVectorImpl< Instruction * > &Preds, bool &HasNonCallUses, const CallInst *CI, DominatorTree &DT)

Given a call to the intrinsic @llvm.type.checked.load, find all devirtualizable call sites based on t...

Function::ProfileCount ProfileCount

LLVM_ABI SmallVector< InstrProfValueData, 4 > getValueProfDataFromInst(const Instruction &Inst, InstrProfValueKind ValueKind, uint32_t MaxNumValueData, uint64_t &TotalC, bool GetNoICPValue=false)

Extract the value profile data from Inst and returns them if Inst is annotated with value profile dat...

LLVM_ABI ModulePass * createModuleSummaryIndexWrapperPass()

Definition ModuleSummaryAnalysis.cpp:1176

bool isa(const From &Val)

isa - Return true if the parameter to the template is an instance of one of the template type argu...

DWARFExpression::Operation Op

LLVM_ABI ImmutablePass * createImmutableModuleSummaryIndexWrapperPass(const ModuleSummaryIndex *Index)

Definition ModuleSummaryAnalysis.cpp:1226

static cl::opt< FunctionSummary::ForceSummaryHotnessType, true > FSEC("force-summary-edges-cold", cl::Hidden, cl::location(ForceSummaryEdgesCold), cl::desc("Force all edges in the function summary to cold"), cl::values(clEnumValN(FunctionSummary::FSHT_None, "none", "None."), clEnumValN(FunctionSummary::FSHT_AllNonCritical, "all-non-critical", "All non-critical edges."), clEnumValN(FunctionSummary::FSHT_All, "all", "All edges.")))

decltype(auto) cast(const From &Val)

cast - Return the argument parameter cast to the specified type.

static cl::opt< bool > EnableMemProfIndirectCallSupport("enable-memprof-indirect-call-support", cl::init(true), cl::Hidden, cl::desc("Enable MemProf support for summarizing and cloning indirect calls"))

void findDevirtualizableCallsForTypeTest(SmallVectorImpl< DevirtCallSite > &DevirtCalls, SmallVectorImpl< CallInst * > &Assumes, const CallInst *CI, DominatorTree &DT)

Given a call to the intrinsic @llvm.type.test, find all devirtualizable call sites based on the call ...

AnalysisManager< Module > ModuleAnalysisManager

Convenience typedef for the Module analysis manager.

LLVM_ABI GlobalVariable * collectUsedGlobalVariables(const Module &M, SmallVectorImpl< GlobalValue * > &Vec, bool CompilerUsed)

Given "llvm.used" or "llvm.compiler.used" as a global name, collect the initializer elements of that ...

Summary of memprof metadata on allocations.

A special type used by analysis passes to provide an address that identifies that particular analysis...

A call site that could be devirtualized.

A specification for a virtual function call with all constant integer arguments.

Flags specific to function summaries.

An "identifier" for a virtual function.

Group flags (Linkage, NotEligibleToImport, etc.) as a bitfield.

Summary of a single MIB in a memprof metadata on allocations.

Struct that holds a reference to a particular GUID in a global value summary.