diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Transforms/Utils/SSAUpdater.cpp | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/lib/Transforms/Utils/SSAUpdater.cpp b/lib/Transforms/Utils/SSAUpdater.cpp index ed9c0ee..8a07c35 100644 --- a/lib/Transforms/Utils/SSAUpdater.cpp +++ b/lib/Transforms/Utils/SSAUpdater.cpp @@ -177,19 +177,14 @@ Value *SSAUpdater::GetValueInMiddleOfBlock(BasicBlock *BB) { /// which use their value in the corresponding predecessor. void SSAUpdater::RewriteUse(Use &U) { Instruction *User = cast<Instruction>(U.getUser()); - BasicBlock *UseBB = User->getParent(); - PHINode *UserPN = dyn_cast<PHINode>(User); - if (UserPN) - UseBB = UserPN->getIncomingBlock(U); + + Value *V; + if (PHINode *UserPN = dyn_cast<PHINode>(User)) + V = GetValueAtEndOfBlock(UserPN->getIncomingBlock(U)); + else + V = GetValueInMiddleOfBlock(User->getParent()); - Value *V = GetValueInMiddleOfBlock(UseBB); U.set(V); - if (UserPN) { - // Incoming value from the same BB must be consistent - for (unsigned i=0;i<UserPN->getNumIncomingValues();i++) - if (UserPN->getIncomingBlock(i) == UseBB) - UserPN->setIncomingValue(i, V); - } } |