Now that we aren't trying to do overlap checking in parallel, we can fuse the loop that generates a list of rule pairs with the loop that checks those pairs. Removing the intermediate vector of pairs should save a little time and memory. But it also means we're no longer borrowing from the `by_term` HashMap, so we can use `into_iter` instead of `values` to move ownership out of the map. That in turn means that we can use `into_iter` on each vector of rules as well, which turns out to offer a slightly nicer idiom for looping over all pairs, and also means we drop allocations as soon as possible. I also pushed grouping by priority earlier, so the O(n^2) all-pairs loop runs over smaller lists. If we later find we want to know about overlaps across different priorities, the definition of the map key is an easy place to make that change.
ISLE: Instruction Selection / Lowering Expressions
ISLE is a domain specific language (DSL) for instruction selection and lowering
clif instructions to vcode's MachInsts in Cranelift.
ISLE is a statically-typed term-rewriting language. You define rewriting rules
that map input terms (clif instructions) into output terms (MachInsts). These
rules get compiled down into Rust source test that uses a tree of match
expressions that is as good or better than what you would have written by hand.