diff options
author | Chris Lattner <sabre@nondot.org> | 2002-05-20 20:48:03 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-05-20 20:48:03 +0000 |
commit | 618b4a11bbde3a9149e9735421d9eeee1784df69 (patch) | |
tree | ed8b791b27aa494d6ebef82a291cf503127b15d4 /lib/Transforms/Scalar/SCCP.cpp | |
parent | a7cc6dd49445592bc528a5b338ede1ad5e6948ba (diff) | |
download | external_llvm-618b4a11bbde3a9149e9735421d9eeee1784df69.tar.gz external_llvm-618b4a11bbde3a9149e9735421d9eeee1784df69.tar.bz2 external_llvm-618b4a11bbde3a9149e9735421d9eeee1784df69.zip |
Fix bug: test/Regression/Transforms/SCCP/2002-05-20-MissedIncomingValue.ll
That was causing a miscompilation of strtol/atoi plus others
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2669 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/SCCP.cpp')
-rw-r--r-- | lib/Transforms/Scalar/SCCP.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp index 05945458cb..24d383b280 100644 --- a/lib/Transforms/Scalar/SCCP.cpp +++ b/lib/Transforms/Scalar/SCCP.cpp @@ -176,6 +176,16 @@ private: DEBUG_SCCP(cerr << "Marking BB Executable: " << BB); BBExecutable.insert(BB); // Basic block is executable! BBWorkList.push_back(BB); // Add the block to the work list! + + // Visit all of the PHI nodes that merge values from this block... Because + // this block is newly executable, PHI nodes that used to be constant now + // may not be. Note that we only mark PHI nodes that live in blocks that + // can execute! + // + for (Value::use_iterator I = BB->use_begin(), E = BB->use_end(); I != E;++I) + if (PHINode *PN = dyn_cast<PHINode>(*I)) + if (BBExecutable.count(PN->getParent())) + visitPHINode(PN); } @@ -308,7 +318,7 @@ bool SCCP::runOnFunction(Function *F) { InstVal &IV = ValueState[Inst]; if (IV.isConstant()) { Constant *Const = IV.getConstant(); - DEBUG_SCCP(cerr << "Constant: " << Inst << " is: " << Const); + DEBUG_SCCP(cerr << "Constant: " << Const << " = " << Inst); // Replaces all of the uses of a variable with uses of the constant. Inst->replaceAllUsesWith(Const); |