mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 19:31:58 +00:00
When we find a reaching definition, make sure it is visited from all paths by
erasing it from the visited set. That ensures we create the right phi defs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115666 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fc60d7729b
commit
984a7fc32c
@ -424,10 +424,14 @@ VNInfo *LiveIntervalMap::mapValue(const VNInfo *ParentVNI, SlotIndex Idx,
|
||||
// This may change during the DFS as we create new phi-defs.
|
||||
typedef DenseMap<MachineBasicBlock*, VNInfo*> MBBValueMap;
|
||||
MBBValueMap DomValue;
|
||||
typedef SplitAnalysis::BlockPtrSet BlockPtrSet;
|
||||
BlockPtrSet Visited;
|
||||
|
||||
for (idf_iterator<MachineBasicBlock*>
|
||||
IDFI = idf_begin(IdxMBB),
|
||||
IDFE = idf_end(IdxMBB); IDFI != IDFE;) {
|
||||
// Iterate over IdxMBB predecessors in a depth-first order.
|
||||
// Skip begin() since that is always IdxMBB.
|
||||
for (idf_ext_iterator<MachineBasicBlock*, BlockPtrSet>
|
||||
IDFI = llvm::next(idf_ext_begin(IdxMBB, Visited)),
|
||||
IDFE = idf_ext_end(IdxMBB, Visited); IDFI != IDFE;) {
|
||||
MachineBasicBlock *MBB = *IDFI;
|
||||
SlotIndex End = lis_.getMBBEndIdx(MBB).getPrevSlot();
|
||||
|
||||
@ -444,7 +448,10 @@ VNInfo *LiveIntervalMap::mapValue(const VNInfo *ParentVNI, SlotIndex Idx,
|
||||
continue;
|
||||
}
|
||||
|
||||
// Yes, VNI dominates MBB. Track the path back to IdxMBB, creating phi-defs
|
||||
// Yes, VNI dominates MBB. Make sure we visit MBB again from other paths.
|
||||
Visited.erase(MBB);
|
||||
|
||||
// Track the path back to IdxMBB, creating phi-defs
|
||||
// as needed along the way.
|
||||
for (unsigned PI = IDFI.getPathLength()-1; PI != 0; --PI) {
|
||||
// Start from MBB's immediate successor. End at IdxMBB.
|
||||
|
Loading…
Reference in New Issue
Block a user