This patch introduces no functional changes.
The original 4-state state machine we used previously does not provide us with enough information to tell value reads from value writes. When given a reachable value alias pair (X, Y), we want to be able to tell if the function (transitively) assigns X to Y, or if the function (transitively) assigns Y to X, or if the function (transitively) assigns a third value Z to both, or if X and Y alias each other only because someone above X and someone above Y alias each other. The "directions" of assignments are very important to us since we need them to generate precise function summaries and yield better mod/ref results.
To keep track of assignment directions, I tried to add more states to the state machine. The semantics of the new machine should be exactly the same as before, except that given a particular state there's no ambiguities any more regarding what is read and what is written. Please refer to the codes for more details on the meaning of those newly added states.
I also tried to simplify the state machine matching codes with some macro abuses. We might want to get rid of those macros someday, but for now I think they do make things cleaner.
Why are we now starting from 1?