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(ptr) 10declare void @b(ptr) 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(ptr %ops, i32 %len) { 40entry: 41 %res = alloca i32 42 store i32 0, ptr %res 43 %cmp6 = icmp sgt i32 %len, 0 44 br i1 %cmp6, label %for.body, label %for.cond.cleanup 45 46for.cond.cleanup.loopexit: ; preds = %sw.epilog 47 %.pre = load i32, ptr %res 48 br label %for.cond.cleanup 49 50for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry 51 %0 = phi i32 [ %.pre, %for.cond.cleanup.loopexit ], [ 0, %entry ] 52 ret i32 %0 53 54for.body: ; preds = %entry, %sw.epilog 55 %i.07 = phi i32 [ %inc, %sw.epilog ], [ 0, %entry ] 56 %arrayidx = getelementptr inbounds i32, ptr %ops, i32 %i.07 57 %1 = load i32, ptr %arrayidx 58 switch i32 %1, label %sw.epilog [ 59 i32 0, label %sw.bb 60 i32 1, label %sw.bb1 61 ] 62 63sw.bb: ; preds = %for.body 64 call void @a(ptr nonnull %res) 65 br label %sw.epilog 66 67sw.bb1: ; preds = %for.body 68 call void @b(ptr nonnull %res) 69 br label %sw.epilog 70 71sw.epilog: ; preds = %for.body, %sw.bb1, %sw.bb 72 %inc = add nuw nsw i32 %i.07, 1 73 %exitcond = icmp eq i32 %inc, %len 74 br i1 %exitcond, label %for.cond.cleanup.loopexit, label %for.body 75} 76