Rationale
For a program point where we cannot reason about incoming dataflow (e.g. an argument of an entry block), the framework needs to initialize the state.
Currently, AbstractSparseDataFlowAnalysis initializes such state to the "pessimistic fixpoint", and AbstractDenseDataFlowAnalysis calls the state's reset() function.
However, entry states aren't necessarily the pessimistic fixpoint. Example: in reaching definition, the pessimistic fixpoint is {all definitions}, but the entry state is {}.
This awkwardness might be why the dense analysis API currently uses reset() instead of markPessimisticFixpoint().
This patch consolidates entry point initialization into a single function setToEntryState().
API Location
Note that setToEntryState() is defined in the analysis rather than the lattice, so that we allow different analyses to use the same lattice but different entry states.
Removal of the concept of optimistic/known value
The concept of optimistic/known value is too specific to SCCP.
Furthermore, the known value is not really used: In the current SCCP implementation, the known value (pessimistic fixpoint) is always Attribute{} (non-constant). This means there's no point storing a knownValue in each state.
If we do need to re-introduce optimistic/known value, we should put it in the SCCP analysis, not the sparse analysis API.
Terminology
Please let me know if "entry state" is a good terminology.
I chose "entry" from Wikipedia (https://en.wikipedia.org/wiki/Data-flow_analysis#Basic_principles).
Another term I can think of is "boundary" (https://suif.stanford.edu/~courses/cs243/lectures/L3-DFA2-revised.pdf) which might be better since it also makes sense for backward analysis.
Nit: I would call it getUnknownConstant