Rollup merge of #152787 - scottmcm:alignment-checks-test, r=jieyouxu

Add a mir-opt test for alignment check generation [zero changes outside tests]

I wrote this as part of rust-lang/rust#152641 which it looks like I'm going to just close, so submitting the new test separately since we didn't have any mir-opt testing of this pass that I could find (at least `x test tests/mir-opt` didn't fail when I broke them) so figured it's something that should exist.
This commit is contained in:
Jonathan Brouwer 2026-02-18 18:55:19 +01:00 committed by GitHub
commit 8a05d66148
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
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;
}
}