LLVM 24.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 > GV->getGlobalSize(DL))
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 SmallVector<User *, 8> Users(V->user_begin(), V->user_end());
775 for (User *U : Users) {
777 // Uses are non-trapping if null pointer is considered valid.
778 // Non address-space 0 globals are already pruned by the caller.
779 if (NullPointerIsDefined(I->getFunction()))
780 return false;
781 if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
782 LI->setOperand(0, NewV);
783 Changed = true;
784 } else if (StoreInst *SI = dyn_cast<StoreInst>(I)) {
785 if (SI->getOperand(1) == V) {
786 SI->setOperand(1, NewV);
787 Changed = true;
788 }
789 } else if (isa<CallInst>(I) || isa<InvokeInst>(I)) {
791 if (CB->getCalledOperand() == V) {
792 // Calling through the pointer! Turn into a direct call, but be careful
793 // that the pointer is not also being passed as an argument.
794 CB->setCalledOperand(NewV);
795 Changed = true;
796 for (unsigned i = 0, e = CB->arg_size(); i != e; ++i)
797 if (CB->getArgOperand(i) == V)
798 CB->setArgOperand(i, NewV);
799 }
802 CI, ConstantExpr::getAddrSpaceCast(NewV, CI->getType()));
803 if (CI->use_empty()) {
804 Changed = true;
805 CI->eraseFromParent();
806 }
807 } else if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(I)) {
808 // Should handle GEP here.
810 Idxs.reserve(GEPI->getNumOperands()-1);
811 for (User::op_iterator i = GEPI->op_begin() + 1, e = GEPI->op_end();
812 i != e; ++i)
813 if (Constant *C = dyn_cast<Constant>(*i))
814 Idxs.push_back(C);
815 else
816 break;
817 if (Idxs.size() == GEPI->getNumOperands() - 1) {
819 V->getDataLayout(), GEPI->getSourceElementType(), NewV, Idxs))
821 }
822 if (GEPI->use_empty()) {
823 Changed = true;
824 GEPI->eraseFromParent();
825 }
826 }
827 }
828
829 return Changed;
830}
831
832/// The specified global has only one non-null value stored into it. If there
833/// are uses of the loaded value that would trap if the loaded value is
834/// dynamically null, then we know that they cannot be reachable with a null
835/// optimize away the load.
837 GlobalVariable *GV, Constant *LV, const DataLayout &DL,
839 bool Changed = false;
840
841 // Keep track of whether we are able to remove all the uses of the global
842 // other than the store that defines it.
843 bool AllNonStoreUsesGone = true;
844
845 // Replace all uses of loads with uses of uses of the stored value.
846 for (User *GlobalUser : llvm::make_early_inc_range(GV->users())) {
847 if (LoadInst *LI = dyn_cast<LoadInst>(GlobalUser)) {
849 // If we were able to delete all uses of the loads
850 if (LI->use_empty()) {
851 LI->eraseFromParent();
852 Changed = true;
853 } else {
854 AllNonStoreUsesGone = false;
855 }
856 } else if (isa<StoreInst>(GlobalUser)) {
857 // Ignore the store that stores "LV" to the global.
858 assert(GlobalUser->getOperand(1) == GV &&
859 "Must be storing *to* the global");
860 } else {
861 AllNonStoreUsesGone = false;
862 }
863 }
864
865 if (Changed) {
866 LLVM_DEBUG(dbgs() << "OPTIMIZED LOADS FROM STORED ONCE POINTER: " << *GV
867 << "\n");
868 ++NumGlobUses;
869 }
870
871 // If we nuked all of the loads, then none of the stores are needed either,
872 // nor is the global.
873 if (AllNonStoreUsesGone) {
874 if (isLeakCheckerRoot(GV)) {
875 Changed |= CleanupPointerRootUsers(GV, GetTLI);
876 } else {
877 Changed = true;
879 }
880 if (GV->use_empty()) {
881 LLVM_DEBUG(dbgs() << " *** GLOBAL NOW DEAD!\n");
882 Changed = true;
883 GV->eraseFromParent();
884 ++NumDeleted;
885 }
886 }
887 return Changed;
888}
889
890/// Walk the use list of V, constant folding all of the instructions that are
891/// foldable.
892static void ConstantPropUsersOf(Value *V, const DataLayout &DL,
893 TargetLibraryInfo *TLI) {
894 for (Value::user_iterator UI = V->user_begin(), E = V->user_end(); UI != E; )
895 if (Instruction *I = dyn_cast<Instruction>(*UI++))
896 if (Constant *NewC = ConstantFoldInstruction(I, DL, TLI)) {
897 I->replaceAllUsesWith(NewC);
898
899 // Advance UI to the next non-I use to avoid invalidating it!
900 // Instructions could multiply use V.
901 while (UI != E && *UI == I)
902 ++UI;
904 I->eraseFromParent();
905 }
906}
907
908/// This function takes the specified global variable, and transforms the
909/// program as if it always contained the result of the specified malloc.
910/// Because it is always the result of the specified malloc, there is no reason
911/// to actually DO the malloc. Instead, turn the malloc into a global, and any
912/// loads of GV as uses of the new global.
913static GlobalVariable *
915 uint64_t AllocSize, Constant *InitVal,
916 const DataLayout &DL,
917 TargetLibraryInfo *TLI) {
918 LLVM_DEBUG(errs() << "PROMOTING GLOBAL: " << *GV << " CALL = " << *CI
919 << '\n');
920
921 // Create global of type [AllocSize x i8].
922 Type *GlobalType = ArrayType::get(Type::getInt8Ty(GV->getContext()),
923 AllocSize);
924
925 // Create the new global variable. The contents of the allocated memory is
926 // undefined initially, so initialize with an undef value.
927 GlobalVariable *NewGV = new GlobalVariable(
928 *GV->getParent(), GlobalType, false, GlobalValue::InternalLinkage,
929 UndefValue::get(GlobalType), GV->getName() + ".body", nullptr,
930 GV->getThreadLocalMode());
931
932 // Initialize the global at the point of the original call. Note that this
933 // is a different point from the initialization referred to below for the
934 // nullability handling. Sublety: We have not proven the original global was
935 // only initialized once. As such, we can not fold this into the initializer
936 // of the new global as may need to re-init the storage multiple times.
937 if (!isa<UndefValue>(InitVal)) {
938 IRBuilder<> Builder(CI->getNextNode());
939 // TODO: Use alignment above if align!=1
940 Builder.CreateMemSet(NewGV, InitVal, AllocSize, std::nullopt);
941 }
942
943 // Update users of the allocation to use the new global instead.
944 CI->replaceAllUsesWith(NewGV);
945
946 // If there is a comparison against null, we will insert a global bool to
947 // keep track of whether the global was initialized yet or not.
948 GlobalVariable *InitBool = new GlobalVariable(
950 ConstantInt::getFalse(GV->getContext()), GV->getName() + ".init",
952 bool InitBoolUsed = false;
953
954 // Loop over all instruction uses of GV, processing them in turn.
956 allUsesOfLoadAndStores(GV, Guses);
957 for (auto *U : Guses) {
958 if (StoreInst *SI = dyn_cast<StoreInst>(U)) {
959 // The global is initialized when the store to it occurs. If the stored
960 // value is null value, the global bool is set to false, otherwise true.
961 auto *NewSI = new StoreInst(
963 SI->getValueOperand())),
964 InitBool, false, Align(1), SI->getOrdering(), SI->getSyncScopeID(),
965 SI->getIterator());
966 NewSI->setDebugLoc(SI->getDebugLoc());
967 SI->eraseFromParent();
968 continue;
969 }
970
971 LoadInst *LI = cast<LoadInst>(U);
972 while (!LI->use_empty()) {
973 Use &LoadUse = *LI->use_begin();
974 ICmpInst *ICI = dyn_cast<ICmpInst>(LoadUse.getUser());
975 if (!ICI) {
976 LoadUse.set(NewGV);
977 continue;
978 }
979
980 // Replace the cmp X, 0 with a use of the bool value.
981 Value *LV = new LoadInst(InitBool->getValueType(), InitBool,
982 InitBool->getName() + ".val", false, Align(1),
983 LI->getOrdering(), LI->getSyncScopeID(),
984 LI->getIterator());
985 // FIXME: Should we use the DebugLoc of the load used by the predicate, or
986 // the predicate? The load seems most appropriate, but there's an argument
987 // that the new load does not represent the old load, but is simply a
988 // component of recomputing the predicate.
989 cast<LoadInst>(LV)->setDebugLoc(LI->getDebugLoc());
990 InitBoolUsed = true;
991 switch (ICI->getPredicate()) {
992 default: llvm_unreachable("Unknown ICmp Predicate!");
993 case ICmpInst::ICMP_ULT: // X < null -> always false
995 break;
996 case ICmpInst::ICMP_UGE: // X >= null -> always true
998 break;
1000 case ICmpInst::ICMP_EQ:
1001 LV = BinaryOperator::CreateNot(LV, "notinit", ICI->getIterator());
1002 cast<BinaryOperator>(LV)->setDebugLoc(ICI->getDebugLoc());
1003 break;
1004 case ICmpInst::ICMP_NE:
1005 case ICmpInst::ICMP_UGT:
1006 break; // no change.
1007 }
1008 ICI->replaceAllUsesWith(LV);
1009 ICI->eraseFromParent();
1010 }
1011 LI->eraseFromParent();
1012 }
1013
1014 // If the initialization boolean was used, insert it, otherwise delete it.
1015 if (!InitBoolUsed) {
1016 while (!InitBool->use_empty()) // Delete initializations
1017 cast<StoreInst>(InitBool->user_back())->eraseFromParent();
1018 delete InitBool;
1019 } else
1020 GV->getParent()->insertGlobalVariable(GV->getIterator(), InitBool);
1021
1022 // Now the GV is dead, nuke it and the allocation..
1023 GV->eraseFromParent();
1024 CI->eraseFromParent();
1025
1026 // To further other optimizations, loop over all users of NewGV and try to
1027 // constant prop them. This will promote GEP instructions with constant
1028 // indices into GEP constant-exprs, which will allow global-opt to hack on it.
1029 ConstantPropUsersOf(NewGV, DL, TLI);
1030
1031 return NewGV;
1032}
1033
1034/// Scan the use-list of GV checking to make sure that there are no complex uses
1035/// of GV. We permit simple things like dereferencing the pointer, but not
1036/// storing through the address, unless it is to the specified global.
1037static bool
1039 const GlobalVariable *GV) {
1042 Worklist.push_back(CI);
1043
1044 while (!Worklist.empty()) {
1045 const Value *V = Worklist.pop_back_val();
1046 if (!Visited.insert(V).second)
1047 continue;
1048
1049 for (const Use &VUse : V->uses()) {
1050 const User *U = VUse.getUser();
1051 if (isa<LoadInst>(U) || isa<CmpInst>(U))
1052 continue; // Fine, ignore.
1053
1054 if (auto *SI = dyn_cast<StoreInst>(U)) {
1055 if (SI->getValueOperand() == V &&
1056 SI->getPointerOperand()->stripPointerCasts() != GV)
1057 return false; // Storing the pointer not into GV... bad.
1058 continue; // Otherwise, storing through it, or storing into GV... fine.
1059 }
1060
1061 if (auto *GEPI = dyn_cast<GetElementPtrInst>(U)) {
1062 Worklist.push_back(GEPI);
1063 continue;
1064 }
1065
1066 return false;
1067 }
1068 }
1069
1070 return true;
1071}
1072
1073/// If we have a global that is only initialized with a fixed size allocation
1074/// try to transform the program to use global memory instead of heap
1075/// allocated memory. This eliminates dynamic allocation, avoids an indirection
1076/// accessing the data, and exposes the resultant global to further GlobalOpt.
1078 CallInst *CI,
1079 const DataLayout &DL,
1080 TargetLibraryInfo *TLI) {
1081 if (!isRemovableAlloc(CI, TLI))
1082 // Must be able to remove the call when we get done..
1083 return false;
1084
1085 Type *Int8Ty = Type::getInt8Ty(CI->getFunction()->getContext());
1086 Constant *InitVal = getInitialValueOfAllocation(CI, TLI, Int8Ty);
1087 if (!InitVal)
1088 // Must be able to emit a memset for initialization
1089 return false;
1090
1091 uint64_t AllocSize;
1092 if (!getObjectSize(CI, AllocSize, DL, TLI, ObjectSizeOpts()))
1093 return false;
1094
1095 // Restrict this transformation to only working on small allocations
1096 // (2048 bytes currently), as we don't want to introduce a 16M global or
1097 // something.
1098 if (AllocSize >= 2048)
1099 return false;
1100
1101 // We can't optimize this global unless all uses of it are *known* to be
1102 // of the malloc value, not of the null initializer value (consider a use
1103 // that compares the global's value against zero to see if the malloc has
1104 // been reached). To do this, we check to see if all uses of the global
1105 // would trap if the global were null: this proves that they must all
1106 // happen after the malloc.
1108 return false;
1109
1110 // We can't optimize this if the malloc itself is used in a complex way,
1111 // for example, being stored into multiple globals. This allows the
1112 // malloc to be stored into the specified global, loaded, gep, icmp'd.
1113 // These are all things we could transform to using the global for.
1115 return false;
1116
1117 OptimizeGlobalAddressOfAllocation(GV, CI, AllocSize, InitVal, DL, TLI);
1118 return true;
1119}
1120
1121// Try to optimize globals based on the knowledge that only one value (besides
1122// its initializer) is ever stored to the global.
1123static bool
1125 const DataLayout &DL,
1127 // If we are dealing with a pointer global that is initialized to null and
1128 // only has one (non-null) value stored into it, then we can optimize any
1129 // users of the loaded value (often calls and loads) that would trap if the
1130 // value was null.
1131 if (GV->getInitializer()->getType()->isPointerTy() &&
1132 GV->getInitializer()->isNullValue() &&
1133 StoredOnceVal->getType()->isPointerTy() &&
1135 nullptr /* F */,
1137 if (Constant *SOVC = dyn_cast<Constant>(StoredOnceVal)) {
1138 // Optimize away any trapping uses of the loaded value.
1139 if (OptimizeAwayTrappingUsesOfLoads(GV, SOVC, DL, GetTLI))
1140 return true;
1141 } else if (isAllocationFn(StoredOnceVal, GetTLI)) {
1142 if (auto *CI = dyn_cast<CallInst>(StoredOnceVal)) {
1143 auto *TLI = &GetTLI(*CI->getFunction());
1145 return true;
1146 }
1147 }
1148 }
1149
1150 return false;
1151}
1152
1153/// At this point, we have learned that the only two values ever stored into GV
1154/// are its initializer and OtherVal. See if we can shrink the global into a
1155/// boolean and select between the two values whenever it is used. This exposes
1156/// the values to other scalar optimizations.
1158 Type *GVElType = GV->getValueType();
1159
1160 // If GVElType is already i1, it is already shrunk. If the type of the GV is
1161 // an FP value, pointer or vector, don't do this optimization because a select
1162 // between them is very expensive and unlikely to lead to later
1163 // simplification. In these cases, we typically end up with "cond ? v1 : v2"
1164 // where v1 and v2 both require constant pool loads, a big loss.
1165 if (GVElType == Type::getInt1Ty(GV->getContext()) ||
1166 GVElType->isFloatingPointTy() ||
1167 GVElType->isPointerTy() || GVElType->isVectorTy())
1168 return false;
1169
1170 // Walk the use list of the global seeing if all the uses are load or store.
1171 // If there is anything else, bail out.
1172 for (User *U : GV->users()) {
1173 if (!isa<LoadInst>(U) && !isa<StoreInst>(U))
1174 return false;
1175 if (getLoadStoreType(U) != GVElType)
1176 return false;
1177 }
1178
1179 LLVM_DEBUG(dbgs() << " *** SHRINKING TO BOOL: " << *GV << "\n");
1180
1181 // Create the new global, initializing it to false.
1183 false,
1186 GV->getName()+".b",
1187 GV->getThreadLocalMode(),
1188 GV->getType()->getAddressSpace());
1189 NewGV->copyAttributesFrom(GV);
1190 GV->getParent()->insertGlobalVariable(GV->getIterator(), NewGV);
1191
1192 Constant *InitVal = GV->getInitializer();
1193 assert(InitVal->getType() != Type::getInt1Ty(GV->getContext()) &&
1194 "No reason to shrink to bool!");
1195
1197 GV->getDebugInfo(GVs);
1198
1199 // If initialized to zero and storing one into the global, we can use a cast
1200 // instead of a select to synthesize the desired value.
1201 bool IsOneZero = false;
1202 bool EmitOneOrZero = true;
1203 auto *CI = dyn_cast<ConstantInt>(OtherVal);
1204 if (CI && CI->getValue().getActiveBits() <= 64) {
1205 IsOneZero = InitVal->isNullValue() && CI->isOne();
1206
1207 auto *CIInit = dyn_cast<ConstantInt>(GV->getInitializer());
1208 if (CIInit && CIInit->getValue().getActiveBits() <= 64) {
1209 uint64_t ValInit = CIInit->getZExtValue();
1210 uint64_t ValOther = CI->getZExtValue();
1211 uint64_t ValMinus = ValOther - ValInit;
1212
1213 for(auto *GVe : GVs){
1214 DIGlobalVariable *DGV = GVe->getVariable();
1215 DIExpression *E = GVe->getExpression();
1216 const DataLayout &DL = GV->getDataLayout();
1217 unsigned SizeInOctets = NewGV->getGlobalSize(DL);
1218
1219 // It is expected that the address of global optimized variable is on
1220 // top of the stack. After optimization, value of that variable will
1221 // be ether 0 for initial value or 1 for other value. The following
1222 // expression should return constant integer value depending on the
1223 // value at global object address:
1224 // val * (ValOther - ValInit) + ValInit:
1225 // DW_OP_deref DW_OP_constu <ValMinus>
1226 // DW_OP_mul DW_OP_constu <ValInit> DW_OP_plus DW_OP_stack_value
1228 dwarf::DW_OP_deref_size, SizeInOctets,
1229 dwarf::DW_OP_constu, ValMinus,
1230 dwarf::DW_OP_mul, dwarf::DW_OP_constu, ValInit,
1231 dwarf::DW_OP_plus};
1232 bool WithStackValue = true;
1233 E = DIExpression::prependOpcodes(E, Ops, WithStackValue);
1236 NewGV->addDebugInfo(DGVE);
1237 }
1238 EmitOneOrZero = false;
1239 }
1240 }
1241
1242 if (EmitOneOrZero) {
1243 // FIXME: This will only emit address for debugger on which will
1244 // be written only 0 or 1.
1245 for(auto *GV : GVs)
1246 NewGV->addDebugInfo(GV);
1247 }
1248
1249 while (!GV->use_empty()) {
1251 if (StoreInst *SI = dyn_cast<StoreInst>(UI)) {
1252 // Change the store into a boolean store.
1253 bool StoringOther = SI->getOperand(0) == OtherVal;
1254 // Only do this if we weren't storing a loaded value.
1255 Value *StoreVal;
1256 if (StoringOther || SI->getOperand(0) == InitVal) {
1257 StoreVal = ConstantInt::get(Type::getInt1Ty(GV->getContext()),
1258 StoringOther);
1259 } else {
1260 // Otherwise, we are storing a previously loaded copy. To do this,
1261 // change the copy from copying the original value to just copying the
1262 // bool.
1263 Instruction *StoredVal = cast<Instruction>(SI->getOperand(0));
1264
1265 // If we've already replaced the input, StoredVal will be a cast or
1266 // select instruction. If not, it will be a load of the original
1267 // global.
1268 if (LoadInst *LI = dyn_cast<LoadInst>(StoredVal)) {
1269 assert(LI->getOperand(0) == GV && "Not a copy!");
1270 // Insert a new load, to preserve the saved value.
1271 StoreVal =
1272 new LoadInst(NewGV->getValueType(), NewGV, LI->getName() + ".b",
1273 false, Align(1), LI->getOrdering(),
1274 LI->getSyncScopeID(), LI->getIterator());
1275 cast<LoadInst>(StoreVal)->setDebugLoc(LI->getDebugLoc());
1276 } else {
1277 assert((isa<CastInst>(StoredVal) || isa<SelectInst>(StoredVal)) &&
1278 "This is not a form that we understand!");
1279 StoreVal = StoredVal->getOperand(0);
1280 assert(isa<LoadInst>(StoreVal) && "Not a load of NewGV!");
1281 }
1282 }
1283 StoreInst *NSI =
1284 new StoreInst(StoreVal, NewGV, false, Align(1), SI->getOrdering(),
1285 SI->getSyncScopeID(), SI->getIterator());
1286 NSI->setDebugLoc(SI->getDebugLoc());
1287 } else {
1288 // Change the load into a load of bool then a select.
1289 LoadInst *LI = cast<LoadInst>(UI);
1290 LoadInst *NLI = new LoadInst(
1291 NewGV->getValueType(), NewGV, LI->getName() + ".b", false, Align(1),
1292 LI->getOrdering(), LI->getSyncScopeID(), LI->getIterator());
1293 Instruction *NSI;
1294 if (IsOneZero)
1295 NSI = new ZExtInst(NLI, LI->getType(), "", LI->getIterator());
1296 else {
1297 NSI = SelectInst::Create(NLI, OtherVal, InitVal, "", LI->getIterator());
1299 }
1300 NSI->takeName(LI);
1301 // Since LI is split into two instructions, NLI and NSI both inherit the
1302 // same DebugLoc
1303 NLI->setDebugLoc(LI->getDebugLoc());
1304 NSI->setDebugLoc(LI->getDebugLoc());
1305 LI->replaceAllUsesWith(NSI);
1306 }
1307 UI->eraseFromParent();
1308 }
1309
1310 // Retain the name of the old global variable. People who are debugging their
1311 // programs may expect these variables to be named the same.
1312 NewGV->takeName(GV);
1313 GV->eraseFromParent();
1314 return true;
1315}
1316
1317static bool
1319 SmallPtrSetImpl<const Comdat *> &NotDiscardableComdats,
1320 function_ref<void(Function &)> DeleteFnCallback = nullptr) {
1322
1323 if (!GV.isDiscardableIfUnused() && !GV.isDeclaration())
1324 return false;
1325
1326 if (const Comdat *C = GV.getComdat())
1327 if (!GV.hasLocalLinkage() && NotDiscardableComdats.count(C))
1328 return false;
1329
1330 bool Dead;
1331 if (auto *F = dyn_cast<Function>(&GV))
1332 Dead = (F->isDeclaration() && F->use_empty()) || F->isDefTriviallyDead();
1333 else
1334 Dead = GV.use_empty();
1335 if (!Dead)
1336 return false;
1337
1338 LLVM_DEBUG(dbgs() << "GLOBAL DEAD: " << GV << "\n");
1339 if (auto *F = dyn_cast<Function>(&GV)) {
1340 if (DeleteFnCallback)
1341 DeleteFnCallback(*F);
1342 }
1344 GV.eraseFromParent();
1345 ++NumDeleted;
1346 return true;
1347}
1348
1350 const Function *F, GlobalValue *GV,
1351 function_ref<DominatorTree &(Function &)> LookupDomTree) {
1352 // Find all uses of GV. We expect them all to be in F, and if we can't
1353 // identify any of the uses we bail out.
1354 //
1355 // On each of these uses, identify if the memory that GV points to is
1356 // used/required/live at the start of the function. If it is not, for example
1357 // if the first thing the function does is store to the GV, the GV can
1358 // possibly be demoted.
1359 //
1360 // We don't do an exhaustive search for memory operations - simply look
1361 // through bitcasts as they're quite common and benign.
1362 const DataLayout &DL = GV->getDataLayout();
1365 for (auto *U : GV->users()) {
1367 if (!I)
1368 return false;
1369 assert(I->getParent()->getParent() == F);
1370
1371 if (auto *LI = dyn_cast<LoadInst>(I))
1372 Loads.push_back(LI);
1373 else if (auto *SI = dyn_cast<StoreInst>(I))
1374 Stores.push_back(SI);
1375 else
1376 return false;
1377 }
1378
1379 // We have identified all uses of GV into loads and stores. Now check if all
1380 // of them are known not to depend on the value of the global at the function
1381 // entry point. We do this by ensuring that every load is dominated by at
1382 // least one store.
1383 auto &DT = LookupDomTree(*const_cast<Function *>(F));
1384
1385 // The below check is quadratic. Check we're not going to do too many tests.
1386 // FIXME: Even though this will always have worst-case quadratic time, we
1387 // could put effort into minimizing the average time by putting stores that
1388 // have been shown to dominate at least one load at the beginning of the
1389 // Stores array, making subsequent dominance checks more likely to succeed
1390 // early.
1391 //
1392 // The threshold here is fairly large because global->local demotion is a
1393 // very powerful optimization should it fire.
1394 const unsigned Threshold = 100;
1395 if (Loads.size() * Stores.size() > Threshold)
1396 return false;
1397
1398 for (auto *L : Loads) {
1399 auto *LTy = L->getType();
1400 if (none_of(Stores, [&](const StoreInst *S) {
1401 auto *STy = S->getValueOperand()->getType();
1402 // The load is only dominated by the store if DomTree says so
1403 // and the number of bits loaded in L is less than or equal to
1404 // the number of bits stored in S.
1405 return DT.dominates(S, L) &&
1406 DL.getTypeStoreSize(LTy).getFixedValue() <=
1407 DL.getTypeStoreSize(STy).getFixedValue();
1408 }))
1409 return false;
1410 }
1411 // All loads have known dependences inside F, so the global can be localized.
1412 return true;
1413}
1414
1415// For a global variable with one store, if the store dominates any loads,
1416// those loads will always load the stored value (as opposed to the
1417// initializer), even in the presence of recursion.
1419 GlobalVariable *GV, const StoreInst *StoredOnceStore,
1420 function_ref<DominatorTree &(Function &)> LookupDomTree) {
1421 const Value *StoredOnceValue = StoredOnceStore->getValueOperand();
1422 // We can do this optimization for non-constants in nosync + norecurse
1423 // functions, but globals used in exactly one norecurse functions are already
1424 // promoted to an alloca.
1425 if (!isa<Constant>(StoredOnceValue))
1426 return false;
1427 const Function *F = StoredOnceStore->getFunction();
1429 for (User *U : GV->users()) {
1430 if (auto *LI = dyn_cast<LoadInst>(U)) {
1431 if (LI->getFunction() == F &&
1432 LI->getType() == StoredOnceValue->getType() && LI->isSimple())
1433 Loads.push_back(LI);
1434 }
1435 }
1436 // Only compute DT if we have any loads to examine.
1437 bool MadeChange = false;
1438 if (!Loads.empty()) {
1439 auto &DT = LookupDomTree(*const_cast<Function *>(F));
1440 for (auto *LI : Loads) {
1441 if (DT.dominates(StoredOnceStore, LI)) {
1442 LI->replaceAllUsesWith(const_cast<Value *>(StoredOnceValue));
1443 LI->eraseFromParent();
1444 MadeChange = true;
1445 }
1446 }
1447 }
1448 return MadeChange;
1449}
1450
1451/// Analyze the specified global variable and optimize
1452/// it if possible. If we make a change, return true.
1453static bool
1457 function_ref<DominatorTree &(Function &)> LookupDomTree) {
1458 auto &DL = GV->getDataLayout();
1459 // If this is a first class global and has only one accessing function and
1460 // this function is non-recursive, we replace the global with a local alloca
1461 // in this function.
1462 //
1463 // NOTE: It doesn't make sense to promote non-single-value types since we
1464 // are just replacing static memory to stack memory.
1465 //
1466 // If the global is in different address space, don't bring it to stack.
1467 if (!GS.HasMultipleAccessingFunctions &&
1468 GS.AccessingFunction &&
1470 GV->getType()->getAddressSpace() == DL.getAllocaAddrSpace() &&
1471 !GV->isExternallyInitialized() &&
1472 GS.AccessingFunction->doesNotRecurse() &&
1473 isPointerValueDeadOnEntryToFunction(GS.AccessingFunction, GV,
1474 LookupDomTree)) {
1475 const DataLayout &DL = GV->getDataLayout();
1476
1477 LLVM_DEBUG(dbgs() << "LOCALIZING GLOBAL: " << *GV << "\n");
1478 BasicBlock::iterator FirstI =
1479 GS.AccessingFunction->getEntryBlock().begin().getNonConst();
1480 Type *ElemTy = GV->getValueType();
1481 // FIXME: Pass Global's alignment when globals have alignment
1482 AllocaInst *Alloca = new AllocaInst(ElemTy, DL.getAllocaAddrSpace(),
1483 nullptr, GV->getName(), FirstI);
1485 if (!isa<UndefValue>(GV->getInitializer())) {
1486 auto *SI = new StoreInst(GV->getInitializer(), Alloca, FirstI);
1487 // FIXME: We're localizing a global and creating a store instruction for
1488 // the initial value of that global. Could we logically use the global
1489 // variable's (if one exists) line for this?
1490 SI->setDebugLoc(DebugLoc::getCompilerGenerated());
1491 }
1492
1493 GV->replaceAllUsesWith(Alloca);
1494 GV->eraseFromParent();
1495 ++NumLocalized;
1496 return true;
1497 }
1498
1499 bool Changed = false;
1500
1501 // If the global is never loaded (but may be stored to), it is dead.
1502 // Delete it now.
1503 if (!GS.IsLoaded) {
1504 LLVM_DEBUG(dbgs() << "GLOBAL NEVER LOADED: " << *GV << "\n");
1505
1506 if (isLeakCheckerRoot(GV)) {
1507 // Delete any constant stores to the global.
1508 Changed = CleanupPointerRootUsers(GV, GetTLI);
1509 } else {
1510 // Delete any stores we can find to the global. We may not be able to
1511 // make it completely dead though.
1513 }
1514
1515 // If the global is dead now, delete it.
1516 if (GV->use_empty()) {
1517 GV->eraseFromParent();
1518 ++NumDeleted;
1519 Changed = true;
1520 }
1521 return Changed;
1522
1523 }
1524 if (GS.StoredType <= GlobalStatus::InitializerStored) {
1525 LLVM_DEBUG(dbgs() << "MARKING CONSTANT: " << *GV << "\n");
1526
1527 // Don't actually mark a global constant if it's atomic because atomic loads
1528 // are implemented by a trivial cmpxchg in some edge-cases and that usually
1529 // requires write access to the variable even if it's not actually changed.
1530 if (GS.Ordering == AtomicOrdering::NotAtomic) {
1531 assert(!GV->isConstant() && "Expected a non-constant global");
1532 GV->setConstant(true);
1533 Changed = true;
1534 }
1535
1536 // Clean up any obviously simplifiable users now.
1538
1539 // If the global is dead now, just nuke it.
1540 if (GV->use_empty()) {
1541 LLVM_DEBUG(dbgs() << " *** Marking constant allowed us to simplify "
1542 << "all users and delete global!\n");
1543 GV->eraseFromParent();
1544 ++NumDeleted;
1545 return true;
1546 }
1547
1548 // Fall through to the next check; see if we can optimize further.
1549 ++NumMarked;
1550 }
1551 if (!GV->getInitializer()->getType()->isSingleValueType()) {
1552 const DataLayout &DL = GV->getDataLayout();
1553 if (SRAGlobal(GV, DL))
1554 return true;
1555 }
1556 Value *StoredOnceValue = GS.getStoredOnceValue();
1557 if (GS.StoredType == GlobalStatus::StoredOnce && StoredOnceValue) {
1558 Function &StoreFn =
1559 const_cast<Function &>(*GS.StoredOnceStore->getFunction());
1560 bool CanHaveNonUndefGlobalInitializer =
1561 GetTTI(StoreFn).canHaveNonUndefGlobalInitializerInAddressSpace(
1562 GV->getType()->getAddressSpace());
1563 // If the initial value for the global was an undef value, and if only
1564 // one other value was stored into it, we can just change the
1565 // initializer to be the stored value, then delete all stores to the
1566 // global. This allows us to mark it constant.
1567 // This is restricted to address spaces that allow globals to have
1568 // initializers. NVPTX, for example, does not support initializers for
1569 // shared memory (AS 3).
1570 auto *SOVConstant = dyn_cast<Constant>(StoredOnceValue);
1571 if (SOVConstant && isa<UndefValue>(GV->getInitializer()) &&
1572 DL.getTypeAllocSize(SOVConstant->getType()).getFixedValue() ==
1573 GV->getGlobalSize(DL) &&
1574 CanHaveNonUndefGlobalInitializer) {
1575 if (SOVConstant->getType() == GV->getValueType()) {
1576 // Change the initializer in place.
1577 GV->setInitializer(SOVConstant);
1578 } else {
1579 // Create a new global with adjusted type.
1580 auto *NGV = new GlobalVariable(
1581 *GV->getParent(), SOVConstant->getType(), GV->isConstant(),
1582 GV->getLinkage(), SOVConstant, "", GV, GV->getThreadLocalMode(),
1583 GV->getAddressSpace());
1584 NGV->takeName(GV);
1585 NGV->copyAttributesFrom(GV);
1586 GV->replaceAllUsesWith(NGV);
1587 GV->eraseFromParent();
1588 GV = NGV;
1589 }
1590
1591 // Clean up any obviously simplifiable users now.
1593
1594 if (GV->use_empty()) {
1595 LLVM_DEBUG(dbgs() << " *** Substituting initializer allowed us to "
1596 << "simplify all users and delete global!\n");
1597 GV->eraseFromParent();
1598 ++NumDeleted;
1599 }
1600 ++NumSubstitute;
1601 return true;
1602 }
1603
1604 // Try to optimize globals based on the knowledge that only one value
1605 // (besides its initializer) is ever stored to the global.
1606 if (optimizeOnceStoredGlobal(GV, StoredOnceValue, DL, GetTLI))
1607 return true;
1608
1609 // Try to forward the store to any loads. If we have more than one store, we
1610 // may have a store of the initializer between StoredOnceStore and a load.
1611 if (GS.NumStores == 1)
1612 if (forwardStoredOnceStore(GV, GS.StoredOnceStore, LookupDomTree))
1613 return true;
1614
1615 // Otherwise, if the global was not a boolean, we can shrink it to be a
1616 // boolean. Skip this optimization for AS that doesn't allow an initializer.
1617 if (SOVConstant && GS.Ordering == AtomicOrdering::NotAtomic &&
1619 CanHaveNonUndefGlobalInitializer)) {
1620 if (TryToShrinkGlobalToBoolean(GV, SOVConstant)) {
1621 ++NumShrunkToBool;
1622 return true;
1623 }
1624 }
1625 }
1626
1627 return Changed;
1628}
1629
1630/// Analyze the specified global variable and optimize it if possible. If we
1631/// make a change, return true.
1632static bool
1636 function_ref<DominatorTree &(Function &)> LookupDomTree) {
1637 if (GV.getName().starts_with("llvm."))
1638 return false;
1639
1640 GlobalStatus GS;
1641
1642 if (GlobalStatus::analyzeGlobal(&GV, GS))
1643 return false;
1644
1645 bool Changed = false;
1646 if (!GS.IsCompared && !GV.hasGlobalUnnamedAddr()) {
1647 auto NewUnnamedAddr = GV.hasLocalLinkage() ? GlobalValue::UnnamedAddr::Global
1649 if (NewUnnamedAddr != GV.getUnnamedAddr()) {
1650 GV.setUnnamedAddr(NewUnnamedAddr);
1651 NumUnnamed++;
1652 Changed = true;
1653 }
1654 }
1655
1656 // Do more involved optimizations if the global is internal.
1657 if (!GV.hasLocalLinkage())
1658 return Changed;
1659
1660 auto *GVar = dyn_cast<GlobalVariable>(&GV);
1661 if (!GVar)
1662 return Changed;
1663
1664 if (GVar->isConstant() || !GVar->hasInitializer())
1665 return Changed;
1666
1667 return processInternalGlobal(GVar, GS, GetTTI, GetTLI, LookupDomTree) ||
1668 Changed;
1669}
1670
1671/// Walk all of the direct calls of the specified function, changing them to
1672/// FastCC.
1674 for (User *U : F->users())
1675 if (auto *Call = dyn_cast<CallBase>(U))
1676 if (Call->getCalledOperand() == F)
1677 Call->setCallingConv(CallingConv::Fast);
1678}
1679
1682 unsigned AttrIndex;
1683 if (Attrs.hasAttrSomewhere(A, &AttrIndex))
1684 return Attrs.removeAttributeAtIndex(C, AttrIndex, A);
1685 return Attrs;
1686}
1687
1689 F->setAttributes(StripAttr(F->getContext(), F->getAttributes(), A));
1690 for (User *U : F->users()) {
1691 CallBase *CB = cast<CallBase>(U);
1692 CB->setAttributes(StripAttr(F->getContext(), CB->getAttributes(), A));
1693 }
1694}
1695
1696/// Return true if this is a calling convention that we'd like to change. The
1697/// idea here is that we don't want to mess with the convention if the user
1698/// explicitly requested something with performance implications like coldcc,
1699/// GHC, or anyregcc.
1701 CallingConv::ID CC = F->getCallingConv();
1702
1703 // FIXME: Is it worth transforming x86_stdcallcc and x86_fastcallcc?
1704 if (CC != CallingConv::C && CC != CallingConv::X86_ThisCall)
1705 return false;
1706
1707 if (!F->canChangeSignature())
1708 return false;
1709
1710 if (F->isVarArg())
1711 return false;
1712
1713 // FIXME: Change CC for the whole chain of musttail calls when possible.
1714 //
1715 // Can't change CC of the function that either has musttail calls, or is a
1716 // musttail callee itself
1717 for (User *U : F->users()) {
1719 if (!CI)
1720 continue;
1721
1722 if (CI->isMustTailCall())
1723 return false;
1724 }
1725
1726 for (BasicBlock &BB : *F)
1727 if (BB.getTerminatingMustTailCall())
1728 return false;
1729
1730 return !F->hasAddressTaken();
1731}
1732
1735 ChangeableCCCacheTy &ChangeableCCCache) {
1736 auto Res = ChangeableCCCache.try_emplace(F, false);
1737 if (Res.second)
1738 Res.first->second = hasChangeableCCImpl(F);
1739 return Res.first->second;
1740}
1741
1742/// Return true if the block containing the call site has a BlockFrequency of
1743/// less than ColdCCRelFreq% of the entry block.
1744static bool isColdCallSite(CallBase &CB, BlockFrequencyInfo &CallerBFI) {
1745 const BranchProbability ColdProb(ColdCCRelFreq, 100);
1746 auto *CallSiteBB = CB.getParent();
1747 auto CallSiteFreq = CallerBFI.getBlockFreq(CallSiteBB);
1748 auto CallerEntryFreq =
1749 CallerBFI.getBlockFreq(&(CB.getCaller()->getEntryBlock()));
1750 return CallSiteFreq < CallerEntryFreq * ColdProb;
1751}
1752
1753// This function checks if the input function F is cold at all call sites. It
1754// also looks each call site's containing function, returning false if the
1755// caller function contains other non cold calls. HasOnlyColdCalls returns
1756// whether a function only has call sites in cold blocks.
1757static bool
1760 function_ref<bool(Function &)> HasOnlyColdCalls) {
1761
1762 if (F.user_empty())
1763 return false;
1764
1765 for (User *U : F.users()) {
1767 if (!CB || CB->getCalledOperand() != &F)
1768 continue;
1769 Function *CallerFunc = CB->getParent()->getParent();
1770 BlockFrequencyInfo &CallerBFI = GetBFI(*CallerFunc);
1771 if (!isColdCallSite(*CB, CallerBFI))
1772 return false;
1773 if (!HasOnlyColdCalls(*CallerFunc))
1774 return false;
1775 }
1776 return true;
1777}
1778
1780 for (User *U : F->users())
1781 if (auto *Call = dyn_cast<CallBase>(U))
1782 if (Call->getCalledOperand() == F)
1783 Call->setCallingConv(CallingConv::Cold);
1784}
1785
1786// This function iterates over all the call instructions in the input Function
1787// and checks that all call sites are in cold blocks and are allowed to use the
1788// coldcc calling convention.
1789static bool
1792 ChangeableCCCacheTy &ChangeableCCCache) {
1793 for (BasicBlock &BB : F) {
1794 for (Instruction &I : BB) {
1795 if (CallInst *CI = dyn_cast<CallInst>(&I)) {
1796 // Skip over isline asm instructions since they aren't function calls.
1797 if (CI->isInlineAsm())
1798 continue;
1799 Function *CalledFn = CI->getCalledFunction();
1800 if (!CalledFn)
1801 return false;
1802 // Skip over intrinsics since they won't remain as function calls.
1803 // Important to do this check before the linkage check below so we
1804 // won't bail out on debug intrinsics, possibly making the generated
1805 // code dependent on the presence of debug info.
1806 if (CalledFn->getIntrinsicID() != Intrinsic::not_intrinsic)
1807 continue;
1808 if (!CalledFn->hasLocalLinkage())
1809 return false;
1810 // Check if it's valid to use coldcc calling convention.
1811 if (!hasChangeableCC(CalledFn, ChangeableCCCache))
1812 return false;
1813 BlockFrequencyInfo &CallerBFI = GetBFI(F);
1814 if (!isColdCallSite(*CI, CallerBFI))
1815 return false;
1816 }
1817 }
1818 }
1819 return true;
1820}
1821
1823 for (User *U : F->users()) {
1824 CallBase *CB = cast<CallBase>(U);
1825 if (CB->isMustTailCall())
1826 return true;
1827 }
1828 return false;
1829}
1830
1832 for (User *U : F->users())
1833 if (isa<InvokeInst>(U))
1834 return true;
1835 return false;
1836}
1837
1839 RemoveAttribute(F, Attribute::Preallocated);
1840
1841 auto *M = F->getParent();
1842
1843 IRBuilder<> Builder(*M);
1844
1845 // Cannot modify users() while iterating over it, so make a copy.
1846 SmallVector<User *, 4> PreallocatedCalls(F->users());
1847 for (CallBase *CB : make_isa_range<CallBase>(PreallocatedCalls)) {
1848 assert(
1849 !CB->isMustTailCall() &&
1850 "Shouldn't call RemotePreallocated() on a musttail preallocated call");
1851 // Create copy of call without "preallocated" operand bundle.
1853 CB->getOperandBundlesAsDefs(OpBundles);
1854 CallBase *PreallocatedSetup = nullptr;
1855 for (auto *It = OpBundles.begin(); It != OpBundles.end(); ++It) {
1856 if (It->getTag() == "preallocated") {
1857 PreallocatedSetup = cast<CallBase>(*It->input_begin());
1858 OpBundles.erase(It);
1859 break;
1860 }
1861 }
1862 assert(PreallocatedSetup && "Did not find preallocated bundle");
1863 uint64_t ArgCount =
1864 cast<ConstantInt>(PreallocatedSetup->getArgOperand(0))->getZExtValue();
1865
1866 assert((isa<CallInst>(CB) || isa<InvokeInst>(CB)) &&
1867 "Unknown indirect call type");
1868 CallBase *NewCB = CallBase::Create(CB, OpBundles, CB->getIterator());
1869 CB->replaceAllUsesWith(NewCB);
1870 NewCB->takeName(CB);
1871 CB->eraseFromParent();
1872
1873 Builder.SetInsertPoint(PreallocatedSetup);
1874 auto *StackSave = Builder.CreateStackSave();
1875 Builder.SetInsertPoint(NewCB->getNextNode());
1876 Builder.CreateStackRestore(StackSave);
1877
1878 // Replace @llvm.call.preallocated.arg() with alloca.
1879 // Cannot modify users() while iterating over it, so make a copy.
1880 // @llvm.call.preallocated.arg() can be called with the same index multiple
1881 // times. So for each @llvm.call.preallocated.arg(), we see if we have
1882 // already created a Value* for the index, and if not, create an alloca and
1883 // bitcast right after the @llvm.call.preallocated.setup() so that it
1884 // dominates all uses.
1885 SmallVector<Value *, 2> ArgAllocas(ArgCount);
1886 SmallVector<User *, 2> PreallocatedArgs(PreallocatedSetup->users());
1887 for (auto *User : PreallocatedArgs) {
1888 auto *UseCall = cast<CallBase>(User);
1889 assert(UseCall->getCalledFunction()->getIntrinsicID() ==
1890 Intrinsic::call_preallocated_arg &&
1891 "preallocated token use was not a llvm.call.preallocated.arg");
1892 uint64_t AllocArgIndex =
1893 cast<ConstantInt>(UseCall->getArgOperand(1))->getZExtValue();
1894 Value *AllocaReplacement = ArgAllocas[AllocArgIndex];
1895 if (!AllocaReplacement) {
1896 auto AddressSpace = UseCall->getType()->getPointerAddressSpace();
1897 auto *ArgType =
1898 UseCall->getFnAttr(Attribute::Preallocated).getValueAsType();
1899 auto *InsertBefore = PreallocatedSetup->getNextNode();
1900 Builder.SetInsertPoint(InsertBefore);
1901 auto *Alloca =
1902 Builder.CreateAlloca(ArgType, AddressSpace, nullptr, "paarg");
1903 ArgAllocas[AllocArgIndex] = Alloca;
1904 AllocaReplacement = Alloca;
1905 }
1906
1907 UseCall->replaceAllUsesWith(AllocaReplacement);
1908 UseCall->eraseFromParent();
1909 }
1910 // Remove @llvm.call.preallocated.setup().
1911 cast<Instruction>(PreallocatedSetup)->eraseFromParent();
1912 }
1913}
1914
1915static bool
1920 function_ref<DominatorTree &(Function &)> LookupDomTree,
1921 SmallPtrSetImpl<const Comdat *> &NotDiscardableComdats,
1922 function_ref<void(Function &F)> ChangedCFGCallback,
1923 function_ref<void(Function &F)> DeleteFnCallback) {
1924
1925 bool Changed = false;
1926
1927 ChangeableCCCacheTy ChangeableCCCache;
1928 // Whether each function only has cold calls. This is only needed for
1929 // functions the target wants to use coldcc for, so compute it lazily.
1930 DenseMap<Function *, bool> AllCallsColdCache;
1931 auto HasOnlyColdCalls = [&](Function &Caller) {
1932 auto Res = AllCallsColdCache.try_emplace(&Caller, false);
1933 if (Res.second)
1934 Res.first->second = hasOnlyColdCalls(Caller, GetBFI, ChangeableCCCache);
1935 return Res.first->second;
1936 };
1937
1938 // Optimize functions.
1940 // Don't perform global opt pass on naked functions; we don't want fast
1941 // calling conventions for naked functions.
1942 if (F.hasFnAttribute(Attribute::Naked))
1943 continue;
1944
1945 // Functions without names cannot be referenced outside this module.
1946 if (!F.hasName() && !F.isDeclaration() && !F.hasLocalLinkage())
1947 F.setLinkage(GlobalValue::InternalLinkage);
1948
1949 if (deleteIfDead(F, NotDiscardableComdats, DeleteFnCallback)) {
1950 Changed = true;
1951 continue;
1952 }
1953
1954 // LLVM's definition of dominance allows instructions that are cyclic
1955 // in unreachable blocks, e.g.:
1956 // %pat = select i1 %condition, @global, i16* %pat
1957 // because any instruction dominates an instruction in a block that's
1958 // not reachable from entry.
1959 // So, remove unreachable blocks from the function, because a) there's
1960 // no point in analyzing them and b) GlobalOpt should otherwise grow
1961 // some more complicated logic to break these cycles.
1962 // Notify the analysis manager that we've modified the function's CFG.
1963 if (!F.isDeclaration()) {
1965 Changed = true;
1966 ChangedCFGCallback(F);
1967 }
1968 }
1969
1970 Changed |= processGlobal(F, GetTTI, GetTLI, LookupDomTree);
1971
1972 if (!F.hasLocalLinkage())
1973 continue;
1974
1975 // Ensure function definition is available for interprocedural analysis.
1976 if (!F.isDefinitionExact())
1977 continue;
1978
1979 // If we have an inalloca parameter that we can safely remove the
1980 // inalloca attribute from, do so. This unlocks optimizations that
1981 // wouldn't be safe in the presence of inalloca.
1982 // FIXME: We should also hoist alloca affected by this to the entry
1983 // block if possible.
1984 if (F.getAttributes().hasAttrSomewhere(Attribute::InAlloca) &&
1985 !F.hasAddressTaken() && !hasMustTailCallers(&F) && !F.isVarArg()) {
1986 RemoveAttribute(&F, Attribute::InAlloca);
1987 Changed = true;
1988 }
1989
1990 // FIXME: handle invokes
1991 // FIXME: handle musttail
1992 if (F.getAttributes().hasAttrSomewhere(Attribute::Preallocated)) {
1993 if (!F.hasAddressTaken() && !hasMustTailCallers(&F) &&
1994 !hasInvokeCallers(&F)) {
1996 Changed = true;
1997 }
1998 continue;
1999 }
2000
2001 if (hasChangeableCC(&F, ChangeableCCCache)) {
2002 NumInternalFunc++;
2003 TargetTransformInfo &TTI = GetTTI(F);
2004 // Change the calling convention to coldcc if either stress testing is
2005 // enabled or the target would like to use coldcc on functions which are
2006 // cold at all call sites and the callers contain no other non coldcc
2007 // calls.
2009 (TTI.useColdCCForColdCall(F) &&
2010 isValidCandidateForColdCC(F, GetBFI, HasOnlyColdCalls))) {
2011 ChangeableCCCache.erase(&F);
2012 F.setCallingConv(CallingConv::Cold);
2014 Changed = true;
2015 NumColdCC++;
2016 }
2017 }
2018
2019 if (hasChangeableCC(&F, ChangeableCCCache)) {
2020 // If this function has a calling convention worth changing, is not a
2021 // varargs function, is only called directly, and is supported by the
2022 // target, promote it to use the Fast calling convention.
2023 TargetTransformInfo &TTI = GetTTI(F);
2024 if (TTI.useFastCCForInternalCall(F)) {
2025 F.setCallingConv(CallingConv::Fast);
2027 ++NumFastCallFns;
2028 Changed = true;
2029 }
2030 }
2031
2032 if (F.getAttributes().hasAttrSomewhere(Attribute::Nest) &&
2033 !F.hasAddressTaken()) {
2034 // The function is not used by a trampoline intrinsic, so it is safe
2035 // to remove the 'nest' attribute.
2036 RemoveAttribute(&F, Attribute::Nest);
2037 ++NumNestRemoved;
2038 Changed = true;
2039 }
2040 }
2041 return Changed;
2042}
2043
2044static bool
2048 function_ref<DominatorTree &(Function &)> LookupDomTree,
2049 SmallPtrSetImpl<const Comdat *> &NotDiscardableComdats) {
2050 bool Changed = false;
2051
2052 for (GlobalVariable &GV : llvm::make_early_inc_range(M.globals())) {
2053 // Global variables without names cannot be referenced outside this module.
2054 if (!GV.hasName() && !GV.isDeclaration() && !GV.hasLocalLinkage())
2056 // Simplify the initializer.
2057 if (GV.hasInitializer()) {
2058 const Constant *C = GV.getInitializer();
2059 auto &DL = M.getDataLayout();
2060 // TLI is not used in the case of a Constant, so use default nullptr
2061 // for that optional parameter, since we don't have a Function to
2062 // provide GetTLI anyway.
2063 Constant *New = ConstantFoldConstant(C, DL, /*TLI*/ nullptr);
2064 if (New != C)
2065 GV.setInitializer(New);
2066 }
2067
2068 if (deleteIfDead(GV, NotDiscardableComdats)) {
2069 Changed = true;
2070 continue;
2071 }
2072
2073 Changed |= processGlobal(GV, GetTTI, GetTLI, LookupDomTree);
2074 }
2075 return Changed;
2076}
2077
2078/// Evaluate static constructors in the function, if we can. Return true if we
2079/// can, false otherwise.
2081 TargetLibraryInfo *TLI) {
2082 // Skip external functions.
2083 if (F->isDeclaration())
2084 return false;
2085 // Call the function.
2086 Evaluator Eval(DL, TLI);
2087 Constant *RetValDummy;
2088 bool EvalSuccess = Eval.EvaluateFunction(F, RetValDummy,
2090
2091 if (EvalSuccess) {
2092 ++NumCtorsEvaluated;
2093
2094 // We succeeded at evaluation: commit the result.
2095 auto NewInitializers = Eval.getMutatedInitializers();
2096 LLVM_DEBUG(dbgs() << "FULLY EVALUATED GLOBAL CTOR FUNCTION '"
2097 << F->getName() << "' to " << NewInitializers.size()
2098 << " stores.\n");
2099 for (const auto &Pair : NewInitializers)
2100 Pair.first->setInitializer(Pair.second);
2101 for (GlobalVariable *GV : Eval.getInvariants())
2102 GV->setConstant(true);
2103 }
2104
2105 return EvalSuccess;
2106}
2107
2108static int compareNames(Constant *const *A, Constant *const *B) {
2109 Value *AStripped = (*A)->stripPointerCasts();
2110 Value *BStripped = (*B)->stripPointerCasts();
2111 return AStripped->getName().compare(BStripped->getName());
2112}
2113
2116 if (Init.empty()) {
2117 V.eraseFromParent();
2118 return;
2119 }
2120
2121 // Get address space of pointers in the array of pointers.
2122 const Type *UsedArrayType = V.getValueType();
2123 const auto *VAT = cast<ArrayType>(UsedArrayType);
2124 const auto *VEPT = cast<PointerType>(VAT->getArrayElementType());
2125
2126 // Type of pointer to the array of pointers.
2127 PointerType *PtrTy =
2128 PointerType::get(V.getContext(), VEPT->getAddressSpace());
2129
2131 for (GlobalValue *GV : Init) {
2133 UsedArray.push_back(Cast);
2134 }
2135
2136 // Sort to get deterministic order.
2137 array_pod_sort(UsedArray.begin(), UsedArray.end(), compareNames);
2138 ArrayType *ATy = ArrayType::get(PtrTy, UsedArray.size());
2139
2140 Module *M = V.getParent();
2141 V.removeFromParent();
2143 *M, ATy, false, GlobalValue::AppendingLinkage,
2144 ConstantArray::get(ATy, UsedArray), "", nullptr,
2145 GlobalVariable::NotThreadLocal, V.getType()->getAddressSpace());
2146 NV->takeName(&V);
2147 NV->setSection("llvm.metadata");
2148 delete &V;
2149}
2150
2151namespace {
2152
2153/// An easy to access representation of llvm.used and llvm.compiler.used.
2154class LLVMUsed {
2155 SmallPtrSet<GlobalValue *, 4> Used;
2156 SmallPtrSet<GlobalValue *, 4> CompilerUsed;
2157 GlobalVariable *UsedV;
2158 GlobalVariable *CompilerUsedV;
2159
2160public:
2161 LLVMUsed(Module &M) {
2163 UsedV = collectUsedGlobalVariables(M, Vec, false);
2164 Used = {llvm::from_range, Vec};
2165 Vec.clear();
2166 CompilerUsedV = collectUsedGlobalVariables(M, Vec, true);
2167 CompilerUsed = {llvm::from_range, Vec};
2168 }
2169
2170 using iterator = SmallPtrSet<GlobalValue *, 4>::iterator;
2171 using used_iterator_range = iterator_range<iterator>;
2172
2173 iterator usedBegin() { return Used.begin(); }
2174 iterator usedEnd() { return Used.end(); }
2175
2176 used_iterator_range used() {
2177 return used_iterator_range(usedBegin(), usedEnd());
2178 }
2179
2180 iterator compilerUsedBegin() { return CompilerUsed.begin(); }
2181 iterator compilerUsedEnd() { return CompilerUsed.end(); }
2182
2183 used_iterator_range compilerUsed() {
2184 return used_iterator_range(compilerUsedBegin(), compilerUsedEnd());
2185 }
2186
2187 bool usedCount(GlobalValue *GV) const { return Used.count(GV); }
2188
2189 bool compilerUsedCount(GlobalValue *GV) const {
2190 return CompilerUsed.count(GV);
2191 }
2192
2193 bool usedErase(GlobalValue *GV) { return Used.erase(GV); }
2194 bool compilerUsedErase(GlobalValue *GV) { return CompilerUsed.erase(GV); }
2195 bool usedInsert(GlobalValue *GV) { return Used.insert(GV).second; }
2196
2197 bool compilerUsedInsert(GlobalValue *GV) {
2198 return CompilerUsed.insert(GV).second;
2199 }
2200
2201 void syncVariablesAndSets() {
2202 if (UsedV)
2203 setUsedInitializer(*UsedV, Used);
2204 if (CompilerUsedV)
2205 setUsedInitializer(*CompilerUsedV, CompilerUsed);
2206 }
2207};
2208
2209} // end anonymous namespace
2210
2211static bool hasUseOtherThanLLVMUsed(GlobalAlias &GA, const LLVMUsed &U) {
2212 if (GA.use_empty()) // No use at all.
2213 return false;
2214
2215 assert((!U.usedCount(&GA) || !U.compilerUsedCount(&GA)) &&
2216 "We should have removed the duplicated "
2217 "element from llvm.compiler.used");
2218 if (!GA.hasOneUse())
2219 // Strictly more than one use. So at least one is not in llvm.used and
2220 // llvm.compiler.used.
2221 return true;
2222
2223 // Exactly one use. Check if it is in llvm.used or llvm.compiler.used.
2224 return !U.usedCount(&GA) && !U.compilerUsedCount(&GA);
2225}
2226
2227static bool mayHaveOtherReferences(GlobalValue &GV, const LLVMUsed &U) {
2228 if (!GV.hasLocalLinkage())
2229 return true;
2230
2231 return U.usedCount(&GV) || U.compilerUsedCount(&GV);
2232}
2233
2234static bool hasUsesToReplace(GlobalAlias &GA, const LLVMUsed &U,
2235 bool &RenameTarget) {
2236 if (GA.isWeakForLinker())
2237 return false;
2238
2239 RenameTarget = false;
2240 bool Ret = false;
2241 if (hasUseOtherThanLLVMUsed(GA, U))
2242 Ret = true;
2243
2244 // If the alias is externally visible, we may still be able to simplify it.
2245 if (!mayHaveOtherReferences(GA, U))
2246 return Ret;
2247
2248 // If the aliasee has internal linkage and no other references (e.g.,
2249 // @llvm.used, @llvm.compiler.used), give it the name and linkage of the
2250 // alias, and delete the alias. This turns:
2251 // define internal ... @f(...)
2252 // @a = alias ... @f
2253 // into:
2254 // define ... @a(...)
2255 Constant *Aliasee = GA.getAliasee();
2258 return Ret;
2259
2260 RenameTarget = true;
2261 return true;
2262}
2263
2264static bool
2266 SmallPtrSetImpl<const Comdat *> &NotDiscardableComdats) {
2267 bool Changed = false;
2268 LLVMUsed Used(M);
2269
2270 for (GlobalValue *GV : Used.used())
2271 Used.compilerUsedErase(GV);
2272
2273 // Return whether GV is explicitly or implicitly dso_local and not replaceable
2274 // by another definition in the current linkage unit.
2275 auto IsModuleLocal = [](GlobalValue &GV) {
2277 (GV.isDSOLocal() || GV.isImplicitDSOLocal());
2278 };
2279
2280 for (GlobalAlias &J : llvm::make_early_inc_range(M.aliases())) {
2281 // Aliases without names cannot be referenced outside this module.
2282 if (!J.hasName() && !J.isDeclaration() && !J.hasLocalLinkage())
2283 J.setLinkage(GlobalValue::InternalLinkage);
2284
2285 if (deleteIfDead(J, NotDiscardableComdats)) {
2286 Changed = true;
2287 continue;
2288 }
2289
2290 // If the alias can change at link time, nothing can be done - bail out.
2291 if (!IsModuleLocal(J))
2292 continue;
2293
2294 Constant *Aliasee = J.getAliasee();
2296 // We can't trivially replace the alias with the aliasee if the aliasee is
2297 // non-trivial in some way. We also can't replace the alias with the aliasee
2298 // if the aliasee may be preemptible at runtime. On ELF, a non-preemptible
2299 // alias can be used to access the definition as if preemption did not
2300 // happen.
2301 // TODO: Try to handle non-zero GEPs of local aliasees.
2302 if (!Target || !IsModuleLocal(*Target))
2303 continue;
2304
2305 Target->removeDeadConstantUsers();
2306
2307 // Make all users of the alias use the aliasee instead.
2308 bool RenameTarget;
2309 if (!hasUsesToReplace(J, Used, RenameTarget))
2310 continue;
2311
2312 J.replaceAllUsesWith(Aliasee);
2313 ++NumAliasesResolved;
2314 Changed = true;
2315
2316 if (RenameTarget) {
2317 // Give the aliasee the name, linkage and other attributes of the alias.
2318 Target->takeName(&J);
2319 Target->setLinkage(J.getLinkage());
2320 Target->setDSOLocal(J.isDSOLocal());
2321 Target->setVisibility(J.getVisibility());
2322 Target->setDLLStorageClass(J.getDLLStorageClass());
2323
2324 if (Used.usedErase(&J))
2325 Used.usedInsert(Target);
2326
2327 if (Used.compilerUsedErase(&J))
2328 Used.compilerUsedInsert(Target);
2329 } else if (mayHaveOtherReferences(J, Used))
2330 continue;
2331
2332 // Delete the alias.
2333 M.eraseAlias(&J);
2334 ++NumAliasesRemoved;
2335 Changed = true;
2336 }
2337
2338 Used.syncVariablesAndSets();
2339
2340 return Changed;
2341}
2342
2343static Function *
2346 LibFunc Func) {
2347 // Hack to get a default TLI before we have actual Function.
2348 auto FuncIter = M.begin();
2349 if (FuncIter == M.end())
2350 return nullptr;
2351 auto *TLI = &GetTLI(*FuncIter);
2352
2353 if (!TLI->has(Func))
2354 return nullptr;
2355
2356 Function *Fn = M.getFunction(TLI->getName(Func));
2357 if (!Fn)
2358 return nullptr;
2359
2360 // Now get the actual TLI for Fn.
2361 TLI = &GetTLI(*Fn);
2362
2363 // Make sure that the function has the correct prototype.
2364 if (TLI->getLibFunc(*Fn) != Func)
2365 return nullptr;
2366
2367 return Fn;
2368}
2369
2370/// Returns whether the given function is an empty C++ destructor or atexit
2371/// handler and can therefore be eliminated. Note that we assume that other
2372/// optimization passes have already simplified the code so we simply check for
2373/// 'ret'.
2374static bool IsEmptyAtExitFunction(const Function &Fn) {
2375 // FIXME: We could eliminate C++ destructors if they're readonly/readnone and
2376 // nounwind, but that doesn't seem worth doing.
2377 if (Fn.isDeclaration())
2378 return false;
2379
2380 for (const auto &I : Fn.getEntryBlock()) {
2382 continue;
2383 if (isa<ReturnInst>(I))
2384 return true;
2385 break;
2386 }
2387 return false;
2388}
2389
2390static bool OptimizeEmptyGlobalAtExitDtors(Function *CXAAtExitFn, bool isCXX) {
2391 /// Itanium C++ ABI p3.3.5:
2392 ///
2393 /// After constructing a global (or local static) object, that will require
2394 /// destruction on exit, a termination function is registered as follows:
2395 ///
2396 /// extern "C" int __cxa_atexit ( void (*f)(void *), void *p, void *d );
2397 ///
2398 /// This registration, e.g. __cxa_atexit(f,p,d), is intended to cause the
2399 /// call f(p) when DSO d is unloaded, before all such termination calls
2400 /// registered before this one. It returns zero if registration is
2401 /// successful, nonzero on failure.
2402
2403 // This pass will look for calls to __cxa_atexit or atexit where the function
2404 // is trivial and remove them.
2405 bool Changed = false;
2406
2407 for (Use &U : llvm::make_early_inc_range(CXAAtExitFn->uses())) {
2408 // We're only interested in calls to the atexit function. Theoretically, we
2409 // could handle invoke instructions as well, but neither llvm-gcc nor clang
2410 // generate invokes to __cxa_atexit.
2411 CallInst *CI = dyn_cast<CallInst>(U.getUser());
2412 if (!CI || !CI->isCallee(&U))
2413 continue;
2414
2415 Function *DtorFn =
2417 if (!DtorFn || !IsEmptyAtExitFunction(*DtorFn))
2418 continue;
2419
2420 // Just remove the call.
2422 CI->eraseFromParent();
2423
2424 if (isCXX)
2425 ++NumCXXDtorsRemoved;
2426 else
2427 ++NumAtExitRemoved;
2428
2429 Changed |= true;
2430 }
2431
2432 return Changed;
2433}
2434
2436 if (IF.isInterposable())
2437 return nullptr;
2438
2440 if (!Resolver)
2441 return nullptr;
2442
2443 if (Resolver->isInterposable())
2444 return nullptr;
2445
2446 // Only handle functions that have been optimized into a single basic block.
2447 auto It = Resolver->begin();
2448 if (++It != Resolver->end())
2449 return nullptr;
2450
2451 BasicBlock &BB = Resolver->getEntryBlock();
2452
2453 if (any_of(BB, [](Instruction &I) { return I.mayHaveSideEffects(); }))
2454 return nullptr;
2455
2456 auto *Ret = dyn_cast<ReturnInst>(BB.getTerminator());
2457 if (!Ret)
2458 return nullptr;
2459
2460 return dyn_cast<Function>(Ret->getReturnValue());
2461}
2462
2463/// Find IFuncs that have resolvers that always point at the same statically
2464/// known callee, and replace their callers with a direct call.
2466 bool Changed = false;
2467 for (GlobalIFunc &IF : M.ifuncs())
2469 if (!IF.use_empty() &&
2470 (!Callee->isDeclaration() ||
2471 none_of(IF.users(), [](User *U) { return isa<GlobalAlias>(U); }))) {
2472 IF.replaceAllUsesWith(Callee);
2473 NumIFuncsResolved++;
2474 Changed = true;
2475 }
2476 return Changed;
2477}
2478
2479static bool
2481 SmallPtrSetImpl<const Comdat *> &NotDiscardableComdats) {
2482 bool Changed = false;
2483 for (GlobalIFunc &IF : make_early_inc_range(M.ifuncs()))
2484 if (deleteIfDead(IF, NotDiscardableComdats)) {
2485 NumIFuncsDeleted++;
2486 Changed = true;
2487 }
2488 return Changed;
2489}
2490
2491// Follows the use-def chain of \p V backwards until it finds a Function,
2492// in which case it collects in \p Versions. Return true on successful
2493// use-def chain traversal, false otherwise.
2494static bool
2497 if (auto *F = dyn_cast<Function>(V)) {
2498 if (!GetTTI(*F).isMultiversionedFunction(*F))
2499 return false;
2500 Versions.push_back(F);
2501 } else if (auto *Sel = dyn_cast<SelectInst>(V)) {
2502 if (!collectVersions(Sel->getTrueValue(), Versions, GetTTI))
2503 return false;
2504 if (!collectVersions(Sel->getFalseValue(), Versions, GetTTI))
2505 return false;
2506 } else if (auto *Phi = dyn_cast<PHINode>(V)) {
2507 for (unsigned I = 0, E = Phi->getNumIncomingValues(); I != E; ++I)
2508 if (!collectVersions(Phi->getIncomingValue(I), Versions, GetTTI))
2509 return false;
2510 } else {
2511 // Unknown instruction type. Bail.
2512 return false;
2513 }
2514 return true;
2515}
2516
2517// Try to statically resolve calls to versioned functions when possible. First
2518// we identify the function versions which are associated with an IFUNC symbol.
2519// We do that by examining the resolver function of the IFUNC. Once we have
2520// collected all the function versions, we sort them in decreasing priority
2521// order. This is necessary for determining the most suitable callee version
2522// for each caller version. We then collect all the callsites to versioned
2523// functions. The static resolution is performed by comparing the feature sets
2524// between callers and callees. Specifically:
2525// * Start a walk over caller and callee lists simultaneously in order of
2526// decreasing priority.
2527// * Statically resolve calls from the current caller to the current callee,
2528// iff the caller feature bits are a superset of the callee feature bits.
2529// * For FMV callers, as long as the caller feature bits are a subset of the
2530// callee feature bits, advance to the next callee. This effectively prevents
2531// considering the current callee as a candidate for static resolution by
2532// following callers (explanation: preceding callers would not have been
2533// selected in a hypothetical runtime execution).
2534// * Advance to the next caller.
2535//
2536// Presentation in EuroLLVM2025:
2537// https://www.youtube.com/watch?v=k54MFimPz-A&t=867s
2540 bool Changed = false;
2541
2542 // Map containing the feature bits for a given function.
2543 DenseMap<Function *, APInt> FeatureMask;
2544 // Map containing the priority bits for a given function.
2545 DenseMap<Function *, APInt> PriorityMask;
2546 // Map containing all the function versions corresponding to an IFunc symbol.
2548 // Map containing the IFunc symbol a function is version of.
2550 // List of all the interesting IFuncs found in the module.
2552
2553 for (GlobalIFunc &IF : M.ifuncs()) {
2554 LLVM_DEBUG(dbgs() << "Examining IFUNC " << IF.getName() << "\n");
2555
2556 if (IF.isInterposable())
2557 continue;
2558
2559 Function *Resolver = IF.getResolverFunction();
2560 if (!Resolver)
2561 continue;
2562
2563 if (Resolver->isInterposable())
2564 continue;
2565
2566 SmallVector<Function *> Versions;
2567 // Discover the versioned functions.
2568 if (any_of(*Resolver, [&](BasicBlock &BB) {
2569 if (auto *Ret = dyn_cast<ReturnInst>(BB.getTerminator()))
2570 if (!collectVersions(Ret->getReturnValue(), Versions, GetTTI))
2571 return true;
2572 return false;
2573 }))
2574 continue;
2575
2576 if (Versions.empty())
2577 continue;
2578
2579 for (Function *V : Versions) {
2580 VersionOf.insert({V, &IF});
2581 auto [FeatIt, FeatInserted] = FeatureMask.try_emplace(V);
2582 if (FeatInserted)
2583 FeatIt->second = GetTTI(*V).getFeatureMask(*V);
2584 auto [PriorIt, PriorInserted] = PriorityMask.try_emplace(V);
2585 if (PriorInserted)
2586 PriorIt->second = GetTTI(*V).getPriorityMask(*V);
2587 }
2588
2589 // Sort function versions in decreasing priority order.
2590 sort(Versions, [&](auto *LHS, auto *RHS) {
2591 return PriorityMask[LHS].ugt(PriorityMask[RHS]);
2592 });
2593
2594 IFuncs.push_back(&IF);
2595 VersionedFuncs.try_emplace(&IF, std::move(Versions));
2596 }
2597
2598 for (GlobalIFunc *CalleeIF : IFuncs) {
2599 SmallVector<Function *> NonFMVCallers;
2600 DenseSet<GlobalIFunc *> CallerIFuncs;
2602
2603 // Find the callsites.
2604 for (User *U : CalleeIF->users()) {
2605 if (auto *CB = dyn_cast<CallBase>(U)) {
2606 if (CB->getCalledOperand() == CalleeIF) {
2607 Function *Caller = CB->getFunction();
2608 GlobalIFunc *CallerIF = nullptr;
2609 TargetTransformInfo &TTI = GetTTI(*Caller);
2610 bool CallerIsFMV = TTI.isMultiversionedFunction(*Caller);
2611 // The caller is a version of a known IFunc.
2612 if (auto It = VersionOf.find(Caller); It != VersionOf.end())
2613 CallerIF = It->second;
2614 else if (!CallerIsFMV && OptimizeNonFMVCallers) {
2615 // The caller is non-FMV.
2616 auto [It, Inserted] = FeatureMask.try_emplace(Caller);
2617 if (Inserted)
2618 It->second = TTI.getFeatureMask(*Caller);
2619 } else
2620 // The caller is none of the above, skip.
2621 continue;
2622 auto [It, Inserted] = CallSites.try_emplace(Caller);
2623 if (Inserted) {
2624 if (CallerIsFMV)
2625 CallerIFuncs.insert(CallerIF);
2626 else
2627 NonFMVCallers.push_back(Caller);
2628 }
2629 It->second.push_back(CB);
2630 }
2631 }
2632 }
2633
2634 if (CallSites.empty())
2635 continue;
2636
2637 LLVM_DEBUG(dbgs() << "Statically resolving calls to function "
2638 << CalleeIF->getResolverFunction()->getName() << "\n");
2639
2640 // The complexity of this algorithm is linear: O(NumCallers + NumCallees)
2641 // if NumCallers > MaxIFuncVersions || NumCallees > MaxIFuncVersions,
2642 // otherwise it is cubic: O((NumCallers ^ 2) x NumCallees).
2643 auto staticallyResolveCalls = [&](ArrayRef<Function *> Callers,
2644 ArrayRef<Function *> Callees,
2645 bool CallerIsFMV) {
2646 bool AllowExpensiveChecks = CallerIsFMV &&
2647 Callers.size() <= MaxIFuncVersions &&
2648 Callees.size() <= MaxIFuncVersions;
2649 // Index to the highest callee candidate.
2650 unsigned J = 0;
2651
2652 for (unsigned I = 0, E = Callers.size(); I < E; ++I) {
2653 // There are no callee candidates left.
2654 if (J == Callees.size())
2655 break;
2656
2657 Function *Caller = Callers[I];
2658 APInt CallerBits = FeatureMask[Caller];
2659
2660 // Compare the feature bits of the best callee candidate with all the
2661 // caller versions preceeding the current one. For each prior caller
2662 // discard feature bits that are known to be available in the current
2663 // caller. As long as the known missing feature bits are a subset of the
2664 // callee feature bits, advance to the next callee and start over.
2665 auto eliminateAvailableFeatures = [&](unsigned BestCandidate) {
2666 unsigned K = 0;
2667 while (K < I && BestCandidate < Callees.size()) {
2668 APInt MissingBits = FeatureMask[Callers[K]] & ~CallerBits;
2669 if (MissingBits.isSubsetOf(FeatureMask[Callees[BestCandidate]])) {
2670 ++BestCandidate;
2671 // Start over.
2672 K = 0;
2673 } else
2674 ++K;
2675 }
2676 return BestCandidate;
2677 };
2678
2679 unsigned BestCandidate =
2680 AllowExpensiveChecks ? eliminateAvailableFeatures(J) : J;
2681 // No callee candidate was found for this caller.
2682 if (BestCandidate == Callees.size())
2683 continue;
2684
2685 LLVM_DEBUG(dbgs() << " Examining "
2686 << (CallerIsFMV ? "FMV" : "regular") << " caller "
2687 << Caller->getName() << "\n");
2688
2689 Function *Callee = Callees[BestCandidate];
2690 APInt CalleeBits = FeatureMask[Callee];
2691
2692 // Statically resolve calls from the current caller to the current
2693 // callee, iff the caller feature bits are a superset of the callee
2694 // feature bits.
2695 if (CalleeBits.isSubsetOf(CallerBits)) {
2696 // Not all caller versions are necessarily users of the callee IFUNC.
2697 if (auto It = CallSites.find(Caller); It != CallSites.end()) {
2698 for (CallBase *CS : It->second) {
2699 LLVM_DEBUG(dbgs() << " Redirecting call " << Caller->getName()
2700 << " -> " << Callee->getName() << "\n");
2701 CS->setCalledOperand(Callee);
2702 }
2703 Changed = true;
2704 }
2705 }
2706
2707 // Nothing else to do about non-FMV callers.
2708 if (!CallerIsFMV)
2709 continue;
2710
2711 // For FMV callers, as long as the caller feature bits are a subset of
2712 // the callee feature bits, advance to the next callee. This effectively
2713 // prevents considering the current callee as a candidate for static
2714 // resolution by following callers.
2715 while (CallerBits.isSubsetOf(FeatureMask[Callees[J]]) &&
2716 ++J < Callees.size())
2717 ;
2718 }
2719 };
2720
2721 auto &Callees = VersionedFuncs[CalleeIF];
2722
2723 // Optimize non-FMV calls.
2725 staticallyResolveCalls(NonFMVCallers, Callees, /*CallerIsFMV=*/false);
2726
2727 // Optimize FMV calls.
2728 for (GlobalIFunc *CallerIF : CallerIFuncs) {
2729 auto &Callers = VersionedFuncs[CallerIF];
2730 staticallyResolveCalls(Callers, Callees, /*CallerIsFMV=*/true);
2731 }
2732
2733 if (CalleeIF->use_empty() ||
2734 all_of(CalleeIF->users(), [](User *U) { return isa<GlobalAlias>(U); }))
2735 NumIFuncsResolved++;
2736 }
2737 return Changed;
2738}
2739
2740static bool
2745 function_ref<DominatorTree &(Function &)> LookupDomTree,
2746 function_ref<void(Function &F)> ChangedCFGCallback,
2747 function_ref<void(Function &F)> DeleteFnCallback) {
2748 SmallPtrSet<const Comdat *, 8> NotDiscardableComdats;
2749 bool Changed = false;
2750 bool LocalChange = true;
2751 std::optional<uint32_t> FirstNotFullyEvaluatedPriority;
2752
2753 while (LocalChange) {
2754 LocalChange = false;
2755
2756 NotDiscardableComdats.clear();
2757 for (const GlobalVariable &GV : M.globals())
2758 if (const Comdat *C = GV.getComdat())
2759 if (!GV.isDiscardableIfUnused() || !GV.use_empty())
2760 NotDiscardableComdats.insert(C);
2761 for (Function &F : M)
2762 if (const Comdat *C = F.getComdat())
2763 if (!F.isDefTriviallyDead())
2764 NotDiscardableComdats.insert(C);
2765 for (GlobalAlias &GA : M.aliases())
2766 if (const Comdat *C = GA.getComdat())
2767 if (!GA.isDiscardableIfUnused() || !GA.use_empty())
2768 NotDiscardableComdats.insert(C);
2769
2770 // Delete functions that are trivially dead, ccc -> fastcc
2771 LocalChange |= OptimizeFunctions(M, GetTLI, GetTTI, GetBFI, LookupDomTree,
2772 NotDiscardableComdats, ChangedCFGCallback,
2773 DeleteFnCallback);
2774
2775 // Optimize global_ctors list.
2776 LocalChange |=
2777 optimizeGlobalCtorsList(M, [&](uint32_t Priority, Function *F) {
2778 if (FirstNotFullyEvaluatedPriority &&
2779 *FirstNotFullyEvaluatedPriority != Priority)
2780 return false;
2781 bool Evaluated = EvaluateStaticConstructor(F, DL, &GetTLI(*F));
2782 if (!Evaluated)
2783 FirstNotFullyEvaluatedPriority = Priority;
2784 return Evaluated;
2785 });
2786
2787 // Optimize non-address-taken globals.
2788 LocalChange |= OptimizeGlobalVars(M, GetTTI, GetTLI, LookupDomTree,
2789 NotDiscardableComdats);
2790
2791 // Resolve aliases, when possible.
2792 LocalChange |= OptimizeGlobalAliases(M, NotDiscardableComdats);
2793
2794 // Try to remove trivial global destructors if they are not removed
2795 // already.
2796 if (Function *CXAAtExitFn =
2797 FindAtExitLibFunc(M, GetTLI, LibFunc_cxa_atexit))
2798 LocalChange |= OptimizeEmptyGlobalAtExitDtors(CXAAtExitFn, true);
2799
2800 if (Function *AtExitFn = FindAtExitLibFunc(M, GetTLI, LibFunc_atexit))
2801 LocalChange |= OptimizeEmptyGlobalAtExitDtors(AtExitFn, false);
2802
2803 // Optimize IFuncs whose callee's are statically known.
2804 LocalChange |= OptimizeStaticIFuncs(M);
2805
2806 // Optimize IFuncs based on the target features of the caller.
2807 LocalChange |= OptimizeNonTrivialIFuncs(M, GetTTI);
2808
2809 // Remove any IFuncs that are now dead.
2810 LocalChange |= DeleteDeadIFuncs(M, NotDiscardableComdats);
2811
2812 Changed |= LocalChange;
2813 }
2814
2815 // TODO: Move all global ctors functions to the end of the module for code
2816 // layout.
2817
2818 return Changed;
2819}
2820
2822 auto &DL = M.getDataLayout();
2823 auto &FAM =
2825 auto LookupDomTree = [&FAM](Function &F) -> DominatorTree &{
2826 return FAM.getResult<DominatorTreeAnalysis>(F);
2827 };
2828 auto GetTLI = [&FAM](Function &F) -> TargetLibraryInfo & {
2829 return FAM.getResult<TargetLibraryAnalysis>(F);
2830 };
2831 auto GetTTI = [&FAM](Function &F) -> TargetTransformInfo & {
2832 return FAM.getResult<TargetIRAnalysis>(F);
2833 };
2834
2835 auto GetBFI = [&FAM](Function &F) -> BlockFrequencyInfo & {
2836 return FAM.getResult<BlockFrequencyAnalysis>(F);
2837 };
2838 auto ChangedCFGCallback = [&FAM](Function &F) {
2839 FAM.invalidate(F, PreservedAnalyses::none());
2840 };
2841 auto DeleteFnCallback = [&FAM](Function &F) { FAM.clear(F, F.getName()); };
2842
2843 if (!optimizeGlobalsInModule(M, DL, GetTLI, GetTTI, GetBFI, LookupDomTree,
2844 ChangedCFGCallback, DeleteFnCallback))
2845 return PreservedAnalyses::all();
2846
2848 // We made sure to clear analyses for deleted functions.
2850 // The only place we modify the CFG is when calling
2851 // removeUnreachableBlocks(), but there we make sure to invalidate analyses
2852 // for modified functions.
2854 return PA;
2855}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t uint64_t
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< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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 bool OptimizeAwayTrappingUsesOfValue(Instruction *V, Constant *NewV)
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 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 isValidCandidateForColdCC(Function &F, function_ref< BlockFrequencyInfo &(Function &)> GetBFI, function_ref< bool(Function &)> HasOnlyColdCalls)
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.
iv Induction Variable Users
Definition IVUsers.cpp:48
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
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:119
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:1261
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.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
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:125
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; assumes that the block is well-formed.
Definition BasicBlock.h:237
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 bool isMustTailCall() const
Tests if this call site must be tail call optimized.
bool isCallee(Value::const_user_iterator UI) const
Determine whether the passed iterator points to the callee operand's Use.
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:764
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
bool isSigned() const
Definition InstrTypes.h:993
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:828
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:1316
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_SUPPRESS_DEPRECATED_DECLARATIONS_PUSH 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:1477
static LLVM_ABI Constant * getAddrSpaceCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
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
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constant.h:64
const Constant * stripPointerCasts() const
Definition Constant.h:237
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.
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:154
bool empty() const
Definition DenseMap.h:716
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:766
iterator end()
Definition DenseMap.h:686
unsigned size() const
Definition DenseMap.h:717
bool erase(const KeyT &Val)
Definition DenseMap.h:930
iterator begin()
Definition DenseMap.h:682
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:827
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:856
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
Analysis pass which computes a DominatorTree.
Definition Dominators.h:241
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
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
LLVM_ABI 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:794
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
Definition Function.h:247
const Function & getFunction() const
Definition Function.h:167
iterator begin()
Definition Function.h:838
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition Function.cpp:352
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:759
LLVM_ABI 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:408
LinkageTypes getLinkage() const
void setUnnamedAddr(UnnamedAddr Val)
bool hasLocalLinkage() const
bool hasPrivateLinkage() const
LLVM_ABI const Comdat * getComdat() const
Definition Globals.cpp:274
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:158
PointerType * getType() const
Global values are always pointers.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this global belongs to.
Definition Globals.cpp:205
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
LLVM_ABI bool isInterposable(bool CheckNoIPA=true) const
Return true if this global's definition can be substituted with an arbitrary definition at link time ...
Definition Globals.cpp:178
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:613
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:647
LLVM_ABI void getDebugInfo(SmallVectorImpl< DIGlobalVariableExpression * > &GVs) const
Fill the vector with all debug info attachements.
LLVM_ABI uint64_t getGlobalSize(const DataLayout &DL) const
Get the size of this global variable in bytes.
Definition Globals.cpp:640
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:609
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:2909
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.
iterator_range< user_iterator > users()
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:76
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:1579
LLVMContext & getContext() const
Definition Metadata.h:1245
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:68
void insertGlobalVariable(GlobalVariable *GV)
Insert global variable GV at the end of the global variable list and take ownership.
Definition Module.h:657
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
Definition Type.cpp:887
unsigned getAddressSpace() const
Return the address space of the Pointer type.
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:340
Interface for looking up the initializer for a variable name, used by Init::resolveReferences.
Definition Record.h:2266
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:258
int compare(StringRef RHS) const
Compare two strings; the result is negative, zero, or positive if this string is lexicographically le...
Definition StringRef.h:177
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:46
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:283
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:277
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
@ ArrayTyID
Arrays.
Definition Type.h:76
@ ScalableVectorTyID
Scalable SIMD vector type.
Definition Type.h:78
@ StructTyID
Structures.
Definition Type.h:75
@ FixedVectorTyID
Fixed width SIMD vector type.
Definition Type.h:77
@ PointerTyID
Pointers.
Definition Type.h:74
bool isSingleValueType() const
Return true if the type is a valid type for a register in codegen.
Definition Type.h:306
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Definition Type.cpp:297
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:296
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
Definition Type.h:186
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:876
User * getUser() const
Returns the User that contains this Use.
Definition Use.h:61
Use * op_iterator
Definition User.h:254
Value * getOperand(unsigned i) const
Definition User.h:207
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:441
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:549
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
iterator_range< user_iterator > users()
Definition Value.h:428
use_iterator use_begin()
Definition Value.h:366
User * user_back()
Definition Value.h:414
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:708
bool use_empty() const
Definition Value.h:348
iterator_range< use_iterator > uses()
Definition Value.h:382
user_iterator_impl< User > user_iterator
Definition Value.h:393
bool hasName() const
Definition Value.h:263
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:315
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:209
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)
bool used(const UsedT *U, size_t I)
Definition DenseMap.h:117
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
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:1755
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:520
@ Dead
Unused definition.
LLVM_ABI Align getOrEnforceKnownAlignment(Value *V, MaybeAlign PrefAlign, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to ensure that the alignment of V is at least PrefAlign bytes.
Definition Local.cpp:1558
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.
@ Store
The extracted value is stored (ExtractElement only).
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:2224
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:649
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
auto make_isa_range(RangeT &&Range)
Return a range over Range containing only elements for which isa<T> holds, casting each of them to T.
Definition STLExtras.h:567
LLVM_ABI bool removeUnreachableBlocks(Function &F, DomTreeUpdater *DTU=nullptr, MemorySSAUpdater *MSSAU=nullptr, bool FoldInstsToUnreachable=true)
Remove all blocks that can not be reached from the function's entry.
Definition Local.cpp:2909
LLVM_ABI Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
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:1762
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:406
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...
LLVM_ABI bool isSafeToDestroyConstant(const Constant *C)
It is safe to destroy a constant iff it is only used by constants itself.
LLVM_ABI 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:1652
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:209
bool isPointerTy(const Type *T)
Definition SPIRVUtils.h:381
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:1769
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...
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth, bool MustPreserveProvenance=false)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
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:535
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:2035
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...
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:206
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:1612
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:951
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 LLVM_ABI 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:1455