Do not insert multiple initializations for the same value in a PHI node
authorChris Lattner <sabre@nondot.org>
Mon, 12 May 2003 14:22:21 +0000 (14:22 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 12 May 2003 14:22:21 +0000 (14:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6113 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/InstSelectSimple.cpp
lib/Target/X86/X86ISelSimple.cpp

index 1b5ab7a4ae6ae8dd6b85f401aca193c1169a367d..4a2474193843ce4231895a653a0787f6cc3fd29c 100644 (file)
@@ -493,18 +493,38 @@ void ISel::SelectPHINodes() {
        MBB->insert(MBB->begin()+NumPHIs++, LongPhiMI);
       }
 
+      // PHIValues - Map of blocks to incoming virtual registers.  We use this
+      // so that we only initialize one incoming value for a particular block,
+      // even if the block has multiple entries in the PHI node.
+      //
+      std::map<MachineBasicBlock*, unsigned> PHIValues;
+
       for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
         MachineBasicBlock *PredMBB = MBBMap[PN->getIncomingBlock(i)];
+        unsigned ValReg;
+        std::map<MachineBasicBlock*, unsigned>::iterator EntryIt =
+          PHIValues.lower_bound(PredMBB);
+
+        if (EntryIt != PHIValues.end() && EntryIt->first == PredMBB) {
+          // We already inserted an initialization of the register for this
+          // predecessor.  Recycle it.
+          ValReg = EntryIt->second;
+
+        } else {        
+          // Get the incoming value into a virtual register.  If it is not
+          // already available in a virtual register, insert the computation
+          // code into PredMBB
+          //
+          MachineBasicBlock::iterator PI = PredMBB->end();
+          while (PI != PredMBB->begin() &&
+                 TII.isTerminatorInstr((*(PI-1))->getOpcode()))
+            --PI;
+          ValReg = getReg(PN->getIncomingValue(i), PredMBB, PI);
+
+          // Remember that we inserted a value for this PHI for this predecessor
+          PHIValues.insert(EntryIt, std::make_pair(PredMBB, ValReg));
+        }
 
-        // Get the incoming value into a virtual register.  If it is not already
-        // available in a virtual register, insert the computation code into
-        // PredMBB
-        //
-       MachineBasicBlock::iterator PI = PredMBB->end();
-       while (PI != PredMBB->begin() &&
-              TII.isTerminatorInstr((*(PI-1))->getOpcode()))
-         --PI;
-       unsigned ValReg = getReg(PN->getIncomingValue(i), PredMBB, PI);
        PhiMI->addRegOperand(ValReg);
         PhiMI->addMachineBasicBlockOperand(PredMBB);
        if (LongPhiMI) {
index 1b5ab7a4ae6ae8dd6b85f401aca193c1169a367d..4a2474193843ce4231895a653a0787f6cc3fd29c 100644 (file)
@@ -493,18 +493,38 @@ void ISel::SelectPHINodes() {
        MBB->insert(MBB->begin()+NumPHIs++, LongPhiMI);
       }
 
+      // PHIValues - Map of blocks to incoming virtual registers.  We use this
+      // so that we only initialize one incoming value for a particular block,
+      // even if the block has multiple entries in the PHI node.
+      //
+      std::map<MachineBasicBlock*, unsigned> PHIValues;
+
       for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
         MachineBasicBlock *PredMBB = MBBMap[PN->getIncomingBlock(i)];
+        unsigned ValReg;
+        std::map<MachineBasicBlock*, unsigned>::iterator EntryIt =
+          PHIValues.lower_bound(PredMBB);
+
+        if (EntryIt != PHIValues.end() && EntryIt->first == PredMBB) {
+          // We already inserted an initialization of the register for this
+          // predecessor.  Recycle it.
+          ValReg = EntryIt->second;
+
+        } else {        
+          // Get the incoming value into a virtual register.  If it is not
+          // already available in a virtual register, insert the computation
+          // code into PredMBB
+          //
+          MachineBasicBlock::iterator PI = PredMBB->end();
+          while (PI != PredMBB->begin() &&
+                 TII.isTerminatorInstr((*(PI-1))->getOpcode()))
+            --PI;
+          ValReg = getReg(PN->getIncomingValue(i), PredMBB, PI);
+
+          // Remember that we inserted a value for this PHI for this predecessor
+          PHIValues.insert(EntryIt, std::make_pair(PredMBB, ValReg));
+        }
 
-        // Get the incoming value into a virtual register.  If it is not already
-        // available in a virtual register, insert the computation code into
-        // PredMBB
-        //
-       MachineBasicBlock::iterator PI = PredMBB->end();
-       while (PI != PredMBB->begin() &&
-              TII.isTerminatorInstr((*(PI-1))->getOpcode()))
-         --PI;
-       unsigned ValReg = getReg(PN->getIncomingValue(i), PredMBB, PI);
        PhiMI->addRegOperand(ValReg);
         PhiMI->addMachineBasicBlockOperand(PredMBB);
        if (LongPhiMI) {