From a10c50afe958333e7b180c110e6aacd7cd9b6ac7 Mon Sep 17 00:00:00 2001 From: Afonso Bordado Date: Wed, 15 Mar 2023 18:05:55 +0000 Subject: [PATCH] cranelift: Translate `stack_*` accesses as unaligned (#6016) We can't currently ensure that these will be aligned, so we shouldn't mark them as such. --- cranelift/codegen/src/legalizer/mod.rs | 10 ++++++---- cranelift/filetests/filetests/egraph/misc.clif | 2 +- .../filetests/runtests/simd-extractlane.clif | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/cranelift/codegen/src/legalizer/mod.rs b/cranelift/codegen/src/legalizer/mod.rs index 6fa43e0552..c226f0cb5d 100644 --- a/cranelift/codegen/src/legalizer/mod.rs +++ b/cranelift/codegen/src/legalizer/mod.rs @@ -82,8 +82,10 @@ pub fn simple_legalize(func: &mut ir::Function, cfg: &mut ControlFlowGraph, isa: let addr = pos.ins().stack_addr(addr_ty, stack_slot, offset); - // Stack slots are required to be accessible and aligned. - let mflags = MemFlags::trusted(); + // Stack slots are required to be accessible. + // We can't currently ensure that they are aligned. + let mut mflags = MemFlags::new(); + mflags.set_notrap(); pos.func.dfg.replace(inst).load(ty, mflags, addr, 0); } InstructionData::StackStore { @@ -99,10 +101,10 @@ pub fn simple_legalize(func: &mut ir::Function, cfg: &mut ControlFlowGraph, isa: let addr = pos.ins().stack_addr(addr_ty, stack_slot, offset); + // Stack slots are required to be accessible. + // We can't currently ensure that they are aligned. let mut mflags = MemFlags::new(); - // Stack slots are required to be accessible and aligned. mflags.set_notrap(); - mflags.set_aligned(); pos.func.dfg.replace(inst).store(mflags, arg, addr, 0); } InstructionData::DynamicStackLoad { diff --git a/cranelift/filetests/filetests/egraph/misc.clif b/cranelift/filetests/filetests/egraph/misc.clif index 811211601b..5eb42631c8 100644 --- a/cranelift/filetests/filetests/egraph/misc.clif +++ b/cranelift/filetests/filetests/egraph/misc.clif @@ -16,6 +16,6 @@ block0(v0: i64): ; nextln: ss0 = explicit_slot 8 ; check: block0(v0: i64): ; nextln: v2 = stack_addr.i64 ss0 -; nextln: store notrap aligned v0, v2 +; nextln: store notrap v0, v2 ; nextln: return v0 ; nextln: } diff --git a/cranelift/filetests/filetests/runtests/simd-extractlane.clif b/cranelift/filetests/filetests/runtests/simd-extractlane.clif index 2216d68c84..1b15d01eb8 100644 --- a/cranelift/filetests/filetests/runtests/simd-extractlane.clif +++ b/cranelift/filetests/filetests/runtests/simd-extractlane.clif @@ -100,3 +100,19 @@ block0(v0: f64x2): return v4 } ; run: %extractlane_f64x2_through_stack([0x1.0 0x2.0]) == 0x1.0 + + +function %unaligned_extractlane() -> f64 { + ss0 = explicit_slot 24 + +block0: + v0 = iconst.i64 0 + stack_store.i64 v0, ss0+0 + stack_store.i64 v0, ss0+8 + stack_store.i64 v0, ss0+16 + + v1 = stack_load.f64x2 ss0+1 + v2 = extractlane v1, 1 + return v2 +} +; run: %unaligned_extractlane() == 0.0