diff options
| author | Torok Edwin <edwintorok@gmail.com> | 2009-10-20 15:42:00 +0000 |
|---|---|---|
| committer | Torok Edwin <edwintorok@gmail.com> | 2009-10-20 15:42:00 +0000 |
| commit | cf10ec951d624e4d76dfd38c47a7dfd060bff8f8 (patch) | |
| tree | 602a689087e65d5b15076697b7ac4dd37cd134bf /llvm/lib/Transforms/Utils | |
| parent | 729d92bd745015a3481bfc5801265d7e93f879f3 (diff) | |
| download | bcm5719-llvm-cf10ec951d624e4d76dfd38c47a7dfd060bff8f8.tar.gz bcm5719-llvm-cf10ec951d624e4d76dfd38c47a7dfd060bff8f8.zip | |
Fix PR5258, jump-threading creating invalid PHIs.
When an incoming value for a PHI is updated, we must also updated all other
incoming values for the same BB to match, otherwise we create invalid PHIs.
llvm-svn: 84638
Diffstat (limited to 'llvm/lib/Transforms/Utils')
| -rw-r--r-- | llvm/lib/Transforms/Utils/SSAUpdater.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/SSAUpdater.cpp b/llvm/lib/Transforms/Utils/SSAUpdater.cpp index ee2f37b26cc..ed9c0ee6c70 100644 --- a/llvm/lib/Transforms/Utils/SSAUpdater.cpp +++ b/llvm/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); + } } |

