Currently, we represent register intervals as pairs of corresponding encoding values. The main idea behind this this patch is to replace such pairs with structures that represent the intervals in a more abstract way, thus conceptually separating the encoding details from the rest of the logic in the pass.
The new structures are still essentially pairs of integers representing the interval boundaries, but now make no references to encodings and have more suitably named fields. Using the chance, the type of endpoints was changed to unsigned to match the types of values they are compared against. The interval structures were also made iterable to simplify the code.