| //@ test-mir-pass: InstSimplify-after-simplifycfg |
| #![crate_type = "lib"] |
| |
| // This is the easy case, and the most plausible to run into in real code. |
| // EMIT_MIR aggregate_array.literals.InstSimplify-after-simplifycfg.diff |
| pub fn literals() -> [u8; 5] { |
| // CHECK-LABEL: fn literals( |
| // CHECK: _0 = [const 0_u8; 5]; |
| [0, 0, 0, 0, 0] |
| } |
| |
| // Check that hiding the const value behind a const item doesn't prevent the optimization |
| // EMIT_MIR aggregate_array.const_items.InstSimplify-after-simplifycfg.diff |
| pub fn const_items() -> [u8; 5] { |
| const A: u8 = 0; |
| const B: u8 = 0; |
| const C: u8 = 0; |
| const D: u8 = 0; |
| const E: u8 = 0; |
| |
| // CHECK-LABEL: fn const_items( |
| // CHECK: _0 = [const const_items::A; 5]; |
| [A, B, C, D, E] |
| } |
| |
| // EMIT_MIR aggregate_array.strs.InstSimplify-after-simplifycfg.diff |
| pub fn strs() -> [&'static str; 5] { |
| // CHECK-LABEL: fn strs( |
| // CHECK: _0 = [const "a"; 5]; |
| ["a", "a", "a", "a", "a"] |
| } |
| |
| // InstSimplify isn't able to see through the move operands, but GVN can. |
| // EMIT_MIR aggregate_array.local.InstSimplify-after-simplifycfg.diff |
| pub fn local() -> [u8; 5] { |
| // CHECK-LABEL: fn local( |
| // CHECK: _0 = [move _2, move _3, move _4, move _5, move _6]; |
| let val = 0; |
| [val, val, val, val, val] |
| } |
| |
| // All of these consts refer to the same value, but the addresses are all different. |
| // It would be wrong to apply the optimization here. |
| // EMIT_MIR aggregate_array.equal_referents.InstSimplify-after-simplifycfg.diff |
| pub fn equal_referents() -> [&'static u8; 5] { |
| const DATA: &[u8] = &[0, 0, 0, 0, 0]; |
| const A: &u8 = &DATA[0]; |
| const B: &u8 = &DATA[1]; |
| const C: &u8 = &DATA[2]; |
| const D: &u8 = &DATA[3]; |
| const E: &u8 = &DATA[4]; |
| |
| // CHECK-LABEL: fn equal_referents( |
| // CHECK: _0 = [const equal_referents::A, const equal_referents::B, const equal_referents::C, const equal_referents::D, const equal_referents::E]; |
| [A, B, C, D, E] |
| } |