///|
pub suberror VerifyError {
  Unassigned(vreg~ : VirtualReg)
  FixedConstraintViolation(
    vreg~ : VirtualReg,
    required~ : PhysicalReg,
    actual~ : Location
  )
  InvalidPreference(vreg~ : VirtualReg, preferred~ : PhysicalReg)
  IncorrectValue(vreg~ : VirtualReg, location~ : Location)
  ScratchRegisterUnavailable(message~ : String)
  InvalidPlan(message~ : String)
} derive(Debug)

///|
fn location_key(location : Location) -> (Int, Int) {
  match location {
    Reg(reg) => physical_reg_key(reg)
    Spill(slot) => (3, slot)
  }
}