We introduce an annotated type system for a compiler intermediate language. The type system is designed to support inter-procedural register allocation and the representation of tuples and variants directly in the register file. We present an algorithm that generates constraints for assigning annotations, and prove its soundness with respect to the type system. Categories and Subject Descriptors D.3.4 [Programming Languages]: Processors—compilers General Terms Languages, Reliability, Verification Keywords Type Systems, Effects, Register Allocation, Defunctionalization, Certifying Compilers