Add a mir-opt test for alignment check generation

This commit is contained in:
Scott McMurray 2026-02-14 17:58:44 -08:00
parent 3c9faa0d03
commit 7585786ecb
3 changed files with 73 additions and 0 deletions

View file

@ -0,0 +1,19 @@
//@ compile-flags: -Copt-level=1 -Zmir-opt-level=2 -Zub-checks
//@ only-64bit
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
#![crate_type = "lib"]
// The diff shows exactly what is generated by the pass;
// then we check the final `-O1` output for people who want to run them
// without the codegen being too terrible.
// EMIT_MIR alignment_checks.sized_ptr.CheckAlignment.diff
pub unsafe fn sized_ptr(ptr: *const u32) -> u32 {
// CHECK-LABEL: fn sized_ptr(_1: *const u32)
// CHECK: _2 = copy _1 as usize (Transmute);
// CHECK: _3 = BitAnd(copy _2, const 3_usize);
// CHECK: _4 = Eq(copy _3, const 0_usize);
// CHECK: assert(copy _4,
*ptr
}

View file

@ -0,0 +1,27 @@
- // MIR for `sized_ptr` before CheckAlignment
+ // MIR for `sized_ptr` after CheckAlignment
fn sized_ptr(_1: *const u32) -> u32 {
debug ptr => _1;
let mut _0: u32;
+ let mut _2: *const ();
+ let mut _3: usize;
+ let mut _4: usize;
+ let mut _5: usize;
+ let mut _6: bool;
bb0: {
+ _2 = copy _1 as *const () (PtrToPtr);
+ _3 = copy _2 as usize (Transmute);
+ _4 = Sub(const <u32 as std::mem::SizedTypeProperties>::ALIGN, const 1_usize);
+ _5 = BitAnd(copy _3, copy _4);
+ _6 = Eq(copy _5, const 0_usize);
+ assert(copy _6, "misaligned pointer dereference: address must be a multiple of {} but is {}", const <u32 as std::mem::SizedTypeProperties>::ALIGN, copy _3) -> [success: bb1, unwind unreachable];
+ }
+
+ bb1: {
_0 = copy (*_1);
return;
}
}

View file

@ -0,0 +1,27 @@
- // MIR for `sized_ptr` before CheckAlignment
+ // MIR for `sized_ptr` after CheckAlignment
fn sized_ptr(_1: *const u32) -> u32 {
debug ptr => _1;
let mut _0: u32;
+ let mut _2: *const ();
+ let mut _3: usize;
+ let mut _4: usize;
+ let mut _5: usize;
+ let mut _6: bool;
bb0: {
+ _2 = copy _1 as *const () (PtrToPtr);
+ _3 = copy _2 as usize (Transmute);
+ _4 = Sub(const <u32 as std::mem::SizedTypeProperties>::ALIGN, const 1_usize);
+ _5 = BitAnd(copy _3, copy _4);
+ _6 = Eq(copy _5, const 0_usize);
+ assert(copy _6, "misaligned pointer dereference: address must be a multiple of {} but is {}", const <u32 as std::mem::SizedTypeProperties>::ALIGN, copy _3) -> [success: bb1, unwind unreachable];
+ }
+
+ bb1: {
_0 = copy (*_1);
return;
}
}