For the type lattice, we (now) use the "less specialized or equal" partial
order, leading to the bottom representing the empty set, and the top
representing any type.
This naming is more in line with the generally used conventions, where the top
of the lattice is the full set, and the bottom of the lattice is the empty set.
A typical example is the powerset of a finite set: generally, meet would be the
intersection, and join would be the union.
top: {a,b,c} / | \ {a,b} {a,c} {b,c} | X X | {a} { b } {c} \ | / bottom: { }
This is in line with the examined lattice representations in LLVM:
- lattice for BitTracker::BitValue in Hexagon/BitTracker.h
- lattice for constant propagation in HexagonConstPropagation.cpp
- lattice in VarLocBasedImpl.cpp
- lattice for address space inference code in InferAddressSpaces.cpp