Forward operands into implicit uses as well as explicit ones.
authorVikram S. Adve <vadve@cs.uiuc.edu>
Sun, 14 Oct 2001 23:28:43 +0000 (23:28 +0000)
committerVikram S. Adve <vadve@cs.uiuc.edu>
Sun, 14 Oct 2001 23:28:43 +0000 (23:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@808 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/SparcV9/SparcV9InstrSelection.cpp

index d303f8eb9054145c353fd487e79947e2890ddb05..25b1d7b748dcbb2c8eaa2595f76acce36968baa4 100644 (file)
@@ -290,7 +290,6 @@ ChooseMovpccAfterSub(const InstructionNode* instrNode,
   return opCode;
 }
 
-
 static inline MachineOpCode
 ChooseConvertToFloatInstr(const InstructionNode* instrNode,
                           const Type* opType)
@@ -1277,7 +1276,8 @@ FixConstantOperands(const InstructionNode* vmInstrNode,
 
 // 
 // Substitute operand `operandNum' of the instruction in node `treeNode'
-// in place the use(s) of that instruction in node `parent'.
+// in place of the use(s) of that instruction in node `parent'.
+// Check both explicit and implicit operands!
 // 
 static void
 ForwardOperand(InstructionNode* treeNode,
@@ -1302,7 +1302,8 @@ ForwardOperand(InstructionNode* treeNode,
   for (unsigned i=0, N=mvec.size(); i < N; i++)
     {
       MachineInstr* minstr = mvec[i];
-      for (unsigned i=0, numOps=minstr->getNumOperands(); i < numOps; i++)
+      
+      for (unsigned i=0, numOps=minstr->getNumOperands(); i < numOps; ++i)
         {
           const MachineOperand& mop = minstr->getOperand(i);
           if (mop.getOperandType() == MachineOperand::MO_VirtualRegister &&
@@ -1312,6 +1313,10 @@ ForwardOperand(InstructionNode* treeNode,
                                            fwdOp);
             }
         }
+      
+      for (unsigned i=0, numOps=minstr->getNumImplicitRefs(); i < numOps; ++i)
+        if (minstr->getImplicitRef(i) == unusedOp)
+          minstr->setImplicitRef(i, fwdOp, minstr->implicitRefIsDefined(i));
     }
 }