1; RUN: llc < %s -asm-verbose=false -verify-machineinstrs | FileCheck %s 2 3;; Test that a small but nontrivial switch in a loop (like in a 4;; bytecode interpreter) lowers reasonably without any irreducible 5;; control flow being introduced. 6 7target triple = "wasm32" 8 9declare void @a(i32*) 10declare void @b(i32*) 11 12; CHECK-LABEL: switch_in_loop: 13; CHECK-NEXT: .functype switch_in_loop (i32, i32) -> (i32) 14; CHECK: global.get __stack_pointer 15; CHECK: global.set __stack_pointer 16; CHECK: block 17; CHECK: br_if 0 18; CHECK: .LBB0_2: 19; CHECK: loop 20; CHECK: block 21; CHECK: block 22; CHECK: block 23; CHECK: br_table {0, 1, 2} 24; CHECK: .LBB0_3: 25; CHECK: end_block 26; CHECK: call a 27; CHECK: br 1 28; CHECK: .LBB0_4: 29; CHECK: end_block 30; CHECK: call b 31; CHECK: .LBB0_5: 32; CHECK: end_block 33; CHECK: br_if 0 34; CHECK: end_loop 35; CHECK: .LBB0_7: 36; CHECK: end_block 37; CHECK: global.set __stack_pointer 38; CHECK: end_function 39define i32 @switch_in_loop(i32* %ops, i32 %len) { 40entry: 41 %res = alloca i32 42 %0 = bitcast i32* %res to i8* 43 store i32 0, i32* %res 44 %cmp6 = icmp sgt i32 %len, 0 45 br i1 %cmp6, label %for.body, label %for.cond.cleanup 46 47for.cond.cleanup.loopexit: ; preds = %sw.epilog 48 %.pre = load i32, i32* %res 49 br label %for.cond.cleanup 50 51for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry 52 %1 = phi i32 [ %.pre, %for.cond.cleanup.loopexit ], [ 0, %entry ] 53 ret i32 %1 54 55for.body: ; preds = %entry, %sw.epilog 56 %i.07 = phi i32 [ %inc, %sw.epilog ], [ 0, %entry ] 57 %arrayidx = getelementptr inbounds i32, i32* %ops, i32 %i.07 58 %2 = load i32, i32* %arrayidx 59 switch i32 %2, label %sw.epilog [ 60 i32 0, label %sw.bb 61 i32 1, label %sw.bb1 62 ] 63 64sw.bb: ; preds = %for.body 65 call void @a(i32* nonnull %res) 66 br label %sw.epilog 67 68sw.bb1: ; preds = %for.body 69 call void @b(i32* nonnull %res) 70 br label %sw.epilog 71 72sw.epilog: ; preds = %for.body, %sw.bb1, %sw.bb 73 %inc = add nuw nsw i32 %i.07, 1 74 %exitcond = icmp eq i32 %inc, %len 75 br i1 %exitcond, label %for.cond.cleanup.loopexit, label %for.body 76} 77