37#define DEBUG_TYPE "ssaupdater"
46 : InsertedPHIs(NewPHI) {}
58 ProtoName = std::string(Name);
70 assert(ProtoType &&
"Need to initialize SSAUpdater");
71 assert(ProtoType == V->getType() &&
72 "All rewritten values must have the same type");
78 unsigned PHINumValues =
PHI->getNumIncomingValues();
79 if (PHINumValues != ValueMapping.
size())
83 for (
unsigned i = 0, e = PHINumValues; i != e; ++i)
84 if (ValueMapping[
PHI->getIncomingBlock(i)] !=
85 PHI->getIncomingValue(i)) {
93 Value *Res = GetValueAtEndOfBlockInternal(BB);
106 Value *SingularValue =
nullptr;
112 for (
unsigned i = 0, e = SomePhi->getNumIncomingValues(); i != e; ++i) {
113 BasicBlock *PredBB = SomePhi->getIncomingBlock(i);
115 PredValues.
push_back(std::make_pair(PredBB, PredVal));
119 SingularValue = PredVal;
120 else if (PredVal != SingularValue)
121 SingularValue =
nullptr;
124 bool isFirstPred =
true;
127 PredValues.
push_back(std::make_pair(PredBB, PredVal));
131 SingularValue = PredVal;
133 }
else if (PredVal != SingularValue)
134 SingularValue =
nullptr;
139 if (PredValues.
empty())
144 return SingularValue;
163 for (
const auto &PredValue : PredValues)
164 InsertedPHI->
addIncoming(PredValue.second, PredValue.first);
177 DL = It->getDebugLoc();
181 if (InsertedPHIs) InsertedPHIs->push_back(InsertedPHI);
202 for (
auto &DVR : DbgVariableRecords) {
203 if (DVR->getParent() ==
I->getParent())
205 UpdateDebugValue(
I, DVR);
211 for (
auto &DVR : DbgVariableRecords) {
212 UpdateDebugValue(
I, DVR);
259 : PHI(
P), idx(PHI->getNumIncomingValues()) {}
311 PHI->addIncoming(Val, Pred);
323 if (
PHI &&
PHI->getNumIncomingValues() == 0)
342 if (
Value *V = AvailableVals[BB])
345 SSAUpdaterImpl<SSAUpdater> Impl(
this, &AvailableVals, InsertedPHIs);
346 return Impl.GetValue(BB);
356 if (Insts.
empty())
return;
358 const Value *SomeVal;
364 if (BaseName.
empty())
365 BaseName = SomeVal->getName();
366 SSA.Initialize(SomeVal->getType(), BaseName);
376 UsesByBlock[
User->getParent()].push_back(
User);
389 if (BlockUses.
empty())
continue;
393 if (BlockUses.
size() == 1) {
397 SSA.AddAvailableValue(BB,
SI->getOperand(0));
410 bool HasStore =
false;
437 Value *StoredValue =
nullptr;
444 L->replaceAllUsesWith(StoredValue);
445 ReplacedLoads[L] = StoredValue;
456 StoredValue =
SI->getOperand(0);
465 assert(StoredValue &&
"Already checked that there is a store in block");
466 SSA.AddAvailableValue(BB, StoredValue);
472 for (
LoadInst *ALoad : LiveInLoads) {
473 Value *NewVal =
SSA.GetValueInMiddleOfBlock(ALoad->getParent());
478 ALoad->replaceAllUsesWith(NewVal);
479 ReplacedLoads[ALoad] = NewVal;
497 assert(NewVal &&
"not a replaced load?");
503 while (RLI != ReplacedLoads.
end()) {
504 NewVal = RLI->second;
505 RLI = ReplacedLoads.
find(NewVal);
513 User->eraseFromParent();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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.
static AvailableValsTy & getAvailableVals(void *AV)
DenseMap< MachineBasicBlock *, Register > AvailableValsTy
static AvailableValsTy & getAvailableVals(void *AV)
static bool IsEquivalentPHI(PHINode *PHI, SmallDenseMap< BasicBlock *, Value *, 8 > &ValueMapping)
This file defines the SmallVector class.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool empty() const
empty - Check if the array is empty.
LLVM Basic Block Representation.
iterator begin()
Instruction iterator methods.
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
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...
LLVM_ABI const BasicBlock * getParent() const
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LLVM_ABI void setKillLocation()
LLVM_ABI void replaceVariableLocationOp(Value *OldValue, Value *NewValue, bool AllowEmpty=false)
static DebugLoc getUnknown()
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
iterator find(const_arg_type_t< KeyT > Val)
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
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.
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.
Value * getIncomingValue()
BasicBlock * getIncomingBlock()
PHI_iterator(PHINode *P, bool)
PHI_iterator & operator++()
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)
succ_iterator BlkSucc_iterator
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.
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.
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
TinyPtrVector - This class is specialized for cases where there are normally 0 or 1 element in a vect...
The instances of the Type class are immutable: once they are created, they are never changed.
A Use represents the edge between a Value definition and its users.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
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.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
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.
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
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...
RNSuccIterator< NodeRef, BlockT, RegionT > succ_begin(NodeRef Node)
RNSuccIterator< NodeRef, BlockT, RegionT > succ_end(NodeRef Node)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
auto predecessors(const MachineBasicBlock *BB)
SuccIterator< Instruction, BasicBlock > succ_iterator