diff options
author | Matthijs Kooijman <matthijs@stdin.nl> | 2008-06-16 13:28:31 +0000 |
---|---|---|
committer | Matthijs Kooijman <matthijs@stdin.nl> | 2008-06-16 13:28:31 +0000 |
commit | 82371541a4a9b9fd31fddbb47b823e0de3a3054a (patch) | |
tree | 9cc7012def69f4d3215b33f34fae5fd22ae7de70 | |
parent | 4138edb9d3dda67c41ac513dcbebe51661484b77 (diff) | |
download | external_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.h | 5 | ||||
-rw-r--r-- | lib/Analysis/ValueTracking.cpp | 11 |
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 |