LLVM 22.0.0git
GlobalOpt.cpp
Go to the documentation of this file.
1//===- GlobalOpt.cpp - Optimize Global Variables --------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This pass transforms simple global variables that never have their address
10// taken. If obviously true, it marks read/write globals as constant, deletes
11// variables only stored to, etc.
12//
13//===----------------------------------------------------------------------===//
14
16#include "llvm/ADT/DenseMap.h"
17#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/Statistic.h"
21#include "llvm/ADT/Twine.h"
30#include "llvm/IR/Attributes.h"
31#include "llvm/IR/BasicBlock.h"
32#include "llvm/IR/CallingConv.h"
33#include "llvm/IR/Constant.h"
34#include "llvm/IR/Constants.h"
35#include "llvm/IR/DataLayout.h"
38#include "llvm/IR/Dominators.h"
39#include "llvm/IR/Function.h"
40#include "llvm/IR/GlobalAlias.h"
41#include "llvm/IR/GlobalValue.h"
43#include "llvm/IR/IRBuilder.h"
44#include "llvm/IR/InstrTypes.h"
45#include "llvm/IR/Instruction.h"
48#include "llvm/IR/Module.h"
49#include "llvm/IR/Operator.h"
51#include "llvm/IR/Type.h"
52#include "llvm/IR/Use.h"
53#include "llvm/IR/User.h"
54#include "llvm/IR/Value.h"
55#include "llvm/IR/ValueHandle.h"
59#include "llvm/Support/Debug.h"
62#include "llvm/Transforms/IPO.h"
67#include <cassert>
68#include <cstdint>
69#include <optional>
70#include <utility>
71#include <vector>
72
73using namespace llvm;
74
75#define DEBUG_TYPE "globalopt"
76
77STATISTIC(NumMarked , "Number of globals marked constant");
78STATISTIC(NumUnnamed , "Number of globals marked unnamed_addr");
79STATISTIC(NumSRA , "Number of aggregate globals broken into scalars");
80STATISTIC(NumSubstitute,"Number of globals with initializers stored into them");
81STATISTIC(NumDeleted , "Number of globals deleted");
82STATISTIC(NumGlobUses , "Number of global uses devirtualized");
83STATISTIC(NumLocalized , "Number of globals localized");
84STATISTIC(NumShrunkToBool , "Number of global vars shrunk to booleans");
85STATISTIC(NumFastCallFns , "Number of functions converted to fastcc");
86STATISTIC(NumCtorsEvaluated, "Number of static ctors evaluated");
87STATISTIC(NumNestRemoved , "Number of nest attributes removed");
88STATISTIC(NumAliasesResolved, "Number of global aliases resolved");
89STATISTIC(NumAliasesRemoved, "Number of global aliases eliminated");
90STATISTIC(NumCXXDtorsRemoved, "Number of global C++ destructors removed");
91STATISTIC(NumAtExitRemoved, "Number of atexit handlers removed");
92STATISTIC(NumInternalFunc, "Number of internal functions");
93STATISTIC(NumColdCC, "Number of functions marked coldcc");
94STATISTIC(NumIFuncsResolved, "Number of statically resolved IFuncs");
95STATISTIC(NumIFuncsDeleted, "Number of IFuncs removed");
96
97static cl::opt<bool>
98 OptimizeNonFMVCallers("optimize-non-fmv-callers",
99 cl::desc("Statically resolve calls to versioned "
100 "functions from non-versioned callers."),
101 cl::init(true), cl::Hidden);
102
104 "max-ifunc-versions", cl::Hidden, cl::init(5),
105 cl::desc("Maximum number of caller/callee versions that is allowed for "
106 "using the expensive (cubic) static resolution algorithm."));
107
108static cl::opt<bool>
109 EnableColdCCStressTest("enable-coldcc-stress-test",
110 cl::desc("Enable stress test of coldcc by adding "
111 "calling conv to all internal functions."),
112 cl::init(false), cl::Hidden);
113
115 "coldcc-rel-freq", cl::Hidden, cl::init(2),
116 cl::desc(
117 "Maximum block frequency, expressed as a percentage of caller's "
118 "entry frequency, for a call site to be considered cold for enabling "
119 "coldcc"));
120
121/// Is this global variable possibly used by a leak checker as a root? If so,
122/// we might not really want to eliminate the stores to it.
124 // A global variable is a root if it is a pointer, or could plausibly contain
125 // a pointer. There are two challenges; one is that we could have a struct
126 // the has an inner member which is a pointer. We recurse through the type to
127 // detect these (up to a point). The other is that we may actually be a union
128 // of a pointer and another type, and so our LLVM type is an integer which
129 // gets converted into a pointer, or our type is an [i8 x #] with a pointer
130 // potentially contained here.
131
132 if (GV->hasPrivateLinkage())
133 return false;
134
136 Types.push_back(GV->getValueType());
137
138 unsigned Limit = 20;
139 do {
140 Type *Ty = Types.pop_back_val();
141 switch (Ty->getTypeID()) {
142 default: break;
144 return true;
147 if (cast<VectorType>(Ty)->getElementType()->isPointerTy())
148 return true;
149 break;
150 case Type::ArrayTyID:
151 Types.push_back(cast<ArrayType>(Ty)->getElementType());
152 break;
153 case Type::StructTyID: {
154 StructType *STy = cast<StructType>(Ty);
155 if (STy->isOpaque()) return true;
156 for (Type *InnerTy : STy->elements()) {
157 if (isa<PointerType>(InnerTy)) return true;
158 if (isa<StructType>(InnerTy) || isa<ArrayType>(InnerTy) ||
159 isa<VectorType>(InnerTy))
160 Types.push_back(InnerTy);
161 }
162 break;
163 }
164 }
165 if (--Limit == 0) return true;
166 } while (!Types.empty());
167 return false;
168}
169
170/// Given a value that is stored to a global but never read, determine whether
171/// it's safe to remove the store and the chain of computation that feeds the
172/// store.
174 Value *V, function_ref<TargetLibraryInfo &(Function &)> GetTLI) {
175 do {
176 if (isa<Constant>(V))
177 return true;
178 if (!V->hasOneUse())
179 return false;
180 if (isa<LoadInst>(V) || isa<InvokeInst>(V) || isa<Argument>(V) ||
182 return false;
183 if (isAllocationFn(V, GetTLI))
184 return true;
185
187 if (I->mayHaveSideEffects())
188 return false;
190 if (!GEP->hasAllConstantIndices())
191 return false;
192 } else if (I->getNumOperands() != 1) {
193 return false;
194 }
195
196 V = I->getOperand(0);
197 } while (true);
198}
199
200/// This GV is a pointer root. Loop over all users of the global and clean up
201/// any that obviously don't assign the global a value that isn't dynamically
202/// allocated.
203static bool
206 // A brief explanation of leak checkers. The goal is to find bugs where
207 // pointers are forgotten, causing an accumulating growth in memory
208 // usage over time. The common strategy for leak checkers is to explicitly
209 // allow the memory pointed to by globals at exit. This is popular because it
210 // also solves another problem where the main thread of a C++ program may shut
211 // down before other threads that are still expecting to use those globals. To
212 // handle that case, we expect the program may create a singleton and never
213 // destroy it.
214
215 bool Changed = false;
216
217 // If Dead[n].first is the only use of a malloc result, we can delete its
218 // chain of computation and the store to the global in Dead[n].second.
220
221 SmallVector<User *> Worklist(GV->users());
222 // Constants can't be pointers to dynamically allocated memory.
223 while (!Worklist.empty()) {
224 User *U = Worklist.pop_back_val();
225 if (StoreInst *SI = dyn_cast<StoreInst>(U)) {
226 Value *V = SI->getValueOperand();
227 if (isa<Constant>(V)) {
228 Changed = true;
229 SI->eraseFromParent();
230 } else if (Instruction *I = dyn_cast<Instruction>(V)) {
231 if (I->hasOneUse())
232 Dead.push_back(std::make_pair(I, SI));
233 }
234 } else if (MemSetInst *MSI = dyn_cast<MemSetInst>(U)) {
235 if (isa<Constant>(MSI->getValue())) {
236 Changed = true;
237 MSI->eraseFromParent();
238 } else if (Instruction *I = dyn_cast<Instruction>(MSI->getValue())) {
239 if (I->hasOneUse())
240 Dead.push_back(std::make_pair(I, MSI));
241 }
242 } else if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(U)) {
243 GlobalVariable *MemSrc = dyn_cast<GlobalVariable>(MTI->getSource());
244 if (MemSrc && MemSrc->isConstant()) {
245 Changed = true;
246 MTI->eraseFromParent();
247 } else if (Instruction *I = dyn_cast<Instruction>(MTI->getSource())) {
248 if (I->hasOneUse())
249 Dead.push_back(std::make_pair(I, MTI));
250 }
251 } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(U)) {
252 if (isa<GEPOperator>(CE))
253 append_range(Worklist, CE->users());
254 }
255 }
256
257 for (const auto &[Inst, Store] : Dead) {
258 if (IsSafeComputationToRemove(Inst, GetTLI)) {
259 Store->eraseFromParent();
260 Instruction *I = Inst;
261 do {
262 if (isAllocationFn(I, GetTLI))
263 break;
264 Instruction *J = dyn_cast<Instruction>(I->getOperand(0));
265 if (!J)
266 break;
267 I->eraseFromParent();
268 I = J;
269 } while (true);
270 I->eraseFromParent();
271 Changed = true;
272 }
273 }
274
276 return Changed;
277}
278
279/// We just marked GV constant. Loop over all users of the global, cleaning up
280/// the obvious ones. This is largely just a quick scan over the use list to
281/// clean up the easy and obvious cruft. This returns true if it made a change.
283 const DataLayout &DL) {
285 SmallVector<User *, 8> WorkList(GV->users());
287 bool Changed = false;
288
289 SmallVector<WeakTrackingVH> MaybeDeadInsts;
290 auto EraseFromParent = [&](Instruction *I) {
291 for (Value *Op : I->operands())
292 if (auto *OpI = dyn_cast<Instruction>(Op))
293 MaybeDeadInsts.push_back(OpI);
294 I->eraseFromParent();
295 Changed = true;
296 };
297 while (!WorkList.empty()) {
298 User *U = WorkList.pop_back_val();
299 if (!Visited.insert(U).second)
300 continue;
301
302 if (auto *BO = dyn_cast<BitCastOperator>(U))
303 append_range(WorkList, BO->users());
304 if (auto *ASC = dyn_cast<AddrSpaceCastOperator>(U))
305 append_range(WorkList, ASC->users());
306 else if (auto *GEP = dyn_cast<GEPOperator>(U))
307 append_range(WorkList, GEP->users());
308 else if (auto *LI = dyn_cast<LoadInst>(U)) {
309 // A load from a uniform value is always the same, regardless of any
310 // applied offset.
311 Type *Ty = LI->getType();
313 LI->replaceAllUsesWith(Res);
314 EraseFromParent(LI);
315 continue;
316 }
317
318 Value *PtrOp = LI->getPointerOperand();
319 APInt Offset(DL.getIndexTypeSizeInBits(PtrOp->getType()), 0);
321 DL, Offset, /* AllowNonInbounds */ true);
323 if (II->getIntrinsicID() == Intrinsic::threadlocal_address)
324 PtrOp = II->getArgOperand(0);
325 }
326 if (PtrOp == GV) {
327 if (auto *Value = ConstantFoldLoadFromConst(Init, Ty, Offset, DL)) {
328 LI->replaceAllUsesWith(Value);
329 EraseFromParent(LI);
330 }
331 }
332 } else if (StoreInst *SI = dyn_cast<StoreInst>(U)) {
333 // Store must be unreachable or storing Init into the global.
334 EraseFromParent(SI);
335 } else if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(U)) { // memset/cpy/mv
336 if (getUnderlyingObject(MI->getRawDest()) == GV)
337 EraseFromParent(MI);
338 } else if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U)) {
339 if (II->getIntrinsicID() == Intrinsic::threadlocal_address)
340 append_range(WorkList, II->users());
341 }
342 }
343
344 Changed |=
347 return Changed;
348}
349
350/// Part of the global at a specific offset, which is only accessed through
351/// loads and stores with the given type.
355 bool IsLoaded = false;
356 bool IsStored = false;
357};
358
359/// Look at all uses of the global and determine which (offset, type) pairs it
360/// can be split into.
362 GlobalVariable *GV, const DataLayout &DL) {
363 SmallVector<Use *, 16> Worklist;
365 auto AppendUses = [&](Value *V) {
366 for (Use &U : V->uses())
367 if (Visited.insert(&U).second)
368 Worklist.push_back(&U);
369 };
370 AppendUses(GV);
371 while (!Worklist.empty()) {
372 Use *U = Worklist.pop_back_val();
373 User *V = U->getUser();
374
375 auto *GEP = dyn_cast<GEPOperator>(V);
377 (GEP && GEP->hasAllConstantIndices())) {
378 AppendUses(V);
379 continue;
380 }
381
382 if (Value *Ptr = getLoadStorePointerOperand(V)) {
383 // This is storing the global address into somewhere, not storing into
384 // the global.
385 if (isa<StoreInst>(V) && U->getOperandNo() == 0)
386 return false;
387
388 APInt Offset(DL.getIndexTypeSizeInBits(Ptr->getType()), 0);
389 Ptr = Ptr->stripAndAccumulateConstantOffsets(DL, Offset,
390 /* AllowNonInbounds */ true);
391 if (Ptr != GV || Offset.getActiveBits() >= 64)
392 return false;
393
394 // TODO: We currently require that all accesses at a given offset must
395 // use the same type. This could be relaxed.
396 Type *Ty = getLoadStoreType(V);
397 const auto &[It, Inserted] =
398 Parts.try_emplace(Offset.getZExtValue(), GlobalPart{Ty});
399 if (Ty != It->second.Ty)
400 return false;
401
402 if (Inserted) {
403 It->second.Initializer =
405 if (!It->second.Initializer) {
406 LLVM_DEBUG(dbgs() << "Global SRA: Failed to evaluate initializer of "
407 << *GV << " with type " << *Ty << " at offset "
408 << Offset.getZExtValue());
409 return false;
410 }
411 }
412
413 // Scalable types not currently supported.
414 if (Ty->isScalableTy())
415 return false;
416
417 auto IsStored = [](Value *V, Constant *Initializer) {
418 auto *SI = dyn_cast<StoreInst>(V);
419 if (!SI)
420 return false;
421
422 Constant *StoredConst = dyn_cast<Constant>(SI->getOperand(0));
423 if (!StoredConst)
424 return true;
425
426 // Don't consider stores that only write the initializer value.
427 return Initializer != StoredConst;
428 };
429
430 It->second.IsLoaded |= isa<LoadInst>(V);
431 It->second.IsStored |= IsStored(V, It->second.Initializer);
432 continue;
433 }
434
435 // Ignore dead constant users.
436 if (auto *C = dyn_cast<Constant>(V)) {
438 return false;
439 continue;
440 }
441
442 // Unknown user.
443 return false;
444 }
445
446 return true;
447}
448
449/// Copy over the debug info for a variable to its SRA replacements.
451 uint64_t FragmentOffsetInBits,
452 uint64_t FragmentSizeInBits,
453 uint64_t VarSize) {
455 GV->getDebugInfo(GVs);
456 for (auto *GVE : GVs) {
457 DIVariable *Var = GVE->getVariable();
458 DIExpression *Expr = GVE->getExpression();
459 int64_t CurVarOffsetInBytes = 0;
460 uint64_t CurVarOffsetInBits = 0;
461 uint64_t FragmentEndInBits = FragmentOffsetInBits + FragmentSizeInBits;
462
463 // Calculate the offset (Bytes), Continue if unknown.
464 if (!Expr->extractIfOffset(CurVarOffsetInBytes))
465 continue;
466
467 // Ignore negative offset.
468 if (CurVarOffsetInBytes < 0)
469 continue;
470
471 // Convert offset to bits.
472 CurVarOffsetInBits = CHAR_BIT * (uint64_t)CurVarOffsetInBytes;
473
474 // Current var starts after the fragment, ignore.
475 if (CurVarOffsetInBits >= FragmentEndInBits)
476 continue;
477
478 uint64_t CurVarSize = Var->getType()->getSizeInBits();
479 uint64_t CurVarEndInBits = CurVarOffsetInBits + CurVarSize;
480 // Current variable ends before start of fragment, ignore.
481 if (CurVarSize != 0 && /* CurVarSize is known */
482 CurVarEndInBits <= FragmentOffsetInBits)
483 continue;
484
485 // Current variable fits in (not greater than) the fragment,
486 // does not need fragment expression.
487 if (CurVarSize != 0 && /* CurVarSize is known */
488 CurVarOffsetInBits >= FragmentOffsetInBits &&
489 CurVarEndInBits <= FragmentEndInBits) {
490 uint64_t CurVarOffsetInFragment =
491 (CurVarOffsetInBits - FragmentOffsetInBits) / 8;
492 if (CurVarOffsetInFragment != 0)
493 Expr = DIExpression::get(Expr->getContext(), {dwarf::DW_OP_plus_uconst,
494 CurVarOffsetInFragment});
495 else
496 Expr = DIExpression::get(Expr->getContext(), {});
497 auto *NGVE =
498 DIGlobalVariableExpression::get(GVE->getContext(), Var, Expr);
499 NGV->addDebugInfo(NGVE);
500 continue;
501 }
502 // Current variable does not fit in single fragment,
503 // emit a fragment expression.
504 if (FragmentSizeInBits < VarSize) {
505 if (CurVarOffsetInBits > FragmentOffsetInBits)
506 continue;
507 uint64_t CurVarFragmentOffsetInBits =
508 FragmentOffsetInBits - CurVarOffsetInBits;
509 uint64_t CurVarFragmentSizeInBits = FragmentSizeInBits;
510 if (CurVarSize != 0 && CurVarEndInBits < FragmentEndInBits)
511 CurVarFragmentSizeInBits -= (FragmentEndInBits - CurVarEndInBits);
512 if (CurVarOffsetInBits)
513 Expr = DIExpression::get(Expr->getContext(), {});
515 Expr, CurVarFragmentOffsetInBits, CurVarFragmentSizeInBits))
516 Expr = *E;
517 else
518 continue;
519 }
520 auto *NGVE = DIGlobalVariableExpression::get(GVE->getContext(), Var, Expr);
521 NGV->addDebugInfo(NGVE);
522 }
523}
524
525/// Perform scalar replacement of aggregates on the specified global variable.
526/// This opens the door for other optimizations by exposing the behavior of the
527/// program in a more fine-grained way. We have determined that this
528/// transformation is safe already. We return the first global variable we
529/// insert so that the caller can reprocess it.
531 assert(GV->hasLocalLinkage());
532
533 // Collect types to split into.
535 if (!collectSRATypes(Parts, GV, DL) || Parts.empty())
536 return nullptr;
537
538 // Make sure we don't SRA back to the same type.
539 if (Parts.size() == 1 && Parts.begin()->second.Ty == GV->getValueType())
540 return nullptr;
541
542 // Don't perform SRA if we would have to split into many globals. Ignore
543 // parts that are either only loaded or only stored, because we expect them
544 // to be optimized away.
545 unsigned NumParts = count_if(Parts, [](const auto &Pair) {
546 return Pair.second.IsLoaded && Pair.second.IsStored;
547 });
548 if (NumParts > 16)
549 return nullptr;
550
551 // Sort by offset.
553 for (const auto &Pair : Parts) {
554 TypesVector.push_back(
555 {Pair.first, Pair.second.Ty, Pair.second.Initializer});
556 }
557 sort(TypesVector, llvm::less_first());
558
559 // Check that the types are non-overlapping.
560 uint64_t Offset = 0;
561 for (const auto &[OffsetForTy, Ty, _] : TypesVector) {
562 // Overlaps with previous type.
563 if (OffsetForTy < Offset)
564 return nullptr;
565
566 Offset = OffsetForTy + DL.getTypeAllocSize(Ty);
567 }
568
569 // Some accesses go beyond the end of the global, don't bother.
570 if (Offset > DL.getTypeAllocSize(GV->getValueType()))
571 return nullptr;
572
573 LLVM_DEBUG(dbgs() << "PERFORMING GLOBAL SRA ON: " << *GV << "\n");
574
575 // Get the alignment of the global, either explicit or target-specific.
576 Align StartAlignment =
577 DL.getValueOrABITypeAlignment(GV->getAlign(), GV->getValueType());
578 uint64_t VarSize = DL.getTypeSizeInBits(GV->getValueType());
579
580 // Create replacement globals.
582 unsigned NameSuffix = 0;
583 for (auto &[OffsetForTy, Ty, Initializer] : TypesVector) {
586 Initializer, GV->getName() + "." + Twine(NameSuffix++), GV,
588 // Start out by copying attributes from the original, including alignment.
589 NGV->copyAttributesFrom(GV);
590 NewGlobals.insert({OffsetForTy, NGV});
591
592 // Calculate the known alignment of the field. If the original aggregate
593 // had 256 byte alignment for example, then the element at a given offset
594 // may also have a known alignment, and something might depend on that:
595 // propagate info to each field.
596 Align NewAlign = commonAlignment(StartAlignment, OffsetForTy);
597 NGV->setAlignment(NewAlign);
598
599 // Copy over the debug info for the variable.
600 transferSRADebugInfo(GV, NGV, OffsetForTy * 8,
601 DL.getTypeAllocSizeInBits(Ty), VarSize);
602 }
603
604 // Replace uses of the original global with uses of the new global.
608 auto AppendUsers = [&](Value *V) {
609 for (User *U : V->users())
610 if (Visited.insert(U).second)
611 Worklist.push_back(U);
612 };
613 AppendUsers(GV);
614 while (!Worklist.empty()) {
615 Value *V = Worklist.pop_back_val();
617 isa<GEPOperator>(V)) {
618 AppendUsers(V);
619 if (isa<Instruction>(V))
620 DeadInsts.push_back(V);
621 continue;
622 }
623
624 if (Value *Ptr = getLoadStorePointerOperand(V)) {
625 APInt Offset(DL.getIndexTypeSizeInBits(Ptr->getType()), 0);
626 Ptr = Ptr->stripAndAccumulateConstantOffsets(DL, Offset,
627 /* AllowNonInbounds */ true);
628 assert(Ptr == GV && "Load/store must be from/to global");
629 GlobalVariable *NGV = NewGlobals[Offset.getZExtValue()];
630 assert(NGV && "Must have replacement global for this offset");
631
632 // Update the pointer operand and recalculate alignment.
633 Align PrefAlign = DL.getPrefTypeAlign(getLoadStoreType(V));
634 Align NewAlign =
636
637 if (auto *LI = dyn_cast<LoadInst>(V)) {
638 LI->setOperand(0, NGV);
639 LI->setAlignment(NewAlign);
640 } else {
641 auto *SI = cast<StoreInst>(V);
642 SI->setOperand(1, NGV);
643 SI->setAlignment(NewAlign);
644 }
645 continue;
646 }
647
649 "Other users can only be dead constants");
650 }
651
652 // Delete old instructions and global.
655 GV->eraseFromParent();
656 ++NumSRA;
657
658 assert(NewGlobals.size() > 0);
659 return NewGlobals.begin()->second;
660}
661
662/// Return true if all users of the specified value will trap if the value is
663/// dynamically null. PHIs keeps track of any phi nodes we've seen to avoid
664/// reprocessing them.
667 for (const User *U : V->users()) {
668 if (const Instruction *I = dyn_cast<Instruction>(U)) {
669 // If null pointer is considered valid, then all uses are non-trapping.
670 // Non address-space 0 globals have already been pruned by the caller.
671 if (NullPointerIsDefined(I->getFunction()))
672 return false;
673 }
674 if (isa<LoadInst>(U)) {
675 // Will trap.
676 } else if (const StoreInst *SI = dyn_cast<StoreInst>(U)) {
677 if (SI->getOperand(0) == V) {
678 return false; // Storing the value.
679 }
680 } else if (const CallInst *CI = dyn_cast<CallInst>(U)) {
681 if (CI->getCalledOperand() != V) {
682 return false; // Not calling the ptr
683 }
684 } else if (const InvokeInst *II = dyn_cast<InvokeInst>(U)) {
685 if (II->getCalledOperand() != V) {
686 return false; // Not calling the ptr
687 }
688 } else if (const AddrSpaceCastInst *CI = dyn_cast<AddrSpaceCastInst>(U)) {
689 if (!AllUsesOfValueWillTrapIfNull(CI, PHIs))
690 return false;
691 } else if (const GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(U)) {
692 if (!AllUsesOfValueWillTrapIfNull(GEPI, PHIs)) return false;
693 } else if (const PHINode *PN = dyn_cast<PHINode>(U)) {
694 // If we've already seen this phi node, ignore it, it has already been
695 // checked.
696 if (PHIs.insert(PN).second && !AllUsesOfValueWillTrapIfNull(PN, PHIs))
697 return false;
698 } else if (isa<ICmpInst>(U) &&
699 !ICmpInst::isSigned(cast<ICmpInst>(U)->getPredicate()) &&
700 isa<LoadInst>(U->getOperand(0)) &&
701 isa<ConstantPointerNull>(U->getOperand(1))) {
702 assert(isa<GlobalValue>(cast<LoadInst>(U->getOperand(0))
703 ->getPointerOperand()
704 ->stripPointerCasts()) &&
705 "Should be GlobalVariable");
706 // This and only this kind of non-signed ICmpInst is to be replaced with
707 // the comparing of the value of the created global init bool later in
708 // optimizeGlobalAddressOfAllocation for the global variable.
709 } else {
710 return false;
711 }
712 }
713 return true;
714}
715
716/// Return true if all uses of any loads from GV will trap if the loaded value
717/// is null. Note that this also permits comparisons of the loaded value
718/// against null, as a special case.
721 Worklist.push_back(GV);
722 while (!Worklist.empty()) {
723 const Value *P = Worklist.pop_back_val();
724 for (const auto *U : P->users()) {
725 if (auto *LI = dyn_cast<LoadInst>(U)) {
726 if (!LI->isSimple())
727 return false;
729 if (!AllUsesOfValueWillTrapIfNull(LI, PHIs))
730 return false;
731 } else if (auto *SI = dyn_cast<StoreInst>(U)) {
732 if (!SI->isSimple())
733 return false;
734 // Ignore stores to the global.
735 if (SI->getPointerOperand() != P)
736 return false;
737 } else if (auto *CE = dyn_cast<ConstantExpr>(U)) {
738 if (CE->stripPointerCasts() != GV)
739 return false;
740 // Check further the ConstantExpr.
741 Worklist.push_back(CE);
742 } else {
743 // We don't know or understand this user, bail out.
744 return false;
745 }
746 }
747 }
748
749 return true;
750}
751
752/// Get all the loads/store uses for global variable \p GV.
756 Worklist.push_back(GV);
757 while (!Worklist.empty()) {
758 auto *P = Worklist.pop_back_val();
759 for (auto *U : P->users()) {
760 if (auto *CE = dyn_cast<ConstantExpr>(U)) {
761 Worklist.push_back(CE);
762 continue;
763 }
764
766 "Expect only load or store instructions");
767 Uses.push_back(U);
768 }
769 }
770}
771
773 bool Changed = false;
774 for (auto UI = V->user_begin(), E = V->user_end(); UI != E; ) {
776 // Uses are non-trapping if null pointer is considered valid.
777 // Non address-space 0 globals are already pruned by the caller.
778 if (NullPointerIsDefined(I->getFunction()))
779 return false;
780 if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
781 LI->setOperand(0, NewV);
782 Changed = true;
783 } else if (StoreInst *SI = dyn_cast<StoreInst>(I)) {
784 if (SI->getOperand(1) == V) {
785 SI->setOperand(1, NewV);
786 Changed = true;
787 }
788 } else if (isa<CallInst>(I) || isa<InvokeInst>(I)) {
790 if (CB->getCalledOperand() == V) {
791 // Calling through the pointer! Turn into a direct call, but be careful
792 // that the pointer is not also being passed as an argument.
793 CB->setCalledOperand(NewV);
794 Changed = true;
795 bool PassedAsArg = false;
796 for (unsigned i = 0, e = CB->arg_size(); i != e; ++i)
797 if (CB->getArgOperand(i) == V) {
798 PassedAsArg = true;
799 CB->setArgOperand(i, NewV);
800 }
801
802 if (PassedAsArg) {
803 // Being passed as an argument also. Be careful to not invalidate UI!
804 UI = V->user_begin();
805 }
806 }
809 CI, ConstantExpr::getAddrSpaceCast(NewV, CI->getType()));
810 if (CI->use_empty()) {
811 Changed = true;
812 CI->eraseFromParent();
813 }
814 } else if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(I)) {
815 // Should handle GEP here.
817 Idxs.reserve(GEPI->getNumOperands()-1);
818 for (User::op_iterator i = GEPI->op_begin() + 1, e = GEPI->op_end();
819 i != e; ++i)
820 if (Constant *C = dyn_cast<Constant>(*i))
821 Idxs.push_back(C);
822 else
823 break;
824 if (Idxs.size() == GEPI->getNumOperands()-1)
826 GEPI, ConstantExpr::getGetElementPtr(GEPI->getSourceElementType(),
827 NewV, Idxs));
828 if (GEPI->use_empty()) {
829 Changed = true;
830 GEPI->eraseFromParent();
831 }
832 }
833 }
834
835 return Changed;
836}
837
838/// The specified global has only one non-null value stored into it. If there
839/// are uses of the loaded value that would trap if the loaded value is
840/// dynamically null, then we know that they cannot be reachable with a null
841/// optimize away the load.
843 GlobalVariable *GV, Constant *LV, const DataLayout &DL,
845 bool Changed = false;
846
847 // Keep track of whether we are able to remove all the uses of the global
848 // other than the store that defines it.
849 bool AllNonStoreUsesGone = true;
850
851 // Replace all uses of loads with uses of uses of the stored value.
852 for (User *GlobalUser : llvm::make_early_inc_range(GV->users())) {
853 if (LoadInst *LI = dyn_cast<LoadInst>(GlobalUser)) {
855 // If we were able to delete all uses of the loads
856 if (LI->use_empty()) {
857 LI->eraseFromParent();
858 Changed = true;
859 } else {
860 AllNonStoreUsesGone = false;
861 }
862 } else if (isa<StoreInst>(GlobalUser)) {
863 // Ignore the store that stores "LV" to the global.
864 assert(GlobalUser->getOperand(1) == GV &&
865 "Must be storing *to* the global");
866 } else {
867 AllNonStoreUsesGone = false;
868
869 // If we get here we could have other crazy uses that are transitively
870 // loaded.
871 assert((isa<PHINode>(GlobalUser) || isa<SelectInst>(GlobalUser) ||
872 isa<ConstantExpr>(GlobalUser) || isa<CmpInst>(GlobalUser) ||
873 isa<BitCastInst>(GlobalUser) ||
874 isa<GetElementPtrInst>(GlobalUser) ||
875 isa<AddrSpaceCastInst>(GlobalUser)) &&
876 "Only expect load and stores!");
877 }
878 }
879
880 if (Changed) {
881 LLVM_DEBUG(dbgs() << "OPTIMIZED LOADS FROM STORED ONCE POINTER: " << *GV
882 << "\n");
883 ++NumGlobUses;
884 }
885
886 // If we nuked all of the loads, then none of the stores are needed either,
887 // nor is the global.
888 if (AllNonStoreUsesGone) {
889 if (isLeakCheckerRoot(GV)) {
890 Changed |= CleanupPointerRootUsers(GV, GetTLI);
891 } else {
892 Changed = true;
894 }
895 if (GV->use_empty()) {
896 LLVM_DEBUG(dbgs() << " *** GLOBAL NOW DEAD!\n");
897 Changed = true;
898 GV->eraseFromParent();
899 ++NumDeleted;
900 }
901 }
902 return Changed;
903}
904
905/// Walk the use list of V, constant folding all of the instructions that are
906/// foldable.
907static void ConstantPropUsersOf(Value *V, const DataLayout &DL,
908 TargetLibraryInfo *TLI) {
909 for (Value::user_iterator UI = V->user_begin(), E = V->user_end(); UI != E; )
910 if (Instruction *I = dyn_cast<Instruction>(*UI++))
911 if (Constant *NewC = ConstantFoldInstruction(I, DL, TLI)) {
912 I->replaceAllUsesWith(NewC);
913
914 // Advance UI to the next non-I use to avoid invalidating it!
915 // Instructions could multiply use V.
916 while (UI != E && *UI == I)
917 ++UI;
919 I->eraseFromParent();
920 }
921}
922
923/// This function takes the specified global variable, and transforms the
924/// program as if it always contained the result of the specified malloc.
925/// Because it is always the result of the specified malloc, there is no reason
926/// to actually DO the malloc. Instead, turn the malloc into a global, and any
927/// loads of GV as uses of the new global.
928static GlobalVariable *
930 uint64_t AllocSize, Constant *InitVal,
931 const DataLayout &DL,
932 TargetLibraryInfo *TLI) {
933 LLVM_DEBUG(errs() << "PROMOTING GLOBAL: " << *GV << " CALL = " << *CI
934 << '\n');
935
936 // Create global of type [AllocSize x i8].
937 Type *GlobalType = ArrayType::get(Type::getInt8Ty(GV->getContext()),
938 AllocSize);
939
940 // Create the new global variable. The contents of the allocated memory is
941 // undefined initially, so initialize with an undef value.
942 GlobalVariable *NewGV = new GlobalVariable(
943 *GV->getParent(), GlobalType, false, GlobalValue::InternalLinkage,
944 UndefValue::get(GlobalType), GV->getName() + ".body", nullptr,
945 GV->getThreadLocalMode());
946
947 // Initialize the global at the point of the original call. Note that this
948 // is a different point from the initialization referred to below for the
949 // nullability handling. Sublety: We have not proven the original global was
950 // only initialized once. As such, we can not fold this into the initializer
951 // of the new global as may need to re-init the storage multiple times.
952 if (!isa<UndefValue>(InitVal)) {
953 IRBuilder<> Builder(CI->getNextNode());
954 // TODO: Use alignment above if align!=1
955 Builder.CreateMemSet(NewGV, InitVal, AllocSize, std::nullopt);
956 }
957
958 // Update users of the allocation to use the new global instead.
959 CI->replaceAllUsesWith(NewGV);
960
961 // If there is a comparison against null, we will insert a global bool to
962 // keep track of whether the global was initialized yet or not.
963 GlobalVariable *InitBool = new GlobalVariable(
965 ConstantInt::getFalse(GV->getContext()), GV->getName() + ".init",
967 bool InitBoolUsed = false;
968
969 // Loop over all instruction uses of GV, processing them in turn.
971 allUsesOfLoadAndStores(GV, Guses);
972 for (auto *U : Guses) {
973 if (StoreInst *SI = dyn_cast<StoreInst>(U)) {
974 // The global is initialized when the store to it occurs. If the stored
975 // value is null value, the global bool is set to false, otherwise true.
976 auto *NewSI = new StoreInst(
978 SI->getValueOperand())),
979 InitBool, false, Align(1), SI->getOrdering(), SI->getSyncScopeID(),
980 SI->getIterator());
981 NewSI->setDebugLoc(SI->getDebugLoc());
982 SI->eraseFromParent();
983 continue;
984 }
985
986 LoadInst *LI = cast<LoadInst>(U);
987 while (!LI->use_empty()) {
988 Use &LoadUse = *LI->use_begin();
989 ICmpInst *ICI = dyn_cast<ICmpInst>(LoadUse.getUser());
990 if (!ICI) {
991 LoadUse.set(NewGV);
992 continue;
993 }
994
995 // Replace the cmp X, 0 with a use of the bool value.
996 Value *LV = new LoadInst(InitBool->getValueType(), InitBool,
997 InitBool->getName() + ".val", false, Align(1),
998 LI->getOrdering(), LI->getSyncScopeID(),
999 LI->getIterator());
1000 // FIXME: Should we use the DebugLoc of the load used by the predicate, or
1001 // the predicate? The load seems most appropriate, but there's an argument
1002 // that the new load does not represent the old load, but is simply a
1003 // component of recomputing the predicate.
1004 cast<LoadInst>(LV)->setDebugLoc(LI->getDebugLoc());
1005 InitBoolUsed = true;
1006 switch (ICI->getPredicate()) {
1007 default: llvm_unreachable("Unknown ICmp Predicate!");
1008 case ICmpInst::ICMP_ULT: // X < null -> always false
1010 break;
1011 case ICmpInst::ICMP_UGE: // X >= null -> always true
1012 LV = ConstantInt::getTrue(GV->getContext());
1013 break;
1014 case ICmpInst::ICMP_ULE:
1015 case ICmpInst::ICMP_EQ:
1016 LV = BinaryOperator::CreateNot(LV, "notinit", ICI->getIterator());
1017 cast<BinaryOperator>(LV)->setDebugLoc(ICI->getDebugLoc());
1018 break;
1019 case ICmpInst::ICMP_NE:
1020 case ICmpInst::ICMP_UGT:
1021 break; // no change.
1022 }
1023 ICI->replaceAllUsesWith(LV);
1024 ICI->eraseFromParent();
1025 }
1026 LI->eraseFromParent();
1027 }
1028
1029 // If the initialization boolean was used, insert it, otherwise delete it.
1030 if (!InitBoolUsed) {
1031 while (!InitBool->use_empty()) // Delete initializations
1032 cast<StoreInst>(InitBool->user_back())->eraseFromParent();
1033 delete InitBool;
1034 } else
1035 GV->getParent()->insertGlobalVariable(GV->getIterator(), InitBool);
1036
1037 // Now the GV is dead, nuke it and the allocation..
1038 GV->eraseFromParent();
1039 CI->eraseFromParent();
1040
1041 // To further other optimizations, loop over all users of NewGV and try to
1042 // constant prop them. This will promote GEP instructions with constant
1043 // indices into GEP constant-exprs, which will allow global-opt to hack on it.
1044 ConstantPropUsersOf(NewGV, DL, TLI);
1045
1046 return NewGV;
1047}
1048
1049/// Scan the use-list of GV checking to make sure that there are no complex uses
1050/// of GV. We permit simple things like dereferencing the pointer, but not
1051/// storing through the address, unless it is to the specified global.
1052static bool
1054 const GlobalVariable *GV) {
1057 Worklist.push_back(CI);
1058
1059 while (!Worklist.empty()) {
1060 const Value *V = Worklist.pop_back_val();
1061 if (!Visited.insert(V).second)
1062 continue;
1063
1064 for (const Use &VUse : V->uses()) {
1065 const User *U = VUse.getUser();
1066 if (isa<LoadInst>(U) || isa<CmpInst>(U))
1067 continue; // Fine, ignore.
1068
1069 if (auto *SI = dyn_cast<StoreInst>(U)) {
1070 if (SI->getValueOperand() == V &&
1071 SI->getPointerOperand()->stripPointerCasts() != GV)
1072 return false; // Storing the pointer not into GV... bad.
1073 continue; // Otherwise, storing through it, or storing into GV... fine.
1074 }
1075
1076 if (auto *GEPI = dyn_cast<GetElementPtrInst>(U)) {
1077 Worklist.push_back(GEPI);
1078 continue;
1079 }
1080
1081 return false;
1082 }
1083 }
1084
1085 return true;
1086}
1087
1088/// If we have a global that is only initialized with a fixed size allocation
1089/// try to transform the program to use global memory instead of heap
1090/// allocated memory. This eliminates dynamic allocation, avoids an indirection
1091/// accessing the data, and exposes the resultant global to further GlobalOpt.
1093 CallInst *CI,
1094 const DataLayout &DL,
1095 TargetLibraryInfo *TLI) {
1096 if (!isRemovableAlloc(CI, TLI))
1097 // Must be able to remove the call when we get done..
1098 return false;
1099
1100 Type *Int8Ty = Type::getInt8Ty(CI->getFunction()->getContext());
1101 Constant *InitVal = getInitialValueOfAllocation(CI, TLI, Int8Ty);
1102 if (!InitVal)
1103 // Must be able to emit a memset for initialization
1104 return false;
1105
1106 uint64_t AllocSize;
1107 if (!getObjectSize(CI, AllocSize, DL, TLI, ObjectSizeOpts()))
1108 return false;
1109
1110 // Restrict this transformation to only working on small allocations
1111 // (2048 bytes currently), as we don't want to introduce a 16M global or
1112 // something.
1113 if (AllocSize >= 2048)
1114 return false;
1115
1116 // We can't optimize this global unless all uses of it are *known* to be
1117 // of the malloc value, not of the null initializer value (consider a use
1118 // that compares the global's value against zero to see if the malloc has
1119 // been reached). To do this, we check to see if all uses of the global
1120 // would trap if the global were null: this proves that they must all
1121 // happen after the malloc.
1123 return false;
1124
1125 // We can't optimize this if the malloc itself is used in a complex way,
1126 // for example, being stored into multiple globals. This allows the
1127 // malloc to be stored into the specified global, loaded, gep, icmp'd.
1128 // These are all things we could transform to using the global for.
1130 return false;
1131
1132 OptimizeGlobalAddressOfAllocation(GV, CI, AllocSize, InitVal, DL, TLI);
1133 return true;
1134}
1135
1136// Try to optimize globals based on the knowledge that only one value (besides
1137// its initializer) is ever stored to the global.
1138static bool
1140 const DataLayout &DL,
1142 // If we are dealing with a pointer global that is initialized to null and
1143 // only has one (non-null) value stored into it, then we can optimize any
1144 // users of the loaded value (often calls and loads) that would trap if the
1145 // value was null.
1146 if (GV->getInitializer()->getType()->isPointerTy() &&
1147 GV->getInitializer()->isNullValue() &&
1148 StoredOnceVal->getType()->isPointerTy() &&
1150 nullptr /* F */,
1152 if (Constant *SOVC = dyn_cast<Constant>(StoredOnceVal)) {
1153 // Optimize away any trapping uses of the loaded value.
1154 if (OptimizeAwayTrappingUsesOfLoads(GV, SOVC, DL, GetTLI))
1155 return true;
1156 } else if (isAllocationFn(StoredOnceVal, GetTLI)) {
1157 if (auto *CI = dyn_cast<CallInst>(StoredOnceVal)) {
1158 auto *TLI = &GetTLI(*CI->getFunction());
1160 return true;
1161 }
1162 }
1163 }
1164
1165 return false;
1166}
1167
1168/// At this point, we have learned that the only two values ever stored into GV
1169/// are its initializer and OtherVal. See if we can shrink the global into a
1170/// boolean and select between the two values whenever it is used. This exposes
1171/// the values to other scalar optimizations.
1173 Type *GVElType = GV->getValueType();
1174
1175 // If GVElType is already i1, it is already shrunk. If the type of the GV is
1176 // an FP value, pointer or vector, don't do this optimization because a select
1177 // between them is very expensive and unlikely to lead to later
1178 // simplification. In these cases, we typically end up with "cond ? v1 : v2"
1179 // where v1 and v2 both require constant pool loads, a big loss.
1180 if (GVElType == Type::getInt1Ty(GV->getContext()) ||
1181 GVElType->isFloatingPointTy() ||
1182 GVElType->isPointerTy() || GVElType->isVectorTy())
1183 return false;
1184
1185 // Walk the use list of the global seeing if all the uses are load or store.
1186 // If there is anything else, bail out.
1187 for (User *U : GV->users()) {
1188 if (!isa<LoadInst>(U) && !isa<StoreInst>(U))
1189 return false;
1190 if (getLoadStoreType(U) != GVElType)
1191 return false;
1192 }
1193
1194 LLVM_DEBUG(dbgs() << " *** SHRINKING TO BOOL: " << *GV << "\n");
1195
1196 // Create the new global, initializing it to false.
1198 false,
1201 GV->getName()+".b",
1202 GV->getThreadLocalMode(),
1203 GV->getType()->getAddressSpace());
1204 NewGV->copyAttributesFrom(GV);
1205 GV->getParent()->insertGlobalVariable(GV->getIterator(), NewGV);
1206
1207 Constant *InitVal = GV->getInitializer();
1208 assert(InitVal->getType() != Type::getInt1Ty(GV->getContext()) &&
1209 "No reason to shrink to bool!");
1210
1212 GV->getDebugInfo(GVs);
1213
1214 // If initialized to zero and storing one into the global, we can use a cast
1215 // instead of a select to synthesize the desired value.
1216 bool IsOneZero = false;
1217 bool EmitOneOrZero = true;
1218 auto *CI = dyn_cast<ConstantInt>(OtherVal);
1219 if (CI && CI->getValue().getActiveBits() <= 64) {
1220 IsOneZero = InitVal->isNullValue() && CI->isOne();
1221
1222 auto *CIInit = dyn_cast<ConstantInt>(GV->getInitializer());
1223 if (CIInit && CIInit->getValue().getActiveBits() <= 64) {
1224 uint64_t ValInit = CIInit->getZExtValue();
1225 uint64_t ValOther = CI->getZExtValue();
1226 uint64_t ValMinus = ValOther - ValInit;
1227
1228 for(auto *GVe : GVs){
1229 DIGlobalVariable *DGV = GVe->getVariable();
1230 DIExpression *E = GVe->getExpression();
1231 const DataLayout &DL = GV->getDataLayout();
1232 unsigned SizeInOctets =
1233 DL.getTypeAllocSizeInBits(NewGV->getValueType()) / 8;
1234
1235 // It is expected that the address of global optimized variable is on
1236 // top of the stack. After optimization, value of that variable will
1237 // be ether 0 for initial value or 1 for other value. The following
1238 // expression should return constant integer value depending on the
1239 // value at global object address:
1240 // val * (ValOther - ValInit) + ValInit:
1241 // DW_OP_deref DW_OP_constu <ValMinus>
1242 // DW_OP_mul DW_OP_constu <ValInit> DW_OP_plus DW_OP_stack_value
1244 dwarf::DW_OP_deref_size, SizeInOctets,
1245 dwarf::DW_OP_constu, ValMinus,
1246 dwarf::DW_OP_mul, dwarf::DW_OP_constu, ValInit,
1247 dwarf::DW_OP_plus};
1248 bool WithStackValue = true;
1249 E = DIExpression::prependOpcodes(E, Ops, WithStackValue);
1252 NewGV->addDebugInfo(DGVE);
1253 }
1254 EmitOneOrZero = false;
1255 }
1256 }
1257
1258 if (EmitOneOrZero) {
1259 // FIXME: This will only emit address for debugger on which will
1260 // be written only 0 or 1.
1261 for(auto *GV : GVs)
1262 NewGV->addDebugInfo(GV);
1263 }
1264
1265 while (!GV->use_empty()) {
1267 if (StoreInst *SI = dyn_cast<StoreInst>(UI)) {
1268 // Change the store into a boolean store.
1269 bool StoringOther = SI->getOperand(0) == OtherVal;
1270 // Only do this if we weren't storing a loaded value.
1271 Value *StoreVal;
1272 if (StoringOther || SI->getOperand(0) == InitVal) {
1273 StoreVal = ConstantInt::get(Type::getInt1Ty(GV->getContext()),
1274 StoringOther);
1275 } else {
1276 // Otherwise, we are storing a previously loaded copy. To do this,
1277 // change the copy from copying the original value to just copying the
1278 // bool.
1279 Instruction *StoredVal = cast<Instruction>(SI->getOperand(0));
1280
1281 // If we've already replaced the input, StoredVal will be a cast or
1282 // select instruction. If not, it will be a load of the original
1283 // global.
1284 if (LoadInst *LI = dyn_cast<LoadInst>(StoredVal)) {
1285 assert(LI->getOperand(0) == GV && "Not a copy!");
1286 // Insert a new load, to preserve the saved value.
1287 StoreVal =
1288 new LoadInst(NewGV->getValueType(), NewGV, LI->getName() + ".b",
1289 false, Align(1), LI->getOrdering(),
1290 LI->getSyncScopeID(), LI->getIterator());
1291 cast<LoadInst>(StoreVal)->setDebugLoc(LI->getDebugLoc());
1292 } else {
1293 assert((isa<CastInst>(StoredVal) || isa<SelectInst>(StoredVal)) &&
1294 "This is not a form that we understand!");
1295 StoreVal = StoredVal->getOperand(0);
1296 assert(isa<LoadInst>(StoreVal) && "Not a load of NewGV!");
1297 }
1298 }
1299 StoreInst *NSI =
1300 new StoreInst(StoreVal, NewGV, false, Align(1), SI->getOrdering(),
1301 SI->getSyncScopeID(), SI->getIterator());
1302 NSI->setDebugLoc(SI->getDebugLoc());
1303 } else {
1304 // Change the load into a load of bool then a select.
1305 LoadInst *LI = cast<LoadInst>(UI);
1306 LoadInst *NLI = new LoadInst(
1307 NewGV->getValueType(), NewGV, LI->getName() + ".b", false, Align(1),
1308 LI->getOrdering(), LI->getSyncScopeID(), LI->getIterator());
1309 Instruction *NSI;
1310 if (IsOneZero)
1311 NSI = new ZExtInst(NLI, LI->getType(), "", LI->getIterator());
1312 else {
1313 NSI = SelectInst::Create(NLI, OtherVal, InitVal, "", LI->getIterator());
1315 }
1316 NSI->takeName(LI);
1317 // Since LI is split into two instructions, NLI and NSI both inherit the
1318 // same DebugLoc
1319 NLI->setDebugLoc(LI->getDebugLoc());
1320 NSI->setDebugLoc(LI->getDebugLoc());
1321 LI->replaceAllUsesWith(NSI);
1322 }
1323 UI->eraseFromParent();
1324 }
1325
1326 // Retain the name of the old global variable. People who are debugging their
1327 // programs may expect these variables to be named the same.
1328 NewGV->takeName(GV);
1329 GV->eraseFromParent();
1330 return true;
1331}
1332
1333static bool
1335 SmallPtrSetImpl<const Comdat *> &NotDiscardableComdats,
1336 function_ref<void(Function &)> DeleteFnCallback = nullptr) {
1338
1339 if (!GV.isDiscardableIfUnused() && !GV.isDeclaration())
1340 return false;
1341
1342 if (const Comdat *C = GV.getComdat())
1343 if (!GV.hasLocalLinkage() && NotDiscardableComdats.count(C))
1344 return false;
1345
1346 bool Dead;
1347 if (auto *F = dyn_cast<Function>(&GV))
1348 Dead = (F->isDeclaration() && F->use_empty()) || F->isDefTriviallyDead();
1349 else
1350 Dead = GV.use_empty();
1351 if (!Dead)
1352 return false;
1353
1354 LLVM_DEBUG(dbgs() << "GLOBAL DEAD: " << GV << "\n");
1355 if (auto *F = dyn_cast<Function>(&GV)) {
1356 if (DeleteFnCallback)
1357 DeleteFnCallback(*F);
1358 }
1360 GV.eraseFromParent();
1361 ++NumDeleted;
1362 return true;
1363}
1364
1366 const Function *F, GlobalValue *GV,
1367 function_ref<DominatorTree &(Function &)> LookupDomTree) {
1368 // Find all uses of GV. We expect them all to be in F, and if we can't
1369 // identify any of the uses we bail out.
1370 //
1371 // On each of these uses, identify if the memory that GV points to is
1372 // used/required/live at the start of the function. If it is not, for example
1373 // if the first thing the function does is store to the GV, the GV can
1374 // possibly be demoted.
1375 //
1376 // We don't do an exhaustive search for memory operations - simply look
1377 // through bitcasts as they're quite common and benign.
1378 const DataLayout &DL = GV->getDataLayout();
1381 for (auto *U : GV->users()) {
1383 if (!I)
1384 return false;
1385 assert(I->getParent()->getParent() == F);
1386
1387 if (auto *LI = dyn_cast<LoadInst>(I))
1388 Loads.push_back(LI);
1389 else if (auto *SI = dyn_cast<StoreInst>(I))
1390 Stores.push_back(SI);
1391 else
1392 return false;
1393 }
1394
1395 // We have identified all uses of GV into loads and stores. Now check if all
1396 // of them are known not to depend on the value of the global at the function
1397 // entry point. We do this by ensuring that every load is dominated by at
1398 // least one store.
1399 auto &DT = LookupDomTree(*const_cast<Function *>(F));
1400
1401 // The below check is quadratic. Check we're not going to do too many tests.
1402 // FIXME: Even though this will always have worst-case quadratic time, we
1403 // could put effort into minimizing the average time by putting stores that
1404 // have been shown to dominate at least one load at the beginning of the
1405 // Stores array, making subsequent dominance checks more likely to succeed
1406 // early.
1407 //
1408 // The threshold here is fairly large because global->local demotion is a
1409 // very powerful optimization should it fire.
1410 const unsigned Threshold = 100;
1411 if (Loads.size() * Stores.size() > Threshold)
1412 return false;
1413
1414 for (auto *L : Loads) {
1415 auto *LTy = L->getType();
1416 if (none_of(Stores, [&](const StoreInst *S) {
1417 auto *STy = S->getValueOperand()->getType();
1418 // The load is only dominated by the store if DomTree says so
1419 // and the number of bits loaded in L is less than or equal to
1420 // the number of bits stored in S.
1421 return DT.dominates(S, L) &&
1422 DL.getTypeStoreSize(LTy).getFixedValue() <=
1423 DL.getTypeStoreSize(STy).getFixedValue();
1424 }))
1425 return false;
1426 }
1427 // All loads have known dependences inside F, so the global can be localized.
1428 return true;
1429}
1430
1431// For a global variable with one store, if the store dominates any loads,
1432// those loads will always load the stored value (as opposed to the
1433// initializer), even in the presence of recursion.
1435 GlobalVariable *GV, const StoreInst *StoredOnceStore,
1436 function_ref<DominatorTree &(Function &)> LookupDomTree) {
1437 const Value *StoredOnceValue = StoredOnceStore->getValueOperand();
1438 // We can do this optimization for non-constants in nosync + norecurse
1439 // functions, but globals used in exactly one norecurse functions are already
1440 // promoted to an alloca.
1441 if (!isa<Constant>(StoredOnceValue))
1442 return false;
1443 const Function *F = StoredOnceStore->getFunction();
1445 for (User *U : GV->users()) {
1446 if (auto *LI = dyn_cast<LoadInst>(U)) {
1447 if (LI->getFunction() == F &&
1448 LI->getType() == StoredOnceValue->getType() && LI->isSimple())
1449 Loads.push_back(LI);
1450 }
1451 }
1452 // Only compute DT if we have any loads to examine.
1453 bool MadeChange = false;
1454 if (!Loads.empty()) {
1455 auto &DT = LookupDomTree(*const_cast<Function *>(F));
1456 for (auto *LI : Loads) {
1457 if (DT.dominates(StoredOnceStore, LI)) {
1458 LI->replaceAllUsesWith(const_cast<Value *>(StoredOnceValue));
1459 LI->eraseFromParent();
1460 MadeChange = true;
1461 }
1462 }
1463 }
1464 return MadeChange;
1465}
1466
1467/// Analyze the specified global variable and optimize
1468/// it if possible. If we make a change, return true.
1469static bool
1473 function_ref<DominatorTree &(Function &)> LookupDomTree) {
1474 auto &DL = GV->getDataLayout();
1475 // If this is a first class global and has only one accessing function and
1476 // this function is non-recursive, we replace the global with a local alloca
1477 // in this function.
1478 //
1479 // NOTE: It doesn't make sense to promote non-single-value types since we
1480 // are just replacing static memory to stack memory.
1481 //
1482 // If the global is in different address space, don't bring it to stack.
1483 if (!GS.HasMultipleAccessingFunctions &&
1484 GS.AccessingFunction &&
1486 GV->getType()->getAddressSpace() == DL.getAllocaAddrSpace() &&
1487 !GV->isExternallyInitialized() &&
1488 GS.AccessingFunction->doesNotRecurse() &&
1489 isPointerValueDeadOnEntryToFunction(GS.AccessingFunction, GV,
1490 LookupDomTree)) {
1491 const DataLayout &DL = GV->getDataLayout();
1492
1493 LLVM_DEBUG(dbgs() << "LOCALIZING GLOBAL: " << *GV << "\n");
1494 BasicBlock::iterator FirstI =
1495 GS.AccessingFunction->getEntryBlock().begin().getNonConst();
1496 Type *ElemTy = GV->getValueType();
1497 // FIXME: Pass Global's alignment when globals have alignment
1498 AllocaInst *Alloca = new AllocaInst(ElemTy, DL.getAllocaAddrSpace(),
1499 nullptr, GV->getName(), FirstI);
1501 if (!isa<UndefValue>(GV->getInitializer())) {
1502 auto *SI = new StoreInst(GV->getInitializer(), Alloca, FirstI);
1503 // FIXME: We're localizing a global and creating a store instruction for
1504 // the initial value of that global. Could we logically use the global
1505 // variable's (if one exists) line for this?
1506 SI->setDebugLoc(DebugLoc::getCompilerGenerated());
1507 }
1508
1509 GV->replaceAllUsesWith(Alloca);
1510 GV->eraseFromParent();
1511 ++NumLocalized;
1512 return true;
1513 }
1514
1515 bool Changed = false;
1516
1517 // If the global is never loaded (but may be stored to), it is dead.
1518 // Delete it now.
1519 if (!GS.IsLoaded) {
1520 LLVM_DEBUG(dbgs() << "GLOBAL NEVER LOADED: " << *GV << "\n");
1521
1522 if (isLeakCheckerRoot(GV)) {
1523 // Delete any constant stores to the global.
1524 Changed = CleanupPointerRootUsers(GV, GetTLI);
1525 } else {
1526 // Delete any stores we can find to the global. We may not be able to
1527 // make it completely dead though.
1529 }
1530
1531 // If the global is dead now, delete it.
1532 if (GV->use_empty()) {
1533 GV->eraseFromParent();
1534 ++NumDeleted;
1535 Changed = true;
1536 }
1537 return Changed;
1538
1539 }
1540 if (GS.StoredType <= GlobalStatus::InitializerStored) {
1541 LLVM_DEBUG(dbgs() << "MARKING CONSTANT: " << *GV << "\n");
1542
1543 // Don't actually mark a global constant if it's atomic because atomic loads
1544 // are implemented by a trivial cmpxchg in some edge-cases and that usually
1545 // requires write access to the variable even if it's not actually changed.
1546 if (GS.Ordering == AtomicOrdering::NotAtomic) {
1547 assert(!GV->isConstant() && "Expected a non-constant global");
1548 GV->setConstant(true);
1549 Changed = true;
1550 }
1551
1552 // Clean up any obviously simplifiable users now.
1554
1555 // If the global is dead now, just nuke it.
1556 if (GV->use_empty()) {
1557 LLVM_DEBUG(dbgs() << " *** Marking constant allowed us to simplify "
1558 << "all users and delete global!\n");
1559 GV->eraseFromParent();
1560 ++NumDeleted;
1561 return true;
1562 }
1563
1564 // Fall through to the next check; see if we can optimize further.
1565 ++NumMarked;
1566 }
1567 if (!GV->getInitializer()->getType()->isSingleValueType()) {
1568 const DataLayout &DL = GV->getDataLayout();
1569 if (SRAGlobal(GV, DL))
1570 return true;
1571 }
1572 Value *StoredOnceValue = GS.getStoredOnceValue();
1573 if (GS.StoredType == GlobalStatus::StoredOnce && StoredOnceValue) {
1574 Function &StoreFn =
1575 const_cast<Function &>(*GS.StoredOnceStore->getFunction());
1576 bool CanHaveNonUndefGlobalInitializer =
1577 GetTTI(StoreFn).canHaveNonUndefGlobalInitializerInAddressSpace(
1578 GV->getType()->getAddressSpace());
1579 // If the initial value for the global was an undef value, and if only
1580 // one other value was stored into it, we can just change the
1581 // initializer to be the stored value, then delete all stores to the
1582 // global. This allows us to mark it constant.
1583 // This is restricted to address spaces that allow globals to have
1584 // initializers. NVPTX, for example, does not support initializers for
1585 // shared memory (AS 3).
1586 auto *SOVConstant = dyn_cast<Constant>(StoredOnceValue);
1587 if (SOVConstant && isa<UndefValue>(GV->getInitializer()) &&
1588 DL.getTypeAllocSize(SOVConstant->getType()) ==
1589 DL.getTypeAllocSize(GV->getValueType()) &&
1590 CanHaveNonUndefGlobalInitializer) {
1591 if (SOVConstant->getType() == GV->getValueType()) {
1592 // Change the initializer in place.
1593 GV->setInitializer(SOVConstant);
1594 } else {
1595 // Create a new global with adjusted type.
1596 auto *NGV = new GlobalVariable(
1597 *GV->getParent(), SOVConstant->getType(), GV->isConstant(),
1598 GV->getLinkage(), SOVConstant, "", GV, GV->getThreadLocalMode(),
1599 GV->getAddressSpace());
1600 NGV->takeName(GV);
1601 NGV->copyAttributesFrom(GV);
1602 GV->replaceAllUsesWith(NGV);
1603 GV->eraseFromParent();
1604 GV = NGV;
1605 }
1606
1607 // Clean up any obviously simplifiable users now.
1609
1610 if (GV->use_empty()) {
1611 LLVM_DEBUG(dbgs() << " *** Substituting initializer allowed us to "
1612 << "simplify all users and delete global!\n");
1613 GV->eraseFromParent();
1614 ++NumDeleted;
1615 }
1616 ++NumSubstitute;
1617 return true;
1618 }
1619
1620 // Try to optimize globals based on the knowledge that only one value
1621 // (besides its initializer) is ever stored to the global.
1622 if (optimizeOnceStoredGlobal(GV, StoredOnceValue, DL, GetTLI))
1623 return true;
1624
1625 // Try to forward the store to any loads. If we have more than one store, we
1626 // may have a store of the initializer between StoredOnceStore and a load.
1627 if (GS.NumStores == 1)
1628 if (forwardStoredOnceStore(GV, GS.StoredOnceStore, LookupDomTree))
1629 return true;
1630
1631 // Otherwise, if the global was not a boolean, we can shrink it to be a
1632 // boolean. Skip this optimization for AS that doesn't allow an initializer.
1633 if (SOVConstant && GS.Ordering == AtomicOrdering::NotAtomic &&
1635 CanHaveNonUndefGlobalInitializer)) {
1636 if (TryToShrinkGlobalToBoolean(GV, SOVConstant)) {
1637 ++NumShrunkToBool;
1638 return true;
1639 }
1640 }
1641 }
1642
1643 return Changed;
1644}
1645
1646/// Analyze the specified global variable and optimize it if possible. If we
1647/// make a change, return true.
1648static bool
1652 function_ref<DominatorTree &(Function &)> LookupDomTree) {
1653 if (GV.getName().starts_with("llvm."))
1654 return false;
1655
1656 GlobalStatus GS;
1657
1658 if (GlobalStatus::analyzeGlobal(&GV, GS))
1659 return false;
1660
1661 bool Changed = false;
1662 if (!GS.IsCompared && !GV.hasGlobalUnnamedAddr()) {
1663 auto NewUnnamedAddr = GV.hasLocalLinkage() ? GlobalValue::UnnamedAddr::Global
1665 if (NewUnnamedAddr != GV.getUnnamedAddr()) {
1666 GV.setUnnamedAddr(NewUnnamedAddr);
1667 NumUnnamed++;
1668 Changed = true;
1669 }
1670 }
1671
1672 // Do more involved optimizations if the global is internal.
1673 if (!GV.hasLocalLinkage())
1674 return Changed;
1675
1676 auto *GVar = dyn_cast<GlobalVariable>(&GV);
1677 if (!GVar)
1678 return Changed;
1679
1680 if (GVar->isConstant() || !GVar->hasInitializer())
1681 return Changed;
1682
1683 return processInternalGlobal(GVar, GS, GetTTI, GetTLI, LookupDomTree) ||
1684 Changed;
1685}
1686
1687/// Walk all of the direct calls of the specified function, changing them to
1688/// FastCC.
1690 for (User *U : F->users())
1691 if (auto *Call = dyn_cast<CallBase>(U))
1692 if (Call->getCalledOperand() == F)
1693 Call->setCallingConv(CallingConv::Fast);
1694}
1695
1696static AttributeList StripAttr(LLVMContext &C, AttributeList Attrs,
1698 unsigned AttrIndex;
1699 if (Attrs.hasAttrSomewhere(A, &AttrIndex))
1700 return Attrs.removeAttributeAtIndex(C, AttrIndex, A);
1701 return Attrs;
1702}
1703
1705 F->setAttributes(StripAttr(F->getContext(), F->getAttributes(), A));
1706 for (User *U : F->users()) {
1707 CallBase *CB = cast<CallBase>(U);
1708 CB->setAttributes(StripAttr(F->getContext(), CB->getAttributes(), A));
1709 }
1710}
1711
1712/// Return true if this is a calling convention that we'd like to change. The
1713/// idea here is that we don't want to mess with the convention if the user
1714/// explicitly requested something with performance implications like coldcc,
1715/// GHC, or anyregcc.
1717 CallingConv::ID CC = F->getCallingConv();
1718
1719 // FIXME: Is it worth transforming x86_stdcallcc and x86_fastcallcc?
1720 if (CC != CallingConv::C && CC != CallingConv::X86_ThisCall)
1721 return false;
1722
1723 if (F->isVarArg())
1724 return false;
1725
1726 // FIXME: Change CC for the whole chain of musttail calls when possible.
1727 //
1728 // Can't change CC of the function that either has musttail calls, or is a
1729 // musttail callee itself
1730 for (User *U : F->users()) {
1732 if (!CI)
1733 continue;
1734
1735 if (CI->isMustTailCall())
1736 return false;
1737 }
1738
1739 for (BasicBlock &BB : *F)
1740 if (BB.getTerminatingMustTailCall())
1741 return false;
1742
1743 return !F->hasAddressTaken();
1744}
1745
1748 ChangeableCCCacheTy &ChangeableCCCache) {
1749 auto Res = ChangeableCCCache.try_emplace(F, false);
1750 if (Res.second)
1751 Res.first->second = hasChangeableCCImpl(F);
1752 return Res.first->second;
1753}
1754
1755/// Return true if the block containing the call site has a BlockFrequency of
1756/// less than ColdCCRelFreq% of the entry block.
1757static bool isColdCallSite(CallBase &CB, BlockFrequencyInfo &CallerBFI) {
1758 const BranchProbability ColdProb(ColdCCRelFreq, 100);
1759 auto *CallSiteBB = CB.getParent();
1760 auto CallSiteFreq = CallerBFI.getBlockFreq(CallSiteBB);
1761 auto CallerEntryFreq =
1762 CallerBFI.getBlockFreq(&(CB.getCaller()->getEntryBlock()));
1763 return CallSiteFreq < CallerEntryFreq * ColdProb;
1764}
1765
1766// This function checks if the input function F is cold at all call sites. It
1767// also looks each call site's containing function, returning false if the
1768// caller function contains other non cold calls. The input vector AllCallsCold
1769// contains a list of functions that only have call sites in cold blocks.
1770static bool
1773 const std::vector<Function *> &AllCallsCold) {
1774
1775 if (F.user_empty())
1776 return false;
1777
1778 for (User *U : F.users()) {
1780 if (!CB || CB->getCalledOperand() != &F)
1781 continue;
1782 Function *CallerFunc = CB->getParent()->getParent();
1783 BlockFrequencyInfo &CallerBFI = GetBFI(*CallerFunc);
1784 if (!isColdCallSite(*CB, CallerBFI))
1785 return false;
1786 if (!llvm::is_contained(AllCallsCold, CallerFunc))
1787 return false;
1788 }
1789 return true;
1790}
1791
1793 for (User *U : F->users())
1794 if (auto *Call = dyn_cast<CallBase>(U))
1795 if (Call->getCalledOperand() == F)
1796 Call->setCallingConv(CallingConv::Cold);
1797}
1798
1799// This function iterates over all the call instructions in the input Function
1800// and checks that all call sites are in cold blocks and are allowed to use the
1801// coldcc calling convention.
1802static bool
1805 ChangeableCCCacheTy &ChangeableCCCache) {
1806 for (BasicBlock &BB : F) {
1807 for (Instruction &I : BB) {
1808 if (CallInst *CI = dyn_cast<CallInst>(&I)) {
1809 // Skip over isline asm instructions since they aren't function calls.
1810 if (CI->isInlineAsm())
1811 continue;
1812 Function *CalledFn = CI->getCalledFunction();
1813 if (!CalledFn)
1814 return false;
1815 // Skip over intrinsics since they won't remain as function calls.
1816 // Important to do this check before the linkage check below so we
1817 // won't bail out on debug intrinsics, possibly making the generated
1818 // code dependent on the presence of debug info.
1819 if (CalledFn->getIntrinsicID() != Intrinsic::not_intrinsic)
1820 continue;
1821 if (!CalledFn->hasLocalLinkage())
1822 return false;
1823 // Check if it's valid to use coldcc calling convention.
1824 if (!hasChangeableCC(CalledFn, ChangeableCCCache))
1825 return false;
1826 BlockFrequencyInfo &CallerBFI = GetBFI(F);
1827 if (!isColdCallSite(*CI, CallerBFI))
1828 return false;
1829 }
1830 }
1831 }
1832 return true;
1833}
1834
1836 for (User *U : F->users()) {
1837 CallBase *CB = cast<CallBase>(U);
1838 if (CB->isMustTailCall())
1839 return true;
1840 }
1841 return false;
1842}
1843
1845 for (User *U : F->users())
1846 if (isa<InvokeInst>(U))
1847 return true;
1848 return false;
1849}
1850
1852 RemoveAttribute(F, Attribute::Preallocated);
1853
1854 auto *M = F->getParent();
1855
1856 IRBuilder<> Builder(M->getContext());
1857
1858 // Cannot modify users() while iterating over it, so make a copy.
1859 SmallVector<User *, 4> PreallocatedCalls(F->users());
1860 for (User *U : PreallocatedCalls) {
1862 if (!CB)
1863 continue;
1864
1865 assert(
1866 !CB->isMustTailCall() &&
1867 "Shouldn't call RemotePreallocated() on a musttail preallocated call");
1868 // Create copy of call without "preallocated" operand bundle.
1870 CB->getOperandBundlesAsDefs(OpBundles);
1871 CallBase *PreallocatedSetup = nullptr;
1872 for (auto *It = OpBundles.begin(); It != OpBundles.end(); ++It) {
1873 if (It->getTag() == "preallocated") {
1874 PreallocatedSetup = cast<CallBase>(*It->input_begin());
1875 OpBundles.erase(It);
1876 break;
1877 }
1878 }
1879 assert(PreallocatedSetup && "Did not find preallocated bundle");
1880 uint64_t ArgCount =
1881 cast<ConstantInt>(PreallocatedSetup->getArgOperand(0))->getZExtValue();
1882
1883 assert((isa<CallInst>(CB) || isa<InvokeInst>(CB)) &&
1884 "Unknown indirect call type");
1885 CallBase *NewCB = CallBase::Create(CB, OpBundles, CB->getIterator());
1886 CB->replaceAllUsesWith(NewCB);
1887 NewCB->takeName(CB);
1888 CB->eraseFromParent();
1889
1890 Builder.SetInsertPoint(PreallocatedSetup);
1891 auto *StackSave = Builder.CreateStackSave();
1892 Builder.SetInsertPoint(NewCB->getNextNode());
1893 Builder.CreateStackRestore(StackSave);
1894
1895 // Replace @llvm.call.preallocated.arg() with alloca.
1896 // Cannot modify users() while iterating over it, so make a copy.
1897 // @llvm.call.preallocated.arg() can be called with the same index multiple
1898 // times. So for each @llvm.call.preallocated.arg(), we see if we have
1899 // already created a Value* for the index, and if not, create an alloca and
1900 // bitcast right after the @llvm.call.preallocated.setup() so that it
1901 // dominates all uses.
1902 SmallVector<Value *, 2> ArgAllocas(ArgCount);
1903 SmallVector<User *, 2> PreallocatedArgs(PreallocatedSetup->users());
1904 for (auto *User : PreallocatedArgs) {
1905 auto *UseCall = cast<CallBase>(User);
1906 assert(UseCall->getCalledFunction()->getIntrinsicID() ==
1907 Intrinsic::call_preallocated_arg &&
1908 "preallocated token use was not a llvm.call.preallocated.arg");
1909 uint64_t AllocArgIndex =
1910 cast<ConstantInt>(UseCall->getArgOperand(1))->getZExtValue();
1911 Value *AllocaReplacement = ArgAllocas[AllocArgIndex];
1912 if (!AllocaReplacement) {
1913 auto AddressSpace = UseCall->getType()->getPointerAddressSpace();
1914 auto *ArgType =
1915 UseCall->getFnAttr(Attribute::Preallocated).getValueAsType();
1916 auto *InsertBefore = PreallocatedSetup->getNextNode();
1917 Builder.SetInsertPoint(InsertBefore);
1918 auto *Alloca =
1919 Builder.CreateAlloca(ArgType, AddressSpace, nullptr, "paarg");
1920 ArgAllocas[AllocArgIndex] = Alloca;
1921 AllocaReplacement = Alloca;
1922 }
1923
1924 UseCall->replaceAllUsesWith(AllocaReplacement);
1925 UseCall->eraseFromParent();
1926 }
1927 // Remove @llvm.call.preallocated.setup().
1928 cast<Instruction>(PreallocatedSetup)->eraseFromParent();
1929 }
1930}
1931
1932static bool
1937 function_ref<DominatorTree &(Function &)> LookupDomTree,
1938 SmallPtrSetImpl<const Comdat *> &NotDiscardableComdats,
1939 function_ref<void(Function &F)> ChangedCFGCallback,
1940 function_ref<void(Function &F)> DeleteFnCallback) {
1941
1942 bool Changed = false;
1943
1944 ChangeableCCCacheTy ChangeableCCCache;
1945 std::vector<Function *> AllCallsCold;
1947 if (hasOnlyColdCalls(F, GetBFI, ChangeableCCCache))
1948 AllCallsCold.push_back(&F);
1949
1950 // Optimize functions.
1952 // Don't perform global opt pass on naked functions; we don't want fast
1953 // calling conventions for naked functions.
1954 if (F.hasFnAttribute(Attribute::Naked))
1955 continue;
1956
1957 // Functions without names cannot be referenced outside this module.
1958 if (!F.hasName() && !F.isDeclaration() && !F.hasLocalLinkage())
1959 F.setLinkage(GlobalValue::InternalLinkage);
1960
1961 if (deleteIfDead(F, NotDiscardableComdats, DeleteFnCallback)) {
1962 Changed = true;
1963 continue;
1964 }
1965
1966 // LLVM's definition of dominance allows instructions that are cyclic
1967 // in unreachable blocks, e.g.:
1968 // %pat = select i1 %condition, @global, i16* %pat
1969 // because any instruction dominates an instruction in a block that's
1970 // not reachable from entry.
1971 // So, remove unreachable blocks from the function, because a) there's
1972 // no point in analyzing them and b) GlobalOpt should otherwise grow
1973 // some more complicated logic to break these cycles.
1974 // Notify the analysis manager that we've modified the function's CFG.
1975 if (!F.isDeclaration()) {
1977 Changed = true;
1978 ChangedCFGCallback(F);
1979 }
1980 }
1981
1982 Changed |= processGlobal(F, GetTTI, GetTLI, LookupDomTree);
1983
1984 if (!F.hasLocalLinkage())
1985 continue;
1986
1987 // If we have an inalloca parameter that we can safely remove the
1988 // inalloca attribute from, do so. This unlocks optimizations that
1989 // wouldn't be safe in the presence of inalloca.
1990 // FIXME: We should also hoist alloca affected by this to the entry
1991 // block if possible.
1992 if (F.getAttributes().hasAttrSomewhere(Attribute::InAlloca) &&
1993 !F.hasAddressTaken() && !hasMustTailCallers(&F) && !F.isVarArg()) {
1994 RemoveAttribute(&F, Attribute::InAlloca);
1995 Changed = true;
1996 }
1997
1998 // FIXME: handle invokes
1999 // FIXME: handle musttail
2000 if (F.getAttributes().hasAttrSomewhere(Attribute::Preallocated)) {
2001 if (!F.hasAddressTaken() && !hasMustTailCallers(&F) &&
2002 !hasInvokeCallers(&F)) {
2004 Changed = true;
2005 }
2006 continue;
2007 }
2008
2009 if (hasChangeableCC(&F, ChangeableCCCache)) {
2010 NumInternalFunc++;
2011 TargetTransformInfo &TTI = GetTTI(F);
2012 // Change the calling convention to coldcc if either stress testing is
2013 // enabled or the target would like to use coldcc on functions which are
2014 // cold at all call sites and the callers contain no other non coldcc
2015 // calls.
2017 (TTI.useColdCCForColdCall(F) &&
2018 isValidCandidateForColdCC(F, GetBFI, AllCallsCold))) {
2019 ChangeableCCCache.erase(&F);
2020 F.setCallingConv(CallingConv::Cold);
2022 Changed = true;
2023 NumColdCC++;
2024 }
2025 }
2026
2027 if (hasChangeableCC(&F, ChangeableCCCache)) {
2028 // If this function has a calling convention worth changing, is not a
2029 // varargs function, is only called directly, and is supported by the
2030 // target, promote it to use the Fast calling convention.
2031 TargetTransformInfo &TTI = GetTTI(F);
2032 if (TTI.useFastCCForInternalCall(F)) {
2033 F.setCallingConv(CallingConv::Fast);
2035 ++NumFastCallFns;
2036 Changed = true;
2037 }
2038 }
2039
2040 if (F.getAttributes().hasAttrSomewhere(Attribute::Nest) &&
2041 !F.hasAddressTaken()) {
2042 // The function is not used by a trampoline intrinsic, so it is safe
2043 // to remove the 'nest' attribute.
2044 RemoveAttribute(&F, Attribute::Nest);
2045 ++NumNestRemoved;
2046 Changed = true;
2047 }
2048 }
2049 return Changed;
2050}
2051
2052static bool
2056 function_ref<DominatorTree &(Function &)> LookupDomTree,
2057 SmallPtrSetImpl<const Comdat *> &NotDiscardableComdats) {
2058 bool Changed = false;
2059
2060 for (GlobalVariable &GV : llvm::make_early_inc_range(M.globals())) {
2061 // Global variables without names cannot be referenced outside this module.
2062 if (!GV.hasName() && !GV.isDeclaration() && !GV.hasLocalLinkage())
2064 // Simplify the initializer.
2065 if (GV.hasInitializer())
2066 if (auto *C = dyn_cast<Constant>(GV.getInitializer())) {
2067 auto &DL = M.getDataLayout();
2068 // TLI is not used in the case of a Constant, so use default nullptr
2069 // for that optional parameter, since we don't have a Function to
2070 // provide GetTLI anyway.
2071 Constant *New = ConstantFoldConstant(C, DL, /*TLI*/ nullptr);
2072 if (New != C)
2073 GV.setInitializer(New);
2074 }
2075
2076 if (deleteIfDead(GV, NotDiscardableComdats)) {
2077 Changed = true;
2078 continue;
2079 }
2080
2081 Changed |= processGlobal(GV, GetTTI, GetTLI, LookupDomTree);
2082 }
2083 return Changed;
2084}
2085
2086/// Evaluate static constructors in the function, if we can. Return true if we
2087/// can, false otherwise.
2089 TargetLibraryInfo *TLI) {
2090 // Skip external functions.
2091 if (F->isDeclaration())
2092 return false;
2093 // Call the function.
2094 Evaluator Eval(DL, TLI);
2095 Constant *RetValDummy;
2096 bool EvalSuccess = Eval.EvaluateFunction(F, RetValDummy,
2098
2099 if (EvalSuccess) {
2100 ++NumCtorsEvaluated;
2101
2102 // We succeeded at evaluation: commit the result.
2103 auto NewInitializers = Eval.getMutatedInitializers();
2104 LLVM_DEBUG(dbgs() << "FULLY EVALUATED GLOBAL CTOR FUNCTION '"
2105 << F->getName() << "' to " << NewInitializers.size()
2106 << " stores.\n");
2107 for (const auto &Pair : NewInitializers)
2108 Pair.first->setInitializer(Pair.second);
2109 for (GlobalVariable *GV : Eval.getInvariants())
2110 GV->setConstant(true);
2111 }
2112
2113 return EvalSuccess;
2114}
2115
2116static int compareNames(Constant *const *A, Constant *const *B) {
2117 Value *AStripped = (*A)->stripPointerCasts();
2118 Value *BStripped = (*B)->stripPointerCasts();
2119 return AStripped->getName().compare(BStripped->getName());
2120}
2121
2124 if (Init.empty()) {
2125 V.eraseFromParent();
2126 return;
2127 }
2128
2129 // Get address space of pointers in the array of pointers.
2130 const Type *UsedArrayType = V.getValueType();
2131 const auto *VAT = cast<ArrayType>(UsedArrayType);
2132 const auto *VEPT = cast<PointerType>(VAT->getArrayElementType());
2133
2134 // Type of pointer to the array of pointers.
2135 PointerType *PtrTy =
2136 PointerType::get(V.getContext(), VEPT->getAddressSpace());
2137
2139 for (GlobalValue *GV : Init) {
2141 UsedArray.push_back(Cast);
2142 }
2143
2144 // Sort to get deterministic order.
2145 array_pod_sort(UsedArray.begin(), UsedArray.end(), compareNames);
2146 ArrayType *ATy = ArrayType::get(PtrTy, UsedArray.size());
2147
2148 Module *M = V.getParent();
2149 V.removeFromParent();
2151 *M, ATy, false, GlobalValue::AppendingLinkage,
2152 ConstantArray::get(ATy, UsedArray), "", nullptr,
2153 GlobalVariable::NotThreadLocal, V.getType()->getAddressSpace());
2154 NV->takeName(&V);
2155 NV->setSection("llvm.metadata");
2156 delete &V;
2157}
2158
2159namespace {
2160
2161/// An easy to access representation of llvm.used and llvm.compiler.used.
2162class LLVMUsed {
2163 SmallPtrSet<GlobalValue *, 4> Used;
2164 SmallPtrSet<GlobalValue *, 4> CompilerUsed;
2165 GlobalVariable *UsedV;
2166 GlobalVariable *CompilerUsedV;
2167
2168public:
2169 LLVMUsed(Module &M) {
2171 UsedV = collectUsedGlobalVariables(M, Vec, false);
2172 Used = {llvm::from_range, Vec};
2173 Vec.clear();
2174 CompilerUsedV = collectUsedGlobalVariables(M, Vec, true);
2175 CompilerUsed = {llvm::from_range, Vec};
2176 }
2177
2178 using iterator = SmallPtrSet<GlobalValue *, 4>::iterator;
2179 using used_iterator_range = iterator_range<iterator>;
2180
2181 iterator usedBegin() { return Used.begin(); }
2182 iterator usedEnd() { return Used.end(); }
2183
2184 used_iterator_range used() {
2185 return used_iterator_range(usedBegin(), usedEnd());
2186 }
2187
2188 iterator compilerUsedBegin() { return CompilerUsed.begin(); }
2189 iterator compilerUsedEnd() { return CompilerUsed.end(); }
2190
2191 used_iterator_range compilerUsed() {
2192 return used_iterator_range(compilerUsedBegin(), compilerUsedEnd());
2193 }
2194
2195 bool usedCount(GlobalValue *GV) const { return Used.count(GV); }
2196
2197 bool compilerUsedCount(GlobalValue *GV) const {
2198 return CompilerUsed.count(GV);
2199 }
2200
2201 bool usedErase(GlobalValue *GV) { return Used.erase(GV); }
2202 bool compilerUsedErase(GlobalValue *GV) { return CompilerUsed.erase(GV); }
2203 bool usedInsert(GlobalValue *GV) { return Used.insert(GV).second; }
2204
2205 bool compilerUsedInsert(GlobalValue *GV) {
2206 return CompilerUsed.insert(GV).second;
2207 }
2208
2209 void syncVariablesAndSets() {
2210 if (UsedV)
2211 setUsedInitializer(*UsedV, Used);
2212 if (CompilerUsedV)
2213 setUsedInitializer(*CompilerUsedV, CompilerUsed);
2214 }
2215};
2216
2217} // end anonymous namespace
2218
2219static bool hasUseOtherThanLLVMUsed(GlobalAlias &GA, const LLVMUsed &U) {
2220 if (GA.use_empty()) // No use at all.
2221 return false;
2222
2223 assert((!U.usedCount(&GA) || !U.compilerUsedCount(&GA)) &&
2224 "We should have removed the duplicated "
2225 "element from llvm.compiler.used");
2226 if (!GA.hasOneUse())
2227 // Strictly more than one use. So at least one is not in llvm.used and
2228 // llvm.compiler.used.
2229 return true;
2230
2231 // Exactly one use. Check if it is in llvm.used or llvm.compiler.used.
2232 return !U.usedCount(&GA) && !U.compilerUsedCount(&GA);
2233}
2234
2235static bool mayHaveOtherReferences(GlobalValue &GV, const LLVMUsed &U) {
2236 if (!GV.hasLocalLinkage())
2237 return true;
2238
2239 return U.usedCount(&GV) || U.compilerUsedCount(&GV);
2240}
2241
2242static bool hasUsesToReplace(GlobalAlias &GA, const LLVMUsed &U,
2243 bool &RenameTarget) {
2244 if (GA.isWeakForLinker())
2245 return false;
2246
2247 RenameTarget = false;
2248 bool Ret = false;
2249 if (hasUseOtherThanLLVMUsed(GA, U))
2250 Ret = true;
2251
2252 // If the alias is externally visible, we may still be able to simplify it.
2253 if (!mayHaveOtherReferences(GA, U))
2254 return Ret;
2255
2256 // If the aliasee has internal linkage and no other references (e.g.,
2257 // @llvm.used, @llvm.compiler.used), give it the name and linkage of the
2258 // alias, and delete the alias. This turns:
2259 // define internal ... @f(...)
2260 // @a = alias ... @f
2261 // into:
2262 // define ... @a(...)
2263 Constant *Aliasee = GA.getAliasee();
2266 return Ret;
2267
2268 RenameTarget = true;
2269 return true;
2270}
2271
2272static bool
2274 SmallPtrSetImpl<const Comdat *> &NotDiscardableComdats) {
2275 bool Changed = false;
2276 LLVMUsed Used(M);
2277
2278 for (GlobalValue *GV : Used.used())
2279 Used.compilerUsedErase(GV);
2280
2281 // Return whether GV is explicitly or implicitly dso_local and not replaceable
2282 // by another definition in the current linkage unit.
2283 auto IsModuleLocal = [](GlobalValue &GV) {
2285 (GV.isDSOLocal() || GV.isImplicitDSOLocal());
2286 };
2287
2288 for (GlobalAlias &J : llvm::make_early_inc_range(M.aliases())) {
2289 // Aliases without names cannot be referenced outside this module.
2290 if (!J.hasName() && !J.isDeclaration() && !J.hasLocalLinkage())
2291 J.setLinkage(GlobalValue::InternalLinkage);
2292
2293 if (deleteIfDead(J, NotDiscardableComdats)) {
2294 Changed = true;
2295 continue;
2296 }
2297
2298 // If the alias can change at link time, nothing can be done - bail out.
2299 if (!IsModuleLocal(J))
2300 continue;
2301
2302 Constant *Aliasee = J.getAliasee();
2304 // We can't trivially replace the alias with the aliasee if the aliasee is
2305 // non-trivial in some way. We also can't replace the alias with the aliasee
2306 // if the aliasee may be preemptible at runtime. On ELF, a non-preemptible
2307 // alias can be used to access the definition as if preemption did not
2308 // happen.
2309 // TODO: Try to handle non-zero GEPs of local aliasees.
2310 if (!Target || !IsModuleLocal(*Target))
2311 continue;
2312
2313 Target->removeDeadConstantUsers();
2314
2315 // Make all users of the alias use the aliasee instead.
2316 bool RenameTarget;
2317 if (!hasUsesToReplace(J, Used, RenameTarget))
2318 continue;
2319
2320 J.replaceAllUsesWith(Aliasee);
2321 ++NumAliasesResolved;
2322 Changed = true;
2323
2324 if (RenameTarget) {
2325 // Give the aliasee the name, linkage and other attributes of the alias.
2326 Target->takeName(&J);
2327 Target->setLinkage(J.getLinkage());
2328 Target->setDSOLocal(J.isDSOLocal());
2329 Target->setVisibility(J.getVisibility());
2330 Target->setDLLStorageClass(J.getDLLStorageClass());
2331
2332 if (Used.usedErase(&J))
2333 Used.usedInsert(Target);
2334
2335 if (Used.compilerUsedErase(&J))
2336 Used.compilerUsedInsert(Target);
2337 } else if (mayHaveOtherReferences(J, Used))
2338 continue;
2339
2340 // Delete the alias.
2341 M.eraseAlias(&J);
2342 ++NumAliasesRemoved;
2343 Changed = true;
2344 }
2345
2346 Used.syncVariablesAndSets();
2347
2348 return Changed;
2349}
2350
2351static Function *
2354 LibFunc Func) {
2355 // Hack to get a default TLI before we have actual Function.
2356 auto FuncIter = M.begin();
2357 if (FuncIter == M.end())
2358 return nullptr;
2359 auto *TLI = &GetTLI(*FuncIter);
2360
2361 if (!TLI->has(Func))
2362 return nullptr;
2363
2364 Function *Fn = M.getFunction(TLI->getName(Func));
2365 if (!Fn)
2366 return nullptr;
2367
2368 // Now get the actual TLI for Fn.
2369 TLI = &GetTLI(*Fn);
2370
2371 // Make sure that the function has the correct prototype.
2372 LibFunc F;
2373 if (!TLI->getLibFunc(*Fn, F) || F != Func)
2374 return nullptr;
2375
2376 return Fn;
2377}
2378
2379/// Returns whether the given function is an empty C++ destructor or atexit
2380/// handler and can therefore be eliminated. Note that we assume that other
2381/// optimization passes have already simplified the code so we simply check for
2382/// 'ret'.
2383static bool IsEmptyAtExitFunction(const Function &Fn) {
2384 // FIXME: We could eliminate C++ destructors if they're readonly/readnone and
2385 // nounwind, but that doesn't seem worth doing.
2386 if (Fn.isDeclaration())
2387 return false;
2388
2389 for (const auto &I : Fn.getEntryBlock()) {
2390 if (I.isDebugOrPseudoInst())
2391 continue;
2392 if (isa<ReturnInst>(I))
2393 return true;
2394 break;
2395 }
2396 return false;
2397}
2398
2399static bool OptimizeEmptyGlobalAtExitDtors(Function *CXAAtExitFn, bool isCXX) {
2400 /// Itanium C++ ABI p3.3.5:
2401 ///
2402 /// After constructing a global (or local static) object, that will require
2403 /// destruction on exit, a termination function is registered as follows:
2404 ///
2405 /// extern "C" int __cxa_atexit ( void (*f)(void *), void *p, void *d );
2406 ///
2407 /// This registration, e.g. __cxa_atexit(f,p,d), is intended to cause the
2408 /// call f(p) when DSO d is unloaded, before all such termination calls
2409 /// registered before this one. It returns zero if registration is
2410 /// successful, nonzero on failure.
2411
2412 // This pass will look for calls to __cxa_atexit or atexit where the function
2413 // is trivial and remove them.
2414 bool Changed = false;
2415
2416 for (User *U : llvm::make_early_inc_range(CXAAtExitFn->users())) {
2417 // We're only interested in calls. Theoretically, we could handle invoke
2418 // instructions as well, but neither llvm-gcc nor clang generate invokes
2419 // to __cxa_atexit.
2421 if (!CI)
2422 continue;
2423
2424 Function *DtorFn =
2426 if (!DtorFn || !IsEmptyAtExitFunction(*DtorFn))
2427 continue;
2428
2429 // Just remove the call.
2431 CI->eraseFromParent();
2432
2433 if (isCXX)
2434 ++NumCXXDtorsRemoved;
2435 else
2436 ++NumAtExitRemoved;
2437
2438 Changed |= true;
2439 }
2440
2441 return Changed;
2442}
2443
2445 if (IF.isInterposable())
2446 return nullptr;
2447
2449 if (!Resolver)
2450 return nullptr;
2451
2452 if (Resolver->isInterposable())
2453 return nullptr;
2454
2455 // Only handle functions that have been optimized into a single basic block.
2456 auto It = Resolver->begin();
2457 if (++It != Resolver->end())
2458 return nullptr;
2459
2460 BasicBlock &BB = Resolver->getEntryBlock();
2461
2462 if (any_of(BB, [](Instruction &I) { return I.mayHaveSideEffects(); }))
2463 return nullptr;
2464
2465 auto *Ret = dyn_cast<ReturnInst>(BB.getTerminator());
2466 if (!Ret)
2467 return nullptr;
2468
2469 return dyn_cast<Function>(Ret->getReturnValue());
2470}
2471
2472/// Find IFuncs that have resolvers that always point at the same statically
2473/// known callee, and replace their callers with a direct call.
2475 bool Changed = false;
2476 for (GlobalIFunc &IF : M.ifuncs())
2478 if (!IF.use_empty() &&
2479 (!Callee->isDeclaration() ||
2480 none_of(IF.users(), [](User *U) { return isa<GlobalAlias>(U); }))) {
2481 IF.replaceAllUsesWith(Callee);
2482 NumIFuncsResolved++;
2483 Changed = true;
2484 }
2485 return Changed;
2486}
2487
2488static bool
2490 SmallPtrSetImpl<const Comdat *> &NotDiscardableComdats) {
2491 bool Changed = false;
2492 for (GlobalIFunc &IF : make_early_inc_range(M.ifuncs()))
2493 if (deleteIfDead(IF, NotDiscardableComdats)) {
2494 NumIFuncsDeleted++;
2495 Changed = true;
2496 }
2497 return Changed;
2498}
2499
2500// Follows the use-def chain of \p V backwards until it finds a Function,
2501// in which case it collects in \p Versions. Return true on successful
2502// use-def chain traversal, false otherwise.
2503static bool
2506 if (auto *F = dyn_cast<Function>(V)) {
2507 if (!GetTTI(*F).isMultiversionedFunction(*F))
2508 return false;
2509 Versions.push_back(F);
2510 } else if (auto *Sel = dyn_cast<SelectInst>(V)) {
2511 if (!collectVersions(Sel->getTrueValue(), Versions, GetTTI))
2512 return false;
2513 if (!collectVersions(Sel->getFalseValue(), Versions, GetTTI))
2514 return false;
2515 } else if (auto *Phi = dyn_cast<PHINode>(V)) {
2516 for (unsigned I = 0, E = Phi->getNumIncomingValues(); I != E; ++I)
2517 if (!collectVersions(Phi->getIncomingValue(I), Versions, GetTTI))
2518 return false;
2519 } else {
2520 // Unknown instruction type. Bail.
2521 return false;
2522 }
2523 return true;
2524}
2525
2526// Try to statically resolve calls to versioned functions when possible. First
2527// we identify the function versions which are associated with an IFUNC symbol.
2528// We do that by examining the resolver function of the IFUNC. Once we have
2529// collected all the function versions, we sort them in decreasing priority
2530// order. This is necessary for determining the most suitable callee version
2531// for each caller version. We then collect all the callsites to versioned
2532// functions. The static resolution is performed by comparing the feature sets
2533// between callers and callees. Specifically:
2534// * Start a walk over caller and callee lists simultaneously in order of
2535// decreasing priority.
2536// * Statically resolve calls from the current caller to the current callee,
2537// iff the caller feature bits are a superset of the callee feature bits.
2538// * For FMV callers, as long as the caller feature bits are a subset of the
2539// callee feature bits, advance to the next callee. This effectively prevents
2540// considering the current callee as a candidate for static resolution by
2541// following callers (explanation: preceding callers would not have been
2542// selected in a hypothetical runtime execution).
2543// * Advance to the next caller.
2544//
2545// Presentation in EuroLLVM2025:
2546// https://www.youtube.com/watch?v=k54MFimPz-A&t=867s
2549 bool Changed = false;
2550
2551 // Map containing the feature bits for a given function.
2552 DenseMap<Function *, APInt> FeatureMask;
2553 // Map containing the priority bits for a given function.
2554 DenseMap<Function *, APInt> PriorityMask;
2555 // Map containing all the function versions corresponding to an IFunc symbol.
2557 // Map containing the IFunc symbol a function is version of.
2559 // List of all the interesting IFuncs found in the module.
2561
2562 for (GlobalIFunc &IF : M.ifuncs()) {
2563 LLVM_DEBUG(dbgs() << "Examining IFUNC " << IF.getName() << "\n");
2564
2565 if (IF.isInterposable())
2566 continue;
2567
2568 Function *Resolver = IF.getResolverFunction();
2569 if (!Resolver)
2570 continue;
2571
2572 if (Resolver->isInterposable())
2573 continue;
2574
2575 SmallVector<Function *> Versions;
2576 // Discover the versioned functions.
2577 if (any_of(*Resolver, [&](BasicBlock &BB) {
2578 if (auto *Ret = dyn_cast_or_null<ReturnInst>(BB.getTerminator()))
2579 if (!collectVersions(Ret->getReturnValue(), Versions, GetTTI))
2580 return true;
2581 return false;
2582 }))
2583 continue;
2584
2585 if (Versions.empty())
2586 continue;
2587
2588 for (Function *V : Versions) {
2589 VersionOf.insert({V, &IF});
2590 auto [FeatIt, FeatInserted] = FeatureMask.try_emplace(V);
2591 if (FeatInserted)
2592 FeatIt->second = GetTTI(*V).getFeatureMask(*V);
2593 auto [PriorIt, PriorInserted] = PriorityMask.try_emplace(V);
2594 if (PriorInserted)
2595 PriorIt->second = GetTTI(*V).getPriorityMask(*V);
2596 }
2597
2598 // Sort function versions in decreasing priority order.
2599 sort(Versions, [&](auto *LHS, auto *RHS) {
2600 return PriorityMask[LHS].ugt(PriorityMask[RHS]);
2601 });
2602
2603 IFuncs.push_back(&IF);
2604 VersionedFuncs.try_emplace(&IF, std::move(Versions));
2605 }
2606
2607 for (GlobalIFunc *CalleeIF : IFuncs) {
2608 SmallVector<Function *> NonFMVCallers;
2609 DenseSet<GlobalIFunc *> CallerIFuncs;
2611
2612 // Find the callsites.
2613 for (User *U : CalleeIF->users()) {
2614 if (auto *CB = dyn_cast<CallBase>(U)) {
2615 if (CB->getCalledOperand() == CalleeIF) {
2616 Function *Caller = CB->getFunction();
2617 GlobalIFunc *CallerIF = nullptr;
2618 TargetTransformInfo &TTI = GetTTI(*Caller);
2619 bool CallerIsFMV = TTI.isMultiversionedFunction(*Caller);
2620 // The caller is a version of a known IFunc.
2621 if (auto It = VersionOf.find(Caller); It != VersionOf.end())
2622 CallerIF = It->second;
2623 else if (!CallerIsFMV && OptimizeNonFMVCallers) {
2624 // The caller is non-FMV.
2625 auto [It, Inserted] = FeatureMask.try_emplace(Caller);
2626 if (Inserted)
2627 It->second = TTI.getFeatureMask(*Caller);
2628 } else
2629 // The caller is none of the above, skip.
2630 continue;
2631 auto [It, Inserted] = CallSites.try_emplace(Caller);
2632 if (Inserted) {
2633 if (CallerIsFMV)
2634 CallerIFuncs.insert(CallerIF);
2635 else
2636 NonFMVCallers.push_back(Caller);
2637 }
2638 It->second.push_back(CB);
2639 }
2640 }
2641 }
2642
2643 if (CallSites.empty())
2644 continue;
2645
2646 LLVM_DEBUG(dbgs() << "Statically resolving calls to function "
2647 << CalleeIF->getResolverFunction()->getName() << "\n");
2648
2649 // The complexity of this algorithm is linear: O(NumCallers + NumCallees)
2650 // if NumCallers > MaxIFuncVersions || NumCallees > MaxIFuncVersions,
2651 // otherwise it is cubic: O((NumCallers ^ 2) x NumCallees).
2652 auto staticallyResolveCalls = [&](ArrayRef<Function *> Callers,
2653 ArrayRef<Function *> Callees,
2654 bool CallerIsFMV) {
2655 bool AllowExpensiveChecks = CallerIsFMV &&
2656 Callers.size() <= MaxIFuncVersions &&
2657 Callees.size() <= MaxIFuncVersions;
2658 // Index to the highest callee candidate.
2659 unsigned J = 0;
2660
2661 for (unsigned I = 0, E = Callers.size(); I < E; ++I) {
2662 // There are no callee candidates left.
2663 if (J == Callees.size())
2664 break;
2665
2666 Function *Caller = Callers[I];
2667 APInt CallerBits = FeatureMask[Caller];
2668
2669 // Compare the feature bits of the best callee candidate with all the
2670 // caller versions preceeding the current one. For each prior caller
2671 // discard feature bits that are known to be available in the current
2672 // caller. As long as the known missing feature bits are a subset of the
2673 // callee feature bits, advance to the next callee and start over.
2674 auto eliminateAvailableFeatures = [&](unsigned BestCandidate) {
2675 unsigned K = 0;
2676 while (K < I && BestCandidate < Callees.size()) {
2677 APInt MissingBits = FeatureMask[Callers[K]] & ~CallerBits;
2678 if (MissingBits.isSubsetOf(FeatureMask[Callees[BestCandidate]])) {
2679 ++BestCandidate;
2680 // Start over.
2681 K = 0;
2682 } else
2683 ++K;
2684 }
2685 return BestCandidate;
2686 };
2687
2688 unsigned BestCandidate =
2689 AllowExpensiveChecks ? eliminateAvailableFeatures(J) : J;
2690 // No callee candidate was found for this caller.
2691 if (BestCandidate == Callees.size())
2692 continue;
2693
2694 LLVM_DEBUG(dbgs() << " Examining "
2695 << (CallerIsFMV ? "FMV" : "regular") << " caller "
2696 << Caller->getName() << "\n");
2697
2698 Function *Callee = Callees[BestCandidate];
2699 APInt CalleeBits = FeatureMask[Callee];
2700
2701 // Statically resolve calls from the current caller to the current
2702 // callee, iff the caller feature bits are a superset of the callee
2703 // feature bits.
2704 if (CalleeBits.isSubsetOf(CallerBits)) {
2705 // Not all caller versions are necessarily users of the callee IFUNC.
2706 if (auto It = CallSites.find(Caller); It != CallSites.end()) {
2707 for (CallBase *CS : It->second) {
2708 LLVM_DEBUG(dbgs() << " Redirecting call " << Caller->getName()
2709 << " -> " << Callee->getName() << "\n");
2710 CS->setCalledOperand(Callee);
2711 }
2712 Changed = true;
2713 }
2714 }
2715
2716 // Nothing else to do about non-FMV callers.
2717 if (!CallerIsFMV)
2718 continue;
2719
2720 // For FMV callers, as long as the caller feature bits are a subset of
2721 // the callee feature bits, advance to the next callee. This effectively
2722 // prevents considering the current callee as a candidate for static
2723 // resolution by following callers.
2724 while (CallerBits.isSubsetOf(FeatureMask[Callees[J]]) &&
2725 ++J < Callees.size())
2726 ;
2727 }
2728 };
2729
2730 auto &Callees = VersionedFuncs[CalleeIF];
2731
2732 // Optimize non-FMV calls.
2734 staticallyResolveCalls(NonFMVCallers, Callees, /*CallerIsFMV=*/false);
2735
2736 // Optimize FMV calls.
2737 for (GlobalIFunc *CallerIF : CallerIFuncs) {
2738 auto &Callers = VersionedFuncs[CallerIF];
2739 staticallyResolveCalls(Callers, Callees, /*CallerIsFMV=*/true);
2740 }
2741
2742 if (CalleeIF->use_empty() ||
2743 all_of(CalleeIF->users(), [](User *U) { return isa<GlobalAlias>(U); }))
2744 NumIFuncsResolved++;
2745 }
2746 return Changed;
2747}
2748
2749static bool
2754 function_ref<DominatorTree &(Function &)> LookupDomTree,
2755 function_ref<void(Function &F)> ChangedCFGCallback,
2756 function_ref<void(Function &F)> DeleteFnCallback) {
2757 SmallPtrSet<const Comdat *, 8> NotDiscardableComdats;
2758 bool Changed = false;
2759 bool LocalChange = true;
2760 std::optional<uint32_t> FirstNotFullyEvaluatedPriority;
2761
2762 while (LocalChange) {
2763 LocalChange = false;
2764
2765 NotDiscardableComdats.clear();
2766 for (const GlobalVariable &GV : M.globals())
2767 if (const Comdat *C = GV.getComdat())
2768 if (!GV.isDiscardableIfUnused() || !GV.use_empty())
2769 NotDiscardableComdats.insert(C);
2770 for (Function &F : M)
2771 if (const Comdat *C = F.getComdat())
2772 if (!F.isDefTriviallyDead())
2773 NotDiscardableComdats.insert(C);
2774 for (GlobalAlias &GA : M.aliases())
2775 if (const Comdat *C = GA.getComdat())
2776 if (!GA.isDiscardableIfUnused() || !GA.use_empty())
2777 NotDiscardableComdats.insert(C);
2778
2779 // Delete functions that are trivially dead, ccc -> fastcc
2780 LocalChange |= OptimizeFunctions(M, GetTLI, GetTTI, GetBFI, LookupDomTree,
2781 NotDiscardableComdats, ChangedCFGCallback,
2782 DeleteFnCallback);
2783
2784 // Optimize global_ctors list.
2785 LocalChange |=
2786 optimizeGlobalCtorsList(M, [&](uint32_t Priority, Function *F) {
2787 if (FirstNotFullyEvaluatedPriority &&
2788 *FirstNotFullyEvaluatedPriority != Priority)
2789 return false;
2790 bool Evaluated = EvaluateStaticConstructor(F, DL, &GetTLI(*F));
2791 if (!Evaluated)
2792 FirstNotFullyEvaluatedPriority = Priority;
2793 return Evaluated;
2794 });
2795
2796 // Optimize non-address-taken globals.
2797 LocalChange |= OptimizeGlobalVars(M, GetTTI, GetTLI, LookupDomTree,
2798 NotDiscardableComdats);
2799
2800 // Resolve aliases, when possible.
2801 LocalChange |= OptimizeGlobalAliases(M, NotDiscardableComdats);
2802
2803 // Try to remove trivial global destructors if they are not removed
2804 // already.
2805 if (Function *CXAAtExitFn =
2806 FindAtExitLibFunc(M, GetTLI, LibFunc_cxa_atexit))
2807 LocalChange |= OptimizeEmptyGlobalAtExitDtors(CXAAtExitFn, true);
2808
2809 if (Function *AtExitFn = FindAtExitLibFunc(M, GetTLI, LibFunc_atexit))
2810 LocalChange |= OptimizeEmptyGlobalAtExitDtors(AtExitFn, false);
2811
2812 // Optimize IFuncs whose callee's are statically known.
2813 LocalChange |= OptimizeStaticIFuncs(M);
2814
2815 // Optimize IFuncs based on the target features of the caller.
2816 LocalChange |= OptimizeNonTrivialIFuncs(M, GetTTI);
2817
2818 // Remove any IFuncs that are now dead.
2819 LocalChange |= DeleteDeadIFuncs(M, NotDiscardableComdats);
2820
2821 Changed |= LocalChange;
2822 }
2823
2824 // TODO: Move all global ctors functions to the end of the module for code
2825 // layout.
2826
2827 return Changed;
2828}
2829
2831 auto &DL = M.getDataLayout();
2832 auto &FAM =
2834 auto LookupDomTree = [&FAM](Function &F) -> DominatorTree &{
2835 return FAM.getResult<DominatorTreeAnalysis>(F);
2836 };
2837 auto GetTLI = [&FAM](Function &F) -> TargetLibraryInfo & {
2838 return FAM.getResult<TargetLibraryAnalysis>(F);
2839 };
2840 auto GetTTI = [&FAM](Function &F) -> TargetTransformInfo & {
2841 return FAM.getResult<TargetIRAnalysis>(F);
2842 };
2843
2844 auto GetBFI = [&FAM](Function &F) -> BlockFrequencyInfo & {
2845 return FAM.getResult<BlockFrequencyAnalysis>(F);
2846 };
2847 auto ChangedCFGCallback = [&FAM](Function &F) {
2848 FAM.invalidate(F, PreservedAnalyses::none());
2849 };
2850 auto DeleteFnCallback = [&FAM](Function &F) { FAM.clear(F, F.getName()); };
2851
2852 if (!optimizeGlobalsInModule(M, DL, GetTLI, GetTTI, GetBFI, LookupDomTree,
2853 ChangedCFGCallback, DeleteFnCallback))
2854 return PreservedAnalyses::all();
2855
2857 // We made sure to clear analyses for deleted functions.
2859 // The only place we modify the CFG is when calling
2860 // removeUnreachableBlocks(), but there we make sure to invalidate analyses
2861 // for modified functions.
2863 return PA;
2864}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Atomic ordering constants.
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")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
#define DEBUG_TYPE
static bool IsSafeComputationToRemove(Value *V, function_ref< TargetLibraryInfo &(Function &)> GetTLI)
Given a value that is stored to a global but never read, determine whether it's safe to remove the st...
static Function * FindAtExitLibFunc(Module &M, function_ref< TargetLibraryInfo &(Function &)> GetTLI, LibFunc Func)
static bool optimizeOnceStoredGlobal(GlobalVariable *GV, Value *StoredOnceVal, const DataLayout &DL, function_ref< TargetLibraryInfo &(Function &)> GetTLI)
static Function * hasSideeffectFreeStaticResolution(GlobalIFunc &IF)
static bool tryToOptimizeStoreOfAllocationToGlobal(GlobalVariable *GV, CallInst *CI, const DataLayout &DL, TargetLibraryInfo *TLI)
If we have a global that is only initialized with a fixed size allocation try to transform the progra...
static void ConstantPropUsersOf(Value *V, const DataLayout &DL, TargetLibraryInfo *TLI)
Walk the use list of V, constant folding all of the instructions that are foldable.
static bool OptimizeStaticIFuncs(Module &M)
Find IFuncs that have resolvers that always point at the same statically known callee,...
static bool hasOnlyColdCalls(Function &F, function_ref< BlockFrequencyInfo &(Function &)> GetBFI, ChangeableCCCacheTy &ChangeableCCCache)
static bool allUsesOfLoadedValueWillTrapIfNull(const GlobalVariable *GV)
Return true if all uses of any loads from GV will trap if the loaded value is null.
static bool hasChangeableCCImpl(Function *F)
Return true if this is a calling convention that we'd like to change.
static bool AllUsesOfValueWillTrapIfNull(const Value *V, SmallPtrSetImpl< const PHINode * > &PHIs)
Return true if all users of the specified value will trap if the value is dynamically null.
static GlobalVariable * OptimizeGlobalAddressOfAllocation(GlobalVariable *GV, CallInst *CI, uint64_t AllocSize, Constant *InitVal, const DataLayout &DL, TargetLibraryInfo *TLI)
This function takes the specified global variable, and transforms the program as if it always contain...
static bool collectVersions(Value *V, SmallVectorImpl< Function * > &Versions, function_ref< TargetTransformInfo &(Function &)> GetTTI)
static bool IsEmptyAtExitFunction(const Function &Fn)
Returns whether the given function is an empty C++ destructor or atexit handler and can therefore be ...
static bool collectSRATypes(DenseMap< uint64_t, GlobalPart > &Parts, GlobalVariable *GV, const DataLayout &DL)
Look at all uses of the global and determine which (offset, type) pairs it can be split into.
static bool valueIsOnlyUsedLocallyOrStoredToOneGlobal(const CallInst *CI, const GlobalVariable *GV)
Scan the use-list of GV checking to make sure that there are no complex uses of GV.
static bool OptimizeFunctions(Module &M, function_ref< TargetLibraryInfo &(Function &)> GetTLI, function_ref< TargetTransformInfo &(Function &)> GetTTI, function_ref< BlockFrequencyInfo &(Function &)> GetBFI, function_ref< DominatorTree &(Function &)> LookupDomTree, SmallPtrSetImpl< const Comdat * > &NotDiscardableComdats, function_ref< void(Function &F)> ChangedCFGCallback, function_ref< void(Function &F)> DeleteFnCallback)
static bool DeleteDeadIFuncs(Module &M, SmallPtrSetImpl< const Comdat * > &NotDiscardableComdats)
static void RemoveAttribute(Function *F, Attribute::AttrKind A)
static bool hasChangeableCC(Function *F, ChangeableCCCacheTy &ChangeableCCCache)
static bool deleteIfDead(GlobalValue &GV, SmallPtrSetImpl< const Comdat * > &NotDiscardableComdats, function_ref< void(Function &)> DeleteFnCallback=nullptr)
static void RemovePreallocated(Function *F)
static cl::opt< bool > OptimizeNonFMVCallers("optimize-non-fmv-callers", cl::desc("Statically resolve calls to versioned " "functions from non-versioned callers."), cl::init(true), cl::Hidden)
static bool processGlobal(GlobalValue &GV, function_ref< TargetTransformInfo &(Function &)> GetTTI, function_ref< TargetLibraryInfo &(Function &)> GetTLI, function_ref< DominatorTree &(Function &)> LookupDomTree)
Analyze the specified global variable and optimize it if possible.
static bool isColdCallSite(CallBase &CB, BlockFrequencyInfo &CallerBFI)
Return true if the block containing the call site has a BlockFrequency of less than ColdCCRelFreq% of...
static void transferSRADebugInfo(GlobalVariable *GV, GlobalVariable *NGV, uint64_t FragmentOffsetInBits, uint64_t FragmentSizeInBits, uint64_t VarSize)
Copy over the debug info for a variable to its SRA replacements.
static cl::opt< bool > EnableColdCCStressTest("enable-coldcc-stress-test", cl::desc("Enable stress test of coldcc by adding " "calling conv to all internal functions."), cl::init(false), cl::Hidden)
static bool OptimizeGlobalAliases(Module &M, SmallPtrSetImpl< const Comdat * > &NotDiscardableComdats)
static bool TryToShrinkGlobalToBoolean(GlobalVariable *GV, Constant *OtherVal)
At this point, we have learned that the only two values ever stored into GV are its initializer and O...
static void ChangeCalleesToFastCall(Function *F)
Walk all of the direct calls of the specified function, changing them to FastCC.
static bool hasMustTailCallers(Function *F)
static bool OptimizeNonTrivialIFuncs(Module &M, function_ref< TargetTransformInfo &(Function &)> GetTTI)
static bool OptimizeGlobalVars(Module &M, function_ref< TargetTransformInfo &(Function &)> GetTTI, function_ref< TargetLibraryInfo &(Function &)> GetTLI, function_ref< DominatorTree &(Function &)> LookupDomTree, SmallPtrSetImpl< const Comdat * > &NotDiscardableComdats)
static void allUsesOfLoadAndStores(GlobalVariable *GV, SmallVector< Value *, 4 > &Uses)
Get all the loads/store uses for global variable GV.
static bool OptimizeEmptyGlobalAtExitDtors(Function *CXAAtExitFn, bool isCXX)
static bool mayHaveOtherReferences(GlobalValue &GV, const LLVMUsed &U)
static void changeCallSitesToColdCC(Function *F)
static AttributeList StripAttr(LLVMContext &C, AttributeList Attrs, Attribute::AttrKind A)
static bool hasInvokeCallers(Function *F)
static void setUsedInitializer(GlobalVariable &V, const SmallPtrSetImpl< GlobalValue * > &Init)
static cl::opt< unsigned > MaxIFuncVersions("max-ifunc-versions", cl::Hidden, cl::init(5), cl::desc("Maximum number of caller/callee versions that is allowed for " "using the expensive (cubic) static resolution algorithm."))
static bool OptimizeAwayTrappingUsesOfLoads(GlobalVariable *GV, Constant *LV, const DataLayout &DL, function_ref< TargetLibraryInfo &(Function &)> GetTLI)
The specified global has only one non-null value stored into it.
static bool isValidCandidateForColdCC(Function &F, function_ref< BlockFrequencyInfo &(Function &)> GetBFI, const std::vector< Function * > &AllCallsCold)
static cl::opt< int > ColdCCRelFreq("coldcc-rel-freq", cl::Hidden, cl::init(2), cl::desc("Maximum block frequency, expressed as a percentage of caller's " "entry frequency, for a call site to be considered cold for enabling " "coldcc"))
static bool optimizeGlobalsInModule(Module &M, const DataLayout &DL, function_ref< TargetLibraryInfo &(Function &)> GetTLI, function_ref< TargetTransformInfo &(Function &)> GetTTI, function_ref< BlockFrequencyInfo &(Function &)> GetBFI, function_ref< DominatorTree &(Function &)> LookupDomTree, function_ref< void(Function &F)> ChangedCFGCallback, function_ref< void(Function &F)> DeleteFnCallback)
static bool EvaluateStaticConstructor(Function *F, const DataLayout &DL, TargetLibraryInfo *TLI)
Evaluate static constructors in the function, if we can.
static bool CleanupConstantGlobalUsers(GlobalVariable *GV, const DataLayout &DL)
We just marked GV constant.
SmallDenseMap< Function *, bool, 8 > ChangeableCCCacheTy
static bool isLeakCheckerRoot(GlobalVariable *GV)
Is this global variable possibly used by a leak checker as a root?
static bool forwardStoredOnceStore(GlobalVariable *GV, const StoreInst *StoredOnceStore, function_ref< DominatorTree &(Function &)> LookupDomTree)
static int compareNames(Constant *const *A, Constant *const *B)
static bool CleanupPointerRootUsers(GlobalVariable *GV, function_ref< TargetLibraryInfo &(Function &)> GetTLI)
This GV is a pointer root.
static bool isPointerValueDeadOnEntryToFunction(const Function *F, GlobalValue *GV, function_ref< DominatorTree &(Function &)> LookupDomTree)
static bool processInternalGlobal(GlobalVariable *GV, const GlobalStatus &GS, function_ref< TargetTransformInfo &(Function &)> GetTTI, function_ref< TargetLibraryInfo &(Function &)> GetTLI, function_ref< DominatorTree &(Function &)> LookupDomTree)
Analyze the specified global variable and optimize it if possible.
static bool hasUsesToReplace(GlobalAlias &GA, const LLVMUsed &U, bool &RenameTarget)
static bool OptimizeAwayTrappingUsesOfValue(Value *V, Constant *NewV)
static GlobalVariable * SRAGlobal(GlobalVariable *GV, const DataLayout &DL)
Perform scalar replacement of aggregates on the specified global variable.
static bool hasUseOtherThanLLVMUsed(GlobalAlias &GA, const LLVMUsed &U)
Hexagon Common GEP
#define _
IRTranslator LLVM IR MI
Module.h This file contains the declarations for the Module class.
This defines the Use class.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Machine Check Debug Module
uint64_t IntrinsicInst * II
#define P(N)
FunctionAnalysisManager FAM
This file contains the declarations for profiling metadata utility functions.
Remove Loads Into Fake Uses
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:114
This pass exposes codegen information to IR-level passes.
Value * RHS
Value * LHS
Class for arbitrary precision integers.
Definition APInt.h:78
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1258
This class represents a conversion between pointers from one address space to another.
an instruction to allocate memory on the stack
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
Definition Attributes.h:88
LLVM Basic Block Representation.
Definition BasicBlock.h:62
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition BasicBlock.h:233
static LLVM_ABI BinaryOperator * CreateNot(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
LLVM_ABI BlockFrequency getBlockFreq(const BasicBlock *BB) const
getblockFreq - Return block frequency.
Represents analyses that only rely on functions' control flow.
Definition Analysis.h:73
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
LLVM_ABI void getOperandBundlesAsDefs(SmallVectorImpl< OperandBundleDef > &Defs) const
Return the list of operand bundles attached to this instruction as a vector of OperandBundleDefs.
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
Value * getCalledOperand() const
void setAttributes(AttributeList A)
Set the attributes for this call.
Value * getArgOperand(unsigned i) const
void setArgOperand(unsigned i, Value *v)
static LLVM_ABI CallBase * Create(CallBase *CB, ArrayRef< OperandBundleDef > Bundles, InsertPosition InsertPt=nullptr)
Create a clone of CB with a different set of operand bundles and insert it before InsertPt.
void setCalledOperand(Value *V)
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
LLVM_ABI Function * getCaller()
Helper to get the caller (the parent function).
This class represents a function call, abstracting a target machine's calling convention.
bool isMustTailCall() const
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:700
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:699
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:701
@ ICMP_NE
not equal
Definition InstrTypes.h:698
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:702
bool isSigned() const
Definition InstrTypes.h:930
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:765
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1130
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
static LLVM_ABI Constant * getAddrSpaceCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
Definition Constants.h:1284
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
static LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
This is an important base class in LLVM.
Definition Constant.h:43
const Constant * stripPointerCasts() const
Definition Constant.h:222
LLVM_ABI void removeDeadConstantUsers() const
If there are any dead constant users dangling off of this constant, remove them.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constants.cpp:90
DWARF expression.
LLVM_ABI bool extractIfOffset(int64_t &Offset) const
If this is a constant offset, extract it.
static LLVM_ABI std::optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
static LLVM_ABI DIExpression * prependOpcodes(const DIExpression *Expr, SmallVectorImpl< uint64_t > &Ops, bool StackValue=false, bool EntryValue=false)
Prepend DIExpr with the given opcodes and optionally turn it into a stack value.
A pair of DIGlobalVariable and DIExpression.
uint64_t getSizeInBits() const
Base class for variables.
DIType * getType() const
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
static DebugLoc getCompilerGenerated()
Definition DebugLoc.h:162
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:178
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:256
bool erase(const KeyT &Val)
Definition DenseMap.h:330
unsigned size() const
Definition DenseMap.h:110
bool empty() const
Definition DenseMap.h:109
iterator begin()
Definition DenseMap.h:78
iterator end()
Definition DenseMap.h:81
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:241
Implements a dense probed hash-table based set.
Definition DenseSet.h:279
Analysis pass which computes a DominatorTree.
Definition Dominators.h:283
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:164
This class evaluates LLVM IR, producing the Constant representing each SSA instruction.
Definition Evaluator.h:37
DenseMap< GlobalVariable *, Constant * > getMutatedInitializers() const
Definition Evaluator.h:102
bool EvaluateFunction(Function *F, Constant *&RetVal, const SmallVectorImpl< Constant * > &ActualArgs)
Evaluate a call to function F, returning true if successful, false if we can't evaluate it.
const SmallPtrSetImpl< GlobalVariable * > & getInvariants() const
Definition Evaluator.h:109
const BasicBlock & getEntryBlock() const
Definition Function.h:807
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
Definition Function.h:244
const Function & getFunction() const
Definition Function.h:164
iterator begin()
Definition Function.h:851
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition Function.cpp:359
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
const Constant * getAliasee() const
Definition GlobalAlias.h:87
LLVM_ABI const Function * getResolverFunction() const
Definition Globals.cpp:665
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
bool isDSOLocal() const
bool isImplicitDSOLocal() const
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
Definition Globals.cpp:328
LinkageTypes getLinkage() const
void setUnnamedAddr(UnnamedAddr Val)
bool hasLocalLinkage() const
bool hasPrivateLinkage() const
LLVM_ABI const Comdat * getComdat() const
Definition Globals.cpp:201
ThreadLocalMode getThreadLocalMode() const
void setLinkage(LinkageTypes LT)
unsigned getAddressSpace() const
Module * getParent()
Get the module that this global value is contained inside of...
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing module and deletes it.
Definition Globals.cpp:93
PointerType * getType() const
Global values are always pointers.
LLVM_ABI bool isInterposable() const
Return true if this global's definition can be substituted with an arbitrary definition at link time ...
Definition Globals.cpp:107
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this global belongs to.
Definition Globals.cpp:132
static bool isInterposableLinkage(LinkageTypes Linkage)
Whether the definition of this global may be replaced by something non-equivalent at link time.
bool hasGlobalUnnamedAddr() const
UnnamedAddr getUnnamedAddr() const
static bool isWeakForLinker(LinkageTypes Linkage)
Whether the definition of this global may be replaced at link time.
static bool isDiscardableIfUnused(LinkageTypes Linkage)
Whether the definition of this global may be discarded if it is not used in its compilation unit.
@ InternalLinkage
Rename collisions when linking (static functions).
Definition GlobalValue.h:60
@ AppendingLinkage
Special purpose, only applies to global arrays.
Definition GlobalValue.h:59
Type * getValueType() const
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
LLVM_ABI void setInitializer(Constant *InitVal)
setInitializer - Sets the initializer for this global variable, removing any existing initializer if ...
Definition Globals.cpp:524
bool isExternallyInitialized() const
MaybeAlign getAlign() const
Returns the alignment of the given variable.
void setConstant(bool Val)
LLVM_ABI void copyAttributesFrom(const GlobalVariable *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a GlobalVariable) fro...
Definition Globals.cpp:553
LLVM_ABI void getDebugInfo(SmallVectorImpl< DIGlobalVariableExpression * > &GVs) const
Fill the vector with all debug info attachements.
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
LLVM_ABI void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
Definition Globals.cpp:520
LLVM_ABI void addDebugInfo(DIGlobalVariableExpression *GV)
Attach a DIGlobalVariableExpression.
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
This instruction compares its operands according to the predicate given to the constructor.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2788
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
A wrapper class for inspecting calls to intrinsic functions.
Invoke instruction.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
An instruction for reading from memory.
AtomicOrdering getOrdering() const
Returns the ordering constraint of this load instruction.
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID of this load instruction.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1569
LLVMContext & getContext() const
Definition Metadata.h:1242
This is the common base class for memset/memcpy/memmove.
This class wraps the llvm.memset and llvm.memset.inline intrinsics.
This class wraps the llvm.memcpy/memmove intrinsics.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
void insertGlobalVariable(GlobalVariable *GV)
Insert global variable GV at the end of the global variable list and take ownership.
Definition Module.h:568
unsigned getAddressSpace() const
Return the address space of the Pointer type.
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
Definition Analysis.h:115
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
Definition Analysis.h:151
PreservedAnalyses & preserve()
Mark an analysis as preserved.
Definition Analysis.h:132
static LLVM_ABI void SalvageDebugInfo(const Constant &C)
Replace all uses of the constant with Undef in debug info metadata.
Definition Metadata.cpp:332
Interface for looking up the initializer for a variable name, used by Init::resolveReferences.
Definition Record.h:2199
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
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 reserve(size_type N)
iterator erase(const_iterator CI)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Value * getValueOperand()
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition StringRef.h:261
int compare(StringRef RHS) const
compare - Compare two strings; the result is negative, zero, or positive if this string is lexicograp...
Definition StringRef.h:179
Class to represent struct types.
ArrayRef< Type * > elements() const
bool isOpaque() const
Return true if this is a type with an identity that has no body specified yet.
Analysis pass providing the TargetTransformInfo.
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
Target - Wrapper for Target specific information.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:273
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:267
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
@ ArrayTyID
Arrays.
Definition Type.h:74
@ ScalableVectorTyID
Scalable SIMD vector type.
Definition Type.h:76
@ StructTyID
Structures.
Definition Type.h:73
@ FixedVectorTyID
Fixed width SIMD vector type.
Definition Type.h:75
@ PointerTyID
Pointers.
Definition Type.h:72
bool isSingleValueType() const
Return true if the type is a valid type for a register in codegen.
Definition Type.h:296
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:294
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:293
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
Definition Type.h:184
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM_ABI void set(Value *Val)
Definition Value.h:905
User * getUser() const
Returns the User that contains this Use.
Definition Use.h:61
Use * op_iterator
Definition User.h:279
Value * getOperand(unsigned i) const
Definition User.h:232
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:546
iterator_range< user_iterator > users()
Definition Value.h:426
use_iterator use_begin()
Definition Value.h:364
User * user_back()
Definition Value.h:412
LLVM_ABI const Value * stripAndAccumulateConstantOffsets(const DataLayout &DL, APInt &Offset, bool AllowNonInbounds, bool AllowInvariantGroup=false, function_ref< bool(Value &Value, APInt &Offset)> ExternalAnalysis=nullptr, bool LookThroughIntToPtr=false) const
Accumulate the constant offset this value has compared to a base pointer.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:701
bool use_empty() const
Definition Value.h:346
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.cpp:1099
iterator_range< use_iterator > uses()
Definition Value.h:380
user_iterator_impl< User > user_iterator
Definition Value.h:391
bool hasName() const
Definition Value.h:262
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:396
This class represents zero extension of integer types.
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:202
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
Definition ilist_node.h:348
CallInst * Call
Changed
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ Cold
Attempts to make code in the caller as efficient as possible under the assumption that the call is no...
Definition CallingConv.h:47
@ X86_ThisCall
Similar to X86_StdCall.
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:532
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1737
LLVM_ABI Constant * getInitialValueOfAllocation(const Value *V, const TargetLibraryInfo *TLI, Type *Ty)
If this is a call to an allocation function that initializes memory to a fixed value,...
LLVM_ABI bool RecursivelyDeleteTriviallyDeadInstructions(Value *V, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, std::function< void(Value *)> AboutToDeleteCallback=std::function< void(Value *)>())
If the specified value is a trivially dead instruction, delete it.
Definition Local.cpp:533
LLVM_ABI void setExplicitlyUnknownBranchWeightsIfProfiled(Instruction &I, StringRef PassName, const Function *F=nullptr)
Like setExplicitlyUnknownBranchWeights(...), but only sets unknown branch weights in the new instruct...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI Constant * ConstantFoldInstruction(const Instruction *I, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldInstruction - Try to constant fold the specified instruction.
LLVM_ABI bool isRemovableAlloc(const CallBase *V, const TargetLibraryInfo *TLI)
Return true if this is a call to an allocation function that does not have side effects that we are r...
const Value * getLoadStorePointerOperand(const Value *V)
A helper function that returns the pointer operand of a load or store instruction.
constexpr from_range_t from_range
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2148
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:632
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
LLVM_ABI Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1744
LLVM_ABI bool isInstructionTriviallyDead(Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction is not used, and the instruction will return.
Definition Local.cpp:402
LLVM_ABI bool getObjectSize(const Value *Ptr, uint64_t &Size, const DataLayout &DL, const TargetLibraryInfo *TLI, ObjectSizeOpts Opts={})
Compute the size of the object pointed by Ptr.
LLVM_ABI Constant * ConstantFoldLoadFromUniformValue(Constant *C, Type *Ty, const DataLayout &DL)
If C is a uniform value where all bits are the same (either all zero, all ones, all undef or all pois...
bool isSafeToDestroyConstant(const Constant *C)
It is safe to destroy a constant iff it is only used by constants itself.
LLVM_ABI Align getOrEnforceKnownAlignment(Value *V, MaybeAlign PrefAlign, const DataLayout &DL, const Instruction *CxtI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to ensure that the alignment of V is at least PrefAlign bytes.
Definition Local.cpp:1566
bool optimizeGlobalCtorsList(Module &M, function_ref< bool(uint32_t, Function *)> ShouldRemove)
Call "ShouldRemove" for every entry in M's global_ctor list and remove the entries for which it retur...
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1634
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
bool isPointerTy(const Type *T)
Definition SPIRVUtils.h:359
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1751
LLVM_ABI Constant * ConstantFoldLoadFromConst(Constant *C, Type *Ty, const APInt &Offset, const DataLayout &DL)
Extract value of C at the given Offset reinterpreted as Ty.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
TargetTransformInfo TTI
DWARFExpression::Operation Op
LLVM_ABI bool RecursivelyDeleteTriviallyDeadInstructionsPermissive(SmallVectorImpl< WeakTrackingVH > &DeadInsts, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, std::function< void(Value *)> AboutToDeleteCallback=std::function< void(Value *)>())
Same functionality as RecursivelyDeleteTriviallyDeadInstructions, but allow instructions that are not...
Definition Local.cpp:548
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
Definition STLExtras.h:1973
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isAllocationFn(const Value *V, const TargetLibraryInfo *TLI)
Tests if a value is a call or invoke to a library function that allocates or reallocates memory (eith...
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1909
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
Type * getLoadStoreType(const Value *I)
A helper function that returns the type of a load or store instruction.
void array_pod_sort(IteratorTy Start, IteratorTy End)
array_pod_sort - This sorts an array with the specified start and end extent.
Definition STLExtras.h:1594
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
LLVM_ABI bool removeUnreachableBlocks(Function &F, DomTreeUpdater *DTU=nullptr, MemorySSAUpdater *MSSAU=nullptr)
Remove all blocks that can not be reached from the function's entry.
Definition Local.cpp:2883
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
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 ...
Definition Module.cpp:870
Part of the global at a specific offset, which is only accessed through loads and stores with the giv...
Constant * Initializer
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
As we analyze each global or thread-local variable, keep track of some information about it.
@ InitializerStored
This global is stored to, but the only thing stored is the constant it was initialized with.
@ StoredOnce
This global is stored to, but only its initializer and one other value is ever stored to it.
static bool analyzeGlobal(const Value *V, GlobalStatus &GS)
Look at all uses of the global and fill in the GlobalStatus structure.
Various options to control the behavior of getObjectSize.
Function object to check whether the first component of a container supported by std::get (like std::...
Definition STLExtras.h:1437