diff --git a/cranelift/codegen/src/machinst/lower.rs b/cranelift/codegen/src/machinst/lower.rs index 5e9276cda2..8c21dbb248 100644 --- a/cranelift/codegen/src/machinst/lower.rs +++ b/cranelift/codegen/src/machinst/lower.rs @@ -19,7 +19,7 @@ use crate::machinst::{ LoweredBlock, MachLabel, Reg, SigSet, VCode, VCodeBuilder, VCodeConstant, VCodeConstantData, VCodeConstants, VCodeInst, ValueRegs, Writable, }; -use crate::{trace, CodegenResult}; +use crate::{trace, CodegenError, CodegenResult}; use alloc::vec::Vec; use regalloc2::VReg; use smallvec::{smallvec, SmallVec}; @@ -323,6 +323,10 @@ fn alloc_vregs( let v = *next_vreg; let (regclasses, tys) = I::rc_for_type(ty)?; *next_vreg += regclasses.len(); + if *next_vreg >= VReg::MAX { + return Err(CodegenError::CodeTooLarge); + } + let regs: ValueRegs = match regclasses { &[rc0] => ValueRegs::one(VReg::new(v, rc0).into()), &[rc0, rc1] => ValueRegs::two(VReg::new(v, rc0).into(), VReg::new(v + 1, rc1).into()),