diff --git a/include/llvm/Analysis/SparsePropagation.h b/include/llvm/Analysis/SparsePropagation.h index bc9ae6172b8..a054c76c9bc 100644 --- a/include/llvm/Analysis/SparsePropagation.h +++ b/include/llvm/Analysis/SparsePropagation.h @@ -24,6 +24,7 @@ namespace llvm { class Value; class Constant; + class Argument; class Instruction; class PHINode; class TerminatorInst; @@ -75,6 +76,12 @@ public: virtual Constant *GetConstant(LatticeVal LV, Value *Val, SparseSolver &SS) { return 0; } + + /// ComputeArgument - Given a formal argument value, compute and return a + /// lattice value corresponding to the specified argument. + virtual LatticeVal ComputeArgument(Argument *I) { + return getOverdefinedVal(); // always safe + } /// MergeValues - Compute and return the merge of the two specified lattice /// values. Merging should only move one direction down the lattice to diff --git a/lib/Analysis/SparsePropagation.cpp b/lib/Analysis/SparsePropagation.cpp index 2fda64c7335..8f042c27839 100644 --- a/lib/Analysis/SparsePropagation.cpp +++ b/lib/Analysis/SparsePropagation.cpp @@ -57,8 +57,10 @@ SparseSolver::LatticeVal SparseSolver::getOrInitValueState(Value *V) { return LatticeFunc->getUntrackedVal(); else if (Constant *C = dyn_cast(V)) LV = LatticeFunc->ComputeConstant(C); + else if (Argument *A = dyn_cast(V)) + LV = LatticeFunc->ComputeArgument(A); else if (!isa(V)) - // Non-instructions (e.g. formal arguments) are overdefined. + // All other non-instructions are overdefined. LV = LatticeFunc->getOverdefinedVal(); else // All instructions are underdefined by default.