LLVM 23.0.0git
SSAUpdater.cpp
Go to the documentation of this file.
1//===- SSAUpdater.cpp - Unstructured SSA Update Tool ----------------------===//
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 the SSAUpdater class.
10//
11//===----------------------------------------------------------------------===//
12
14#include "llvm/ADT/DenseMap.h"
15#include "llvm/ADT/STLExtras.h"
19#include "llvm/IR/BasicBlock.h"
20#include "llvm/IR/CFG.h"
21#include "llvm/IR/Constants.h"
22#include "llvm/IR/DebugInfo.h"
23#include "llvm/IR/DebugLoc.h"
24#include "llvm/IR/Instruction.h"
26#include "llvm/IR/Use.h"
27#include "llvm/IR/Value.h"
29#include "llvm/Support/Debug.h"
32#include <cassert>
33#include <utility>
34
35using namespace llvm;
36
37#define DEBUG_TYPE "ssaupdater"
38
40
42 return *static_cast<AvailableValsTy*>(AV);
43}
44
46 : InsertedPHIs(NewPHI) {}
47
49 delete static_cast<AvailableValsTy*>(AV);
50}
51
53 if (!AV)
54 AV = new AvailableValsTy();
55 else
57 ProtoType = Ty;
58 ProtoName = std::string(Name);
59}
60
62 return getAvailableVals(AV).count(BB);
63}
64
68
70 assert(ProtoType && "Need to initialize SSAUpdater");
71 assert(ProtoType == V->getType() &&
72 "All rewritten values must have the same type");
73 getAvailableVals(AV)[BB] = V;
74}
75
78 unsigned PHINumValues = PHI->getNumIncomingValues();
79 if (PHINumValues != ValueMapping.size())
80 return false;
81
82 // Scan the phi to see if it matches.
83 for (unsigned i = 0, e = PHINumValues; i != e; ++i)
84 if (ValueMapping[PHI->getIncomingBlock(i)] !=
85 PHI->getIncomingValue(i)) {
86 return false;
87 }
88
89 return true;
90}
91
93 Value *Res = GetValueAtEndOfBlockInternal(BB);
94 return Res;
95}
96
98 // If there is no definition of the renamed variable in this block, just use
99 // GetValueAtEndOfBlock to do our work.
100 if (!HasValueForBlock(BB))
101 return GetValueAtEndOfBlock(BB);
102
103 // Otherwise, we have the hard case. Get the live-in values for each
104 // predecessor.
106 Value *SingularValue = nullptr;
107
108 // We can get our predecessor info by walking the pred_iterator list, but it
109 // is relatively slow. If we already have PHI nodes in this block, walk one
110 // of them to get the predecessor list instead.
111 if (PHINode *SomePhi = dyn_cast<PHINode>(BB->begin())) {
112 for (unsigned i = 0, e = SomePhi->getNumIncomingValues(); i != e; ++i) {
113 BasicBlock *PredBB = SomePhi->getIncomingBlock(i);
114 Value *PredVal = GetValueAtEndOfBlock(PredBB);
115 PredValues.push_back(std::make_pair(PredBB, PredVal));
116
117 // Compute SingularValue.
118 if (i == 0)
119 SingularValue = PredVal;
120 else if (PredVal != SingularValue)
121 SingularValue = nullptr;
122 }
123 } else {
124 bool isFirstPred = true;
125 for (BasicBlock *PredBB : predecessors(BB)) {
126 Value *PredVal = GetValueAtEndOfBlock(PredBB);
127 PredValues.push_back(std::make_pair(PredBB, PredVal));
128
129 // Compute SingularValue.
130 if (isFirstPred) {
131 SingularValue = PredVal;
132 isFirstPred = false;
133 } else if (PredVal != SingularValue)
134 SingularValue = nullptr;
135 }
136 }
137
138 // If there are no predecessors, just return poison.
139 if (PredValues.empty())
140 return PoisonValue::get(ProtoType);
141
142 // Otherwise, if all the merged values are the same, just use it.
143 if (SingularValue)
144 return SingularValue;
145
146 // Otherwise, we do need a PHI: check to see if we already have one available
147 // in this block that produces the right value.
148 if (isa<PHINode>(BB->begin())) {
149 SmallDenseMap<BasicBlock *, Value *, 8> ValueMapping(PredValues.begin(),
150 PredValues.end());
151 for (PHINode &SomePHI : BB->phis()) {
152 if (IsEquivalentPHI(&SomePHI, ValueMapping))
153 return &SomePHI;
154 }
155 }
156
157 // Ok, we have no way out, insert a new one now.
158 PHINode *InsertedPHI =
159 PHINode::Create(ProtoType, PredValues.size(), ProtoName);
160 InsertedPHI->insertBefore(BB->begin());
161
162 // Fill in all the predecessors of the PHI.
163 for (const auto &PredValue : PredValues)
164 InsertedPHI->addIncoming(PredValue.second, PredValue.first);
165
166 // See if the PHI node can be merged to a single value. This can happen in
167 // loop cases when we get a PHI of itself and one other value.
168 if (Value *V =
169 simplifyInstruction(InsertedPHI, BB->getDataLayout())) {
170 InsertedPHI->eraseFromParent();
171 return V;
172 }
173
174 // Set the DebugLoc of the inserted PHI, if available.
175 DebugLoc DL;
176 if (BasicBlock::iterator It = BB->getFirstNonPHIIt(); It != BB->end())
177 DL = It->getDebugLoc();
178 InsertedPHI->setDebugLoc(DL);
179
180 // If the client wants to know about all new instructions, tell it.
181 if (InsertedPHIs) InsertedPHIs->push_back(InsertedPHI);
182
183 LLVM_DEBUG(dbgs() << " Inserted PHI: " << *InsertedPHI << "\n");
184 return InsertedPHI;
185}
186
188 Instruction *User = cast<Instruction>(U.getUser());
189
190 Value *V;
191 if (PHINode *UserPN = dyn_cast<PHINode>(User))
192 V = GetValueAtEndOfBlock(UserPN->getIncomingBlock(U));
193 else
194 V = GetValueInMiddleOfBlock(User->getParent());
195
196 U.set(V);
197}
198
200 SmallVector<DbgVariableRecord *, 4> DbgVariableRecords;
201 llvm::findDbgValues(I, DbgVariableRecords);
202 for (auto &DVR : DbgVariableRecords) {
203 if (DVR->getParent() == I->getParent())
204 continue;
205 UpdateDebugValue(I, DVR);
206 }
207}
208
210 Instruction *I, SmallVectorImpl<DbgVariableRecord *> &DbgVariableRecords) {
211 for (auto &DVR : DbgVariableRecords) {
212 UpdateDebugValue(I, DVR);
213 }
214}
215
216void SSAUpdater::UpdateDebugValue(Instruction *I, DbgVariableRecord *DVR) {
217 BasicBlock *UserBB = DVR->getParent();
218 if (HasValueForBlock(UserBB)) {
219 Value *NewVal = GetValueAtEndOfBlock(UserBB);
220 DVR->replaceVariableLocationOp(I, NewVal);
221 } else
222 DVR->setKillLocation();
223}
224
226 Instruction *User = cast<Instruction>(U.getUser());
227
228 Value *V;
229 if (PHINode *UserPN = dyn_cast<PHINode>(User))
230 V = GetValueAtEndOfBlock(UserPN->getIncomingBlock(U));
231 else
232 V = GetValueAtEndOfBlock(User->getParent());
233
234 U.set(V);
235}
236
237namespace llvm {
238
240 "ssaupdater-phi-search-limit",
241 cl::desc("Limit number of phi-nodes to be searched when "
242 "looking for an existing duplicate."),
243 cl::init(80), cl::Hidden);
244
245template<>
247public:
249 using ValT = Value *;
250 using PhiT = PHINode;
252
253 static BlkSucc_iterator BlkSucc_begin(BlkT *BB) { return succ_begin(BB); }
254 static BlkSucc_iterator BlkSucc_end(BlkT *BB) { return succ_end(BB); }
255
257 private:
258 PHINode *PHI;
259 unsigned idx;
260
261 public:
262 explicit PHI_iterator(PHINode *P) // begin iterator
263 : PHI(P), idx(0) {}
264 PHI_iterator(PHINode *P, bool) // end iterator
265 : PHI(P), idx(PHI->getNumIncomingValues()) {}
266
267 PHI_iterator &operator++() { ++idx; return *this; }
268 bool operator==(const PHI_iterator& x) const { return idx == x.idx; }
269 bool operator!=(const PHI_iterator& x) const { return !operator==(x); }
270
271 Value *getIncomingValue() { return PHI->getIncomingValue(idx); }
272 BasicBlock *getIncomingBlock() { return PHI->getIncomingBlock(idx); }
273 };
274
277 return PHI_iterator(PHI, true);
278 }
279
280 /// FindPredecessorBlocks - Put the predecessors of Info->BB into the Preds
281 /// vector, set Info->NumPreds, and allocate space in Info->Preds.
284 // We can get our predecessor info by walking the pred_iterator list,
285 // but it is relatively slow. If we already have PHI nodes in this
286 // block, walk one of them to get the predecessor list instead.
287 if (PHINode *SomePhi = dyn_cast<PHINode>(BB->begin()))
288 append_range(*Preds, SomePhi->blocks());
289 else
290 append_range(*Preds, predecessors(BB));
291 }
292
293 /// GetPoisonVal - Get a poison value of the same type as the value
294 /// being handled.
295 static Value *GetPoisonVal(BasicBlock *BB, SSAUpdater *Updater) {
296 return PoisonValue::get(Updater->ProtoType);
297 }
298
299 /// CreateEmptyPHI - Create a new PHI instruction in the specified block.
300 /// Reserve space for the operands but do not fill them in yet.
301 static Value *CreateEmptyPHI(BasicBlock *BB, unsigned NumPreds,
302 SSAUpdater *Updater) {
303 PHINode *PHI =
304 PHINode::Create(Updater->ProtoType, NumPreds, Updater->ProtoName);
305 // FIXME: Ordinarily we don't care about or try to assign DebugLocs to PHI
306 // nodes, but loop optimizations may try to use a PHI node as a DebugLoc
307 // source (e.g. if this is an induction variable), and it's not clear what
308 // location we could attach here, so mark this unknown for now.
309 PHI->setDebugLoc(DebugLoc::getUnknown());
310 PHI->insertBefore(BB->begin());
311 return PHI;
312 }
313
314 /// AddPHIOperand - Add the specified value as an operand of the PHI for
315 /// the specified predecessor block.
316 static void AddPHIOperand(PHINode *PHI, Value *Val, BasicBlock *Pred) {
317 PHI->addIncoming(Val, Pred);
318 }
319
320 /// ValueIsPHI - Check if a value is a PHI.
321 static PHINode *ValueIsPHI(Value *Val, SSAUpdater *Updater) {
322 return dyn_cast<PHINode>(Val);
323 }
324
325 /// ValueIsNewPHI - Like ValueIsPHI but also check if the PHI has no source
326 /// operands, i.e., it was just added.
327 static PHINode *ValueIsNewPHI(Value *Val, SSAUpdater *Updater) {
328 PHINode *PHI = ValueIsPHI(Val, Updater);
329 if (PHI && PHI->getNumIncomingValues() == 0)
330 return PHI;
331 return nullptr;
332 }
333
334 /// GetPHIValue - For the specified PHI instruction, return the value
335 /// that it defines.
337 return PHI;
338 }
339};
340
341} // end namespace llvm
342
343/// Check to see if AvailableVals has an entry for the specified BB and if so,
344/// return it. If not, construct SSA form by first calculating the required
345/// placement of PHIs and then inserting new PHIs where needed.
346Value *SSAUpdater::GetValueAtEndOfBlockInternal(BasicBlock *BB) {
347 AvailableValsTy &AvailableVals = getAvailableVals(AV);
348 if (Value *V = AvailableVals[BB])
349 return V;
350
351 SSAUpdaterImpl<SSAUpdater> Impl(this, &AvailableVals, InsertedPHIs);
352 return Impl.GetValue(BB);
353}
354
355//===----------------------------------------------------------------------===//
356// LoadAndStorePromoter Implementation
357//===----------------------------------------------------------------------===//
358
361 SSAUpdater &S, StringRef BaseName) : SSA(S) {
362 if (Insts.empty()) return;
363
364 const Value *SomeVal;
365 if (const LoadInst *LI = dyn_cast<LoadInst>(Insts[0]))
366 SomeVal = LI;
367 else
368 SomeVal = cast<StoreInst>(Insts[0])->getOperand(0);
369
370 if (BaseName.empty())
371 BaseName = SomeVal->getName();
372 SSA.Initialize(SomeVal->getType(), BaseName);
373}
374
376 // First step: bucket up uses of the alloca by the block they occur in.
377 // This is important because we have to handle multiple defs/uses in a block
378 // ourselves: SSAUpdater is purely for cross-block references.
380
381 for (Instruction *User : Insts)
382 UsesByBlock[User->getParent()].push_back(User);
383
384 // Okay, now we can iterate over all the blocks in the function with uses,
385 // processing them. Keep track of which loads are loading a live-in value.
386 // Walk the uses in the use-list order to be determinstic.
387 SmallVector<LoadInst *, 32> LiveInLoads;
388 DenseMap<Value *, Value *> ReplacedLoads;
389
390 for (Instruction *User : Insts) {
391 BasicBlock *BB = User->getParent();
392 TinyPtrVector<Instruction *> &BlockUses = UsesByBlock[BB];
393
394 // If this block has already been processed, ignore this repeat use.
395 if (BlockUses.empty()) continue;
396
397 // Okay, this is the first use in the block. If this block just has a
398 // single user in it, we can rewrite it trivially.
399 if (BlockUses.size() == 1) {
400 // If it is a store, it is a trivial def of the value in the block.
403 SSA.AddAvailableValue(BB, SI->getOperand(0));
404 } else if (auto *AI = dyn_cast<AllocaInst>(User)) {
405 // We treat AllocaInst as a store of an getValueToUseForAlloca value.
406 SSA.AddAvailableValue(BB, getValueToUseForAlloca(AI));
407 } else {
408 // Otherwise it is a load, queue it to rewrite as a live-in load.
409 LiveInLoads.push_back(cast<LoadInst>(User));
410 }
411 BlockUses.clear();
412 continue;
413 }
414
415 // Otherwise, check to see if this block is all loads.
416 bool HasStore = false;
417 for (Instruction *I : BlockUses) {
419 HasStore = true;
420 break;
421 }
422 }
423
424 // If so, we can queue them all as live in loads.
425 if (!HasStore) {
426 for (Instruction *I : BlockUses)
427 LiveInLoads.push_back(cast<LoadInst>(I));
428 BlockUses.clear();
429 continue;
430 }
431
432 // Sort all of the interesting instructions in the block so that we don't
433 // have to scan a large block just to find a few instructions.
435 BlockUses.begin(), BlockUses.end(),
436 [](Instruction *A, Instruction *B) { return A->comesBefore(B); });
437
438 // Otherwise, we have mixed loads and stores (or just a bunch of stores).
439 // Since SSAUpdater is purely for cross-block values, we need to determine
440 // the order of these instructions in the block. If the first use in the
441 // block is a load, then it uses the live in value. The last store defines
442 // the live out value.
443 Value *StoredValue = nullptr;
444 for (Instruction *I : BlockUses) {
445 if (LoadInst *L = dyn_cast<LoadInst>(I)) {
446 // If we haven't seen a store yet, this is a live in use, otherwise
447 // use the stored value.
448 if (StoredValue) {
449 replaceLoadWithValue(L, StoredValue);
450 L->replaceAllUsesWith(StoredValue);
451 ReplacedLoads[L] = StoredValue;
452 } else {
453 LiveInLoads.push_back(L);
454 }
455 continue;
456 }
457
460
461 // Remember that this is the active value in the block.
462 StoredValue = SI->getOperand(0);
463 } else if (auto *AI = dyn_cast<AllocaInst>(I)) {
464 // Check if this an alloca, in which case we treat it as a store of
465 // getValueToUseForAlloca.
466 StoredValue = getValueToUseForAlloca(AI);
467 }
468 }
469
470 // The last stored value that happened is the live-out for the block.
471 assert(StoredValue && "Already checked that there is a store in block");
472 SSA.AddAvailableValue(BB, StoredValue);
473 BlockUses.clear();
474 }
475
476 // Okay, now we rewrite all loads that use live-in values in the loop,
477 // inserting PHI nodes as necessary.
478 for (LoadInst *ALoad : LiveInLoads) {
479 Value *NewVal = SSA.GetValueInMiddleOfBlock(ALoad->getParent());
480 replaceLoadWithValue(ALoad, NewVal);
481
482 // Avoid assertions in unreachable code.
483 if (NewVal == ALoad) NewVal = PoisonValue::get(NewVal->getType());
484 ALoad->replaceAllUsesWith(NewVal);
485 ReplacedLoads[ALoad] = NewVal;
486 }
487
488 // Allow the client to do stuff before we start nuking things.
490
491 // Now that everything is rewritten, delete the old instructions from the
492 // function. They should all be dead now.
493 for (Instruction *User : Insts) {
494 if (!shouldDelete(User))
495 continue;
496
497 // If this is a load that still has uses, then the load must have been added
498 // as a live value in the SSAUpdate data structure for a block (e.g. because
499 // the loaded value was stored later). In this case, we need to recursively
500 // propagate the updates until we get to the real value.
501 if (!User->use_empty()) {
502 Value *NewVal = ReplacedLoads[User];
503 assert(NewVal && "not a replaced load?");
504
505 // Propagate down to the ultimate replacee. The intermediately loads
506 // could theoretically already have been deleted, so we don't want to
507 // dereference the Value*'s.
508 auto RLI = ReplacedLoads.find(NewVal);
509 while (RLI != ReplacedLoads.end()) {
510 NewVal = RLI->second;
511 RLI = ReplacedLoads.find(NewVal);
512 }
513
515 User->replaceAllUsesWith(NewVal);
516 }
517
519 User->eraseFromParent();
520 }
521}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Rewrite undef for PHI
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This defines the Use class.
#define I(x, y, z)
Definition MD5.cpp:57
static AvailableValsTy & getAvailableVals(void *AV)
DenseMap< MachineBasicBlock *, Register > AvailableValsTy
#define P(N)
if(PassOpts->AAPipeline)
static AvailableValsTy & getAvailableVals(void *AV)
static bool IsEquivalentPHI(PHINode *PHI, SmallDenseMap< BasicBlock *, Value *, 8 > &ValueMapping)
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator end()
Definition BasicBlock.h:474
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:461
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
Definition BasicBlock.h:530
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this basic block belongs to.
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
LLVM_ABI const BasicBlock * getParent() const
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LLVM_ABI void replaceVariableLocationOp(Value *OldValue, Value *NewValue, bool AllowEmpty=false)
A debug info location.
Definition DebugLoc.h:123
static DebugLoc getUnknown()
Definition DebugLoc.h:161
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
Definition DenseMap.h:205
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:178
unsigned size() const
Definition DenseMap.h:110
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
Definition DenseMap.h:174
iterator end()
Definition DenseMap.h:81
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.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
virtual Value * getValueToUseForAlloca(Instruction *AI) const
Return the value to use for the point in the code that the alloca is positioned.
Definition SSAUpdater.h:184
virtual void instructionDeleted(Instruction *I) const
Called before each instruction is deleted.
Definition SSAUpdater.h:172
virtual void doExtraRewritesBeforeFinalDeletion()
This hook is invoked after all the stores are found and inserted as available values.
Definition SSAUpdater.h:165
LoadAndStorePromoter(ArrayRef< const Instruction * > Insts, SSAUpdater &S, StringRef Name=StringRef())
virtual void replaceLoadWithValue(LoadInst *LI, Value *V) const
Clients can choose to implement this to get notified right before a load is RAUW'd another value.
Definition SSAUpdater.h:169
void run(const SmallVectorImpl< Instruction * > &Insts)
This does the promotion.
virtual void updateDebugInfo(Instruction *I) const
Called to update debug info associated with the instruction.
Definition SSAUpdater.h:175
virtual bool shouldDelete(Instruction *I) const
Return false if a sub-class wants to keep one of the loads/stores after the SSA construction.
Definition SSAUpdater.h:179
An instruction for reading from memory.
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...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
bool operator!=(const PHI_iterator &x) const
bool operator==(const PHI_iterator &x) const
static BlkSucc_iterator BlkSucc_end(BlkT *BB)
static BlkSucc_iterator BlkSucc_begin(BlkT *BB)
static void FindPredecessorBlocks(BasicBlock *BB, SmallVectorImpl< BasicBlock * > *Preds)
FindPredecessorBlocks - Put the predecessors of Info->BB into the Preds vector, set Info->NumPreds,...
static Value * CreateEmptyPHI(BasicBlock *BB, unsigned NumPreds, SSAUpdater *Updater)
CreateEmptyPHI - Create a new PHI instruction in the specified block.
static PHINode * ValueIsNewPHI(Value *Val, SSAUpdater *Updater)
ValueIsNewPHI - Like ValueIsPHI but also check if the PHI has no source operands, i....
static PHI_iterator PHI_begin(PhiT *PHI)
static void AddPHIOperand(PHINode *PHI, Value *Val, BasicBlock *Pred)
AddPHIOperand - Add the specified value as an operand of the PHI for the specified predecessor block.
static Value * GetPHIValue(PHINode *PHI)
GetPHIValue - For the specified PHI instruction, return the value that it defines.
static Value * GetPoisonVal(BasicBlock *BB, SSAUpdater *Updater)
GetPoisonVal - Get a poison value of the same type as the value being handled.
static PHI_iterator PHI_end(PhiT *PHI)
static PHINode * ValueIsPHI(Value *Val, SSAUpdater *Updater)
ValueIsPHI - Check if a value is a PHI.
Helper class for SSA formation on a set of values defined in multiple blocks.
Definition SSAUpdater.h:39
void RewriteUse(Use &U)
Rewrite a use of the symbolic value.
void RewriteUseAfterInsertions(Use &U)
Rewrite a use like RewriteUse but handling in-block definitions.
Value * FindValueForBlock(BasicBlock *BB) const
Return the value for the specified block if the SSAUpdater has one, otherwise return nullptr.
void Initialize(Type *Ty, StringRef Name)
Reset this object to get ready for a new set of SSA updates with type 'Ty'.
Value * GetValueInMiddleOfBlock(BasicBlock *BB)
Construct SSA form, materializing a value that is live in the middle of the specified block.
SSAUpdater(SmallVectorImpl< PHINode * > *InsertedPHIs=nullptr)
If InsertedPHIs is specified, it will be filled in with all PHI Nodes created by rewriting.
void UpdateDebugValues(Instruction *I)
Rewrite debug value intrinsics to conform to a new SSA form.
bool HasValueForBlock(BasicBlock *BB) const
Return true if the SSAUpdater already has a value for the specified block.
Value * GetValueAtEndOfBlock(BasicBlock *BB)
Construct SSA form, materializing a value that is live at the end of the specified block.
void AddAvailableValue(BasicBlock *BB, Value *V)
Indicate that a rewritten value is available in the specified block with the specified value.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
TinyPtrVector - This class is specialized for cases where there are normally 0 or 1 element in a vect...
unsigned size() const
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
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:346
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
LLVM_ABI void findDbgValues(Value *V, SmallVectorImpl< DbgVariableRecord * > &DbgVariableRecords)
Finds the dbg.values describing a value.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2207
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
cl::opt< unsigned > SSAUpdaterPhiSearchLimit
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1635
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
RNSuccIterator< NodeRef, BlockT, RegionT > succ_begin(NodeRef Node)
RNSuccIterator< NodeRef, BlockT, RegionT > succ_end(NodeRef Node)
Instruction::succ_iterator succ_iterator
Definition CFG.h:138
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)