LLVM 24.0.0git
CallSiteSplitting.cpp
Go to the documentation of this file.
1//===- CallSiteSplitting.cpp ----------------------------------------------===//
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 file implements a transformation that tries to split a call-site to pass
10// more constrained arguments if its argument is predicated in the control flow
11// so that we can expose better context to the later passes (e.g, inliner, jump
12// threading, or IPA-CP based function cloning, etc.).
13// As of now we support two cases :
14//
15// 1) Try to a split call-site with constrained arguments, if any constraints
16// on any argument can be found by following the single predecessors of the
17// all site's predecessors. Currently this pass only handles call-sites with 2
18// predecessors. For example, in the code below, we try to split the call-site
19// since we can predicate the argument(ptr) based on the OR condition.
20//
21// Split from :
22// if (!ptr || c)
23// callee(ptr);
24// to :
25// if (!ptr)
26// callee(null) // set the known constant value
27// else if (c)
28// callee(nonnull ptr) // set non-null attribute in the argument
29//
30// 2) We can also split a call-site based on constant incoming values of a PHI
31// For example,
32// from :
33// Header:
34// %c = icmp eq i32 %i1, %i2
35// br i1 %c, label %Tail, label %TBB
36// TBB:
37// br label Tail%
38// Tail:
39// %p = phi i32 [ 0, %Header], [ 1, %TBB]
40// call void @bar(i32 %p)
41// to
42// Header:
43// %c = icmp eq i32 %i1, %i2
44// br i1 %c, label %Tail-split0, label %TBB
45// TBB:
46// br label %Tail-split1
47// Tail-split0:
48// call void @bar(i32 0)
49// br label %Tail
50// Tail-split1:
51// call void @bar(i32 1)
52// br label %Tail
53// Tail:
54// %p = phi i32 [ 0, %Tail-split0 ], [ 1, %Tail-split1 ]
55//
56//===----------------------------------------------------------------------===//
57
59#include "ScalarOptions.h"
60#include "llvm/ADT/Statistic.h"
66#include "llvm/Support/Debug.h"
69
70using namespace llvm;
71using namespace PatternMatch;
72
73#define DEBUG_TYPE "callsite-splitting"
74
75STATISTIC(NumCallSiteSplit, "Number of call-site split");
76
78 unsigned ArgNo = 0;
79 for (auto &I : CB.args()) {
80 if (&*I == Op)
81 CB.addParamAttr(ArgNo, Attribute::NonNull);
82 ++ArgNo;
83 }
84}
85
87 Constant *ConstValue) {
88 unsigned ArgNo = 0;
89 for (auto &I : CB.args()) {
90 if (&*I == Op) {
91 // It is possible we have already added the non-null attribute to the
92 // parameter by using an earlier constraining condition.
93 CB.removeParamAttr(ArgNo, Attribute::NonNull);
94 CB.setArgOperand(ArgNo, ConstValue);
95 }
96 ++ArgNo;
97 }
98}
99
101 assert(isa<Constant>(Cmp->getOperand(1)) && "Expected a constant operand.");
102 Value *Op0 = Cmp->getOperand(0);
103 unsigned ArgNo = 0;
104 for (auto I = CB.arg_begin(), E = CB.arg_end(); I != E; ++I, ++ArgNo) {
105 // Don't consider constant or arguments that are already known non-null.
106 if (isa<Constant>(*I) || CB.paramHasAttr(ArgNo, Attribute::NonNull))
107 continue;
108
109 if (*I == Op0)
110 return true;
111 }
112 return false;
113}
114
115using ConditionTy = std::pair<ICmpInst *, unsigned>;
117
118/// If From has a conditional jump to To, add the condition to Conditions,
119/// if it is relevant to any argument at CB.
120static void recordCondition(CallBase &CB, BasicBlock *From, BasicBlock *To,
121 ConditionsTy &Conditions) {
122 auto *BI = dyn_cast<CondBrInst>(From->getTerminator());
123 if (!BI)
124 return;
125
126 CmpPredicate Pred;
127 Value *Cond = BI->getCondition();
128 if (!match(Cond, m_ICmp(Pred, m_Value(), m_Constant())))
129 return;
130
132 if (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE)
134 Conditions.push_back({Cmp, From->getTerminator()->getSuccessor(0) == To
135 ? Pred
136 : Cmp->getInverseCmpPredicate()});
137}
138
139/// Record ICmp conditions relevant to any argument in CB following Pred's
140/// single predecessors. If there are conflicting conditions along a path, like
141/// x == 1 and x == 0, the first condition will be used. We stop once we reach
142/// an edge to StopAt.
143static void recordConditions(CallBase &CB, BasicBlock *Pred,
144 ConditionsTy &Conditions, BasicBlock *StopAt) {
145 BasicBlock *From = Pred;
146 BasicBlock *To = Pred;
148 while (To != StopAt && !Visited.count(From->getSinglePredecessor()) &&
149 (From = From->getSinglePredecessor())) {
150 recordCondition(CB, From, To, Conditions);
151 Visited.insert(From);
152 To = From;
153 }
154}
155
156static void addConditions(CallBase &CB, const ConditionsTy &Conditions) {
157 for (const auto &Cond : Conditions) {
158 Value *Arg = Cond.first->getOperand(0);
159 Constant *ConstVal = cast<Constant>(Cond.first->getOperand(1));
160 if (Cond.second == ICmpInst::ICMP_EQ)
161 setConstantInArgument(CB, Arg, ConstVal);
162 else if (ConstVal->getType()->isPointerTy() && ConstVal->isNullValue()) {
163 assert(Cond.second == ICmpInst::ICMP_NE);
164 addNonNullAttribute(CB, Arg);
165 }
166 }
167}
168
171 assert(Preds.size() == 2 && "Expected exactly 2 predecessors!");
172 return Preds;
173}
174
175static bool canSplitCallSite(const ScalarOptions &Opts, CallBase &CB,
177 if (CB.isConvergent() || CB.cannotDuplicate())
178 return false;
179
180 // FIXME: As of now we handle only CallInst. InvokeInst could be handled
181 // without too much effort.
182 if (!isa<CallInst>(CB))
183 return false;
184
185 BasicBlock *CallSiteBB = CB.getParent();
186 // Need 2 predecessors and cannot split an edge from an IndirectBrInst.
188 if (Preds.size() != 2 || isa<IndirectBrInst>(Preds[0]->getTerminator()) ||
189 isa<IndirectBrInst>(Preds[1]->getTerminator()))
190 return false;
191
192 // BasicBlock::canSplitPredecessors is more aggressive, so checking for
193 // BasicBlock::isEHPad as well.
194 if (!CallSiteBB->canSplitPredecessors() || CallSiteBB->isEHPad())
195 return false;
196
197 // Allow splitting a call-site only when the CodeSize cost of the
198 // instructions before the call is less then DuplicationThreshold. The
199 // instructions before the call will be duplicated in the split blocks and
200 // corresponding uses will be updated.
201 InstructionCost Cost = 0;
202 for (auto &InstBeforeCall :
203 llvm::make_range(CallSiteBB->begin(), CB.getIterator())) {
204 Cost += TTI.getInstructionCost(&InstBeforeCall,
206 if (Cost >= Opts.callsite_splitting_duplication_threshold)
207 return false;
208 }
209
210 return true;
211}
212
213static Instruction *
215 Instruction *Copy = I->clone();
216 Copy->setName(I->getName());
217 Copy->insertBefore(Before);
218 if (V)
219 Copy->setOperand(0, V);
220 return Copy;
221}
222
223/// Copy mandatory `musttail` return sequence that follows original `CI`, and
224/// link it up to `NewCI` value instead:
225///
226/// * (optional) `bitcast NewCI to ...`
227/// * `ret bitcast or NewCI`
228///
229/// Insert this sequence right before `SplitBB`'s terminator, which will be
230/// cleaned up later in `splitCallSite` below.
231static void copyMustTailReturn(BasicBlock *SplitBB, Instruction *CI,
232 Instruction *NewCI) {
233 bool IsVoid = SplitBB->getParent()->getReturnType()->isVoidTy();
234 auto II = std::next(CI->getIterator());
235
237 if (BCI)
238 ++II;
239
241 assert(RI && "`musttail` call must be followed by `ret` instruction");
242
243 Instruction *TI = SplitBB->getTerminator();
244 Value *V = NewCI;
245 if (BCI)
246 V = cloneInstForMustTail(BCI, TI->getIterator(), V);
247 cloneInstForMustTail(RI, TI->getIterator(), IsVoid ? nullptr : V);
248
249 // FIXME: remove TI here, `DuplicateInstructionsInSplitBetween` has a bug
250 // that prevents doing this now.
251}
252
253/// For each (predecessor, conditions from predecessors) pair, it will split the
254/// basic block containing the call site, hook it up to the predecessor and
255/// replace the call instruction with new call instructions, which contain
256/// constraints based on the conditions from their predecessors.
257/// For example, in the IR below with an OR condition, the call-site can
258/// be split. In this case, Preds for Tail is [(Header, a == null),
259/// (TBB, a != null, b == null)]. Tail is replaced by 2 split blocks, containing
260/// CallInst1, which has constraints based on the conditions from Head and
261/// CallInst2, which has constraints based on the conditions coming from TBB.
262///
263/// From :
264///
265/// Header:
266/// %c = icmp eq i32* %a, null
267/// br i1 %c %Tail, %TBB
268/// TBB:
269/// %c2 = icmp eq i32* %b, null
270/// br i1 %c %Tail, %End
271/// Tail:
272/// %ca = call i1 @callee (i32* %a, i32* %b)
273///
274/// to :
275///
276/// Header: // PredBB1 is Header
277/// %c = icmp eq i32* %a, null
278/// br i1 %c %Tail-split1, %TBB
279/// TBB: // PredBB2 is TBB
280/// %c2 = icmp eq i32* %b, null
281/// br i1 %c %Tail-split2, %End
282/// Tail-split1:
283/// %ca1 = call @callee (i32* null, i32* %b) // CallInst1
284/// br %Tail
285/// Tail-split2:
286/// %ca2 = call @callee (i32* nonnull %a, i32* null) // CallInst2
287/// br %Tail
288/// Tail:
289/// %p = phi i1 [%ca1, %Tail-split1],[%ca2, %Tail-split2]
290///
291/// Note that in case any arguments at the call-site are constrained by its
292/// predecessors, new call-sites with more constrained arguments will be
293/// created in createCallSitesOnPredicatedArgument().
294static void splitCallSite(CallBase &CB,
295 ArrayRef<std::pair<BasicBlock *, ConditionsTy>> Preds,
296 DomTreeUpdater &DTU) {
297 BasicBlock *TailBB = CB.getParent();
298 bool IsMustTailCall = CB.isMustTailCall();
299
300 PHINode *CallPN = nullptr;
301
302 // `musttail` calls must be followed by optional `bitcast`, and `ret`. The
303 // split blocks will be terminated right after that so there're no users for
304 // this phi in a `TailBB`.
305 if (!IsMustTailCall && !CB.use_empty()) {
306 CallPN = PHINode::Create(CB.getType(), Preds.size(), "phi.call");
307 CallPN->setDebugLoc(CB.getDebugLoc());
308 }
309
310 LLVM_DEBUG(dbgs() << "split call-site : " << CB << " into \n");
311
312 assert(Preds.size() == 2 && "The ValueToValueMaps array has size 2.");
313 // ValueToValueMapTy is neither copy nor moveable, so we use a simple array
314 // here.
315 ValueToValueMapTy ValueToValueMaps[2];
316 for (unsigned i = 0; i < Preds.size(); i++) {
317 BasicBlock *PredBB = Preds[i].first;
319 TailBB, PredBB, &*std::next(CB.getIterator()), ValueToValueMaps[i],
320 DTU);
321 assert(SplitBlock && "Unexpected new basic block split.");
322
323 auto *NewCI =
324 cast<CallBase>(&*std::prev(SplitBlock->getTerminator()->getIterator()));
325 addConditions(*NewCI, Preds[i].second);
326
327 // Handle PHIs used as arguments in the call-site.
328 for (PHINode &PN : TailBB->phis()) {
329 unsigned ArgNo = 0;
330 for (auto &CI : CB.args()) {
331 if (&*CI == &PN) {
332 NewCI->setArgOperand(ArgNo, PN.getIncomingValueForBlock(SplitBlock));
333 }
334 ++ArgNo;
335 }
336 }
337 LLVM_DEBUG(dbgs() << " " << *NewCI << " in " << SplitBlock->getName()
338 << "\n");
339 if (CallPN)
340 CallPN->addIncoming(NewCI, SplitBlock);
341
342 // Clone and place bitcast and return instructions before `TI`
343 if (IsMustTailCall)
344 copyMustTailReturn(SplitBlock, &CB, NewCI);
345 }
346
347 NumCallSiteSplit++;
348
349 // FIXME: remove TI in `copyMustTailReturn`
350 if (IsMustTailCall) {
351 // Remove superfluous `br` terminators from the end of the Split blocks
352 // NOTE: Removing terminator removes the SplitBlock from the TailBB's
353 // predecessors. Therefore we must get complete list of Splits before
354 // attempting removal.
356 assert(Splits.size() == 2 && "Expected exactly 2 splits!");
357 for (BasicBlock *BB : Splits) {
358 BB->getTerminator()->eraseFromParent();
360 }
361
362 // Erase the tail block once done with musttail patching
363 DTU.deleteBB(TailBB);
364 return;
365 }
366
367 BasicBlock::iterator OriginalBegin = TailBB->begin();
368 // Replace users of the original call with a PHI mering call-sites split.
369 if (CallPN) {
370 CallPN->insertBefore(*TailBB, OriginalBegin);
371 CB.replaceAllUsesWith(CallPN);
372 }
373
374 // Remove instructions moved to split blocks from TailBB, from the duplicated
375 // call instruction to the beginning of the basic block. If an instruction
376 // has any uses, add a new PHI node to combine the values coming from the
377 // split blocks. The new PHI nodes are placed before the first original
378 // instruction, so we do not end up deleting them. By using reverse-order, we
379 // do not introduce unnecessary PHI nodes for def-use chains from the call
380 // instruction to the beginning of the block.
381 auto I = CB.getReverseIterator();
382 Instruction *OriginalBeginInst = &*OriginalBegin;
383 while (I != TailBB->rend()) {
384 Instruction *CurrentI = &*I++;
385 if (!CurrentI->use_empty()) {
386 // If an existing PHI has users after the call, there is no need to create
387 // a new one.
388 if (isa<PHINode>(CurrentI))
389 continue;
390 PHINode *NewPN = PHINode::Create(CurrentI->getType(), Preds.size());
391 NewPN->setDebugLoc(CurrentI->getDebugLoc());
392 for (auto &Mapping : ValueToValueMaps) {
393 Value *V = Mapping[CurrentI];
394 NewPN->addIncoming(V, cast<Instruction>(V)->getParent());
395 }
396 NewPN->insertBefore(*TailBB, TailBB->begin());
397 CurrentI->replaceAllUsesWith(NewPN);
398 }
399 CurrentI->dropDbgRecords();
400 CurrentI->eraseFromParent();
401 // We are done once we handled the first original instruction in TailBB.
402 if (CurrentI == OriginalBeginInst)
403 break;
404 }
405}
406
407// Return true if the call-site has an argument which is a PHI with only
408// constant incoming values.
409static bool isPredicatedOnPHI(CallBase &CB) {
410 BasicBlock *Parent = CB.getParent();
411 if (&CB != &*Parent->getFirstNonPHIOrPseudoProbe())
412 return false;
413
414 for (auto &PN : Parent->phis()) {
415 for (auto &Arg : CB.args()) {
416 if (&*Arg != &PN)
417 continue;
418 assert(PN.getNumIncomingValues() == 2 &&
419 "Unexpected number of incoming values");
420 if (PN.getIncomingBlock(0) == PN.getIncomingBlock(1))
421 return false;
422 if (PN.getIncomingValue(0) == PN.getIncomingValue(1))
423 continue;
424 if (isa<Constant>(PN.getIncomingValue(0)) &&
425 isa<Constant>(PN.getIncomingValue(1)))
426 return true;
427 }
428 }
429 return false;
430}
431
433
434// Check if any of the arguments in CS are predicated on a PHI node and return
435// the set of predecessors we should use for splitting.
437 if (!isPredicatedOnPHI(CB))
438 return {};
439
440 auto Preds = getTwoPredecessors(CB.getParent());
441 return {{Preds[0], {}}, {Preds[1], {}}};
442}
443
444// Checks if any of the arguments in CS are predicated in a predecessor and
445// returns a list of predecessors with the conditions that hold on their edges
446// to CS.
448 DomTreeUpdater &DTU) {
449 auto Preds = getTwoPredecessors(CB.getParent());
450 if (Preds[0] == Preds[1])
451 return {};
452
453 // We can stop recording conditions once we reached the immediate dominator
454 // for the block containing the call site. Conditions in predecessors of the
455 // that node will be the same for all paths to the call site and splitting
456 // is not beneficial.
457 assert(DTU.hasDomTree() && "We need a DTU with a valid DT!");
458 auto *CSDTNode = DTU.getDomTree().getNode(CB.getParent());
459 BasicBlock *StopAt = CSDTNode ? CSDTNode->getIDom()->getBlock() : nullptr;
460
462 for (auto *Pred : llvm::reverse(Preds)) {
463 ConditionsTy Conditions;
464 // Record condition on edge BB(CS) <- Pred
465 recordCondition(CB, Pred, CB.getParent(), Conditions);
466 // Record conditions following Pred's single predecessors.
467 recordConditions(CB, Pred, Conditions, StopAt);
468 PredsCS.push_back({Pred, Conditions});
469 }
470
471 if (all_of(PredsCS, [](const std::pair<BasicBlock *, ConditionsTy> &P) {
472 return P.second.empty();
473 }))
474 return {};
475
476 return PredsCS;
477}
478
479static bool tryToSplitCallSite(const ScalarOptions &Opts, CallBase &CB,
481 // Check if we can split the call site.
482 if (!CB.arg_size() || !canSplitCallSite(Opts, CB, TTI))
483 return false;
484
485 auto PredsWithConds = shouldSplitOnPredicatedArgument(CB, DTU);
486 if (PredsWithConds.empty())
487 PredsWithConds = shouldSplitOnPHIPredicatedArgument(CB);
488 if (PredsWithConds.empty())
489 return false;
490
491 splitCallSite(CB, PredsWithConds, DTU);
492 return true;
493}
494
497
498 const ScalarOptions &Opts = getScalarOptions(F);
499 DomTreeUpdater DTU(&DT, DomTreeUpdater::UpdateStrategy::Lazy);
500 bool Changed = false;
502 auto II = BB.getFirstNonPHIOrPseudoProbe()->getIterator();
503 auto IE = BB.getTerminator()->getIterator();
504 // Iterate until we reach the terminator instruction. tryToSplitCallSite
505 // can replace BB's terminator in case BB is a successor of itself. In that
506 // case, IE will be invalidated and we also have to check the current
507 // terminator.
508 while (II != IE && &*II != BB.getTerminator()) {
509 CallBase *CB = dyn_cast<CallBase>(&*II++);
510 if (!CB || isa<IntrinsicInst>(CB) || isInstructionTriviallyDead(CB, &TLI))
511 continue;
512
513 Function *Callee = CB->getCalledFunction();
514 if (!Callee || Callee->isDeclaration())
515 continue;
516
517 // Successful musttail call-site splits result in erased CI and erased BB.
518 // Check if such path is possible before attempting the splitting.
519 bool IsMustTail = CB->isMustTailCall();
520
521 Changed |= tryToSplitCallSite(Opts, *CB, TTI, DTU);
522
523 // There're no interesting instructions after this. The call site
524 // itself might have been erased on splitting.
525 if (IsMustTail)
526 break;
527 }
528 }
529 return Changed;
530}
531
534 auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
535 auto &TTI = AM.getResult<TargetIRAnalysis>(F);
536 auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
537
538 if (!doCallSiteSplitting(F, TLI, TTI, DT))
539 return PreservedAnalyses::all();
542 return PA;
543}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static const Function * getParent(const Value *V)
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static void addConditions(CallBase &CB, const ConditionsTy &Conditions)
static void copyMustTailReturn(BasicBlock *SplitBB, Instruction *CI, Instruction *NewCI)
Copy mandatory musttail return sequence that follows original CI, and link it up to NewCI value inste...
SmallVector< ConditionTy, 2 > ConditionsTy
static bool isCondRelevantToAnyCallArgument(ICmpInst *Cmp, CallBase &CB)
SmallVector< std::pair< BasicBlock *, ConditionsTy >, 2 > PredsWithCondsTy
static bool canSplitCallSite(const ScalarOptions &Opts, CallBase &CB, TargetTransformInfo &TTI)
static bool doCallSiteSplitting(Function &F, TargetLibraryInfo &TLI, TargetTransformInfo &TTI, DominatorTree &DT)
static void recordConditions(CallBase &CB, BasicBlock *Pred, ConditionsTy &Conditions, BasicBlock *StopAt)
Record ICmp conditions relevant to any argument in CB following Pred's single predecessors.
static bool isPredicatedOnPHI(CallBase &CB)
static PredsWithCondsTy shouldSplitOnPredicatedArgument(CallBase &CB, DomTreeUpdater &DTU)
static bool tryToSplitCallSite(const ScalarOptions &Opts, CallBase &CB, TargetTransformInfo &TTI, DomTreeUpdater &DTU)
static void addNonNullAttribute(CallBase &CB, Value *Op)
static void setConstantInArgument(CallBase &CB, Value *Op, Constant *ConstValue)
static Instruction * cloneInstForMustTail(Instruction *I, BasicBlock::iterator Before, Value *V)
static void recordCondition(CallBase &CB, BasicBlock *From, BasicBlock *To, ConditionsTy &Conditions)
If From has a conditional jump to To, add the condition to Conditions, if it is relevant to any argum...
static PredsWithCondsTy shouldSplitOnPHIPredicatedArgument(CallBase &CB)
static SmallVector< BasicBlock *, 2 > getTwoPredecessors(BasicBlock *BB)
static void splitCallSite(CallBase &CB, ArrayRef< std::pair< BasicBlock *, ConditionsTy > > Preds, DomTreeUpdater &DTU)
For each (predecessor, conditions from predecessors) pair, it will split the basic block containing t...
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
uint64_t IntrinsicInst * II
#define P(N)
const SmallVectorImpl< MachineOperand > & Cond
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:119
This pass exposes codegen information to IR-level passes.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:440
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
Definition BasicBlock.h:509
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrPseudoProbe() const
Returns an iterator to the first instruction in this block that is not a PHINode or a pseudo operatio...
reverse_iterator rend()
Definition BasicBlock.h:458
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
bool isEHPad() const
Return true if this basic block is an exception handling block.
Definition BasicBlock.h:683
LLVM_ABI bool canSplitPredecessors() const
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
This class represents a no-op cast from one type to another.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
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...
bool cannotDuplicate() const
Determine if the invoke cannot be duplicated.
LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
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.
void setArgOperand(unsigned i, Value *v)
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
bool isConvergent() const
Determine if the invoke is convergent.
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
unsigned arg_size() const
void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)
Adds the attribute to the indicated argument.
@ ICMP_NE
not equal
Definition InstrTypes.h:762
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
This is an important base class in LLVM.
Definition Constant.h:44
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constant.h:65
LLVM_ABI void deleteBB(BasicBlock *DelBB)
Delete DelBB.
Analysis pass which computes a DominatorTree.
Definition Dominators.h:241
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
Type * getReturnType() const
Returns the type of the ret val.
Definition Function.h:217
DomTreeT & getDomTree()
Flush DomTree updates and return DomTree.
void applyUpdatesPermissive(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
bool hasDomTree() const
Returns true if it holds a DomTreeT.
This instruction compares its operands according to the predicate given to the constructor.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI BasicBlock * getSuccessor(unsigned Idx) const LLVM_READONLY
Return the specified successor. This instruction must be a terminator.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI void dropDbgRecords()
Erase any DbgRecords attached to this instruction.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
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 & preserve()
Mark an analysis as preserved.
Definition Analysis.h:132
Return a value (possibly void), from a function.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Analysis pass providing the TargetTransformInfo.
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
@ TCK_CodeSize
Instruction code size.
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:277
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:549
bool use_empty() const
Definition Value.h:348
const ParentTy * getParent() const
Definition ilist_node.h:34
reverse_self_iterator getReverseIterator()
Definition ilist_node.h:126
self_iterator getIterator()
Definition ilist_node.h:123
Changed
bool match(Val *V, const Pattern &P)
auto m_Value()
Match an arbitrary value and ignore it.
auto m_Constant()
Match an arbitrary Constant and ignore it.
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1755
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:649
const ScalarOptions & getScalarOptions(const LLVMContext &C)
LLVM_ABI BasicBlock * DuplicateInstructionsInSplitBetween(BasicBlock *BB, BasicBlock *PredBB, Instruction *StopAt, ValueToValueMapTy &ValueMapping, DomTreeUpdater &DTU)
Split edge between BB and PredBB and duplicate all non-Phi instructions from BB between its beginning...
LLVM_ABI bool isInstructionTriviallyDead(Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction is not used, and the instruction will return.
Definition Local.cpp:408
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
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
TargetTransformInfo TTI
LLVM_ABI BasicBlock * SplitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, const Twine &BBName="")
Split the specified block at the specified instruction.
DWARFExpression::Operation Op
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
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.
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Run the pass over the function.