4 <:PolyEqual:> is an optimization pass for the <:SSA:>
5 <:IntermediateLanguage:>, invoked from <:SSASimplify:>.
9 This pass implements polymorphic equality.
13 * <!ViewGitFile(mlton,master,mlton/ssa/poly-equal.fun)>
15 == Details and Notes ==
17 For each datatype, tycon, and vector type, it builds and equality
18 function and translates calls to `MLton_equal` into calls to that
21 Also generates calls to `Word_equal`.
23 For tuples, it does the equality test inline; i.e., it does not create
24 a separate equality function for each tuple type.
26 All equality functions are created only if necessary, i.e., if
27 equality is actually used at a type.
31 * for datatypes that are enumerations, do not build a case dispatch,
32 just use `MLton_eq`, as the backend will represent these as ints
34 * deep equality always does an `MLton_eq` test first
36 * If one argument to `=` is a constant and the type will get
37 translated to an `IntOrPointer`, then just use `eq` instead of the
38 full equality. This is important for implementing code like the
39 following efficiently:
42 if x = 0 ... (* where x is of type IntInf.int *)
45 * Also convert pointer equality on scalar types to type specific