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 | f993327e71d826dcb852929a78881569ef83374d (patch) | |
tree | 61b6388ff743c0a268b055a0c0c5fdf67b2a3360 /lib/Transforms/Utils | |
parent | 2b6183d2543287e5371319d16010bf651a207b1b (diff) | |
download | external_llvm-f993327e71d826dcb852929a78881569ef83374d.zip external_llvm-f993327e71d826dcb852929a78881569ef83374d.tar.gz external_llvm-f993327e71d826dcb852929a78881569ef83374d.tar.bz2 |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84638 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils')
-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 ee2f37b..ed9c0ee 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); + } } |