Check in current state of scripts.
Convert cross product machines to SSA form, thus enabling a whole
bunch of interesting optimisations.
Whoops: the result of crossProductSurvivalConstraint needs to be
expressed in terms of the input machine variables, not the SSA ones.
Fix that.
Slightly better ordering for BDD variables.  This tends to keep
related HB edges together.
Tweak a bunch of BDD traversals to respect sharing within the BDD,
rather than trying to enumerate every path, so as to avoid horrible
exponential blowup.
*Much* faster avail expression analysis for SSA-form machines.
Minor optimisation to the avail simplification: avoid apply
substitutions which will themselves force further substitutions later
on.
Avoid unecessarily duplicating lots of subclauses when converting from
exprbdds to irexprs.
BDDs are implicitly interned, so now that everything is represented as
a BDD rather than an IRExpr there's no need to ever intern them
explicitly.
Load->load forwarding in the realias analysis was a mistake, so remove
it.

Basically, if you can do load->load forwarding then you can always
satisfy the second load with either an initial-value load or the same
store as satisfied the first one, and the result is usually simpler,
so we might as well kill off the basic forwarding completely.
Switch enabling tables from std::map to a new small hashed map class,
which acts like a hashed map if you have a lot of things and like an
array if you don't.  This should be a little bit faster.
Get rid of some spurious compiler warnings.
Rejigger the way we assign identifiers to memory accesses so that if A
happens before B, and A and B are in the say thread, A's identifier
will always be numerically less than B's.
Remove a couple of redundant copies in the zip implementation.
Take advantage of the new MAI ordering to simplify BDDs much more
aggressively.  This should be sufficient to take advantage of almost
all of the ordering information implicit in the state machine structure.
If the predecessor of a state is a branch node, and the two successors
of that branch are not equal, then knowing that we traversed a
particular edge tells us whether the branch condition is true or
false.  Take advantage of that fact in Phi elimination.
Rework realias analysis to use an enabling table to build the
selection mux, rather than doign the hideously expensive thing with
the sat checker.
Tweak the symbolic executor to not use the ND chooser to eval copy
exprbdds.  The copy value is instead kept as a BDD and copied into the
thread state structure directly.
Dead code elimination.
Tweak build system to make compiler warnings a bit more obvious.