From dfaceb49fca5ea37ded300dfe0867aa4b891f98b Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Fri, 20 Jun 2008 16:39:44 +0000 Subject: [PATCH] Fix the conditions under which SCCP should examine insertvalue instructions. Thanks to Matthijs Kooijman for pointing this out! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52542 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/SCCP.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp index dc6d497bd00..3ca03b3c1d9 100644 --- a/lib/Transforms/Scalar/SCCP.cpp +++ b/lib/Transforms/Scalar/SCCP.cpp @@ -750,7 +750,7 @@ void SCCPSolver::visitInsertValueInst(InsertValueInst &IVI) { Value *Val = IVI.getOperand(1); // If the operand to the getresult is an undef, the result is undef. - if (isa(Aggr)) + if (isa(Aggr) && isa(Val)) return; // Currently only handle single-index insertvalues. @@ -758,6 +758,23 @@ void SCCPSolver::visitInsertValueInst(InsertValueInst &IVI) { markOverdefined(&IVI); return; } + + // Currently only handle insertvalue instructions that are in a single-use + // chain that builds up a return value. + for (const InsertValueInst *TmpIVI = &IVI; ; ) { + if (!TmpIVI->hasOneUse()) { + markOverdefined(&IVI); + return; + } + const Value *V = *TmpIVI->use_begin(); + if (isa(V)) + break; + TmpIVI = dyn_cast(V); + if (!TmpIVI) { + markOverdefined(&IVI); + return; + } + } // See if we are tracking the result of the callee. Function *F = IVI.getParent()->getParent();