From cbbd94db02db187b79712e2b2128f7ffae17547e Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Tue, 8 Oct 2019 16:09:26 +0200 Subject: [PATCH] Allow wrap-around when subtracting type size to immediate in try_fold_extended_move; --- cranelift/codegen/src/simple_preopt.rs | 2 +- .../fold-extended-move-wraparound.clif | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 cranelift/filetests/filetests/simple_preopt/fold-extended-move-wraparound.clif diff --git a/cranelift/codegen/src/simple_preopt.rs b/cranelift/codegen/src/simple_preopt.rs index 221e8a57b0..73e22451c9 100644 --- a/cranelift/codegen/src/simple_preopt.rs +++ b/cranelift/codegen/src/simple_preopt.rs @@ -508,7 +508,7 @@ fn try_fold_extended_move( } let imm_bits: i64 = imm.into(); - let ireduce_ty = match dest_ty.lane_bits() as i64 - imm_bits { + let ireduce_ty = match (dest_ty.lane_bits() as i64).wrapping_sub(imm_bits) { 8 => I8, 16 => I16, 32 => I32, diff --git a/cranelift/filetests/filetests/simple_preopt/fold-extended-move-wraparound.clif b/cranelift/filetests/filetests/simple_preopt/fold-extended-move-wraparound.clif new file mode 100644 index 0000000000..074507a786 --- /dev/null +++ b/cranelift/filetests/filetests/simple_preopt/fold-extended-move-wraparound.clif @@ -0,0 +1,14 @@ +test simple_preopt +target x86_64 + +function %wraparound(i64 vmctx) -> f32 system_v { + gv0 = vmctx + gv1 = iadd_imm.i64 gv0, 48 + +ebb35(v0: i64): + v88 = iconst.i64 0 + v89 = iconst.i64 0x8000_0000_0000_0000 + v90 = ishl_imm v88, 0x8000_0000_0000_0000 + v91 = sshr v90, v89; check: sshr_imm v90, 0x8000_0000_0000_0000 + trap user0 +}