From: Dan Gohman Date: Wed, 4 Mar 2009 19:23:38 +0000 (+0000) Subject: When using MachineInstr operand indices on SDNodes, the number X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=b37a8206b6ba10c2bd59e19811dfd88091021556;p=oota-llvm.git When using MachineInstr operand indices on SDNodes, the number 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 --- diff --git a/lib/Target/X86/X86InstrInfo.cpp b/lib/Target/X86/X86InstrInfo.cpp index 1d1db14efe3..3de7dfce88a 100644 --- a/lib/Target/X86/X86InstrInfo.cpp +++ b/lib/Target/X86/X86InstrInfo.cpp @@ -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 AddrOps; std::vector BeforeOps; std::vector 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);