From 1792779edffe9e41cb0c07298b4dd0ef4acb0f2a Mon Sep 17 00:00:00 2001 From: "Vikram S. Adve" Date: Sun, 31 Mar 2002 18:56:51 +0000 Subject: [PATCH] Fix a bug in previous bug fix. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2069 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../InstrSelection/InstrSelectionSupport.cpp | 20 +++++++++++++------ .../InstrSelection/InstrSelectionSupport.cpp | 20 +++++++++++++------ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp b/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp index 67f79d5d228..ff43f04a5f9 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(chainIdxVec.front()) && + cast(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; diff --git a/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp b/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp index 67f79d5d228..ff43f04a5f9 100644 --- a/lib/Target/SparcV9/InstrSelection/InstrSelectionSupport.cpp +++ b/lib/Target/SparcV9/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(chainIdxVec.front()) && + cast(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;