diff options
author | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-03-31 18:56:51 +0000 |
---|---|---|
committer | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-03-31 18:56:51 +0000 |
commit | 1792779edffe9e41cb0c07298b4dd0ef4acb0f2a (patch) | |
tree | c372df06bf7be95e9bc4190f9032753cbbba9b23 /lib/CodeGen | |
parent | 1a53f03392ea21a47745430057f0b342129dd902 (diff) | |
download | external_llvm-1792779edffe9e41cb0c07298b4dd0ef4acb0f2a.zip external_llvm-1792779edffe9e41cb0c07298b4dd0ef4acb0f2a.tar.gz external_llvm-1792779edffe9e41cb0c07298b4dd0ef4acb0f2a.tar.bz2 |
Fix a bug in previous bug fix.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2069 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp b/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp index 67f79d5..ff43f04 100644 --- a/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp +++ b/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp @@ -97,7 +97,7 @@ GetConstantValueAsSignedInt(const Value *V, if (Val < INT64_MAX) // then safe to cast to signed return (int64_t)Val; } - + isValidConstant = false; return 0; } @@ -120,9 +120,14 @@ FoldGetElemChain(const InstructionNode* getElemInstrNode, MemAccessInst* getElemInst = (MemAccessInst*) getElemInstrNode->getInstruction(); - // Initialize return values from the incoming instruction + // Return NULL if we don't fold any instructions in. Value* ptrVal = NULL; - assert(chainIdxVec.size() == 0); + + // The incoming index vector must be for the user of the chain. + // Its leading index must be [0] and we insert indices after that. + assert(chainIdxVec.size() > 0 && + isa<ConstantUInt>(chainIdxVec.front()) && + cast<ConstantUInt>(chainIdxVec.front())->getValue() == 0); // Now chase the chain of getElementInstr instructions, if any. // Check for any array indices and stop there. @@ -152,12 +157,15 @@ FoldGetElemChain(const InstructionNode* getElemInstrNode, } if (allStructureOffsets) - { // Get pointer value out of ptrChild and *prepend* its index vector + { // Get pointer value out of ptrChild. ptrVal = getElemInst->getPointerOperand(); - chainIdxVec.insert(chainIdxVec.begin(), + + // Insert its index vector at the start, but after the leading [0] + chainIdxVec.insert(chainIdxVec.begin()+1, idxVec.begin()+1, idxVec.end()); + + // Mark the folded node so no code is generated for it. ((InstructionNode*) ptrChild)->markFoldedIntoParent(); - // mark so no code is generated } else // cannot fold this getElementPtr instr. or any further ones break; |