1; RUN: llc < %s -asm-verbose=false -verify-machineinstrs | FileCheck %s 2 3target triple = "wasm32-unknown-unknown" 4 5; Test that switches are lowered correctly in the presence of an 6; unreachable default branch target. 7 8; CHECK-LABEL: foo: 9; CHECK-NEXT: .functype foo (i32) -> (i32) 10; CHECK-NEXT: block 11; CHECK-NEXT: block 12; CHECK-NEXT: local.get 0 13; CHECK-NEXT: br_table {0, 1, 0} 14; CHECK-NEXT: .LBB0_1: 15; CHECK-NEXT: end_block 16; CHECK-NEXT: i32.const 0 17; CHECK-NEXT: return 18; CHECK-NEXT: .LBB0_2: 19; CHECK-NEXT: end_block 20; CHECK-NEXT: i32.const 1 21; CHECK-NEXT: end_function 22define i32 @foo(i32 %x) { 23entry: 24 switch i32 %x, label %unreachable [ 25 i32 0, label %bb0 26 i32 1, label %bb1 27 ] 28 29bb0: 30 ret i32 0 31 32bb1: 33 ret i32 1 34 35unreachable: 36 unreachable 37} 38 39; CHECK-LABEL: split: 40; CHECK: .functype split (i32) -> () 41; CHECK: block 42; CHECK: br_if 0 43; CHECK: block 44; CHECK: block 45; CHECK: br_table {1, 1, 0} 46; CHECK: .LBB1_2 47; CHECK: end_block 48; CHECK: br_table {0, 0, 0, 0, 0, 0, 0, 0} 49; CHECK: .LBB1_3 50; CHECK: end_block 51; CHECK: unreachable 52; CHECK: .LBB1_4 53; CHECK: end_block 54; CHECK: end_function 55define void @split(i8 %c) { 56entry: 57 switch i8 %c, label %sw.default [ 58 i8 114, label %return 59 i8 103, label %sw.bb1 60 i8 98, label %sw.bb2 61 i8 97, label %sw.bb3 62 i8 48, label %sw.bb4 63 i8 49, label %sw.bb5 64 ] 65 66sw.bb1: 67 unreachable 68 69sw.bb2: 70 unreachable 71 72sw.bb3: 73 unreachable 74 75sw.bb4: 76 unreachable 77 78sw.bb5: 79 unreachable 80 81sw.default: 82 unreachable 83 84return: 85 ret void 86} 87