aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthijs Kooijman <matthijs@stdin.nl>2008-06-16 13:28:31 +0000
committerMatthijs Kooijman <matthijs@stdin.nl>2008-06-16 13:28:31 +0000
commit82371541a4a9b9fd31fddbb47b823e0de3a3054a (patch)
tree9cc7012def69f4d3215b33f34fae5fd22ae7de70
parent4138edb9d3dda67c41ac513dcbebe51661484b77 (diff)
downloadexternal_llvm-82371541a4a9b9fd31fddbb47b823e0de3a3054a.zip
external_llvm-82371541a4a9b9fd31fddbb47b823e0de3a3054a.tar.gz
external_llvm-82371541a4a9b9fd31fddbb47b823e0de3a3054a.tar.bz2
Make the InsertBefore argument to FindInsertedValue optional, so you can find an inserted value without modifying the code.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52319 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Analysis/ValueTracking.h5
-rw-r--r--lib/Analysis/ValueTracking.cpp11
2 files changed, 12 insertions, 4 deletions
diff --git a/include/llvm/Analysis/ValueTracking.h b/include/llvm/Analysis/ValueTracking.h
index 1dc1468..1e54e7d 100644
--- a/include/llvm/Analysis/ValueTracking.h
+++ b/include/llvm/Analysis/ValueTracking.h
@@ -55,10 +55,13 @@ namespace llvm {
/// FindScalarValue - Given an aggregrate and an sequence of indices, see if the
/// scalar value indexed is already around as a register, for example if it were
/// inserted directly into the aggregrate.
+ ///
+ /// If InsertBefore is not null, this function will duplicate (modified)
+ /// insertvalues when a part of a nested struct is extracted.
Value *FindInsertedValue(Value *V,
const unsigned *idx_begin,
const unsigned *idx_end,
- Instruction *InsertBefore);
+ Instruction *InsertBefore = 0);
} // end namespace llvm
#endif
diff --git a/lib/Analysis/ValueTracking.cpp b/lib/Analysis/ValueTracking.cpp
index 64cdc24..9251857 100644
--- a/lib/Analysis/ValueTracking.cpp
+++ b/lib/Analysis/ValueTracking.cpp
@@ -805,6 +805,7 @@ Value *BuildSubAggregate(Value *From, Value* To, const Type *IndexedType,
// Any inserted instructions are inserted before InsertBefore
Value *BuildSubAggregate(Value *From, const unsigned *idx_begin,
const unsigned *idx_end, Instruction *InsertBefore) {
+ assert(InsertBefore && "Must have someplace to insert!");
const Type *IndexedType = ExtractValueInst::getIndexedType(From->getType(),
idx_begin,
idx_end);
@@ -851,9 +852,13 @@ Value *llvm::FindInsertedValue(Value *V, const unsigned *idx_begin,
for (const unsigned *i = I->idx_begin(), *e = I->idx_end();
i != e; ++i, ++req_idx) {
if (req_idx == idx_end)
- // The requested index is a part of a nested aggregate. Handle this
- // specially.
- return BuildSubAggregate(V, idx_begin, req_idx, InsertBefore);
+ if (InsertBefore)
+ // The requested index is a part of a nested aggregate. Handle this
+ // specially.
+ return BuildSubAggregate(V, idx_begin, req_idx, InsertBefore);
+ else
+ // We can't handle this without inserting insertvalues
+ return 0;
// This insert value inserts something else than what we are looking for.
// See if the (aggregrate) value inserted into has the value we are