///|
pub fn choose_fixed_reg_hint(
  available_regs : Array[PhysicalReg],
  fixed_regs : Array[PhysicalReg],
) -> PhysicalReg? {
  if available_regs.is_empty() || fixed_regs.is_empty() {
    return None
  }
  let mut max_id = -1
  for preg in available_regs {
    if preg.id > max_id {
      max_id = preg.id
    }
  }
  if max_id < 0 {
    return None
  }
  let available : Array[Bool] = Array::make(max_id + 1, false)
  let counts : Array[Int] = Array::make(max_id + 1, 0)
  for preg in available_regs {
    if preg.id >= 0 {
      available[preg.id] = true
    }
  }
  for preg in fixed_regs {
    if preg.id >= 0 && preg.id < available.length() && available[preg.id] {
      counts[preg.id] = counts[preg.id] + 1
    }
  }
  let mut best : PhysicalReg? = None
  let mut best_count = 0
  for preg in available_regs {
    let count = counts[preg.id]
    match best {
      None =>
        if count > 0 {
          best = Some(preg)
          best_count = count
        }
      Some(current) =>
        if count > best_count ||
          (count == best_count && count > 0 && preg.id < current.id) {
          best = Some(preg)
          best_count = count
        }
    }
  }
  best
}