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
176 if (CB.isConvergent() || CB.cannotDuplicate())
177 return false;
178
179 // FIXME: As of now we handle only CallInst. InvokeInst could be handled
180 // without too much effort.
181 if (!isa<CallInst>(CB))
182 return false;
183
184 BasicBlock *CallSiteBB = CB.getParent();
185 // Need 2 predecessors and cannot split an edge from an IndirectBrInst.
187 if (Preds.size() != 2 || isa<IndirectBrInst>(Preds[0]->getTerminator()) ||
188 isa<IndirectBrInst>(Preds[1]->getTerminator()))
189 return false;
190
191 // BasicBlock::canSplitPredecessors is more aggressive, so checking for
192 // BasicBlock::isEHPad as well.
193 if (!CallSiteBB->canSplitPredecessors() || CallSiteBB->isEHPad())
194 return false;
195
196 // Allow splitting a call-site only when the CodeSize cost of the
197 // instructions before the call is less then DuplicationThreshold. The
198 // instructions before the call will be duplicated in the split blocks and
199 // corresponding uses will be updated.
200 InstructionCost Cost = 0;
201 for (auto &InstBeforeCall :
202 llvm::make_range(CallSiteBB->begin(), CB.getIterator())) {
203 Cost += TTI.getInstructionCost(&InstBeforeCall,
205 if (Cost >= ScalarOptions::Global.callsite_splitting_duplication_threshold)
206 return false;
207 }
208
209 return true;
210}
211
212static Instruction *
214 Instruction *Copy = I->clone();
215 Copy->setName(I->getName());
216 Copy->insertBefore(Before);
217 if (V)
218 Copy->setOperand(0, V);
219 return Copy;
220}
221
222/// Copy mandatory `musttail` return sequence that follows original `CI`, and
223/// link it up to `NewCI` value instead:
224///
225/// * (optional) `bitcast NewCI to ...`
226/// * `ret bitcast or NewCI`
227///
228/// Insert this sequence right before `SplitBB`'s terminator, which will be
229/// cleaned up later in `splitCallSite` below.
230static void copyMustTailReturn(BasicBlock *SplitBB, Instruction *CI,
231 Instruction *NewCI) {
232 bool IsVoid = SplitBB->getParent()->getReturnType()->isVoidTy();
233 auto II = std::next(CI->getIterator());
234
236 if (BCI)
237 ++II;
238
240 assert(RI && "`musttail` call must be followed by `ret` instruction");
241
242 Instruction *TI = SplitBB->getTerminator();
243 Value *V = NewCI;
244 if (BCI)
245 V = cloneInstForMustTail(BCI, TI->getIterator(), V);
246 cloneInstForMustTail(RI, TI->getIterator(), IsVoid ? nullptr : V);
247
248 // FIXME: remove TI here, `DuplicateInstructionsInSplitBetween` has a bug
249 // that prevents doing this now.
250}
251
252/// For each (predecessor, conditions from predecessors) pair, it will split the
253/// basic block containing the call site, hook it up to the predecessor and
254/// replace the call instruction with new call instructions, which contain
255/// constraints based on the conditions from their predecessors.
256/// For example, in the IR below with an OR condition, the call-site can
257/// be split. In this case, Preds for Tail is [(Header, a == null),
258/// (TBB, a != null, b == null)]. Tail is replaced by 2 split blocks, containing
259/// CallInst1, which has constraints based on the conditions from Head and
260/// CallInst2, which has constraints based on the conditions coming from TBB.
261///
262/// From :
263///
264/// Header:
265/// %c = icmp eq i32* %a, null
266/// br i1 %c %Tail, %TBB
267/// TBB:
268/// %c2 = icmp eq i32* %b, null
269/// br i1 %c %Tail, %End
270/// Tail:
271/// %ca = call i1 @callee (i32* %a, i32* %b)
272///
273/// to :
274///
275/// Header: // PredBB1 is Header
276/// %c = icmp eq i32* %a, null
277/// br i1 %c %Tail-split1, %TBB
278/// TBB: // PredBB2 is TBB
279/// %c2 = icmp eq i32* %b, null
280/// br i1 %c %Tail-split2, %End
281/// Tail-split1:
282/// %ca1 = call @callee (i32* null, i32* %b) // CallInst1
283/// br %Tail
284/// Tail-split2:
285/// %ca2 = call @callee (i32* nonnull %a, i32* null) // CallInst2
286/// br %Tail
287/// Tail:
288/// %p = phi i1 [%ca1, %Tail-split1],[%ca2, %Tail-split2]
289///
290/// Note that in case any arguments at the call-site are constrained by its
291/// predecessors, new call-sites with more constrained arguments will be
292/// created in createCallSitesOnPredicatedArgument().
293static void splitCallSite(CallBase &CB,
294 ArrayRef<std::pair<BasicBlock *, ConditionsTy>> Preds,
295 DomTreeUpdater &DTU) {
296 BasicBlock *TailBB = CB.getParent();
297 bool IsMustTailCall = CB.isMustTailCall();
298
299 PHINode *CallPN = nullptr;
300
301 // `musttail` calls must be followed by optional `bitcast`, and `ret`. The
302 // split blocks will be terminated right after that so there're no users for
303 // this phi in a `TailBB`.
304 if (!IsMustTailCall && !CB.use_empty()) {
305 CallPN = PHINode::Create(CB.getType(), Preds.size(), "phi.call");
306 CallPN->setDebugLoc(CB.getDebugLoc());
307 }
308
309 LLVM_DEBUG(dbgs() << "split call-site : " << CB << " into \n");
310
311 assert(Preds.size() == 2 && "The ValueToValueMaps array has size 2.");
312 // ValueToValueMapTy is neither copy nor moveable, so we use a simple array
313 // here.
314 ValueToValueMapTy ValueToValueMaps[2];
315 for (unsigned i = 0; i < Preds.size(); i++) {
316 BasicBlock *PredBB = Preds[i].first;
318 TailBB, PredBB, &*std::next(CB.getIterator()), ValueToValueMaps[i],
319 DTU);
320 assert(SplitBlock && "Unexpected new basic block split.");
321
322 auto *NewCI =
323 cast<CallBase>(&*std::prev(SplitBlock->getTerminator()->getIterator()));
324 addConditions(*NewCI, Preds[i].second);
325
326 // Handle PHIs used as arguments in the call-site.
327 for (PHINode &PN : TailBB->phis()) {
328 unsigned ArgNo = 0;
329 for (auto &CI : CB.args()) {
330 if (&*CI == &PN) {
331 NewCI->setArgOperand(ArgNo, PN.getIncomingValueForBlock(SplitBlock));
332 }
333 ++ArgNo;
334 }
335 }
336 LLVM_DEBUG(dbgs() << " " << *NewCI << " in " << SplitBlock->getName()
337 << "\n");
338 if (CallPN)
339 CallPN->addIncoming(NewCI, SplitBlock);
340
341 // Clone and place bitcast and return instructions before `TI`
342 if (IsMustTailCall)
343 copyMustTailReturn(SplitBlock, &CB, NewCI);
344 }
345
346 NumCallSiteSplit++;
347
348 // FIXME: remove TI in `copyMustTailReturn`
349 if (IsMustTailCall) {
350 // Remove superfluous `br` terminators from the end of the Split blocks
351 // NOTE: Removing terminator removes the SplitBlock from the TailBB's
352 // predecessors. Therefore we must get complete list of Splits before
353 // attempting removal.
355 assert(Splits.size() == 2 && "Expected exactly 2 splits!");
356 for (BasicBlock *BB : Splits) {
357 BB->getTerminator()->eraseFromParent();
359 }
360
361 // Erase the tail block once done with musttail patching
362 DTU.deleteBB(TailBB);
363 return;
364 }
365
366 BasicBlock::iterator OriginalBegin = TailBB->begin();
367 // Replace users of the original call with a PHI mering call-sites split.
368 if (CallPN) {
369 CallPN->insertBefore(*TailBB, OriginalBegin);
370 CB.replaceAllUsesWith(CallPN);
371 }
372
373 // Remove instructions moved to split blocks from TailBB, from the duplicated
374 // call instruction to the beginning of the basic block. If an instruction
375 // has any uses, add a new PHI node to combine the values coming from the
376 // split blocks. The new PHI nodes are placed before the first original
377 // instruction, so we do not end up deleting them. By using reverse-order, we
378 // do not introduce unnecessary PHI nodes for def-use chains from the call
379 // instruction to the beginning of the block.
380 auto I = CB.getReverseIterator();
381 Instruction *OriginalBeginInst = &*OriginalBegin;
382 while (I != TailBB->rend()) {
383 Instruction *CurrentI = &*I++;
384 if (!CurrentI->use_empty()) {
385 // If an existing PHI has users after the call, there is no need to create
386 // a new one.
387 if (isa<PHINode>(CurrentI))
388 continue;
389 PHINode *NewPN = PHINode::Create(CurrentI->getType(), Preds.size());
390 NewPN->setDebugLoc(CurrentI->getDebugLoc());
391 for (auto &Mapping : ValueToValueMaps) {
392 Value *V = Mapping[CurrentI];
393 NewPN->addIncoming(V, cast<Instruction>(V)->getParent());
394 }
395 NewPN->insertBefore(*TailBB, TailBB->begin());
396 CurrentI->replaceAllUsesWith(NewPN);
397 }
398 CurrentI->dropDbgRecords();
399 CurrentI->eraseFromParent();
400 // We are done once we handled the first original instruction in TailBB.
401 if (CurrentI == OriginalBeginInst)
402 break;
403 }
404}
405
406// Return true if the call-site has an argument which is a PHI with only
407// constant incoming values.
408static bool isPredicatedOnPHI(CallBase &CB) {
409 BasicBlock *Parent = CB.getParent();
410 if (&CB != &*Parent->getFirstNonPHIOrDbg())
411 return false;
412
413 for (auto &PN : Parent->phis()) {
414 for (auto &Arg : CB.args()) {
415 if (&*Arg != &PN)
416 continue;
417 assert(PN.getNumIncomingValues() == 2 &&
418 "Unexpected number of incoming values");
419 if (PN.getIncomingBlock(0) == PN.getIncomingBlock(1))
420 return false;
421 if (PN.getIncomingValue(0) == PN.getIncomingValue(1))
422 continue;
423 if (isa<Constant>(PN.getIncomingValue(0)) &&
424 isa<Constant>(PN.getIncomingValue(1)))
425 return true;
426 }
427 }
428 return false;
429}
430
432
433// Check if any of the arguments in CS are predicated on a PHI node and return
434// the set of predecessors we should use for splitting.
436 if (!isPredicatedOnPHI(CB))
437 return {};
438
439 auto Preds = getTwoPredecessors(CB.getParent());
440 return {{Preds[0], {}}, {Preds[1], {}}};
441}
442
443// Checks if any of the arguments in CS are predicated in a predecessor and
444// returns a list of predecessors with the conditions that hold on their edges
445// to CS.
447 DomTreeUpdater &DTU) {
448 auto Preds = getTwoPredecessors(CB.getParent());
449 if (Preds[0] == Preds[1])
450 return {};
451
452 // We can stop recording conditions once we reached the immediate dominator
453 // for the block containing the call site. Conditions in predecessors of the
454 // that node will be the same for all paths to the call site and splitting
455 // is not beneficial.
456 assert(DTU.hasDomTree() && "We need a DTU with a valid DT!");
457 auto *CSDTNode = DTU.getDomTree().getNode(CB.getParent());
458 BasicBlock *StopAt = CSDTNode ? CSDTNode->getIDom()->getBlock() : nullptr;
459
461 for (auto *Pred : llvm::reverse(Preds)) {
462 ConditionsTy Conditions;
463 // Record condition on edge BB(CS) <- Pred
464 recordCondition(CB, Pred, CB.getParent(), Conditions);
465 // Record conditions following Pred's single predecessors.
466 recordConditions(CB, Pred, Conditions, StopAt);
467 PredsCS.push_back({Pred, Conditions});
468 }
469
470 if (all_of(PredsCS, [](const std::pair<BasicBlock *, ConditionsTy> &P) {
471 return P.second.empty();
472 }))
473 return {};
474
475 return PredsCS;
476}
477
479 DomTreeUpdater &DTU) {
480 // Check if we can split the call site.
481 if (!CB.arg_size() || !canSplitCallSite(CB, TTI))
482 return false;
483
484 auto PredsWithConds = shouldSplitOnPredicatedArgument(CB, DTU);
485 if (PredsWithConds.empty())
486 PredsWithConds = shouldSplitOnPHIPredicatedArgument(CB);
487 if (PredsWithConds.empty())
488 return false;
489
490 splitCallSite(CB, PredsWithConds, DTU);
491 return true;
492}
493
496
497 DomTreeUpdater DTU(&DT, DomTreeUpdater::UpdateStrategy::Lazy);
498 bool Changed = false;
500 auto II = BB.getFirstNonPHIOrDbg()->getIterator();
501 auto IE = BB.getTerminator()->getIterator();
502 // Iterate until we reach the terminator instruction. tryToSplitCallSite
503 // can replace BB's terminator in case BB is a successor of itself. In that
504 // case, IE will be invalidated and we also have to check the current
505 // terminator.
506 while (II != IE && &*II != BB.getTerminator()) {
507 CallBase *CB = dyn_cast<CallBase>(&*II++);
508 if (!CB || isa<IntrinsicInst>(CB) || isInstructionTriviallyDead(CB, &TLI))
509 continue;
510
511 Function *Callee = CB->getCalledFunction();
512 if (!Callee || Callee->isDeclaration())
513 continue;
514
515 // Successful musttail call-site splits result in erased CI and erased BB.
516 // Check if such path is possible before attempting the splitting.
517 bool IsMustTail = CB->isMustTailCall();
518
519 Changed |= tryToSplitCallSite(*CB, TTI, DTU);
520
521 // There're no interesting instructions after this. The call site
522 // itself might have been erased on splitting.
523 if (IsMustTail)
524 break;
525 }
526 }
527 return Changed;
528}
529
532 auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
533 auto &TTI = AM.getResult<TargetIRAnalysis>(F);
534 auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
535
536 if (!doCallSiteSplitting(F, TLI, TTI, DT))
537 return PreservedAnalyses::all();
540 return PA;
541}
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 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 void addNonNullAttribute(CallBase &CB, Value *Op)
static void setConstantInArgument(CallBase &CB, Value *Op, Constant *ConstValue)
static bool canSplitCallSite(CallBase &CB, TargetTransformInfo &TTI)
static Instruction * cloneInstForMustTail(Instruction *I, BasicBlock::iterator Before, Value *V)
static bool tryToSplitCallSite(CallBase &CB, TargetTransformInfo &TTI, DomTreeUpdater &DTU)
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:446
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
Definition BasicBlock.h:515
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
reverse_iterator rend()
Definition BasicBlock.h:464
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:689
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:43
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constant.h:64
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:553
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
static cl::opt< unsigned long > StopAt("sbvec-stop-at", cl::init(StopAtDisabled), cl::Hidden, cl::desc("Vectorize if the invocation count is < than this. 0 " "disables vectorization."))
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
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:406
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.