LLVM 23.0.0git
ArgumentPromotion.cpp
Go to the documentation of this file.
1//===- ArgumentPromotion.cpp - Promote by-reference arguments -------------===//
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 promotes "by reference" arguments to be "by value" arguments. In
10// practice, this means looking for internal functions that have pointer
11// arguments. If it can prove, through the use of alias analysis, that an
12// argument is *only* loaded, then it can pass the value into the function
13// instead of the address of the value. This can cause recursive simplification
14// of code and lead to the elimination of allocas (especially in C++ template
15// code like the STL).
16//
17// This pass also handles aggregate arguments that are passed into a function,
18// scalarizing them if the elements of the aggregate are only loaded. Note that
19// by default it refuses to scalarize aggregates which would require passing in
20// more than three operands to the function, because passing thousands of
21// operands for a large array or structure is unprofitable! This limit can be
22// configured or disabled, however.
23//
24// Note that this transformation could also be done for arguments that are only
25// stored to (returning the value instead), but does not currently. This case
26// would be best handled when and if LLVM begins supporting multiple return
27// values from functions.
28//
29//===----------------------------------------------------------------------===//
30
32
34#include "llvm/ADT/STLExtras.h"
35#include "llvm/ADT/ScopeExit.h"
38#include "llvm/ADT/Statistic.h"
39#include "llvm/ADT/Twine.h"
43#include "llvm/Analysis/Loads.h"
48#include "llvm/IR/Argument.h"
49#include "llvm/IR/Attributes.h"
50#include "llvm/IR/BasicBlock.h"
51#include "llvm/IR/CFG.h"
52#include "llvm/IR/Constants.h"
53#include "llvm/IR/DIBuilder.h"
54#include "llvm/IR/DataLayout.h"
56#include "llvm/IR/Dominators.h"
57#include "llvm/IR/Function.h"
58#include "llvm/IR/IRBuilder.h"
59#include "llvm/IR/InstrTypes.h"
60#include "llvm/IR/Instruction.h"
62#include "llvm/IR/Metadata.h"
63#include "llvm/IR/Module.h"
64#include "llvm/IR/NoFolder.h"
65#include "llvm/IR/PassManager.h"
66#include "llvm/IR/Type.h"
67#include "llvm/IR/Use.h"
68#include "llvm/IR/User.h"
69#include "llvm/IR/Value.h"
71#include "llvm/Support/Debug.h"
75#include <algorithm>
76#include <cassert>
77#include <cstdint>
78#include <utility>
79#include <vector>
80
81using namespace llvm;
82
83#define DEBUG_TYPE "argpromotion"
84
85STATISTIC(NumArgumentsPromoted, "Number of pointer arguments promoted");
86STATISTIC(NumArgumentsDead, "Number of dead pointer args eliminated");
87
88namespace {
89
90struct ArgPart {
91 Type *Ty;
92 Align Alignment;
93 /// A representative guaranteed-executed load or store instruction for use by
94 /// metadata transfer.
95 Instruction *MustExecInstr;
96};
97
98using OffsetAndArgPart = std::pair<int64_t, ArgPart>;
99
100} // end anonymous namespace
101
103 Value *Ptr, Type *ResElemTy, int64_t Offset) {
104 if (Offset != 0) {
105 APInt APOffset(DL.getIndexTypeSizeInBits(Ptr->getType()), Offset,
106 /*isSigned=*/true);
107 Ptr = IRB.CreatePtrAdd(Ptr, IRB.getInt(APOffset));
108 }
109 return Ptr;
110}
111
112/// DoPromotion - This method actually performs the promotion of the specified
113/// arguments, and returns the new function. At this point, we know that it's
114/// safe to do so.
115static Function *
118 &ArgsToPromote) {
119 // Start by computing a new prototype for the function, which is the same as
120 // the old function, but has modified arguments.
121 FunctionType *FTy = F->getFunctionType();
122 std::vector<Type *> Params;
123
124 // Attribute - Keep track of the parameter attributes for the arguments
125 // that we are *not* promoting. For the ones that we do promote, the parameter
126 // attributes are lost
128 // Mapping from old to new argument indices. -1 for promoted or removed
129 // arguments.
130 SmallVector<unsigned> NewArgIndices;
131 AttributeList PAL = F->getAttributes();
133
134 // First, determine the new argument list
135 unsigned ArgNo = 0, NewArgNo = 0;
136 for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E;
137 ++I, ++ArgNo) {
138 auto It = ArgsToPromote.find(&*I);
139 if (It == ArgsToPromote.end()) {
140 // Unchanged argument
141 Params.push_back(I->getType());
142 ArgAttrVec.push_back(PAL.getParamAttrs(ArgNo));
143 NewArgIndices.push_back(NewArgNo++);
144 } else if (I->use_empty()) {
145 // Dead argument (which are always marked as promotable)
146 ++NumArgumentsDead;
147 ORE.emit([&]() {
148 return OptimizationRemark(DEBUG_TYPE, "ArgumentRemoved", F)
149 << "eliminating argument " << ore::NV("ArgName", I->getName())
150 << "(" << ore::NV("ArgIndex", ArgNo) << ")";
151 });
152
153 NewArgIndices.push_back((unsigned)-1);
154 } else {
155 const auto &ArgParts = It->second;
156 for (const auto &Pair : ArgParts) {
157 Params.push_back(Pair.second.Ty);
158 ArgAttrVec.push_back(AttributeSet());
159 }
160 ++NumArgumentsPromoted;
161 ORE.emit([&]() {
162 return OptimizationRemark(DEBUG_TYPE, "ArgumentPromoted", F)
163 << "promoting argument " << ore::NV("ArgName", I->getName())
164 << "(" << ore::NV("ArgIndex", ArgNo) << ")"
165 << " to pass by value";
166 });
167
168 NewArgIndices.push_back((unsigned)-1);
169 NewArgNo += ArgParts.size();
170 }
171 }
172
173 Type *RetTy = FTy->getReturnType();
174
175 // Construct the new function type using the new arguments.
176 FunctionType *NFTy = FunctionType::get(RetTy, Params, FTy->isVarArg());
177
178 // Create the new function body and insert it into the module.
179 Function *NF = Function::Create(NFTy, F->getLinkage(), F->getAddressSpace(),
180 F->getName());
182 NF->copyMetadata(F, 0);
183
184 // The new function will have the !dbg metadata copied from the original
185 // function. The original function may not be deleted, and dbg metadata need
186 // to be unique, so we need to drop it.
187 F->setSubprogram(nullptr);
188
189 LLVM_DEBUG(dbgs() << "ARG PROMOTION: Promoting to:" << *NF << "\n"
190 << "From: " << *F);
191
192 uint64_t LargestVectorWidth = 0;
193 for (auto *I : Params)
194 if (auto *VT = dyn_cast<llvm::VectorType>(I))
195 LargestVectorWidth = std::max(
196 LargestVectorWidth, VT->getPrimitiveSizeInBits().getKnownMinValue());
197
198 // Recompute the parameter attributes list based on the new arguments for
199 // the function.
200 NF->setAttributes(AttributeList::get(F->getContext(), PAL.getFnAttrs(),
201 PAL.getRetAttrs(), ArgAttrVec));
202
203 // Remap argument indices in allocsize attribute.
204 if (auto AllocSize = NF->getAttributes().getFnAttrs().getAllocSizeArgs()) {
205 unsigned Arg1 = NewArgIndices[AllocSize->first];
206 assert(Arg1 != (unsigned)-1 && "allocsize cannot be promoted argument");
207 std::optional<unsigned> Arg2;
208 if (AllocSize->second) {
209 Arg2 = NewArgIndices[*AllocSize->second];
210 assert(Arg2 != (unsigned)-1 && "allocsize cannot be promoted argument");
211 }
212 NF->addFnAttr(Attribute::getWithAllocSizeArgs(F->getContext(), Arg1, Arg2));
213 }
214
215 AttributeFuncs::updateMinLegalVectorWidthAttr(*NF, LargestVectorWidth);
216 ArgAttrVec.clear();
217
218 F->getParent()->getFunctionList().insert(F->getIterator(), NF);
219 NF->takeName(F);
220
221 // Loop over all the callers of the function, transforming the call sites to
222 // pass in the loaded pointers.
224 const DataLayout &DL = F->getDataLayout();
226
227 while (!F->use_empty()) {
228 CallBase &CB = cast<CallBase>(*F->user_back());
229 assert(CB.getCalledFunction() == F);
230 const AttributeList &CallPAL = CB.getAttributes();
231 IRBuilder<NoFolder> IRB(&CB);
232
233 // Loop over the operands, inserting GEP and loads in the caller as
234 // appropriate.
235 auto *AI = CB.arg_begin();
236 ArgNo = 0;
237 for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E;
238 ++I, ++AI, ++ArgNo) {
239 auto ArgIt = ArgsToPromote.find(&*I);
240 if (ArgIt == ArgsToPromote.end()) {
241 Args.push_back(*AI); // Unmodified argument
242 ArgAttrVec.push_back(CallPAL.getParamAttrs(ArgNo));
243 } else if (!I->use_empty()) {
244 Value *V = *AI;
245 for (const auto &Pair : ArgIt->second) {
246 LoadInst *LI = IRB.CreateAlignedLoad(
247 Pair.second.Ty,
248 createByteGEP(IRB, DL, V, Pair.second.Ty, Pair.first),
249 Pair.second.Alignment, V->getName() + ".val");
250 if (Pair.second.MustExecInstr) {
251 LI->setAAMetadata(Pair.second.MustExecInstr->getAAMetadata());
252 LI->copyMetadata(*Pair.second.MustExecInstr,
253 {LLVMContext::MD_dereferenceable,
254 LLVMContext::MD_dereferenceable_or_null,
255 LLVMContext::MD_noundef,
256 LLVMContext::MD_nontemporal});
257 // Only transfer poison-generating metadata if we also have
258 // !noundef.
259 // TODO: Without !noundef, we could merge this metadata across
260 // all promoted loads.
261 if (LI->hasMetadata(LLVMContext::MD_noundef))
262 LI->copyMetadata(*Pair.second.MustExecInstr,
264 }
265 Args.push_back(LI);
266 ArgAttrVec.push_back(AttributeSet());
267 }
268 } else {
269 assert(I->use_empty());
270 DeadArgs.emplace_back(AI->get());
271 }
272 }
273
274 // Push any varargs arguments on the list.
275 for (; AI != CB.arg_end(); ++AI, ++ArgNo) {
276 Args.push_back(*AI);
277 ArgAttrVec.push_back(CallPAL.getParamAttrs(ArgNo));
278 }
279
281 CB.getOperandBundlesAsDefs(OpBundles);
282
283 CallBase *NewCS = nullptr;
284 if (InvokeInst *II = dyn_cast<InvokeInst>(&CB)) {
285 NewCS = InvokeInst::Create(NF, II->getNormalDest(), II->getUnwindDest(),
286 Args, OpBundles, "", CB.getIterator());
287 } else {
288 auto *NewCall =
289 CallInst::Create(NF, Args, OpBundles, "", CB.getIterator());
290 NewCall->setTailCallKind(cast<CallInst>(&CB)->getTailCallKind());
291 NewCS = NewCall;
292 }
293 NewCS->setCallingConv(CB.getCallingConv());
294 NewCS->setAttributes(AttributeList::get(F->getContext(),
295 CallPAL.getFnAttrs(),
296 CallPAL.getRetAttrs(), ArgAttrVec));
297 NewCS->copyMetadata(CB, {LLVMContext::MD_prof, LLVMContext::MD_dbg});
298 Args.clear();
299 ArgAttrVec.clear();
300
301 AttributeFuncs::updateMinLegalVectorWidthAttr(*CB.getCaller(),
302 LargestVectorWidth);
303
304 if (!CB.use_empty()) {
305 CB.replaceAllUsesWith(NewCS);
306 NewCS->takeName(&CB);
307 }
308
309 // Finally, remove the old call from the program, reducing the use-count of
310 // F.
311 CB.eraseFromParent();
312 }
313
315
316 // Since we have now created the new function, splice the body of the old
317 // function right into the new function, leaving the old rotting hulk of the
318 // function empty.
319 NF->splice(NF->begin(), F);
320
321 // We will collect all the new created allocas to promote them into registers
322 // after the following loop
324
325 // Loop over the argument list, transferring uses of the old arguments over to
326 // the new arguments, also transferring over the names as well.
328 for (Argument &Arg : F->args()) {
329 if (!ArgsToPromote.count(&Arg)) {
330 // If this is an unmodified argument, move the name and users over to the
331 // new version.
332 Arg.replaceAllUsesWith(&*I2);
333 I2->takeName(&Arg);
334 ++I2;
335 continue;
336 }
337
338 // There potentially are metadata uses for things like llvm.dbg.value.
339 // Replace them with poison, after handling the other regular uses.
340 llvm::scope_exit RauwPoisonMetadata(
341 [&]() { Arg.replaceAllUsesWith(PoisonValue::get(Arg.getType())); });
342
343 if (Arg.use_empty())
344 continue;
345
346 // Otherwise, if we promoted this argument, we have to create an alloca in
347 // the callee for every promotable part and store each of the new incoming
348 // arguments into the corresponding alloca, what lets the old code (the
349 // store instructions if they are allowed especially) a chance to work as
350 // before.
351 assert(Arg.getType()->isPointerTy() &&
352 "Only arguments with a pointer type are promotable");
353
354 IRBuilder<NoFolder> IRB(&NF->begin()->front());
355
356 // Add only the promoted elements, so parts from ArgsToPromote
358 for (const auto &Pair : ArgsToPromote.find(&Arg)->second) {
359 int64_t Offset = Pair.first;
360 const ArgPart &Part = Pair.second;
361
362 Argument *NewArg = I2++;
363 NewArg->setName(Arg.getName() + "." + Twine(Offset) + ".val");
364
365 AllocaInst *NewAlloca = IRB.CreateAlloca(
366 Part.Ty, nullptr, Arg.getName() + "." + Twine(Offset) + ".allc");
367 NewAlloca->setAlignment(Pair.second.Alignment);
368 IRB.CreateAlignedStore(NewArg, NewAlloca, Pair.second.Alignment);
369
370 // Collect the alloca to retarget the users to
371 OffsetToAlloca.insert({Offset, NewAlloca});
372 }
373
374 auto GetAlloca = [&](Value *Ptr) {
375 APInt Offset(DL.getIndexTypeSizeInBits(Ptr->getType()), 0);
376 Ptr = Ptr->stripAndAccumulateConstantOffsets(DL, Offset,
377 /* AllowNonInbounds */ true);
378 assert(Ptr == &Arg && "Not constant offset from arg?");
379 return OffsetToAlloca.lookup(Offset.getSExtValue());
380 };
381
382 // Cleanup the code from the dead instructions: GEPs and BitCasts in between
383 // the original argument and its users: loads and stores. Retarget every
384 // user to the new created alloca.
385 SmallVector<Value *, 16> Worklist(Arg.users());
387 while (!Worklist.empty()) {
388 Value *V = Worklist.pop_back_val();
389 if (isa<GetElementPtrInst>(V)) {
390 DeadInsts.push_back(cast<Instruction>(V));
391 append_range(Worklist, V->users());
392 continue;
393 }
394
395 if (auto *LI = dyn_cast<LoadInst>(V)) {
396 Value *Ptr = LI->getPointerOperand();
397 LI->setOperand(LoadInst::getPointerOperandIndex(), GetAlloca(Ptr));
398 continue;
399 }
400
401 if (auto *SI = dyn_cast<StoreInst>(V)) {
402 assert(!SI->isVolatile() && "Volatile operations can't be promoted.");
403 Value *Ptr = SI->getPointerOperand();
404 SI->setOperand(StoreInst::getPointerOperandIndex(), GetAlloca(Ptr));
405 continue;
406 }
407
408 llvm_unreachable("Unexpected user");
409 }
410
411 for (Instruction *I : DeadInsts) {
412 I->replaceAllUsesWith(PoisonValue::get(I->getType()));
413 I->eraseFromParent();
414 }
415
416 // Collect the allocas for promotion
417 for (const auto &Pair : OffsetToAlloca) {
418 assert(isAllocaPromotable(Pair.second) &&
419 "By design, only promotable allocas should be produced.");
420 Allocas.push_back(Pair.second);
421 }
422 }
423
424 LLVM_DEBUG(dbgs() << "ARG PROMOTION: " << Allocas.size()
425 << " alloca(s) are promotable by Mem2Reg\n");
426
427 if (!Allocas.empty()) {
428 // And we are able to call the `promoteMemoryToRegister()` function.
429 // Our earlier checks have ensured that PromoteMemToReg() will
430 // succeed.
431 auto &DT = FAM.getResult<DominatorTreeAnalysis>(*NF);
432 auto &AC = FAM.getResult<AssumptionAnalysis>(*NF);
433 PromoteMemToReg(Allocas, DT, &AC);
434 }
435
436 // If argument(s) are dead (hence removed) or promoted, the function probably
437 // does not follow the standard calling convention anymore. Add DW_CC_nocall
438 // to DISubroutineType to inform debugger that it may not be safe to call this
439 // function.
440 DISubprogram *SP = NF->getSubprogram();
441 if (SP) {
442 auto Temp = SP->getType()->cloneWithCC(llvm::dwarf::DW_CC_nocall);
443 SP->replaceType(MDNode::replaceWithPermanent(std::move(Temp)));
444 }
445
446 return NF;
447}
448
449/// Return true if we can prove that all callees pass in a valid pointer for the
450/// specified function argument.
452 Argument *Arg, SmallPtrSetImpl<CallBase *> &RecursiveCalls,
453 Align NeededAlign, uint64_t NeededDerefBytes) {
454 Function *Callee = Arg->getParent();
455 const DataLayout &DL = Callee->getDataLayout();
456 APInt Bytes(64, NeededDerefBytes);
457
458 // Check if the argument itself is marked dereferenceable and aligned.
459 if (isDereferenceableAndAlignedPointer(Arg, NeededAlign, Bytes, DL))
460 return true;
461
462 // Look at all call sites of the function. At this point we know we only have
463 // direct callees.
464 return all_of(Callee->users(), [&](User *U) {
465 CallBase &CB = cast<CallBase>(*U);
466 // In case of functions with recursive calls, this check
467 // (isDereferenceableAndAlignedPointer) will fail when it tries to look at
468 // the first caller of this function. The caller may or may not have a load,
469 // incase it doesn't load the pointer being passed, this check will fail.
470 // So, it's safe to skip the check incase we know that we are dealing with a
471 // recursive call. For example we have a IR given below.
472 //
473 // def fun(ptr %a) {
474 // ...
475 // %loadres = load i32, ptr %a, align 4
476 // %res = call i32 @fun(ptr %a)
477 // ...
478 // }
479 //
480 // def bar(ptr %x) {
481 // ...
482 // %resbar = call i32 @fun(ptr %x)
483 // ...
484 // }
485 //
486 // Since we record processed recursive calls, we check if the current
487 // CallBase has been processed before. If yes it means that it is a
488 // recursive call and we can skip the check just for this call. So, just
489 // return true.
490 if (RecursiveCalls.contains(&CB))
491 return true;
492
493 return isDereferenceableAndAlignedPointer(CB.getArgOperand(Arg->getArgNo()),
494 NeededAlign, Bytes, DL);
495 });
496}
497
498// Try to prove that all Calls to F do not modify the memory pointed to by Arg,
499// using alias analysis local to each caller of F.
502 for (User *U : Arg->getParent()->users()) {
503
504 auto *Call = cast<CallBase>(U);
505
508
509 AAResults &AAR = FAM.getResult<AAManager>(*Call->getFunction());
510 // Bail as soon as we find a Call where Arg may be modified.
511 if (isModSet(AAR.getModRefInfo(Call, Loc)))
512 return false;
513 }
514
515 // All Users are Calls which do not modify the Arg.
516 return true;
517}
518
519/// Determine that this argument is safe to promote, and find the argument
520/// parts it can be promoted into.
521static bool findArgParts(Argument *Arg, const DataLayout &DL, AAResults &AAR,
522 unsigned MaxElements, bool IsRecursive,
525 // Quick exit for unused arguments
526 if (Arg->use_empty())
527 return true;
528
529 // We can only promote this argument if all the uses are loads at known
530 // offsets.
531 //
532 // Promoting the argument causes it to be loaded in the caller
533 // unconditionally. This is only safe if we can prove that either the load
534 // would have happened in the callee anyway (ie, there is a load in the entry
535 // block) or the pointer passed in at every call site is guaranteed to be
536 // valid.
537 // In the former case, invalid loads can happen, but would have happened
538 // anyway, in the latter case, invalid loads won't happen. This prevents us
539 // from introducing an invalid load that wouldn't have happened in the
540 // original code.
541
543 Align NeededAlign(1);
544 uint64_t NeededDerefBytes = 0;
545
546 // And if this is a byval argument we also allow to have store instructions.
547 // Only handle in such way arguments with specified alignment;
548 // if it's unspecified, the actual alignment of the argument is
549 // target-specific.
550 bool AreStoresAllowed = Arg->getParamByValType() && Arg->getParamAlign();
551
552 // An end user of a pointer argument is a load or store instruction.
553 // Returns std::nullopt if this load or store is not based on the argument.
554 // Return true if we can promote the instruction, false otherwise.
555 auto HandleEndUser = [&](auto *I, Type *Ty,
556 bool GuaranteedToExecute) -> std::optional<bool> {
557 // Don't promote volatile or atomic instructions.
558 if (!I->isSimple())
559 return false;
560
561 Value *Ptr = I->getPointerOperand();
562 APInt Offset(DL.getIndexTypeSizeInBits(Ptr->getType()), 0);
564 /* AllowNonInbounds */ true);
565 if (Ptr != Arg)
566 return std::nullopt;
567
568 if (Offset.getSignificantBits() >= 64)
569 return false;
570
571 TypeSize Size = DL.getTypeStoreSize(Ty);
572 // Don't try to promote scalable types.
573 if (Size.isScalable())
574 return false;
575
576 // If this is a recursive function and one of the types is a pointer,
577 // then promoting it might lead to recursive promotion.
578 if (IsRecursive && Ty->isPointerTy())
579 return false;
580
581 int64_t Off = Offset.getSExtValue();
582 auto Pair = ArgParts.try_emplace(
583 Off, ArgPart{Ty, I->getAlign(), GuaranteedToExecute ? I : nullptr});
584 ArgPart &Part = Pair.first->second;
585 bool OffsetNotSeenBefore = Pair.second;
586
587 // We limit promotion to only promoting up to a fixed number of elements of
588 // the aggregate.
589 if (MaxElements > 0 && ArgParts.size() > MaxElements) {
590 LLVM_DEBUG(dbgs() << "ArgPromotion of " << *Arg << " failed: "
591 << "more than " << MaxElements << " parts\n");
592 return false;
593 }
594
595 // For now, we only support loading/storing one specific type at a given
596 // offset.
597 if (Part.Ty != Ty) {
598 LLVM_DEBUG(dbgs() << "ArgPromotion of " << *Arg << " failed: "
599 << "accessed as both " << *Part.Ty << " and " << *Ty
600 << " at offset " << Off << "\n");
601 return false;
602 }
603
604 // If this instruction is not guaranteed to execute, and we haven't seen a
605 // load or store at this offset before (or it had lower alignment), then we
606 // need to remember that requirement.
607 // Note that skipping instructions of previously seen offsets is only
608 // correct because we only allow a single type for a given offset, which
609 // also means that the number of accessed bytes will be the same.
610 if (!GuaranteedToExecute &&
611 (OffsetNotSeenBefore || Part.Alignment < I->getAlign())) {
612 // We won't be able to prove dereferenceability for negative offsets.
613 if (Off < 0)
614 return false;
615
616 // If the offset is not aligned, an aligned base pointer won't help.
617 if (!isAligned(I->getAlign(), Off))
618 return false;
619
620 NeededDerefBytes = std::max(NeededDerefBytes, Off + Size.getFixedValue());
621 NeededAlign = std::max(NeededAlign, I->getAlign());
622 }
623
624 Part.Alignment = std::max(Part.Alignment, I->getAlign());
625 return true;
626 };
627
628 // Look for loads and stores that are guaranteed to execute on entry.
629 for (Instruction &I : Arg->getParent()->getEntryBlock()) {
630 std::optional<bool> Res{};
631 if (LoadInst *LI = dyn_cast<LoadInst>(&I))
632 Res = HandleEndUser(LI, LI->getType(), /* GuaranteedToExecute */ true);
633 else if (StoreInst *SI = dyn_cast<StoreInst>(&I))
634 Res = HandleEndUser(SI, SI->getValueOperand()->getType(),
635 /* GuaranteedToExecute */ true);
636 if (Res && !*Res)
637 return false;
638
640 break;
641 }
642
643 // Now look at all loads of the argument. Remember the load instructions
644 // for the aliasing check below.
648 SmallPtrSet<CallBase *, 4> RecursiveCalls;
649 auto AppendUses = [&](const Value *V) {
650 for (const Use &U : V->uses())
651 if (Visited.insert(&U).second)
652 Worklist.push_back(&U);
653 };
654 AppendUses(Arg);
655 while (!Worklist.empty()) {
656 const Use *U = Worklist.pop_back_val();
657 Value *V = U->getUser();
658
659 if (auto *GEP = dyn_cast<GetElementPtrInst>(V)) {
660 if (!GEP->hasAllConstantIndices())
661 return false;
662 AppendUses(V);
663 continue;
664 }
665
666 if (auto *LI = dyn_cast<LoadInst>(V)) {
667 if (!*HandleEndUser(LI, LI->getType(), /* GuaranteedToExecute */ false))
668 return false;
669 Loads.push_back(LI);
670 continue;
671 }
672
673 // Stores are allowed for byval arguments
674 auto *SI = dyn_cast<StoreInst>(V);
675 if (AreStoresAllowed && SI &&
676 U->getOperandNo() == StoreInst::getPointerOperandIndex()) {
677 if (!*HandleEndUser(SI, SI->getValueOperand()->getType(),
678 /* GuaranteedToExecute */ false))
679 return false;
680 continue;
681 // Only stores TO the argument is allowed, all the other stores are
682 // unknown users
683 }
684
685 auto *CB = dyn_cast<CallBase>(V);
686 Value *PtrArg = U->get();
687 if (CB && CB->getCalledFunction() == CB->getFunction()) {
688 if (PtrArg != Arg) {
689 LLVM_DEBUG(dbgs() << "ArgPromotion of " << *Arg << " failed: "
690 << "pointer offset is not equal to zero\n");
691 return false;
692 }
693
694 unsigned int ArgNo = Arg->getArgNo();
695 if (U->getOperandNo() != ArgNo) {
696 LLVM_DEBUG(dbgs() << "ArgPromotion of " << *Arg << " failed: "
697 << "arg position is different in callee\n");
698 return false;
699 }
700
701 // We limit promotion to only promoting up to a fixed number of elements
702 // of the aggregate.
703 if (MaxElements > 0 && ArgParts.size() > MaxElements) {
704 LLVM_DEBUG(dbgs() << "ArgPromotion of " << *Arg << " failed: "
705 << "more than " << MaxElements << " parts\n");
706 return false;
707 }
708
709 RecursiveCalls.insert(CB);
710 continue;
711 }
712 // Unknown user.
713 LLVM_DEBUG(dbgs() << "ArgPromotion of " << *Arg << " failed: "
714 << "unknown user " << *V << "\n");
715 return false;
716 }
717
718 if (NeededDerefBytes || NeededAlign > 1) {
719 // Try to prove a required deref / aligned requirement.
720 if (!allCallersPassValidPointerForArgument(Arg, RecursiveCalls, NeededAlign,
721 NeededDerefBytes)) {
722 LLVM_DEBUG(dbgs() << "ArgPromotion of " << *Arg << " failed: "
723 << "not dereferenceable or aligned\n");
724 return false;
725 }
726 }
727
728 if (ArgParts.empty())
729 return true; // No users, this is a dead argument.
730
731 // Sort parts by offset.
732 append_range(ArgPartsVec, ArgParts);
733 sort(ArgPartsVec, llvm::less_first());
734
735 // Make sure the parts are non-overlapping.
736 int64_t Offset = ArgPartsVec[0].first;
737 for (const auto &Pair : ArgPartsVec) {
738 if (Pair.first < Offset)
739 return false; // Overlap with previous part.
740
741 Offset = Pair.first + DL.getTypeStoreSize(Pair.second.Ty);
742 }
743
744 // If store instructions are allowed, the path from the entry of the function
745 // to each load may be not free of instructions that potentially invalidate
746 // the load, and this is an admissible situation.
747 if (AreStoresAllowed)
748 return true;
749
750 // Okay, now we know that the argument is only used by load instructions, and
751 // it is safe to unconditionally perform all of them.
752
753 // If we can determine that no call to the Function modifies the memory region
754 // accessed through Arg, through alias analysis using actual arguments in the
755 // callers, we know that it is guaranteed to be safe to promote the argument.
757 return true;
758
759 // Otherwise, use alias analysis to check if the pointer is guaranteed to not
760 // be modified from entry of the function to each of the load instructions.
761 for (LoadInst *Load : Loads) {
762 // Check to see if the load is invalidated from the start of the block to
763 // the load itself.
764 BasicBlock *BB = Load->getParent();
765
767 if (AAR.canInstructionRangeModRef(BB->front(), *Load, Loc, ModRefInfo::Mod))
768 return false; // Pointer is invalidated!
769
770 // Now check every path from the entry block to the load for transparency.
771 // To do this, we perform a depth first search on the inverse CFG from the
772 // loading block.
773 for (BasicBlock *P : predecessors(BB)) {
774 for (BasicBlock *TranspBB : inverse_depth_first(P))
775 if (AAR.canBasicBlockModify(*TranspBB, Loc))
776 return false;
777 }
778 }
779
780 // If the path from the entry of the function to each load is free of
781 // instructions that potentially invalidate the load, we can make the
782 // transformation!
783 return true;
784}
785
786/// Check if callers and callee agree on how promoted arguments would be
787/// passed.
789 const TargetTransformInfo &TTI) {
790 return all_of(F.uses(), [&](const Use &U) {
791 CallBase *CB = dyn_cast<CallBase>(U.getUser());
792 if (!CB)
793 return false;
794
795 const Function *Caller = CB->getCaller();
796 const Function *Callee = CB->getCalledFunction();
797 return TTI.areTypesABICompatible(Caller, Callee, Types);
798 });
799}
800
801/// PromoteArguments - This method checks the specified function to see if there
802/// are any promotable arguments and if it is safe to promote the function (for
803/// example, all callers are direct). If safe to promote some arguments, it
804/// calls the DoPromotion method.
806 unsigned MaxElements, bool IsRecursive) {
807 // Don't perform argument promotion for naked functions; otherwise we can end
808 // up removing parameters that are seemingly 'not used' as they are referred
809 // to in the assembly.
810 if (F->hasFnAttribute(Attribute::Naked))
811 return nullptr;
812
813 // Make sure that it is local to this module.
814 if (!F->hasLocalLinkage())
815 return nullptr;
816
817 // Don't promote arguments for variadic functions. Adding, removing, or
818 // changing non-pack parameters can change the classification of pack
819 // parameters. Frontends encode that classification at the call site in the
820 // IR, while in the callee the classification is determined dynamically based
821 // on the number of registers consumed so far.
822 if (F->isVarArg())
823 return nullptr;
824
825 // Don't transform functions that receive inallocas, as the transformation may
826 // not be safe depending on calling convention.
827 if (F->getAttributes().hasAttrSomewhere(Attribute::InAlloca))
828 return nullptr;
829
830 // First check: see if there are any pointer arguments! If not, quick exit.
831 SmallVector<Argument *, 16> PointerArgs;
832 for (Argument &I : F->args())
833 if (I.getType()->isPointerTy())
834 PointerArgs.push_back(&I);
835 if (PointerArgs.empty())
836 return nullptr;
837
838 // Second check: make sure that all callers are direct callers. We can't
839 // transform functions that have indirect callers. Also see if the function
840 // is self-recursive.
841 for (Use &U : F->uses()) {
842 CallBase *CB = dyn_cast<CallBase>(U.getUser());
843 // Must be a direct call.
844 if (CB == nullptr || !CB->isCallee(&U) ||
845 CB->getFunctionType() != F->getFunctionType())
846 return nullptr;
847
848 // Can't change signature of musttail callee
849 if (CB->isMustTailCall())
850 return nullptr;
851
852 if (CB->getFunction() == F)
853 IsRecursive = true;
854 }
855
856 // Can't change signature of musttail caller
857 // FIXME: Support promoting whole chain of musttail functions
858 for (BasicBlock &BB : *F)
859 if (BB.getTerminatingMustTailCall())
860 return nullptr;
861
862 const DataLayout &DL = F->getDataLayout();
863 auto &AAR = FAM.getResult<AAManager>(*F);
864 const auto &TTI = FAM.getResult<TargetIRAnalysis>(*F);
865
866 // Check to see which arguments are promotable. If an argument is promotable,
867 // add it to ArgsToPromote.
869 unsigned NumArgsAfterPromote = F->getFunctionType()->getNumParams();
870 for (Argument *PtrArg : PointerArgs) {
871 // Replace sret attribute with noalias. This reduces register pressure by
872 // avoiding a register copy.
873 if (PtrArg->hasStructRetAttr()) {
874 unsigned ArgNo = PtrArg->getArgNo();
875 F->removeParamAttr(ArgNo, Attribute::StructRet);
876 F->addParamAttr(ArgNo, Attribute::NoAlias);
877 for (Use &U : F->uses()) {
878 CallBase &CB = cast<CallBase>(*U.getUser());
879 CB.removeParamAttr(ArgNo, Attribute::StructRet);
880 CB.addParamAttr(ArgNo, Attribute::NoAlias);
881 }
882 }
883
884 // If we can promote the pointer to its value.
886
887 if (findArgParts(PtrArg, DL, AAR, MaxElements, IsRecursive, ArgParts,
888 FAM)) {
890 for (const auto &Pair : ArgParts)
891 Types.push_back(Pair.second.Ty);
892
893 if (areTypesABICompatible(Types, *F, TTI)) {
894 NumArgsAfterPromote += ArgParts.size() - 1;
895 ArgsToPromote.insert({PtrArg, std::move(ArgParts)});
896 }
897 }
898 }
899
900 // No promotable pointer arguments.
901 if (ArgsToPromote.empty())
902 return nullptr;
903
904 if (NumArgsAfterPromote > TTI.getMaxNumArgs())
905 return nullptr;
906
907 return doPromotion(F, FAM, ArgsToPromote);
908}
909
912 LazyCallGraph &CG,
913 CGSCCUpdateResult &UR) {
914 bool Changed = false, LocalChange;
915
916 // Iterate until we stop promoting from this SCC.
917 do {
918 LocalChange = false;
919
921 AM.getResult<FunctionAnalysisManagerCGSCCProxy>(C, CG).getManager();
922
923 bool IsRecursive = C.size() > 1;
924 for (LazyCallGraph::Node &N : C) {
925 Function &OldF = N.getFunction();
926 Function *NewF = promoteArguments(&OldF, FAM, MaxElements, IsRecursive);
927 if (!NewF)
928 continue;
929 LocalChange = true;
930
931 // Directly substitute the functions in the call graph. Note that this
932 // requires the old function to be completely dead and completely
933 // replaced by the new function. It does no call graph updates, it merely
934 // swaps out the particular function mapped to a particular node in the
935 // graph.
936 C.getOuterRefSCC().replaceNodeFunction(N, *NewF);
937 FAM.clear(OldF, OldF.getName());
938 OldF.eraseFromParent();
939
940 PreservedAnalyses FuncPA;
941 FuncPA.preserveSet<CFGAnalyses>();
942 for (auto *U : NewF->users()) {
943 auto *UserF = cast<CallBase>(U)->getFunction();
944 FAM.invalidate(*UserF, FuncPA);
945 }
946 }
947
948 Changed |= LocalChange;
949 } while (LocalChange);
950
951 if (!Changed)
952 return PreservedAnalyses::all();
953
955 // We've cleared out analyses for deleted functions.
957 // We've manually invalidated analyses for functions we've modified.
959 return PA;
960}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static bool areTypesABICompatible(ArrayRef< Type * > Types, const Function &F, const TargetTransformInfo &TTI)
Check if callers and callee agree on how promoted arguments would be passed.
static bool findArgParts(Argument *Arg, const DataLayout &DL, AAResults &AAR, unsigned MaxElements, bool IsRecursive, SmallVectorImpl< OffsetAndArgPart > &ArgPartsVec, FunctionAnalysisManager &FAM)
Determine that this argument is safe to promote, and find the argument parts it can be promoted into.
static Function * doPromotion(Function *F, FunctionAnalysisManager &FAM, const DenseMap< Argument *, SmallVector< OffsetAndArgPart, 4 > > &ArgsToPromote)
DoPromotion - This method actually performs the promotion of the specified arguments,...
static Function * promoteArguments(Function *F, FunctionAnalysisManager &FAM, unsigned MaxElements, bool IsRecursive)
PromoteArguments - This method checks the specified function to see if there are any promotable argum...
static Value * createByteGEP(IRBuilderBase &IRB, const DataLayout &DL, Value *Ptr, Type *ResElemTy, int64_t Offset)
static bool isArgUnmodifiedByAllCalls(Argument *Arg, FunctionAnalysisManager &FAM)
static bool allCallersPassValidPointerForArgument(Argument *Arg, SmallPtrSetImpl< CallBase * > &RecursiveCalls, Align NeededAlign, uint64_t NeededDerefBytes)
Return true if we can prove that all callees pass in a valid pointer for the specified function argum...
This file contains the simple types necessary to represent the attributes associated with functions a...
This is the interface for LLVM's primary stateless and local alias analysis.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file provides interfaces used to build and manipulate a call graph, which is a very useful tool ...
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
#define DEBUG_TYPE
Hexagon Common GEP
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
This defines the Use class.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file provides utility analysis objects describing memory locations.
This file contains the declarations for metadata subclasses.
uint64_t IntrinsicInst * II
#define P(N)
FunctionAnalysisManager FAM
This file contains some templates that are useful if you are working with the STL at all.
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:114
This pass exposes codegen information to IR-level passes.
A manager for alias analyses.
ModRefInfo getModRefInfo(const Instruction *I, const std::optional< MemoryLocation > &OptLoc)
Check whether or not an instruction may read or write the optionally specified memory location.
LLVM_ABI bool canInstructionRangeModRef(const Instruction &I1, const Instruction &I2, const MemoryLocation &Loc, const ModRefInfo Mode)
Check if it is possible for the execution of the specified instructions to mod(according to the mode)...
LLVM_ABI bool canBasicBlockModify(const BasicBlock &BB, const MemoryLocation &Loc)
Check if it is possible for execution of the specified basic block to modify the location Loc.
Class for arbitrary precision integers.
Definition APInt.h:78
This templated class represents "all analyses that operate over <aparticular IR unit>" (e....
Definition Analysis.h:50
an instruction to allocate memory on the stack
void setAlignment(Align Align)
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
PreservedAnalyses run(LazyCallGraph::SCC &C, CGSCCAnalysisManager &AM, LazyCallGraph &CG, CGSCCUpdateResult &UR)
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
const Function * getParent() const
Definition Argument.h:44
unsigned getArgNo() const
Return the index of this formal argument in its containing function.
Definition Argument.h:50
LLVM_ABI Type * getParamByValType() const
If this is a byval argument, return its type.
Definition Function.cpp:224
LLVM_ABI MaybeAlign getParamAlign() const
If this is a byval or inalloca argument, return its alignment.
Definition Function.cpp:215
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
A function analysis which provides an AssumptionCache.
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:407
static LLVM_ABI Attribute getWithAllocSizeArgs(LLVMContext &Context, unsigned ElemSizeArg, const std::optional< unsigned > &NumElemsArg)
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Instruction & front() const
Definition BasicBlock.h:493
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...
void setCallingConv(CallingConv::ID CC)
LLVM_ABI void getOperandBundlesAsDefs(SmallVectorImpl< OperandBundleDef > &Defs) const
Return the list of operand bundles attached to this instruction as a vector of OperandBundleDefs.
void removeParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Removes the attribute from the given argument.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
CallingConv::ID getCallingConv() const
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
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.
void setAttributes(AttributeList A)
Set the attributes for this call.
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
FunctionType * getFunctionType() const
AttributeList getAttributes() const
Return the attributes for this call.
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Adds the attribute to the indicated argument.
LLVM_ABI Function * getCaller()
Helper to get the caller (the parent function).
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Subprogram description. Uses SubclassData1.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
Definition DenseMap.h:205
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:256
unsigned size() const
Definition DenseMap.h:110
bool empty() const
Definition DenseMap.h:109
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:241
Analysis pass which computes a DominatorTree.
Definition Dominators.h:283
A proxy from a FunctionAnalysisManager to an SCC.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
void addFnAttr(Attribute::AttrKind Kind)
Add function attributes to this function.
Definition Function.cpp:639
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
Definition Function.h:168
void splice(Function::iterator ToIt, Function *FromF)
Transfer all blocks from FromF to this function at ToIt.
Definition Function.h:761
const BasicBlock & getEntryBlock() const
Definition Function.h:809
Argument * arg_iterator
Definition Function.h:73
DISubprogram * getSubprogram() const
Get the attached subprogram.
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:354
iterator begin()
Definition Function.h:853
void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
Definition Function.cpp:450
arg_iterator arg_begin()
Definition Function.h:868
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
Definition Function.h:357
void copyAttributesFrom(const Function *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a Function) from the ...
Definition Function.cpp:844
LLVM_ABI void copyMetadata(const GlobalObject *Src, unsigned Offset)
Copy metadata from Src, adjusting offsets by Offset.
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
AllocaInst * CreateAlloca(Type *Ty, unsigned AddrSpace, Value *ArraySize=nullptr, const Twine &Name="")
Definition IRBuilder.h:1837
LoadInst * CreateAlignedLoad(Type *Ty, Value *Ptr, MaybeAlign Align, const char *Name)
Definition IRBuilder.h:1871
Value * CreatePtrAdd(Value *Ptr, Value *Offset, const Twine &Name="", GEPNoWrapFlags NW=GEPNoWrapFlags::none())
Definition IRBuilder.h:2025
StoreInst * CreateAlignedStore(Value *Val, Value *Ptr, MaybeAlign Align, bool isVolatile=false)
Definition IRBuilder.h:1890
ConstantInt * getInt(const APInt &AI)
Get a constant integer value.
Definition IRBuilder.h:537
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2788
LLVM_ABI void setAAMetadata(const AAMDNodes &N)
Sets the AA metadata on this instruction from the AAMDNodes structure.
bool hasMetadata() const
Return true if this instruction has any metadata attached to it.
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.
LLVM_ABI void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
Invoke instruction.
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
A node in the call graph.
An SCC of the call graph.
A lazily constructed view of the call graph of a module.
An instruction for reading from memory.
static unsigned getPointerOperandIndex()
static std::enable_if_t< std::is_base_of< MDNode, T >::value, T * > replaceWithPermanent(std::unique_ptr< T, TempMDNodeDeleter > N)
Replace a temporary node with a permanent one.
Definition Metadata.h:1307
Representation for a specific memory location.
static LLVM_ABI MemoryLocation get(const LoadInst *LI)
Return a location with information about the memory reference by the given instruction.
static LLVM_ABI MemoryLocation getForArgument(const CallBase *Call, unsigned ArgIdx, const TargetLibraryInfo *TLI)
Return a location representing a particular argument of a call.
static constexpr const unsigned PoisonGeneratingIDs[]
Metadata IDs that may generate poison.
Definition Metadata.h:146
The optimization diagnostic interface.
LLVM_ABI void emit(DiagnosticInfoOptimizationBase &OptDiag)
Output the remark via the diagnostic handler and to the optimization record file.
Diagnostic information for applied optimization remarks.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
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
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
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...
reference emplace_back(ArgTypes &&... Args)
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.
static unsigned getPointerOperandIndex()
Analysis pass providing the TargetTransformInfo.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
Definition Value.cpp:397
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:553
iterator_range< user_iterator > users()
Definition Value.h:427
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.
bool use_empty() const
Definition Value.h:347
iterator_range< use_iterator > uses()
Definition Value.h:381
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:403
self_iterator getIterator()
Definition ilist_node.h:123
CallInst * Call
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
DiagnosticInfoOptimizationBase::Argument NV
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
@ Offset
Definition DWP.cpp:532
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
LLVM_ABI void PromoteMemToReg(ArrayRef< AllocaInst * > Allocas, DominatorTree &DT, AssumptionCache *AC=nullptr)
Promote the specified list of alloca instructions into scalar registers, inserting PHI nodes as appro...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
bool isAligned(Align Lhs, uint64_t SizeInBytes)
Checks that SizeInBytes is a multiple of the alignment.
Definition Alignment.h:134
LLVM_ABI bool isDereferenceableAndAlignedPointer(const Value *V, Type *Ty, Align Alignment, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Returns true if V is always a dereferenceable pointer with alignment greater or equal than requested.
Definition Loads.cpp:229
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
LLVM_ABI bool isAllocaPromotable(const AllocaInst *AI)
Return true if this alloca is legal for promotion.
AnalysisManager< LazyCallGraph::SCC, LazyCallGraph & > CGSCCAnalysisManager
The CGSCC analysis manager.
bool isModSet(const ModRefInfo MRI)
Definition ModRef.h:49
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1636
iterator_range< idf_iterator< T > > inverse_depth_first(const T &G)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
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
@ Mod
The access may modify the value stored in memory.
Definition ModRef.h:34
TargetTransformInfo TTI
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:553
LLVM_ABI bool isGuaranteedToTransferExecutionToSuccessor(const Instruction *I)
Return true if this function can prove that the instruction I will always transfer execution to one o...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
auto predecessors(const MachineBasicBlock *BB)
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Support structure for SCC passes to communicate updates the call graph back to the CGSCC pass manager...
Function object to check whether the first component of a container supported by std::get (like std::...
Definition STLExtras.h:1439