From f993327e71d826dcb852929a78881569ef83374d Mon Sep 17 00:00:00 2001 From: Torok Edwin Date: Tue, 20 Oct 2009 15:42:00 +0000 Subject: 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 --- lib/Transforms/Utils/SSAUpdater.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'lib') 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(U.getUser()); BasicBlock *UseBB = User->getParent(); - if (PHINode *UserPN = dyn_cast(User)) + PHINode *UserPN = dyn_cast(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;igetNumIncomingValues();i++) + if (UserPN->getIncomingBlock(i) == UseBB) + UserPN->setIncomingValue(i, V); + } } -- cgit v1.1