aboutsummaryrefslogtreecommitdiffstats
path: root/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
commit1792779edffe9e41cb0c07298b4dd0ef4acb0f2a (patch)
treec372df06bf7be95e9bc4190f9032753cbbba9b23 /lib/CodeGen
parent1a53f03392ea21a47745430057f0b342129dd902 (diff)
downloadexternal_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.cpp20
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;