diff --git a/crates/lightbeam/src/backend.rs b/crates/lightbeam/src/backend.rs index a0979bff8c..2f612f5ddd 100644 --- a/crates/lightbeam/src/backend.rs +++ b/crates/lightbeam/src/backend.rs @@ -3215,13 +3215,13 @@ impl<'this, M: ModuleContext> Context<'this, M> { ty: impl Into>, val: &mut ValueLocation, ) -> Result, Error> { - let out = match self.to_reg(ty, *val) { - Err(e) => return Err(e), - Ok(o) => o.unwrap(), - }; - self.free_value(*val)?; - *val = ValueLocation::Reg(out); - Ok(Some(out)) + if let Some(out) = self.to_reg(ty, *val)? { + self.free_value(*val)?; + *val = ValueLocation::Reg(out); + Ok(Some(out)) + } else { + Ok(None) + } } /// Clones this value into a register so that it can be efficiently read @@ -3236,13 +3236,13 @@ impl<'this, M: ModuleContext> Context<'this, M> { self.block_state.regs.mark_used(r); Ok(Some(r)) } - val => { - let scratch = self.take_reg(ty.unwrap_or(GPRType::Rq)).unwrap(); - - self.copy_value(val, CCLoc::Reg(scratch))?; - - Ok(Some(scratch)) - } + val => match self.take_reg(ty.unwrap_or(GPRType::Rq)) { + Some(scratch) => { + self.copy_value(val, CCLoc::Reg(scratch))?; + Ok(Some(scratch)) + } + None => Ok(None), + }, } } @@ -3253,13 +3253,14 @@ impl<'this, M: ModuleContext> Context<'this, M> { ty: impl Into>, val: &mut ValueLocation, ) -> Result, Error> { - let out = match self.to_temp_reg(ty, *val) { - Err(e) => return Err(e), - Ok(o) => o.unwrap(), - }; - self.free_value(*val)?; - *val = ValueLocation::Reg(out); - Ok(Some(out)) + let out = self.to_temp_reg(ty, *val)?; + if let Some(o) = out { + self.free_value(*val)?; + *val = ValueLocation::Reg(o); + Ok(Some(o)) + } else { + return Ok(None); + } } fn into_temp_loc( @@ -3288,25 +3289,25 @@ impl<'this, M: ModuleContext> Context<'this, M> { val: ValueLocation, ) -> Result, Error> { // If we have `None` as the type then it always matches (`.unwrap_or(true)`) - let res = match val { + match val { ValueLocation::Reg(r) => { let ty = ty.into(); let type_matches = ty.map(|t| t == r.type_()).unwrap_or(true); if self.block_state.regs.num_usages(r) <= 1 && type_matches { self.block_state.regs.mark_used(r); - Some(r) + Ok(Some(r)) } else { - let scratch = self.take_reg(ty.unwrap_or(GPRType::Rq)).unwrap(); - - self.copy_value(val, CCLoc::Reg(scratch))?; - - Some(scratch) + if let Some(scratch) = self.take_reg(ty.unwrap_or(GPRType::Rq)) { + self.copy_value(val, CCLoc::Reg(scratch))?; + Ok(Some(scratch)) + } else { + Ok(None) + } } } - val => self.to_reg(ty, val)?, - }; - Ok(res) + val => self.to_reg(ty, val), + } } pub fn f32_neg(&mut self) -> Result<(), Error> {