We also need to collect the VN IDs for the PHI instructions for later updating.
authorOwen Anderson <resistor@mac.com>
Wed, 12 Mar 2008 04:22:57 +0000 (04:22 +0000)
committerOwen Anderson <resistor@mac.com>
Wed, 12 Mar 2008 04:22:57 +0000 (04:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48278 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/StrongPHIElimination.cpp

index 6467afe28f278ce27f1025a14045bc63aeb1c2c9..9dd7ddc62d0415140f72a1491c346e142cc83eee 100644 (file)
@@ -52,8 +52,12 @@ namespace {
     std::set<unsigned> UsedByAnother;
     
     // RenameSets are the sets of operands (and their VNInfo IDs) to a PHI
-    // (the defining instruction of the key) that can be renamed without copies
+    // (the defining instruction of the key) that can be renamed without copies.
     std::map<unsigned, std::map<unsigned, unsigned> > RenameSets;
+    
+    // PhiValueNumber holds the ID numbers of the VNs for each phi that we're
+    // eliminating, indexed by the register defined by that phi.
+    std::map<unsigned, unsigned> PhiValueNumber;
 
     // Store the DFS-in number of each block
     DenseMap<MachineBasicBlock*, unsigned> preorder;
@@ -405,6 +409,11 @@ void StrongPHIElimination::processBlock(MachineBasicBlock* MBB) {
   while (P != MBB->end() && P->getOpcode() == TargetInstrInfo::PHI) {
     unsigned DestReg = P->getOperand(0).getReg();
 
+    LiveInterval& PI = LI.getOrCreateInterval(DestReg);
+    unsigned pIdx = LI.getInstructionIndex(P);
+    VNInfo* PVN = PI.getLiveRangeContaining(pIdx)->valno;
+    PhiValueNumber.insert(std::make_pair(DestReg, PVN->id));
+
     // PHIUnion is the set of incoming registers to the PHI node that
     // are going to be renames rather than having copies inserted.  This set
     // is refinded over the course of this function.  UnionedBlocks is the set