From 9719147f91d26f024a4e2f56637c695a42d887b7 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Thu, 23 Feb 2023 17:32:10 +0100 Subject: [PATCH] s390x: Fix integer overflow during negation (#5866) Use wrapping_neg in i{64,32,16}_from_negated_value to avoid Rust aborts due to integer overflow. The resulting INT_MIN is already handled correctly in subsequent operations. Fixes https://github.com/bytecodealliance/wasmtime/issues/5863. --- cranelift/codegen/src/isa/s390x/lower/isle.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cranelift/codegen/src/isa/s390x/lower/isle.rs b/cranelift/codegen/src/isa/s390x/lower/isle.rs index 520cd5f371..a6dfe21e51 100644 --- a/cranelift/codegen/src/isa/s390x/lower/isle.rs +++ b/cranelift/codegen/src/isa/s390x/lower/isle.rs @@ -628,21 +628,21 @@ impl generated_code::Context for IsleContext<'_, '_, MInst, S390xBackend> { #[inline] fn i64_from_negated_value(&mut self, val: Value) -> Option { let constant = self.u64_from_signed_value(val)? as i64; - let imm = -constant; + let imm = constant.wrapping_neg(); Some(imm) } #[inline] fn i32_from_negated_value(&mut self, val: Value) -> Option { let constant = self.u64_from_signed_value(val)? as i64; - let imm = i32::try_from(-constant).ok()?; + let imm = i32::try_from(constant.wrapping_neg()).ok()?; Some(imm) } #[inline] fn i16_from_negated_value(&mut self, val: Value) -> Option { let constant = self.u64_from_signed_value(val)? as i64; - let imm = i16::try_from(-constant).ok()?; + let imm = i16::try_from(constant.wrapping_neg()).ok()?; Some(imm) }