diff options
author | Dan Gohman <gohman@apple.com> | 2008-03-21 21:01:32 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2008-03-21 21:01:32 +0000 |
commit | f1d3d666c14b67b962e81dbaac18da9116e79fa8 (patch) | |
tree | 723aa1eda563d5715d6a11f529301a57cbc66016 /lib/Transforms | |
parent | 35831d06fdd17f42897a9931555c17af490c06ee (diff) |
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
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/Scalar/CodeGenPrepare.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/Transforms/Scalar/CodeGenPrepare.cpp b/lib/Transforms/Scalar/CodeGenPrepare.cpp index 8762d3dd1b..43251c344f 100644 --- a/lib/Transforms/Scalar/CodeGenPrepare.cpp +++ b/lib/Transforms/Scalar/CodeGenPrepare.cpp @@ -1127,6 +1127,15 @@ bool CodeGenPrepare::OptimizeBlock(BasicBlock &BB) { // 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()); + } } } |