When using MachineInstr operand indices on SDNodes, the number
authorDan Gohman <gohman@apple.com>
Wed, 4 Mar 2009 19:23:38 +0000 (19:23 +0000)
committerDan Gohman <gohman@apple.com>
Wed, 4 Mar 2009 19:23:38 +0000 (19:23 +0000)
of MachineInstr def operands must be subtracted out. This bug
was uncovered by the recent x86 EFLAGS optimization. Before
that, the only instructions that ever needed unfolding were
things like CMP32rm, where NumDefs is zero.

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

lib/Target/X86/X86InstrInfo.cpp

index 1d1db14efe315d8ffb8a1d6bed302293d91af81d..3de7dfce88a8878f0e0b7fe0f60e79496263e983 100644 (file)
@@ -2382,6 +2382,7 @@ X86InstrInfo::unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N,
   const TargetOperandInfo &TOI = TID.OpInfo[Index];
   const TargetRegisterClass *RC = TOI.isLookupPtrRegClass()
     ? RI.getPointerRegClass() : RI.getRegClass(TOI.RegClass);
+  unsigned NumDefs = TID.NumDefs;
   std::vector<SDValue> AddrOps;
   std::vector<SDValue> BeforeOps;
   std::vector<SDValue> AfterOps;
@@ -2389,11 +2390,11 @@ X86InstrInfo::unfoldMemoryOperand(SelectionDAG &DAG, SDNode *N,
   unsigned NumOps = N->getNumOperands();
   for (unsigned i = 0; i != NumOps-1; ++i) {
     SDValue Op = N->getOperand(i);
-    if (i >= Index && i < Index+4)
+    if (i >= Index-NumDefs && i < Index-NumDefs+4)
       AddrOps.push_back(Op);
-    else if (i < Index)
+    else if (i < Index-NumDefs)
       BeforeOps.push_back(Op);
-    else if (i > Index)
+    else if (i > Index-NumDefs)
       AfterOps.push_back(Op);
   }
   SDValue Chain = N->getOperand(NumOps-1);