When adding a register, we should mark it as "def" if it can optionally define
authorBill Wendling <isanbard@gmail.com>
Mon, 30 Aug 2010 01:36:05 +0000 (01:36 +0000)
committerBill Wendling <isanbard@gmail.com>
Mon, 30 Aug 2010 01:36:05 +0000 (01:36 +0000)
said (physical) register.

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

lib/CodeGen/SelectionDAG/InstrEmitter.cpp

index 61c2a90e7edc082a6869d45303d9bc78038b1512..0b8a2db4f45832da357420a8daec10c44a1bdfaf 100644 (file)
@@ -253,7 +253,6 @@ unsigned InstrEmitter::getVR(SDValue Op,
   return I->second;
 }
 
   return I->second;
 }
 
-
 /// AddRegisterOperand - Add the specified register as an operand to the
 /// specified machine instr. Insert register copies if the register is
 /// not in the required register class.
 /// AddRegisterOperand - Add the specified register as an operand to the
 /// specified machine instr. Insert register copies if the register is
 /// not in the required register class.
@@ -337,7 +336,10 @@ void InstrEmitter::AddOperand(MachineInstr *MI, SDValue Op,
     const ConstantFP *CFP = F->getConstantFPValue();
     MI->addOperand(MachineOperand::CreateFPImm(CFP));
   } else if (RegisterSDNode *R = dyn_cast<RegisterSDNode>(Op)) {
     const ConstantFP *CFP = F->getConstantFPValue();
     MI->addOperand(MachineOperand::CreateFPImm(CFP));
   } else if (RegisterSDNode *R = dyn_cast<RegisterSDNode>(Op)) {
-    MI->addOperand(MachineOperand::CreateReg(R->getReg(), false));
+    unsigned Reg = R->getReg();
+    const TargetInstrDesc &TID = MI->getDesc();
+    MI->addOperand(MachineOperand::CreateReg(Reg,
+      (Reg == 0 || !TID.OpInfo) ? false : TID.OpInfo[IIOpNum].isOptionalDef()));
   } else if (GlobalAddressSDNode *TGA = dyn_cast<GlobalAddressSDNode>(Op)) {
     MI->addOperand(MachineOperand::CreateGA(TGA->getGlobal(), TGA->getOffset(),
                                             TGA->getTargetFlags()));
   } else if (GlobalAddressSDNode *TGA = dyn_cast<GlobalAddressSDNode>(Op)) {
     MI->addOperand(MachineOperand::CreateGA(TGA->getGlobal(), TGA->getOffset(),
                                             TGA->getTargetFlags()));