//@ test-mir-pass: InstSimplify-after-simplifycfg //@ compile-flags: -C panic=abort #![crate_type = "lib"] #![feature(core_intrinsics)] #![feature(custom_mir)] use std::intrinsics::mir::*; use std::mem::{ManuallyDrop, MaybeUninit, transmute}; // EMIT_MIR combine_transmutes.identity_transmutes.InstSimplify-after-simplifycfg.diff pub unsafe fn identity_transmutes() { // CHECK-LABEL: fn identity_transmutes( // CHECK-NOT: as i32 (Transmute); // CHECK-NOT: as Vec (Transmute); // These are nops and should be removed let _a = transmute::(1); let _a = transmute::, Vec>(Vec::new()); } #[custom_mir(dialect = "runtime", phase = "initial")] // EMIT_MIR combine_transmutes.integer_transmutes.InstSimplify-after-simplifycfg.diff pub unsafe fn integer_transmutes() { // CHECK-LABEL: fn integer_transmutes( // CHECK-NOT: _i32 as u32 (Transmute); // CHECK: _i32 as u32 (IntToInt); // CHECK: _i32 as i64 (Transmute); // CHECK-NOT: _u64 as i64 (Transmute); // CHECK: _u64 as i64 (IntToInt); // CHECK: _u64 as u32 (Transmute); // CHECK-NOT: _isize as usize (Transmute); // CHECK: _isize as usize (IntToInt); mir! { { let A = CastTransmute::(1); // Can be a cast let B = CastTransmute::(1); // UB let C = CastTransmute::(1); // Can be a cast let D = CastTransmute::(1); // UB let E = CastTransmute::(1); // Can be a cast Return() } } } // EMIT_MIR combine_transmutes.adt_transmutes.InstSimplify-after-simplifycfg.diff pub unsafe fn adt_transmutes() { // CHECK-LABEL: fn adt_transmutes( // CHECK: as u8 (Transmute); // CHECK: ({{_.*}}.0: i16); // CHECK: as u16 (Transmute); // CHECK: as u32 (Transmute); // CHECK: as i32 (Transmute); // CHECK: ({{_.*}}.1: std::mem::ManuallyDrop); let _a: u8 = transmute(Some(std::num::NonZero::::MAX)); let _a: i16 = transmute(std::num::Wrapping(0_i16)); let _a: u16 = transmute(std::num::Wrapping(0_i16)); let _a: u32 = transmute(Union32 { i32: 0 }); let _a: i32 = transmute(Union32 { u32: 0 }); let _a: ManuallyDrop = transmute(MaybeUninit::::uninit()); } pub union Union32 { u32: u32, i32: i32, }