Handle getresult instructions in different basic blocks
from their aggregate operands by moving the getresult
instructions.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48657 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/Scalar/CodeGenPrepare.cpp b/lib/Transforms/Scalar/CodeGenPrepare.cpp
index 8762d3d..43251c3 100644
--- a/lib/Transforms/Scalar/CodeGenPrepare.cpp
+++ b/lib/Transforms/Scalar/CodeGenPrepare.cpp
@@ -1127,6 +1127,15 @@
             // Sink address computing for memory operands into the block.
             MadeChange |= OptimizeInlineAsmInst(I, &(*CI), SunkAddrs);
         }
+    } else if (GetResultInst *GRI = dyn_cast<GetResultInst>(I)) {
+      // Ensure that all getresult instructions live in the same basic block
+      // as their associated struct-value instructions. Codegen requires
+      // this, as lowering only works on one basic block at a time.
+      if (Instruction *Agg = dyn_cast<Instruction>(GRI->getAggregateValue())) {
+        BasicBlock *AggBB = Agg->getParent();
+        if (AggBB != GRI->getParent())
+          GRI->moveBefore(AggBB->getTerminator());
+      }
     }
   }