Make the InsertBefore argument to FindInsertedValue optional, so you can find an...
authorMatthijs Kooijman <matthijs@stdin.nl>
Mon, 16 Jun 2008 13:28:31 +0000 (13:28 +0000)
committerMatthijs Kooijman <matthijs@stdin.nl>
Mon, 16 Jun 2008 13:28:31 +0000 (13:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52319 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/ValueTracking.h
lib/Analysis/ValueTracking.cpp

index 1dc1468209f6be5e8c78627d2bd25d0046180653..1e54e7d3c6181bfe53eed570a6f9a37f3bf54074 100644 (file)
@@ -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
index 64cdc246b915ca120377e2e66fef1b4edc5a2f2e..925185793d745bc9bd669b6d516b318aae2aa0f0 100644 (file)
@@ -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