diff options
author | Torok Edwin <edwintorok@gmail.com> | 2009-10-20 15:15:09 +0000 |
---|---|---|
committer | Torok Edwin <edwintorok@gmail.com> | 2009-10-20 15:15:09 +0000 |
commit | 2b6183d2543287e5371319d16010bf651a207b1b (patch) | |
tree | dd1c74b0dd02efc2996c9f9ae645234b399e4a73 /lib/Transforms/Scalar/SCCP.cpp | |
parent | 174101e13a6f24f6f2737e043194f0ffae925bb3 (diff) | |
download | llvm-2b6183d2543287e5371319d16010bf651a207b1b.tar.gz llvm-2b6183d2543287e5371319d16010bf651a207b1b.tar.bz2 llvm-2b6183d2543287e5371319d16010bf651a207b1b.tar.xz |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84637 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/SCCP.cpp')
-rw-r--r-- | lib/Transforms/Scalar/SCCP.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp index b5edf4e058..b745097872 100644 --- a/lib/Transforms/Scalar/SCCP.cpp +++ b/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() || |