//@ unit-test: GVN // Check that we do not propagate past an indirect mutation. #![feature(raw_ref_op)] // EMIT_MIR indirect_mutation.foo.GVN.diff fn foo() { // CHECK-LABEL: fn foo( // CHECK: debug u => _1; // CHECK: debug y => _3; // CHECK: _1 = const (1_i32,); // CHECK: _2 = &mut (_1.0: i32); // CHECK: (*_2) = const 5_i32; // CHECK: _4 = (_1.0: i32); // CHECK: _3 = Eq(move _4, const 5_i32); let mut u = (1,); *&mut u.0 = 5; let y = { u.0 } == 5; } // EMIT_MIR indirect_mutation.bar.GVN.diff fn bar() { // CHECK-LABEL: fn bar( // CHECK: debug v => _1; // CHECK: debug y => _4; // CHECK: _3 = &raw mut (_1.0: i32); // CHECK: (*_3) = const 5_i32; // CHECK: _5 = (_1.0: i32); // CHECK: _4 = Eq(move _5, const 5_i32); let mut v = (1,); unsafe { *&raw mut v.0 = 5; } let y = { v.0 } == 5; } fn main() { foo(); bar(); }