Add a mir-opt test for alignment check generation
This commit is contained in:
parent
3c9faa0d03
commit
7585786ecb
3 changed files with 73 additions and 0 deletions
19
tests/mir-opt/alignment_checks.rs
Normal file
19
tests/mir-opt/alignment_checks.rs
Normal 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
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue