diff options
Diffstat (limited to 'lib/Transforms/Utils/SSAUpdater.cpp')
-rw-r--r-- | lib/Transforms/Utils/SSAUpdater.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/Transforms/Utils/SSAUpdater.cpp b/lib/Transforms/Utils/SSAUpdater.cpp index ee2f37b26c..ed9c0ee6c7 100644 --- a/lib/Transforms/Utils/SSAUpdater.cpp +++ b/lib/Transforms/Utils/SSAUpdater.cpp @@ -178,10 +178,18 @@ Value *SSAUpdater::GetValueInMiddleOfBlock(BasicBlock *BB) { void SSAUpdater::RewriteUse(Use &U) { Instruction *User = cast<Instruction>(U.getUser()); BasicBlock *UseBB = User->getParent(); - if (PHINode *UserPN = dyn_cast<PHINode>(User)) + PHINode *UserPN = dyn_cast<PHINode>(User); + if (UserPN) UseBB = UserPN->getIncomingBlock(U); - U.set(GetValueInMiddleOfBlock(UseBB)); + 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); + } } |