mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
MSSA: Factor out phi node placement
llvm-svn: 279462
This commit is contained in:
parent
56831e2edc
commit
0d6d72f476
@ -616,6 +616,8 @@ private:
|
||||
MemoryAccess *findDominatingDef(BasicBlock *, enum InsertionPlace);
|
||||
void removeFromLookups(MemoryAccess *);
|
||||
|
||||
void placePHINodes(const SmallPtrSetImpl<BasicBlock *> &,
|
||||
const SmallPtrSetImpl<BasicBlock *> &);
|
||||
MemoryAccess *renameBlock(BasicBlock *, MemoryAccess *);
|
||||
void renamePass(DomTreeNode *, MemoryAccess *IncomingVal,
|
||||
SmallPtrSet<BasicBlock *, 16> &Visited);
|
||||
|
@ -1459,6 +1459,27 @@ void MemorySSA::OptimizeUses::optimizeUses() {
|
||||
LocStackInfo);
|
||||
}
|
||||
|
||||
void MemorySSA::placePHINodes(
|
||||
const SmallPtrSetImpl<BasicBlock *> &DefiningBlocks,
|
||||
const SmallPtrSetImpl<BasicBlock *> &LiveInBlocks) {
|
||||
// Determine where our MemoryPhi's should go
|
||||
ForwardIDFCalculator IDFs(*DT);
|
||||
IDFs.setDefiningBlocks(DefiningBlocks);
|
||||
IDFs.setLiveInBlocks(LiveInBlocks);
|
||||
SmallVector<BasicBlock *, 32> IDFBlocks;
|
||||
IDFs.calculate(IDFBlocks);
|
||||
|
||||
// Now place MemoryPhi nodes.
|
||||
for (auto &BB : IDFBlocks) {
|
||||
// Insert phi node
|
||||
AccessList *Accesses = getOrCreateAccessList(BB);
|
||||
MemoryPhi *Phi = new MemoryPhi(BB->getContext(), BB, NextID++);
|
||||
ValueToMemoryAccess[BB] = Phi;
|
||||
// Phi's always are placed at the front of the block.
|
||||
Accesses->push_front(Phi);
|
||||
}
|
||||
}
|
||||
|
||||
void MemorySSA::buildMemorySSA() {
|
||||
// We create an access to represent "live on entry", for things like
|
||||
// arguments or users of globals, where the memory they use is defined before
|
||||
@ -1528,23 +1549,7 @@ void MemorySSA::buildMemorySSA() {
|
||||
// live into it to.
|
||||
LiveInBlockWorklist.append(pred_begin(BB), pred_end(BB));
|
||||
}
|
||||
|
||||
// Determine where our MemoryPhi's should go
|
||||
ForwardIDFCalculator IDFs(*DT);
|
||||
IDFs.setDefiningBlocks(DefiningBlocks);
|
||||
IDFs.setLiveInBlocks(LiveInBlocks);
|
||||
SmallVector<BasicBlock *, 32> IDFBlocks;
|
||||
IDFs.calculate(IDFBlocks);
|
||||
|
||||
// Now place MemoryPhi nodes.
|
||||
for (auto &BB : IDFBlocks) {
|
||||
// Insert phi node
|
||||
AccessList *Accesses = getOrCreateAccessList(BB);
|
||||
MemoryPhi *Phi = new MemoryPhi(BB->getContext(), BB, NextID++);
|
||||
ValueToMemoryAccess[BB] = Phi;
|
||||
// Phi's always are placed at the front of the block.
|
||||
Accesses->push_front(Phi);
|
||||
}
|
||||
placePHINodes(DefiningBlocks, LiveInBlocks);
|
||||
|
||||
// Now do regular SSA renaming on the MemoryDef/MemoryUse. Visited will get
|
||||
// filled in with all blocks.
|
||||
|
Loading…
Reference in New Issue
Block a user