summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorVikram S. Adve <vadve@cs.uiuc.edu>2002-03-31 18:56:51 +0000
committerVikram S. Adve <vadve@cs.uiuc.edu>2002-03-31 18:56:51 +0000
commit5bf8890305a8e0a7136b698672652a6e86591974 (patch)
tree4c06a609b0e08ef16938d7f58dd8d03912f2420c /llvm/lib/CodeGen
parentaa2373d2ed74cf639bdc77b81ec16df635cf1dbf (diff)
downloadbcm5719-llvm-5bf8890305a8e0a7136b698672652a6e86591974.tar.gz
bcm5719-llvm-5bf8890305a8e0a7136b698672652a6e86591974.zip
Fix a bug in previous bug fix.
llvm-svn: 2069
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp b/llvm/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp
index 67f79d5d228..ff43f04a5f9 100644
--- a/llvm/lib/CodeGen/InstrSelection/InstrSelectionSupport.cpp
+++ b/llvm/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;
OpenPOWER on IntegriCloud