Note [Avoid unnecessary swaps]
If we swap without actually improving matters, we can get an infinite loop.
Consider
work item: a ~ b
inert item: b ~ c
We canonicalise the work-item to (a ~ c). If we then swap it before
adding to the inert set, we'll add (c ~ a), and therefore kick out the
inert guy, so we get
new work item: b ~ c
inert item: c ~ a
And now the cycle just repeats
Historical Note [Eliminate younger unification variables]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Given a choice of unifying
alpha := beta or beta := alpha
we try, if possible, to eliminate the "younger" one, as determined
by `ltUnique`. Reason: the younger one is less likely to appear free in
an existing inert constraint, and hence we are less likely to be forced
into kicking out and rewriting inert constraints.
This is a performance optimisation only. It turns out to fix
#14723 all by itself, but clearly not reliably so!
It's simple to implement (see nicer_to_update_tv2 in swapOverTyVars).
But, to my surprise, it didn't seem to make any significant difference
to the compiler's performance, so I didn't take it any further. Still
it seemed too nice to discard altogether, so I'm leaving these
notes. SLPJ Jan 18. References 0
This Note does not link to any other.
Referenced by 1
- TyVar/TyVar orientation GHC.Tc.Utils.Unify