summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorTorok Edwin <edwintorok@gmail.com>2009-10-20 15:15:09 +0000
committerTorok Edwin <edwintorok@gmail.com>2009-10-20 15:15:09 +0000
commit729d92bd745015a3481bfc5801265d7e93f879f3 (patch)
tree1c09f358f101537ee2515be16652285ffc7216a4 /llvm/lib
parent531e2840642e0a4099d537300c512d41f5c044a9 (diff)
downloadbcm5719-llvm-729d92bd745015a3481bfc5801265d7e93f879f3.tar.gz
bcm5719-llvm-729d92bd745015a3481bfc5801265d7e93f879f3.zip
Fix PR4313: IPSCCP was not setting the lattice value for the invoke instruction
when the invoke had multiple return values: it set the lattice value only on the extractvalue. This caused the invoke's lattice value to remain the default (undefined), and later propagated to extractvalue's operand, which incorrectly introduces undefined behavior. llvm-svn: 84637
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/Scalar/SCCP.cpp6
1 files changed, 4 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp
index b5edf4e0582..b745097872c 100644
--- a/llvm/lib/Transforms/Scalar/SCCP.cpp
+++ b/llvm/lib/Transforms/Scalar/SCCP.cpp
@@ -1229,7 +1229,10 @@ CallOverdefined:
TMRVI = TrackedMultipleRetVals.find(std::make_pair(F, 0));
if (TMRVI == TrackedMultipleRetVals.end())
goto CallOverdefined;
-
+
+ // Need to mark as overdefined, otherwise it stays undefined which
+ // creates extractvalue undef, <idx>
+ markOverdefined(I);
// If we are tracking this callee, propagate the return values of the call
// into this call site. We do this by walking all the uses. Single-index
// ExtractValueInst uses can be tracked; anything more complicated is
@@ -1271,7 +1274,6 @@ CallOverdefined:
}
}
-
void SCCPSolver::Solve() {
// Process the work lists until they are empty!
while (!BBWorkList.empty() || !InstWorkList.empty() ||
OpenPOWER on IntegriCloud