From e8518dd7ffdcc012d2f22b9761aca8cba9903ea0 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Sat, 3 May 2008 01:12:15 +0000 Subject: [PATCH] Handle multiple return values. llvm-svn: 50604 --- lib/Transforms/Utils/LCSSA.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/Transforms/Utils/LCSSA.cpp b/lib/Transforms/Utils/LCSSA.cpp index a9d1dc40cf6..39314678bd4 100644 --- a/lib/Transforms/Utils/LCSSA.cpp +++ b/lib/Transforms/Utils/LCSSA.cpp @@ -217,7 +217,29 @@ void LCSSA::getLoopValuesUsedOutsideLoop(Loop *L, } if (*BB != UserBB && !inLoop(UserBB)) { - AffectedValues.insert(I); + const StructType *STy = dyn_cast(I->getType()); + if (STy) { + // I is a call or an invoke that returns multiple values. + // These values are accessible through getresult only. + // If the getresult value is not in the BB then move it + // immediately here. It will be processed in next iteration. + BasicBlock::iterator InsertPoint; + if (InvokeInst *II = dyn_cast(I)) { + InsertPoint = II->getNormalDest()->begin(); + while (isa(InsertPoint)) + ++InsertPoint; + } else { + InsertPoint = I; + InsertPoint++; + } + for (Value::use_iterator TmpI = I->use_begin(), + TmpE = I->use_end(); TmpI != TmpE; ++TmpI) { + GetResultInst *GR = cast(TmpI); + if (GR->getParent() != *BB) + GR->moveBefore(InsertPoint); + } + } else + AffectedValues.insert(I); break; } }