- If the reaching definition is an undef and the use is a PHI, add the implicit_def...
authorEvan Cheng <evan.cheng@apple.com>
Fri, 4 Dec 2009 00:09:05 +0000 (00:09 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Fri, 4 Dec 2009 00:09:05 +0000 (00:09 +0000)
- When reaching value is replaced with another, update the cache as well.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@90501 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/MachineSSAUpdater.cpp

index 644cb9d46b667a74d9a09dadb5ceb497910da014..31662b3494a9ebb127127e287be7c7052e6f970e 100644 (file)
@@ -194,17 +194,22 @@ void MachineSSAUpdater::RewriteUse(MachineOperand &U) {
   if (UseMI->getOpcode() == TargetInstrInfo::PHI) {
     MachineBasicBlock *SourceBB = findCorrespondingPred(UseMI, &U);
     NewVR = GetValueAtEndOfBlock(SourceBB);
-  } else {
-    NewVR = GetValueInMiddleOfBlock(UseMI->getParent());
-  }
-
-  if (NewVR == ~0U) {
     // Insert an implicit_def to represent an undef value.
     MachineInstr *NewDef = InsertNewDef(TargetInstrInfo::IMPLICIT_DEF,
-                                        UseMI->getParent(), UseMI, VRC,MRI,TII);
+                                        SourceBB,SourceBB->getFirstTerminator(),
+                                        VRC, MRI, TII);
     NewVR = NewDef->getOperand(0).getReg();
+  } else {
+    NewVR = GetValueInMiddleOfBlock(UseMI->getParent());
+    if (NewVR == ~0U) {
+      // Insert an implicit_def to represent an undef value.
+      MachineInstr *NewDef = InsertNewDef(TargetInstrInfo::IMPLICIT_DEF,
+                                          UseMI->getParent(), UseMI,
+                                          VRC, MRI, TII);
+      NewVR = NewDef->getOperand(0).getReg();
+    }
   }
-    
+
   U.setReg(NewVR);
 }
 
@@ -281,7 +286,7 @@ unsigned MachineSSAUpdater::GetValueAtEndOfBlockInternal(MachineBasicBlock *BB){
   /// this block is involved in a loop, a no-entry PHI node will have been
   /// inserted as InsertedVal.  Otherwise, we'll still have the null we inserted
   /// above.
-  unsigned InsertedVal = AvailableVals[BB];
+  unsigned &InsertedVal = AvailableVals[BB];
 
   // If all the predecessor values are the same then we don't need to insert a
   // PHI.  This is the simple and common case.
@@ -294,10 +299,10 @@ unsigned MachineSSAUpdater::GetValueAtEndOfBlockInternal(MachineBasicBlock *BB){
       assert(InsertedVal != SingularValue && "Dead loop?");
       MRI->replaceRegWith(InsertedVal, SingularValue);
       OldVal->eraseFromParent();
-    } else {
-      InsertedVal = SingularValue;
     }
 
+    InsertedVal = SingularValue;
+
     // Drop the entries we added in IncomingPredInfo to restore the stack.
     IncomingPredInfo.erase(IncomingPredInfo.begin()+FirstPredInfoEntry,
                            IncomingPredInfo.end());
@@ -348,5 +353,4 @@ unsigned MachineSSAUpdater::GetValueAtEndOfBlockInternal(MachineBasicBlock *BB){
   }
 
   return InsertedVal;
-
 }