LLVM 22.0.0git
DeadArgumentElimination.cpp
Go to the documentation of this file.
1//===- DeadArgumentElimination.cpp - Eliminate dead 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 deletes dead arguments from internal functions. Dead argument
10// elimination removes arguments which are directly dead, as well as arguments
11// only passed into function calls as dead arguments of other functions. This
12// pass also deletes dead return values in a similar way.
13//
14// This pass is often useful as a cleanup pass to run after aggressive
15// interprocedural passes, which add possibly-dead arguments or return values.
16//
17//===----------------------------------------------------------------------===//
18
21#include "llvm/ADT/Statistic.h"
23#include "llvm/IR/Argument.h"
25#include "llvm/IR/Attributes.h"
26#include "llvm/IR/BasicBlock.h"
27#include "llvm/IR/Constants.h"
28#include "llvm/IR/DIBuilder.h"
30#include "llvm/IR/Function.h"
31#include "llvm/IR/IRBuilder.h"
32#include "llvm/IR/InstrTypes.h"
35#include "llvm/IR/Intrinsics.h"
36#include "llvm/IR/Module.h"
37#include "llvm/IR/NoFolder.h"
38#include "llvm/IR/PassManager.h"
39#include "llvm/IR/Type.h"
40#include "llvm/IR/Use.h"
41#include "llvm/IR/User.h"
42#include "llvm/IR/Value.h"
44#include "llvm/Pass.h"
46#include "llvm/Support/Debug.h"
48#include "llvm/Transforms/IPO.h"
50#include <cassert>
51#include <utility>
52#include <vector>
53
54using namespace llvm;
55
56#define DEBUG_TYPE "deadargelim"
57
58STATISTIC(NumArgumentsEliminated, "Number of unread args removed");
59STATISTIC(NumRetValsEliminated, "Number of unused return values removed");
60STATISTIC(NumArgumentsReplacedWithPoison,
61 "Number of unread args replaced with poison");
62
63namespace {
64
65/// The dead argument elimination pass.
66class DAE : public ModulePass {
67protected:
68 // DAH uses this to specify a different ID.
69 explicit DAE(char &ID) : ModulePass(ID) {}
70
71public:
72 static char ID; // Pass identification, replacement for typeid
73
74 DAE() : ModulePass(ID) {
76 }
77
78 bool runOnModule(Module &M) override {
79 if (skipModule(M))
80 return false;
81 DeadArgumentEliminationPass DAEP(shouldHackArguments());
82 ModuleAnalysisManager DummyMAM;
83 PreservedAnalyses PA = DAEP.run(M, DummyMAM);
84 return !PA.areAllPreserved();
85 }
86
87 virtual bool shouldHackArguments() const { return false; }
88};
89
90} // end anonymous namespace
91
92char DAE::ID = 0;
93
94INITIALIZE_PASS(DAE, "deadargelim", "Dead Argument Elimination", false, false)
95
96namespace {
97
98/// The DeadArgumentHacking pass, same as dead argument elimination, but deletes
99/// arguments to functions which are external. This is only for use by bugpoint.
100struct DAH : public DAE {
101 static char ID;
102
103 DAH() : DAE(ID) {}
104
105 bool shouldHackArguments() const override { return true; }
106};
107
108} // end anonymous namespace
109
110char DAH::ID = 0;
111
112INITIALIZE_PASS(DAH, "deadarghaX0r",
113 "Dead Argument Hacking (BUGPOINT USE ONLY; DO NOT USE)", false,
114 false)
115
116/// This pass removes arguments from functions which are not used by the body of
117/// the function.
118ModulePass *llvm::createDeadArgEliminationPass() { return new DAE(); }
119
121
122/// If this is an function that takes a ... list, and if llvm.vastart is never
123/// called, the varargs list is dead for the function.
124bool DeadArgumentEliminationPass::deleteDeadVarargs(Function &F) {
125 assert(F.getFunctionType()->isVarArg() && "Function isn't varargs!");
126 if (F.isDeclaration() || !F.hasLocalLinkage())
127 return false;
128
129 // Ensure that the function is only directly called.
130 if (F.hasAddressTaken())
131 return false;
132
133 // Don't touch naked functions. The assembly might be using an argument, or
134 // otherwise rely on the frame layout in a way that this analysis will not
135 // see.
136 if (F.hasFnAttribute(Attribute::Naked)) {
137 return false;
138 }
139
140 // Okay, we know we can transform this function if safe. Scan its body
141 // looking for calls marked musttail or calls to llvm.vastart.
142 for (BasicBlock &BB : F) {
143 for (Instruction &I : BB) {
144 CallInst *CI = dyn_cast<CallInst>(&I);
145 if (!CI)
146 continue;
147 if (CI->isMustTailCall())
148 return false;
149 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI)) {
150 if (II->getIntrinsicID() == Intrinsic::vastart)
151 return false;
152 }
153 }
154 }
155
156 // If we get here, there are no calls to llvm.vastart in the function body,
157 // remove the "..." and adjust all the calls.
158
159 // Start by computing a new prototype for the function, which is the same as
160 // the old function, but doesn't have isVarArg set.
161 FunctionType *FTy = F.getFunctionType();
162
163 std::vector<Type *> Params(FTy->param_begin(), FTy->param_end());
164 FunctionType *NFTy = FunctionType::get(FTy->getReturnType(), Params, false);
165 unsigned NumArgs = Params.size();
166
167 // Create the new function body and insert it into the module...
168 Function *NF = Function::Create(NFTy, F.getLinkage(), F.getAddressSpace());
169 NF->copyAttributesFrom(&F);
170 NF->setComdat(F.getComdat());
171 F.getParent()->getFunctionList().insert(F.getIterator(), NF);
172 NF->takeName(&F);
173
174 // Loop over all the callers of the function, transforming the call sites
175 // to pass in a smaller number of arguments into the new function.
176 //
177 std::vector<Value *> Args;
178 for (User *U : llvm::make_early_inc_range(F.users())) {
179 CallBase *CB = dyn_cast<CallBase>(U);
180 if (!CB)
181 continue;
182
183 // Pass all the same arguments.
184 Args.assign(CB->arg_begin(), CB->arg_begin() + NumArgs);
185
186 // Drop any attributes that were on the vararg arguments.
187 AttributeList PAL = CB->getAttributes();
188 if (!PAL.isEmpty()) {
190 for (unsigned ArgNo = 0; ArgNo < NumArgs; ++ArgNo)
191 ArgAttrs.push_back(PAL.getParamAttrs(ArgNo));
192 PAL = AttributeList::get(F.getContext(), PAL.getFnAttrs(),
193 PAL.getRetAttrs(), ArgAttrs);
194 }
195
197 CB->getOperandBundlesAsDefs(OpBundles);
198
199 CallBase *NewCB = nullptr;
200 if (InvokeInst *II = dyn_cast<InvokeInst>(CB)) {
201 NewCB = InvokeInst::Create(NF, II->getNormalDest(), II->getUnwindDest(),
202 Args, OpBundles, "", CB->getIterator());
203 } else {
204 NewCB = CallInst::Create(NF, Args, OpBundles, "", CB->getIterator());
205 cast<CallInst>(NewCB)->setTailCallKind(
206 cast<CallInst>(CB)->getTailCallKind());
207 }
208 NewCB->setCallingConv(CB->getCallingConv());
209 NewCB->setAttributes(PAL);
210 NewCB->copyMetadata(*CB, {LLVMContext::MD_prof, LLVMContext::MD_dbg});
211
212 Args.clear();
213
214 if (!CB->use_empty())
215 CB->replaceAllUsesWith(NewCB);
216
217 NewCB->takeName(CB);
218
219 // Finally, remove the old call from the program, reducing the use-count of
220 // F.
221 CB->eraseFromParent();
222 }
223
224 // Since we have now created the new function, splice the body of the old
225 // function right into the new function, leaving the old rotting hulk of the
226 // function empty.
227 NF->splice(NF->begin(), &F);
228
229 // Loop over the argument list, transferring uses of the old arguments over to
230 // the new arguments, also transferring over the names as well. While we're
231 // at it, remove the dead arguments from the DeadArguments list.
232 for (Function::arg_iterator I = F.arg_begin(), E = F.arg_end(),
233 I2 = NF->arg_begin();
234 I != E; ++I, ++I2) {
235 // Move the name and users over to the new version.
236 I->replaceAllUsesWith(&*I2);
237 I2->takeName(&*I);
238 }
239
240 // Clone metadata from the old function, including debug info descriptor.
242 F.getAllMetadata(MDs);
243 for (auto [KindID, Node] : MDs)
244 NF->addMetadata(KindID, *Node);
245
246 // Fix up any BlockAddresses that refer to the function.
247 F.replaceAllUsesWith(NF);
248 // Delete the bitcast that we just created, so that NF does not
249 // appear to be address-taken.
251 // Finally, nuke the old function.
252 F.eraseFromParent();
253 return true;
254}
255
256/// Checks if the given function has any arguments that are unused, and changes
257/// the caller parameters to be poison instead.
258bool DeadArgumentEliminationPass::removeDeadArgumentsFromCallers(Function &F) {
259 // We cannot change the arguments if this TU does not define the function or
260 // if the linker may choose a function body from another TU, even if the
261 // nominal linkage indicates that other copies of the function have the same
262 // semantics. In the below example, the dead load from %p may not have been
263 // eliminated from the linker-chosen copy of f, so replacing %p with poison
264 // in callers may introduce undefined behavior.
265 //
266 // define linkonce_odr void @f(i32* %p) {
267 // %v = load i32 %p
268 // ret void
269 // }
270 if (!F.hasExactDefinition())
271 return false;
272
273 // Functions with local linkage should already have been handled, except if
274 // they are fully alive (e.g., called indirectly) and except for the fragile
275 // (variadic) ones. In these cases, we may still be able to improve their
276 // statically known call sites.
277 if ((F.hasLocalLinkage() && !FrozenFunctions.count(&F)) &&
278 !F.getFunctionType()->isVarArg())
279 return false;
280
281 // Don't touch naked functions. The assembly might be using an argument, or
282 // otherwise rely on the frame layout in a way that this analysis will not
283 // see.
284 if (F.hasFnAttribute(Attribute::Naked))
285 return false;
286
287 if (F.use_empty())
288 return false;
289
290 SmallVector<unsigned, 8> UnusedArgs;
291 bool Changed = false;
292
293 AttributeMask UBImplyingAttributes =
295 for (Argument &Arg : F.args()) {
296 if (!Arg.hasSwiftErrorAttr() && Arg.use_empty() &&
297 !Arg.hasPassPointeeByValueCopyAttr()) {
298 if (Arg.isUsedByMetadata()) {
299 Arg.replaceAllUsesWith(PoisonValue::get(Arg.getType()));
300 Changed = true;
301 }
302 UnusedArgs.push_back(Arg.getArgNo());
303 F.removeParamAttrs(Arg.getArgNo(), UBImplyingAttributes);
304 }
305 }
306
307 if (UnusedArgs.empty())
308 return false;
309
310 for (Use &U : F.uses()) {
311 CallBase *CB = dyn_cast<CallBase>(U.getUser());
312 if (!CB || !CB->isCallee(&U) ||
313 CB->getFunctionType() != F.getFunctionType())
314 continue;
315
316 // Now go through all unused args and replace them with poison.
317 for (unsigned ArgNo : UnusedArgs) {
318 Value *Arg = CB->getArgOperand(ArgNo);
319 CB->setArgOperand(ArgNo, PoisonValue::get(Arg->getType()));
320 CB->removeParamAttrs(ArgNo, UBImplyingAttributes);
321
322 ++NumArgumentsReplacedWithPoison;
323 Changed = true;
324 }
325 }
326
327 return Changed;
328}
329
330/// Convenience function that returns the number of return values. It returns 0
331/// for void functions and 1 for functions not returning a struct. It returns
332/// the number of struct elements for functions returning a struct.
333static unsigned numRetVals(const Function *F) {
334 Type *RetTy = F->getReturnType();
335 if (RetTy->isVoidTy())
336 return 0;
337 if (StructType *STy = dyn_cast<StructType>(RetTy))
338 return STy->getNumElements();
339 if (ArrayType *ATy = dyn_cast<ArrayType>(RetTy))
340 return ATy->getNumElements();
341 return 1;
342}
343
344/// Returns the sub-type a function will return at a given Idx. Should
345/// correspond to the result type of an ExtractValue instruction executed with
346/// just that one Idx (i.e. only top-level structure is considered).
347static Type *getRetComponentType(const Function *F, unsigned Idx) {
348 Type *RetTy = F->getReturnType();
349 assert(!RetTy->isVoidTy() && "void type has no subtype");
350
351 if (StructType *STy = dyn_cast<StructType>(RetTy))
352 return STy->getElementType(Idx);
353 if (ArrayType *ATy = dyn_cast<ArrayType>(RetTy))
354 return ATy->getElementType();
355 return RetTy;
356}
357
358/// Checks Use for liveness in LiveValues. If Use is not live, it adds Use to
359/// the MaybeLiveUses argument. Returns the determined liveness of Use.
361DeadArgumentEliminationPass::markIfNotLive(RetOrArg Use,
362 UseVector &MaybeLiveUses) {
363 // We're live if our use or its Function is already marked as live.
364 if (isLive(Use))
365 return Live;
366
367 // We're maybe live otherwise, but remember that we must become live if
368 // Use becomes live.
369 MaybeLiveUses.push_back(Use);
370 return MaybeLive;
371}
372
373/// Looks at a single use of an argument or return value and determines if it
374/// should be alive or not. Adds this use to MaybeLiveUses if it causes the
375/// used value to become MaybeLive.
376///
377/// RetValNum is the return value number to use when this use is used in a
378/// return instruction. This is used in the recursion, you should always leave
379/// it at 0.
381DeadArgumentEliminationPass::surveyUse(const Use *U, UseVector &MaybeLiveUses,
382 unsigned RetValNum) {
383 const User *V = U->getUser();
384 if (const ReturnInst *RI = dyn_cast<ReturnInst>(V)) {
385 // The value is returned from a function. It's only live when the
386 // function's return value is live. We use RetValNum here, for the case
387 // that U is really a use of an insertvalue instruction that uses the
388 // original Use.
389 const Function *F = RI->getParent()->getParent();
390 if (RetValNum != -1U) {
391 RetOrArg Use = createRet(F, RetValNum);
392 // We might be live, depending on the liveness of Use.
393 return markIfNotLive(Use, MaybeLiveUses);
394 }
395
397 for (unsigned Ri = 0; Ri < numRetVals(F); ++Ri) {
398 RetOrArg Use = createRet(F, Ri);
399 // We might be live, depending on the liveness of Use. If any
400 // sub-value is live, then the entire value is considered live. This
401 // is a conservative choice, and better tracking is possible.
403 markIfNotLive(Use, MaybeLiveUses);
404 if (Result != Live)
405 Result = SubResult;
406 }
407 return Result;
408 }
409
410 if (const InsertValueInst *IV = dyn_cast<InsertValueInst>(V)) {
411 if (U->getOperandNo() != InsertValueInst::getAggregateOperandIndex() &&
412 IV->hasIndices())
413 // The use we are examining is inserted into an aggregate. Our liveness
414 // depends on all uses of that aggregate, but if it is used as a return
415 // value, only index at which we were inserted counts.
416 RetValNum = *IV->idx_begin();
417
418 // Note that if we are used as the aggregate operand to the insertvalue,
419 // we don't change RetValNum, but do survey all our uses.
420
421 Liveness Result = MaybeLive;
422 for (const Use &UU : IV->uses()) {
423 Result = surveyUse(&UU, MaybeLiveUses, RetValNum);
424 if (Result == Live)
425 break;
426 }
427 return Result;
428 }
429
430 if (const auto *CB = dyn_cast<CallBase>(V)) {
431 const Function *F = CB->getCalledFunction();
432 if (F) {
433 // Used in a direct call.
434
435 // The function argument is live if it is used as a bundle operand.
436 if (CB->isBundleOperand(U))
437 return Live;
438
439 // Find the argument number. We know for sure that this use is an
440 // argument, since if it was the function argument this would be an
441 // indirect call and that we know can't be looking at a value of the
442 // label type (for the invoke instruction).
443 unsigned ArgNo = CB->getArgOperandNo(U);
444
445 if (ArgNo >= F->getFunctionType()->getNumParams())
446 // The value is passed in through a vararg! Must be live.
447 return Live;
448
449 assert(CB->getArgOperand(ArgNo) == CB->getOperand(U->getOperandNo()) &&
450 "Argument is not where we expected it");
451
452 // Value passed to a normal call. It's only live when the corresponding
453 // argument to the called function turns out live.
454 RetOrArg Use = createArg(F, ArgNo);
455 return markIfNotLive(Use, MaybeLiveUses);
456 }
457 }
458 // Used in any other way? Value must be live.
459 return Live;
460}
461
462/// Looks at all the uses of the given value
463/// Returns the Liveness deduced from the uses of this value.
464///
465/// Adds all uses that cause the result to be MaybeLive to MaybeLiveRetUses. If
466/// the result is Live, MaybeLiveUses might be modified but its content should
467/// be ignored (since it might not be complete).
469DeadArgumentEliminationPass::surveyUses(const Value *V,
470 UseVector &MaybeLiveUses) {
471 // Assume it's dead (which will only hold if there are no uses at all..).
472 Liveness Result = MaybeLive;
473 // Check each use.
474 for (const Use &U : V->uses()) {
475 Result = surveyUse(&U, MaybeLiveUses);
476 if (Result == Live)
477 break;
478 }
479 return Result;
480}
481
482/// Performs the initial survey of the specified function, checking out whether
483/// it uses any of its incoming arguments or whether any callers use the return
484/// value. This fills in the LiveValues set and Uses map.
485///
486/// We consider arguments of non-internal functions to be intrinsically alive as
487/// well as arguments to functions which have their "address taken".
488void DeadArgumentEliminationPass::surveyFunction(const Function &F) {
489 // Functions with inalloca/preallocated parameters are expecting args in a
490 // particular register and memory layout.
491 if (F.getAttributes().hasAttrSomewhere(Attribute::InAlloca) ||
492 F.getAttributes().hasAttrSomewhere(Attribute::Preallocated)) {
493 markFrozen(F);
494 return;
495 }
496
497 // Don't touch naked functions. The assembly might be using an argument, or
498 // otherwise rely on the frame layout in a way that this analysis will not
499 // see.
500 if (F.hasFnAttribute(Attribute::Naked)) {
501 markFrozen(F);
502 return;
503 }
504
505 unsigned RetCount = numRetVals(&F);
506
507 // Assume all return values are dead
508 using RetVals = SmallVector<Liveness, 5>;
509
510 RetVals RetValLiveness(RetCount, MaybeLive);
511
512 using RetUses = SmallVector<UseVector, 5>;
513
514 // These vectors map each return value to the uses that make it MaybeLive, so
515 // we can add those to the Uses map if the return value really turns out to be
516 // MaybeLive. Initialized to a list of RetCount empty lists.
517 RetUses MaybeLiveRetUses(RetCount);
518
519 for (const BasicBlock &BB : F) {
520 if (BB.getTerminatingMustTailCall()) {
521 LLVM_DEBUG(dbgs() << "DeadArgumentEliminationPass - " << F.getName()
522 << " has musttail calls\n");
523 if (markFnOrRetTyFrozenOnMusttail(F))
524 return;
525 }
526 }
527
528 if (!F.hasLocalLinkage() && (!ShouldHackArguments || F.isIntrinsic())) {
529 markFrozen(F);
530 return;
531 }
532
534 dbgs() << "DeadArgumentEliminationPass - Inspecting callers for fn: "
535 << F.getName() << "\n");
536 // Keep track of the number of live retvals, so we can skip checks once all
537 // of them turn out to be live.
538 unsigned NumLiveRetVals = 0;
539
540 // Loop all uses of the function.
541 for (const Use &U : F.uses()) {
542 // If the function is PASSED IN as an argument, its address has been
543 // taken.
544 const auto *CB = dyn_cast<CallBase>(U.getUser());
545 if (!CB || !CB->isCallee(&U) ||
546 CB->getFunctionType() != F.getFunctionType()) {
547 markFrozen(F);
548 return;
549 }
550
551 if (CB->isMustTailCall()) {
552 LLVM_DEBUG(dbgs() << "DeadArgumentEliminationPass - " << F.getName()
553 << " has musttail callers\n");
554 if (markFnOrRetTyFrozenOnMusttail(F))
555 return;
556 }
557
558 // If we end up here, we are looking at a direct call to our function.
559
560 // Now, check how our return value(s) is/are used in this caller. Don't
561 // bother checking return values if all of them are live already.
562 if (NumLiveRetVals == RetCount)
563 continue;
564
565 // Check all uses of the return value.
566 for (const Use &UU : CB->uses()) {
567 if (ExtractValueInst *Ext = dyn_cast<ExtractValueInst>(UU.getUser())) {
568 // This use uses a part of our return value, survey the uses of
569 // that part and store the results for this index only.
570 unsigned Idx = *Ext->idx_begin();
571 if (RetValLiveness[Idx] != Live) {
572 RetValLiveness[Idx] = surveyUses(Ext, MaybeLiveRetUses[Idx]);
573 if (RetValLiveness[Idx] == Live)
574 NumLiveRetVals++;
575 }
576 } else {
577 // Used by something else than extractvalue. Survey, but assume that the
578 // result applies to all sub-values.
579 UseVector MaybeLiveAggregateUses;
580 if (surveyUse(&UU, MaybeLiveAggregateUses) == Live) {
581 NumLiveRetVals = RetCount;
582 RetValLiveness.assign(RetCount, Live);
583 break;
584 }
585
586 for (unsigned Ri = 0; Ri != RetCount; ++Ri) {
587 if (RetValLiveness[Ri] != Live)
588 MaybeLiveRetUses[Ri].append(MaybeLiveAggregateUses.begin(),
589 MaybeLiveAggregateUses.end());
590 }
591 }
592 }
593 }
594
595 // Now we've inspected all callers, record the liveness of our return values.
596 for (unsigned Ri = 0; Ri != RetCount; ++Ri)
597 markValue(createRet(&F, Ri), RetValLiveness[Ri], MaybeLiveRetUses[Ri]);
598
599 LLVM_DEBUG(dbgs() << "DeadArgumentEliminationPass - Inspecting args for fn: "
600 << F.getName() << "\n");
601
602 // Now, check all of our arguments.
603 unsigned ArgI = 0;
604 UseVector MaybeLiveArgUses;
605 for (Function::const_arg_iterator AI = F.arg_begin(), E = F.arg_end();
606 AI != E; ++AI, ++ArgI) {
607 Liveness Result;
608 if (F.getFunctionType()->isVarArg()) {
609 // Variadic functions will already have a va_arg function expanded inside
610 // them, making them potentially very sensitive to ABI changes resulting
611 // from removing arguments entirely, so don't. For example AArch64 handles
612 // register and stack HFAs very differently, and this is reflected in the
613 // IR which has already been generated.
614 Result = Live;
615 } else {
616 // See what the effect of this use is (recording any uses that cause
617 // MaybeLive in MaybeLiveArgUses).
618 Result = surveyUses(&*AI, MaybeLiveArgUses);
619 }
620
621 // Mark the result.
622 markValue(createArg(&F, ArgI), Result, MaybeLiveArgUses);
623 // Clear the vector again for the next iteration.
624 MaybeLiveArgUses.clear();
625 }
626}
627
628/// Marks the liveness of RA depending on L. If L is MaybeLive, it also takes
629/// all uses in MaybeLiveUses and records them in Uses, such that RA will be
630/// marked live if any use in MaybeLiveUses gets marked live later on.
631void DeadArgumentEliminationPass::markValue(const RetOrArg &RA, Liveness L,
632 const UseVector &MaybeLiveUses) {
633 switch (L) {
634 case Live:
635 markLive(RA);
636 break;
637 case MaybeLive:
638 assert(!isLive(RA) && "Use is already live!");
639 for (const auto &MaybeLiveUse : MaybeLiveUses) {
640 if (isLive(MaybeLiveUse)) {
641 // A use is live, so this value is live.
642 markLive(RA);
643 break;
644 }
645 // Note any uses of this value, so this value can be
646 // marked live whenever one of the uses becomes live.
647 Uses.emplace(MaybeLiveUse, RA);
648 }
649 break;
650 }
651}
652
653/// Return true if we freeze the whole function.
654/// If the calling convention is not swifttailcc or tailcc, the caller and
655/// callee of musttail must have exactly the same signature. Otherwise we
656/// only needs to guarantee they have the same return type.
657bool DeadArgumentEliminationPass::markFnOrRetTyFrozenOnMusttail(
658 const Function &F) {
659 if (F.getCallingConv() != CallingConv::SwiftTail ||
660 F.getCallingConv() != CallingConv::Tail) {
661 markFrozen(F);
662 return true;
663 } else {
664 markRetTyFrozen(F);
665 return false;
666 }
667}
668
669/// Mark the given Function as alive, meaning that it cannot be changed in any
670/// way. Additionally, mark any values that are used as this function's
671/// parameters or by its return values (according to Uses) live as well.
672void DeadArgumentEliminationPass::markFrozen(const Function &F) {
673 LLVM_DEBUG(dbgs() << "DeadArgumentEliminationPass - frozen fn: "
674 << F.getName() << "\n");
675 // Mark the function as frozen.
676 FrozenFunctions.insert(&F);
677 // Mark all arguments as live.
678 for (unsigned ArgI = 0, E = F.arg_size(); ArgI != E; ++ArgI)
679 propagateLiveness(createArg(&F, ArgI));
680 // Mark all return values as live.
681 for (unsigned Ri = 0, E = numRetVals(&F); Ri != E; ++Ri)
682 propagateLiveness(createRet(&F, Ri));
683}
684
685void DeadArgumentEliminationPass::markRetTyFrozen(const Function &F) {
686 LLVM_DEBUG(dbgs() << "DeadArgumentEliminationPass - frozen return type fn: "
687 << F.getName() << "\n");
688 FrozenRetTyFunctions.insert(&F);
689}
690
691/// Mark the given return value or argument as live. Additionally, mark any
692/// values that are used by this value (according to Uses) live as well.
693void DeadArgumentEliminationPass::markLive(const RetOrArg &RA) {
694 if (isLive(RA))
695 return; // Already marked Live.
696
697 LiveValues.insert(RA);
698
699 LLVM_DEBUG(dbgs() << "DeadArgumentEliminationPass - Marking "
700 << RA.getDescription() << " live\n");
701 propagateLiveness(RA);
702}
703
704bool DeadArgumentEliminationPass::isLive(const RetOrArg &RA) {
705 return FrozenFunctions.count(RA.F) || LiveValues.count(RA);
706}
707
708/// Given that RA is a live value, propagate it's liveness to any other values
709/// it uses (according to Uses).
710void DeadArgumentEliminationPass::propagateLiveness(const RetOrArg &RA) {
711 // We don't use upper_bound (or equal_range) here, because our recursive call
712 // to ourselves is likely to cause the upper_bound (which is the first value
713 // not belonging to RA) to become erased and the iterator invalidated.
714 UseMap::iterator Begin = Uses.lower_bound(RA);
715 UseMap::iterator E = Uses.end();
716 UseMap::iterator I;
717 for (I = Begin; I != E && I->first == RA; ++I)
718 markLive(I->second);
719
720 // Erase RA from the Uses map (from the lower bound to wherever we ended up
721 // after the loop).
722 Uses.erase(Begin, I);
723}
724
725/// Remove any arguments and return values from F that are not in LiveValues.
726/// Transform the function and all the callees of the function to not have these
727/// arguments and return values.
728bool DeadArgumentEliminationPass::removeDeadStuffFromFunction(Function *F) {
729 // Don't modify frozen functions
730 if (FrozenFunctions.count(F))
731 return false;
732
733 // Start by computing a new prototype for the function, which is the same as
734 // the old function, but has fewer arguments and a different return type.
735 FunctionType *FTy = F->getFunctionType();
736 std::vector<Type *> Params;
737
738 // Keep track of if we have a live 'returned' argument
739 bool HasLiveReturnedArg = false;
740
741 // Set up to build a new list of parameter attributes.
743 const AttributeList &PAL = F->getAttributes();
745
746 // Remember which arguments are still alive.
747 SmallVector<bool, 10> ArgAlive(FTy->getNumParams(), false);
748 // Construct the new parameter list from non-dead arguments. Also construct
749 // a new set of parameter attributes to correspond. Skip the first parameter
750 // attribute, since that belongs to the return value.
751 unsigned ArgI = 0;
752 for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E;
753 ++I, ++ArgI) {
754 RetOrArg Arg = createArg(F, ArgI);
755 if (LiveValues.erase(Arg)) {
756 Params.push_back(I->getType());
757 ArgAlive[ArgI] = true;
758 ArgAttrVec.push_back(PAL.getParamAttrs(ArgI));
759 HasLiveReturnedArg |= PAL.hasParamAttr(ArgI, Attribute::Returned);
760 } else {
761 ++NumArgumentsEliminated;
762
763 ORE.emit([&]() {
764 return OptimizationRemark(DEBUG_TYPE, "ArgumentRemoved", F)
765 << "eliminating argument " << ore::NV("ArgName", I->getName())
766 << "(" << ore::NV("ArgIndex", ArgI) << ")";
767 });
768 LLVM_DEBUG(dbgs() << "DeadArgumentEliminationPass - Removing argument "
769 << ArgI << " (" << I->getName() << ") from "
770 << F->getName() << "\n");
771 }
772 }
773
774 // Find out the new return value.
775 Type *RetTy = FTy->getReturnType();
776 Type *NRetTy = nullptr;
777 unsigned RetCount = numRetVals(F);
778
779 // -1 means unused, other numbers are the new index
780 SmallVector<int, 5> NewRetIdxs(RetCount, -1);
781 std::vector<Type *> RetTypes;
782
783 // If there is a function with a live 'returned' argument but a dead return
784 // value, then there are two possible actions:
785 // 1) Eliminate the return value and take off the 'returned' attribute on the
786 // argument.
787 // 2) Retain the 'returned' attribute and treat the return value (but not the
788 // entire function) as live so that it is not eliminated.
789 //
790 // It's not clear in the general case which option is more profitable because,
791 // even in the absence of explicit uses of the return value, code generation
792 // is free to use the 'returned' attribute to do things like eliding
793 // save/restores of registers across calls. Whether this happens is target and
794 // ABI-specific as well as depending on the amount of register pressure, so
795 // there's no good way for an IR-level pass to figure this out.
796 //
797 // Fortunately, the only places where 'returned' is currently generated by
798 // the FE are places where 'returned' is basically free and almost always a
799 // performance win, so the second option can just be used always for now.
800 //
801 // This should be revisited if 'returned' is ever applied more liberally.
802 if (RetTy->isVoidTy() || HasLiveReturnedArg ||
803 FrozenRetTyFunctions.count(F)) {
804 NRetTy = RetTy;
805 } else {
806 // Look at each of the original return values individually.
807 for (unsigned Ri = 0; Ri != RetCount; ++Ri) {
808 RetOrArg Ret = createRet(F, Ri);
809 if (LiveValues.erase(Ret)) {
810 RetTypes.push_back(getRetComponentType(F, Ri));
811 NewRetIdxs[Ri] = RetTypes.size() - 1;
812 } else {
813 ++NumRetValsEliminated;
814
815 ORE.emit([&]() {
816 return OptimizationRemark(DEBUG_TYPE, "ReturnValueRemoved", F)
817 << "removing return value " << std::to_string(Ri);
818 });
820 dbgs() << "DeadArgumentEliminationPass - Removing return value "
821 << Ri << " from " << F->getName() << "\n");
822 }
823 }
824 if (RetTypes.size() > 1) {
825 // More than one return type? Reduce it down to size.
826 if (StructType *STy = dyn_cast<StructType>(RetTy)) {
827 // Make the new struct packed if we used to return a packed struct
828 // already.
829 NRetTy = StructType::get(STy->getContext(), RetTypes, STy->isPacked());
830 } else {
831 assert(isa<ArrayType>(RetTy) && "unexpected multi-value return");
832 NRetTy = ArrayType::get(RetTypes[0], RetTypes.size());
833 }
834 } else if (RetTypes.size() == 1)
835 // One return type? Just a simple value then, but only if we didn't use to
836 // return a struct with that simple value before.
837 NRetTy = RetTypes.front();
838 else if (RetTypes.empty())
839 // No return types? Make it void, but only if we didn't use to return {}.
840 NRetTy = Type::getVoidTy(F->getContext());
841 }
842
843 assert(NRetTy && "No new return type found?");
844
845 // The existing function return attributes.
846 AttrBuilder RAttrs(F->getContext(), PAL.getRetAttrs());
847
848 // Remove any incompatible attributes, but only if we removed all return
849 // values. Otherwise, ensure that we don't have any conflicting attributes
850 // here. Currently, this should not be possible, but special handling might be
851 // required when new return value attributes are added.
852 if (NRetTy->isVoidTy())
853 RAttrs.remove(AttributeFuncs::typeIncompatible(NRetTy, PAL.getRetAttrs()));
854 else
855 assert(!RAttrs.overlaps(
857 "Return attributes no longer compatible?");
858
859 AttributeSet RetAttrs = AttributeSet::get(F->getContext(), RAttrs);
860
861 // Strip allocsize attributes. They might refer to the deleted arguments.
862 AttributeSet FnAttrs =
863 PAL.getFnAttrs().removeAttribute(F->getContext(), Attribute::AllocSize);
864
865 // Reconstruct the AttributesList based on the vector we constructed.
866 assert(ArgAttrVec.size() == Params.size());
867 AttributeList NewPAL =
868 AttributeList::get(F->getContext(), FnAttrs, RetAttrs, ArgAttrVec);
869
870 // Create the new function type based on the recomputed parameters.
871 FunctionType *NFTy = FunctionType::get(NRetTy, Params, FTy->isVarArg());
872
873 // No change?
874 if (NFTy == FTy)
875 return false;
876
877 // Create the new function body and insert it into the module...
878 Function *NF = Function::Create(NFTy, F->getLinkage(), F->getAddressSpace());
880 NF->setComdat(F->getComdat());
881 NF->setAttributes(NewPAL);
882 // Insert the new function before the old function, so we won't be processing
883 // it again.
884 F->getParent()->getFunctionList().insert(F->getIterator(), NF);
885 NF->takeName(F);
886
887 // Loop over all the callers of the function, transforming the call sites to
888 // pass in a smaller number of arguments into the new function.
889 std::vector<Value *> Args;
890 while (!F->use_empty()) {
891 CallBase &CB = cast<CallBase>(*F->user_back());
892
893 ArgAttrVec.clear();
894 const AttributeList &CallPAL = CB.getAttributes();
895
896 // Adjust the call return attributes in case the function was changed to
897 // return void.
898 AttrBuilder RAttrs(F->getContext(), CallPAL.getRetAttrs());
899 RAttrs.remove(
901 AttributeSet RetAttrs = AttributeSet::get(F->getContext(), RAttrs);
902
903 // Declare these outside of the loops, so we can reuse them for the second
904 // loop, which loops the varargs.
905 auto *I = CB.arg_begin();
906 unsigned Pi = 0;
907 // Loop over those operands, corresponding to the normal arguments to the
908 // original function, and add those that are still alive.
909 for (unsigned E = FTy->getNumParams(); Pi != E; ++I, ++Pi)
910 if (ArgAlive[Pi]) {
911 Args.push_back(*I);
912 // Get original parameter attributes, but skip return attributes.
913 AttributeSet Attrs = CallPAL.getParamAttrs(Pi);
914 if (NRetTy != RetTy && Attrs.hasAttribute(Attribute::Returned)) {
915 // If the return type has changed, then get rid of 'returned' on the
916 // call site. The alternative is to make all 'returned' attributes on
917 // call sites keep the return value alive just like 'returned'
918 // attributes on function declaration, but it's less clearly a win and
919 // this is not an expected case anyway
920 ArgAttrVec.push_back(AttributeSet::get(
921 F->getContext(), AttrBuilder(F->getContext(), Attrs)
922 .removeAttribute(Attribute::Returned)));
923 } else {
924 // Otherwise, use the original attributes.
925 ArgAttrVec.push_back(Attrs);
926 }
927 }
928
929 // Push any varargs arguments on the list. Don't forget their attributes.
930 for (auto *E = CB.arg_end(); I != E; ++I, ++Pi) {
931 Args.push_back(*I);
932 ArgAttrVec.push_back(CallPAL.getParamAttrs(Pi));
933 }
934
935 // Reconstruct the AttributesList based on the vector we constructed.
936 assert(ArgAttrVec.size() == Args.size());
937
938 // Again, be sure to remove any allocsize attributes, since their indices
939 // may now be incorrect.
940 AttributeSet FnAttrs = CallPAL.getFnAttrs().removeAttribute(
941 F->getContext(), Attribute::AllocSize);
942
943 AttributeList NewCallPAL =
944 AttributeList::get(F->getContext(), FnAttrs, RetAttrs, ArgAttrVec);
945
947 CB.getOperandBundlesAsDefs(OpBundles);
948
949 CallBase *NewCB = nullptr;
950 if (InvokeInst *II = dyn_cast<InvokeInst>(&CB)) {
951 NewCB = InvokeInst::Create(NF, II->getNormalDest(), II->getUnwindDest(),
952 Args, OpBundles, "", CB.getParent());
953 } else {
954 NewCB = CallInst::Create(NFTy, NF, Args, OpBundles, "", CB.getIterator());
955 cast<CallInst>(NewCB)->setTailCallKind(
956 cast<CallInst>(&CB)->getTailCallKind());
957 }
958 NewCB->setCallingConv(CB.getCallingConv());
959 NewCB->setAttributes(NewCallPAL);
960 NewCB->copyMetadata(CB, {LLVMContext::MD_prof, LLVMContext::MD_dbg});
961 Args.clear();
962 ArgAttrVec.clear();
963
964 if (!CB.use_empty() || CB.isUsedByMetadata()) {
965 if (NewCB->getType() == CB.getType()) {
966 // Return type not changed? Just replace users then.
967 CB.replaceAllUsesWith(NewCB);
968 NewCB->takeName(&CB);
969 } else if (NewCB->getType()->isVoidTy()) {
970 // If the return value is dead, replace any uses of it with poison
971 // (any non-debug value uses will get removed later on).
973 } else {
974 assert((RetTy->isStructTy() || RetTy->isArrayTy()) &&
975 "Return type changed, but not into a void. The old return type"
976 " must have been a struct or an array!");
977 Instruction *InsertPt = &CB;
978 if (InvokeInst *II = dyn_cast<InvokeInst>(&CB)) {
979 BasicBlock *NewEdge =
980 SplitEdge(NewCB->getParent(), II->getNormalDest());
981 InsertPt = &*NewEdge->getFirstInsertionPt();
982 }
983
984 // We used to return a struct or array. Instead of doing smart stuff
985 // with all the uses, we will just rebuild it using extract/insertvalue
986 // chaining and let instcombine clean that up.
987 //
988 // Start out building up our return value from poison
989 Value *RetVal = PoisonValue::get(RetTy);
990 for (unsigned Ri = 0; Ri != RetCount; ++Ri)
991 if (NewRetIdxs[Ri] != -1) {
992 Value *V;
993 IRBuilder<NoFolder> IRB(InsertPt);
994 if (RetTypes.size() > 1)
995 // We are still returning a struct, so extract the value from our
996 // return value
997 V = IRB.CreateExtractValue(NewCB, NewRetIdxs[Ri], "newret");
998 else
999 // We are now returning a single element, so just insert that
1000 V = NewCB;
1001 // Insert the value at the old position
1002 RetVal = IRB.CreateInsertValue(RetVal, V, Ri, "oldret");
1003 }
1004 // Now, replace all uses of the old call instruction with the return
1005 // struct we built
1006 CB.replaceAllUsesWith(RetVal);
1007 NewCB->takeName(&CB);
1008 }
1009 }
1010
1011 // Finally, remove the old call from the program, reducing the use-count of
1012 // F.
1013 CB.eraseFromParent();
1014 }
1015
1016 // Since we have now created the new function, splice the body of the old
1017 // function right into the new function, leaving the old rotting hulk of the
1018 // function empty.
1019 NF->splice(NF->begin(), F);
1020
1021 // Loop over the argument list, transferring uses of the old arguments over to
1022 // the new arguments, also transferring over the names as well.
1023 ArgI = 0;
1024 for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(),
1025 I2 = NF->arg_begin();
1026 I != E; ++I, ++ArgI)
1027 if (ArgAlive[ArgI]) {
1028 // If this is a live argument, move the name and users over to the new
1029 // version.
1030 I->replaceAllUsesWith(&*I2);
1031 I2->takeName(&*I);
1032 ++I2;
1033 } else {
1034 // If this argument is dead, replace any uses of it with poison
1035 // (any non-debug value uses will get removed later on).
1036 I->replaceAllUsesWith(PoisonValue::get(I->getType()));
1037 }
1038
1039 // If we change the return value of the function we must rewrite any return
1040 // instructions. Check this now.
1041 if (F->getReturnType() != NF->getReturnType())
1042 for (BasicBlock &BB : *NF)
1043 if (ReturnInst *RI = dyn_cast<ReturnInst>(BB.getTerminator())) {
1044 IRBuilder<NoFolder> IRB(RI);
1045 Value *RetVal = nullptr;
1046
1047 if (!NFTy->getReturnType()->isVoidTy()) {
1048 assert(RetTy->isStructTy() || RetTy->isArrayTy());
1049 // The original return value was a struct or array, insert
1050 // extractvalue/insertvalue chains to extract only the values we need
1051 // to return and insert them into our new result.
1052 // This does generate messy code, but we'll let it to instcombine to
1053 // clean that up.
1054 Value *OldRet = RI->getOperand(0);
1055 // Start out building up our return value from poison
1056 RetVal = PoisonValue::get(NRetTy);
1057 for (unsigned RetI = 0; RetI != RetCount; ++RetI)
1058 if (NewRetIdxs[RetI] != -1) {
1059 Value *EV = IRB.CreateExtractValue(OldRet, RetI, "oldret");
1060
1061 if (RetTypes.size() > 1) {
1062 // We're still returning a struct, so reinsert the value into
1063 // our new return value at the new index
1064
1065 RetVal = IRB.CreateInsertValue(RetVal, EV, NewRetIdxs[RetI],
1066 "newret");
1067 } else {
1068 // We are now only returning a simple value, so just return the
1069 // extracted value.
1070 RetVal = EV;
1071 }
1072 }
1073 }
1074 // Replace the return instruction with one returning the new return
1075 // value (possibly 0 if we became void).
1076 auto *NewRet =
1077 ReturnInst::Create(F->getContext(), RetVal, RI->getIterator());
1078 NewRet->setDebugLoc(RI->getDebugLoc());
1079 RI->eraseFromParent();
1080 }
1081
1082 // Clone metadata from the old function, including debug info descriptor.
1084 F->getAllMetadata(MDs);
1085 for (auto [KindID, Node] : MDs)
1086 NF->addMetadata(KindID, *Node);
1087
1088 // If either the return value(s) or argument(s) are removed, then probably the
1089 // function does not follow standard calling conventions anymore. Hence, add
1090 // DW_CC_nocall to DISubroutineType to inform debugger that it may not be safe
1091 // to call this function or try to interpret the return value.
1092 if (NFTy != FTy && NF->getSubprogram()) {
1093 DISubprogram *SP = NF->getSubprogram();
1094 auto Temp = SP->getType()->cloneWithCC(llvm::dwarf::DW_CC_nocall);
1095 SP->replaceType(MDNode::replaceWithPermanent(std::move(Temp)));
1096 }
1097
1098 // Now that the old function is dead, delete it.
1099 F->eraseFromParent();
1100
1101 return true;
1102}
1103
1106 bool Changed = false;
1107
1108 // First pass: Do a simple check to see if any functions can have their "..."
1109 // removed. We can do this if they never call va_start. This loop cannot be
1110 // fused with the next loop, because deleting a function invalidates
1111 // information computed while surveying other functions.
1112 LLVM_DEBUG(dbgs() << "DeadArgumentEliminationPass - Deleting dead varargs\n");
1114 if (F.getFunctionType()->isVarArg())
1115 Changed |= deleteDeadVarargs(F);
1116
1117 // Second phase: Loop through the module, determining which arguments are
1118 // live. We assume all arguments are dead unless proven otherwise (allowing us
1119 // to determine that dead arguments passed into recursive functions are dead).
1120 LLVM_DEBUG(dbgs() << "DeadArgumentEliminationPass - Determining liveness\n");
1121 for (auto &F : M)
1122 surveyFunction(F);
1123
1124 // Now, remove all dead arguments and return values from each function in
1125 // turn. We use make_early_inc_range here because functions will probably get
1126 // removed (i.e. replaced by new ones).
1128 Changed |= removeDeadStuffFromFunction(&F);
1129
1130 // Finally, look for any unused parameters in functions with non-local
1131 // linkage and replace the passed in parameters with poison.
1132 for (auto &F : M)
1133 Changed |= removeDeadArgumentsFromCallers(F);
1134
1135 if (!Changed)
1136 return PreservedAnalyses::all();
1137 return PreservedAnalyses::none();
1138}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file contains the simple types necessary to represent the attributes associated with functions a...
This file contains the declarations for the subclasses of Constant, which represent the different fla...
return RetTy
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
Convenience function that returns the number of return values It returns for void functions and for functions not returning a struct It returns the number of struct elements for functions returning a struct static unsigned numRetVals(const Function *F)
#define DEBUG_TYPE
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:55
#define I(x, y, z)
Definition: MD5.cpp:58
uint64_t IntrinsicInst * II
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:56
SI optimize exec mask operations pre RA
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:167
#define LLVM_DEBUG(...)
Definition: Debug.h:119
static const uint32_t IV[8]
Definition: blake3_impl.h:83
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:255
This class represents an incoming formal argument to a Function.
Definition: Argument.h:32
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
LLVM_ABI AttrBuilder & removeAttribute(Attribute::AttrKind Val)
Remove an attribute from the builder.
LLVM_ABI AttributeSet getFnAttrs() const
The function attributes are returned.
static LLVM_ABI AttributeList get(LLVMContext &C, ArrayRef< std::pair< unsigned, Attribute > > Attrs)
Create an AttributeList with the specified parameters in it.
bool isEmpty() const
Return true if there are no attributes.
Definition: Attributes.h:1039
LLVM_ABI AttributeSet getRetAttrs() const
The attributes for the ret value are returned.
bool hasParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Return true if the attribute exists for the given argument.
Definition: Attributes.h:845
LLVM_ABI AttributeSet getParamAttrs(unsigned ArgNo) const
The attributes for the argument or parameter at the given index are returned.
LLVM_ABI AttributeSet removeAttribute(LLVMContext &C, Attribute::AttrKind Kind) const
Remove the specified attribute from this set.
Definition: Attributes.cpp:957
static LLVM_ABI AttributeSet get(LLVMContext &C, const AttrBuilder &B)
Definition: Attributes.cpp:921
LLVM Basic Block Representation.
Definition: BasicBlock.h:62
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
Definition: BasicBlock.cpp:393
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1116
void setCallingConv(CallingConv::ID CC)
Definition: InstrTypes.h:1410
void removeParamAttrs(unsigned ArgNo, const AttributeMask &AttrsToRemove)
Removes the attributes from the given argument.
Definition: InstrTypes.h:1571
LLVM_ABI void getOperandBundlesAsDefs(SmallVectorImpl< OperandBundleDef > &Defs) const
Return the list of operand bundles attached to this instruction as a vector of OperandBundleDefs.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
Definition: InstrTypes.h:1348
CallingConv::ID getCallingConv() const
Definition: InstrTypes.h:1406
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
Definition: InstrTypes.h:1267
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.
Definition: InstrTypes.h:1359
void setAttributes(AttributeList A)
Set the attributes for this call.
Definition: InstrTypes.h:1427
Value * getArgOperand(unsigned i) const
Definition: InstrTypes.h:1292
void setArgOperand(unsigned i, Value *v)
Definition: InstrTypes.h:1297
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
Definition: InstrTypes.h:1273
bool isBundleOperand(unsigned Idx) const
Return true if the operand at index Idx is a bundle operand.
Definition: InstrTypes.h:2016
FunctionType * getFunctionType() const
Definition: InstrTypes.h:1205
unsigned getArgOperandNo(const Use *U) const
Given a use for a arg operand, get the arg operand number that corresponds to it.
Definition: InstrTypes.h:1323
AttributeList getAttributes() const
Return the attributes for this call.
Definition: InstrTypes.h:1424
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
bool isMustTailCall() const
LLVM_ABI void removeDeadConstantUsers() const
If there are any dead constant users dangling off of this constant, remove them.
Definition: Constants.cpp:739
Subprogram description. Uses SubclassData1.
Eliminate dead arguments (and return values) from functions.
PreservedAnalyses run(Module &M, ModuleAnalysisManager &)
FuncSet FrozenRetTyFunctions
This set contains all functions that cannot change return type;.
Liveness
During our initial pass over the program, we determine that things are either alive or maybe alive.
LiveSet LiveValues
This set contains all values that have been determined to be live.
RetOrArg createRet(const Function *F, unsigned Idx)
Convenience wrapper.
RetOrArg createArg(const Function *F, unsigned Idx)
Convenience wrapper.
FuncSet FrozenFunctions
This set contains all functions that cannot be changed in any way.
bool ShouldHackArguments
This allows this pass to do double-duty as the dead arg hacking pass (used only by bugpoint).
UseMap Uses
This maps a return value or argument to any MaybeLive return values or arguments it uses.
This instruction extracts a struct member or array element value from an aggregate value.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
Definition: Function.h:166
void splice(Function::iterator ToIt, Function *FromF)
Transfer all blocks from FromF to this function at ToIt.
Definition: Function.h:759
iterator begin()
Definition: Function.h:851
arg_iterator arg_begin()
Definition: Function.h:866
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
Definition: Function.h:355
Type * getReturnType() const
Returns the type of the ret val.
Definition: Function.h:214
void copyAttributesFrom(const Function *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a Function) from the ...
Definition: Function.cpp:856
LLVM_ABI void setComdat(Comdat *C)
Definition: Globals.cpp:214
LLVM_ABI void addMetadata(unsigned KindID, MDNode &MD)
Add a metadata attachment.
Definition: Metadata.cpp:1605
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition: IRBuilder.h:2780
This instruction inserts a struct field of array element value into an aggregate value.
static unsigned getAggregateOperandIndex()
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
A wrapper class for inspecting calls to intrinsic functions.
Definition: IntrinsicInst.h:49
Invoke instruction.
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
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:1304
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
Definition: Pass.h:255
bool skipModule(const Module &M) const
Optional passes call this function to check whether the pass should be skipped.
Definition: Pass.cpp:63
virtual bool runOnModule(Module &M)=0
runOnModule - Virtual method overriden by subclasses to process the module being operated on.
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:67
The optimization diagnostic interface.
Diagnostic information for applied optimization remarks.
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Definition: Constants.cpp:1885
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
bool areAllPreserved() const
Test whether all analyses are preserved (and none are abandoned).
Definition: Analysis.h:292
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition: Analysis.h:118
Return a value (possibly void), from a function.
static ReturnInst * Create(LLVMContext &C, Value *retVal=nullptr, InsertPosition InsertBefore=nullptr)
bool empty() const
Definition: SmallVector.h:82
size_t size() const
Definition: SmallVector.h:79
void push_back(const T &Elt)
Definition: SmallVector.h:414
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
Class to represent struct types.
Definition: DerivedTypes.h:218
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Definition: Type.cpp:414
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
bool isVoidTy() const
Return true if this is 'void'.
Definition: Type.h:139
A Use represents the edge between a Value definition and its users.
Definition: Use.h:35
Value * getOperand(unsigned i) const
Definition: User.h:232
LLVM Value Representation.
Definition: Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:256
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition: Value.cpp:546
bool isUsedByMetadata() const
Return true if there is metadata referencing this value.
Definition: Value.h:568
bool use_empty() const
Definition: Value.h:346
iterator_range< use_iterator > uses()
Definition: Value.h:380
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition: Value.cpp:396
const ParentTy * getParent() const
Definition: ilist_node.h:34
self_iterator getIterator()
Definition: ilist_node.h:134
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
LLVM_ABI AttributeMask getUBImplyingAttributes()
Get param/return attributes which imply immediate undefined behavior if an invalid value is passed.
LLVM_ABI AttributeMask typeIncompatible(Type *Ty, AttributeSet AS, AttributeSafetyKind ASK=ASK_ALL)
Which attributes cannot be applied to a type.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition: CallingConv.h:24
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
Definition: CallingConv.h:76
@ SwiftTail
This follows the Swift calling convention in how arguments are passed but guarantees tail calls will ...
Definition: CallingConv.h:87
DiagnosticInfoOptimizationBase::Argument NV
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
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:663
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:207
LLVM_ABI void initializeDAEPass(PassRegistry &)
LLVM_ABI ModulePass * createDeadArgEliminationPass()
createDeadArgEliminationPass - This pass removes arguments from functions which are not used by the b...
LLVM_ABI BasicBlock * SplitEdge(BasicBlock *From, BasicBlock *To, DominatorTree *DT=nullptr, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="")
Split the edge connecting the specified blocks, and return the newly created basic block between From...
LLVM_ABI ModulePass * createDeadArgHackingPass()
DeadArgHacking pass - Same as DAE, but delete arguments of external functions as well.