//@ test-mir-pass: GVN #![feature(custom_mir, core_intrinsics)] use std::intrinsics::mir::*; // EMIT_MIR gvn_overlapping.overlapping.GVN.diff /// Check that we do not create overlapping assignments. #[custom_mir(dialect = "runtime")] fn overlapping(_17: Adt) { // CHECK-LABEL: fn overlapping( // CHECK: let mut [[PTR:.*]]: *mut Adt; // CHECK: (*[[PTR]]) = Adt::Some(copy {{.*}}); mir! { let _33: *mut Adt; let _48: u32; let _73: &Adt; { _33 = core::ptr::addr_of_mut!(_17); _73 = &(*_33); _48 = Field(Variant((*_73), 1), 0); (*_33) = Adt::Some(_48); Return() } } } // EMIT_MIR gvn_overlapping.stable_projection.GVN.diff /// Check that we allow dereferences in the RHS if the LHS is a stable projection. #[custom_mir(dialect = "runtime")] fn stable_projection(_1: (Adt,)) { // CHECK-LABEL: fn stable_projection( // CHECK: let mut _2: *mut Adt; // CHECK: let mut _4: &Adt; // CHECK: (_1.0: Adt) = copy (*_4); mir! { let _2: *mut Adt; let _3: u32; let _4: &Adt; { _2 = core::ptr::addr_of_mut!(_1.0); _4 = &(*_2); _3 = Field(Variant((*_4), 1), 0); _1.0 = Adt::Some(_3); Return() } } } // EMIT_MIR gvn_overlapping.fields.GVN.diff /// Check that we do not create assignments between different fields of the same local. #[custom_mir(dialect = "runtime")] fn fields(_1: (Adt, Adt)) { // CHECK-LABEL: fn fields( // CHECK: _2 = copy (((_1.0: Adt) as variant#1).0: u32); // CHECK-NEXT: (_1.1: Adt) = Adt::Some(copy _2); mir! { let _2: u32; { _2 = Field(Variant(_1.0, 1), 0); _1.1 = Adt::Some(_2); Return() } } } fn main() { overlapping(Adt::Some(0)); } enum Adt { None, Some(u32), }