From: Vikram S. Adve Date: Sun, 4 Aug 2002 20:51:05 +0000 (+0000) Subject: Bug fix in SetOperandsForMemInstr: handle leading zeros correctly X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=99d4a38c77cf26706d5deedf170748a6fc4e97d8;p=oota-llvm.git Bug fix in SetOperandsForMemInstr: handle leading zeros correctly when folding or not folding GEPs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3245 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/SparcV9/SparcV9InstrSelection.cpp b/lib/Target/SparcV9/SparcV9InstrSelection.cpp index b9dcd6deb16..1b27d32583c 100644 --- a/lib/Target/SparcV9/SparcV9InstrSelection.cpp +++ b/lib/Target/SparcV9/SparcV9InstrSelection.cpp @@ -995,18 +995,22 @@ SetOperandsForMemInstr(vector& mvec, // If we have only constant indices, fold chains of constant indices // in this and any preceding GetElemPtr instructions. + bool foldedGEPs = false; if (allConstantIndices && (ptrChild->getOpLabel() == Instruction::GetElementPtr || ptrChild->getOpLabel() == GetElemPtrIdx)) - if (Value* newPtr = FoldGetElemChain((InstructionNode*) ptrChild, idxVec)) + if (Value* newPtr = FoldGetElemChain((InstructionNode*) ptrChild, idxVec)) { ptrVal = newPtr; + foldedGEPs = true; + } // Append the index vector of the current instruction, if any. - // Discard any leading [0] index. - if (memInst->getNumIndices() > 0) + // Skip the leading [0] index if preceding GEPs were folded into this. + if (memInst->getNumIndices() > 0) { + assert((!foldedGEPs || IsZero(*memInst->idx_begin())) && "1st index not 0"); idxVec.insert(idxVec.end(), - memInst->idx_begin() + IsZero(*memInst->idx_begin()), - memInst->idx_end()); + memInst->idx_begin() + foldedGEPs, memInst->idx_end()); + } // Now create the appropriate operands for the machine instruction SetMemOperands_Internal(mvec, mvecI, vmInstrNode,