| //@ test-mir-pass: SimplifyCfg-after-unreachable-enum-branching |
| #![feature(custom_mir, core_intrinsics)] |
| #![crate_type = "lib"] |
| |
| use std::intrinsics::mir::*; |
| |
| // Check that we correctly cleaned up the dead BB. |
| // EMIT_MIR simplify_dead_blocks.assert_nonzero_nonmax.SimplifyCfg-after-unreachable-enum-branching.diff |
| #[custom_mir(dialect = "runtime", phase = "post-cleanup")] |
| pub unsafe fn assert_nonzero_nonmax(x: u8) -> u8 { |
| // CHECK-LABEL: fn assert_nonzero_nonmax( |
| // CHECK: bb0: { |
| // CHECK-NEXT: switchInt(copy {{_[0-9]+}}) -> [0: [[unreachable:bb.*]], 1: [[retblock2:bb.*]], 255: [[unreachable:bb.*]], otherwise: [[retblock:bb.*]]]; |
| // CHECK-NEXT: } |
| // CHECK-NOT: _0 = const 1_u8; |
| // CHECK: [[retblock2]]: { |
| // CHECK-NEXT: _0 = const 2_u8; |
| // CHECK-NEXT: return; |
| // CHECK-NEXT: } |
| // CHECK: [[unreachable]]: { |
| // CHECK-NEXT: unreachable; |
| // CHECK-NEXT: } |
| // CHECK: [[retblock]]: { |
| // CHECK-NEXT: _0 = copy _1; |
| // CHECK-NEXT: return; |
| // CHECK-NEXT: } |
| mir! { |
| { |
| match x { |
| 0 => unreachable, |
| 1 => retblock2, |
| u8::MAX => unreachable, |
| _ => retblock, |
| } |
| } |
| deadRetblock1 = { |
| RET = 1; |
| Return() |
| } |
| retblock2 = { |
| RET = 2; |
| Return() |
| } |
| unreachable = { |
| Unreachable() |
| } |
| retblock = { |
| RET = x; |
| Return() |
| } |
| } |
| } |