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 datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" 8target triple = "wasm32" 9 10declare void @a(i32*) 11declare void @b(i32*) 12 13; CHECK-LABEL: switch_in_loop: 14; CHECK-NEXT: .functype switch_in_loop (i32, i32) -> (i32) 15; CHECK: global.get __stack_pointer 16; CHECK: global.set __stack_pointer 17; CHECK: block 18; CHECK: br_if 0 19; CHECK: .LBB0_2: 20; CHECK: loop 21; CHECK: block 22; CHECK: block 23; CHECK: block 24; CHECK: br_table {0, 1, 2} 25; CHECK: .LBB0_3: 26; CHECK: end_block 27; CHECK: call a 28; CHECK: br 1 29; CHECK: .LBB0_4: 30; CHECK: end_block 31; CHECK: call b 32; CHECK: .LBB0_5: 33; CHECK: end_block 34; CHECK: br_if 0 35; CHECK: end_loop 36; CHECK: .LBB0_7: 37; CHECK: end_block 38; CHECK: global.set __stack_pointer 39; CHECK: end_function 40define i32 @switch_in_loop(i32* %ops, i32 %len) { 41entry: 42 %res = alloca i32 43 %0 = bitcast i32* %res to i8* 44 store i32 0, i32* %res 45 %cmp6 = icmp sgt i32 %len, 0 46 br i1 %cmp6, label %for.body, label %for.cond.cleanup 47 48for.cond.cleanup.loopexit: ; preds = %sw.epilog 49 %.pre = load i32, i32* %res 50 br label %for.cond.cleanup 51 52for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry 53 %1 = phi i32 [ %.pre, %for.cond.cleanup.loopexit ], [ 0, %entry ] 54 ret i32 %1 55 56for.body: ; preds = %entry, %sw.epilog 57 %i.07 = phi i32 [ %inc, %sw.epilog ], [ 0, %entry ] 58 %arrayidx = getelementptr inbounds i32, i32* %ops, i32 %i.07 59 %2 = load i32, i32* %arrayidx 60 switch i32 %2, label %sw.epilog [ 61 i32 0, label %sw.bb 62 i32 1, label %sw.bb1 63 ] 64 65sw.bb: ; preds = %for.body 66 call void @a(i32* nonnull %res) 67 br label %sw.epilog 68 69sw.bb1: ; preds = %for.body 70 call void @b(i32* nonnull %res) 71 br label %sw.epilog 72 73sw.epilog: ; preds = %for.body, %sw.bb1, %sw.bb 74 %inc = add nuw nsw i32 %i.07, 1 75 %exitcond = icmp eq i32 %inc, %len 76 br i1 %exitcond, label %for.cond.cleanup.loopexit, label %for.body 77} 78