From 2426bce9ac3d0f73733574173d08a38137e95d1e Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Thu, 15 Aug 2019 13:24:34 +0200 Subject: [PATCH] Fix load.i64 and store legalization --- cranelift/codegen/src/legalizer/mod.rs | 10 +++++++--- .../filetests/isa/x86/load-store-narrow.clif | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 cranelift/filetests/filetests/isa/x86/load-store-narrow.clif diff --git a/cranelift/codegen/src/legalizer/mod.rs b/cranelift/codegen/src/legalizer/mod.rs index ad13a1aaf3..70fb614a2d 100644 --- a/cranelift/codegen/src/legalizer/mod.rs +++ b/cranelift/codegen/src/legalizer/mod.rs @@ -588,9 +588,12 @@ fn narrow_load( _ => panic!("Expected load: {}", pos.func.dfg.display_inst(inst, None)), }; - let al = pos.ins().load(ir::types::I64, flags, ptr, offset); + let res_ty = pos.func.dfg.ctrl_typevar(inst); + let small_ty = res_ty.half_width().expect("Can't narrow load"); + + let al = pos.ins().load(small_ty, flags, ptr, offset); let ah = pos.ins().load( - ir::types::I64, + small_ty, flags, ptr, offset.try_add_i64(8).expect("load offset overflow"), @@ -618,7 +621,7 @@ fn narrow_store( _ => panic!("Expected store: {}", pos.func.dfg.display_inst(inst, None)), }; - let (al, ah) = pos.func.dfg.replace(inst).isplit(val); + let (al, ah) = pos.ins().isplit(val); pos.ins().store(flags, al, ptr, offset); pos.ins().store( flags, @@ -626,4 +629,5 @@ fn narrow_store( ptr, offset.try_add_i64(8).expect("store offset overflow"), ); + pos.remove_inst(); } diff --git a/cranelift/filetests/filetests/isa/x86/load-store-narrow.clif b/cranelift/filetests/filetests/isa/x86/load-store-narrow.clif new file mode 100644 index 0000000000..5f95b92fc0 --- /dev/null +++ b/cranelift/filetests/filetests/isa/x86/load-store-narrow.clif @@ -0,0 +1,16 @@ +test compile +target i686 + +function u0:0(i64, i32) system_v { +ebb0(v0: i64, v1: i32): + v2 = bor v0, v0 + store v2, v1 + return +} + +function u0:1(i32) -> i64 system_v { +ebb0(v1: i32): + v0 = load.i64 v1 + v2 = bor v0, v0 + return v2 +}