76 lines · plain
1; RUN: llc < %s -asm-verbose=false -verify-machineinstrs | FileCheck %s2 3;; Test that a small but nontrivial switch in a loop (like in a4;; bytecode interpreter) lowers reasonably without any irreducible5;; 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_pointer15; CHECK: global.set __stack_pointer16; CHECK: block17; CHECK: br_if 018; CHECK: .LBB0_2:19; CHECK: loop20; CHECK: block21; CHECK: block22; CHECK: block23; CHECK: br_table {0, 1, 2}24; CHECK: .LBB0_3:25; CHECK: end_block26; CHECK: call a27; CHECK: br 128; CHECK: .LBB0_4:29; CHECK: end_block30; CHECK: call b31; CHECK: .LBB0_5:32; CHECK: end_block33; CHECK: br_if 034; CHECK: end_loop35; CHECK: .LBB0_7:36; CHECK: end_block37; CHECK: global.set __stack_pointer38; CHECK: end_function39define i32 @switch_in_loop(ptr %ops, i32 %len) {40entry:41 %res = alloca i3242 store i32 0, ptr %res43 %cmp6 = icmp sgt i32 %len, 044 br i1 %cmp6, label %for.body, label %for.cond.cleanup45 46for.cond.cleanup.loopexit: ; preds = %sw.epilog47 %.pre = load i32, ptr %res48 br label %for.cond.cleanup49 50for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry51 %0 = phi i32 [ %.pre, %for.cond.cleanup.loopexit ], [ 0, %entry ]52 ret i32 %053 54for.body: ; preds = %entry, %sw.epilog55 %i.07 = phi i32 [ %inc, %sw.epilog ], [ 0, %entry ]56 %arrayidx = getelementptr inbounds i32, ptr %ops, i32 %i.0757 %1 = load i32, ptr %arrayidx58 switch i32 %1, label %sw.epilog [59 i32 0, label %sw.bb60 i32 1, label %sw.bb161 ]62 63sw.bb: ; preds = %for.body64 call void @a(ptr nonnull %res)65 br label %sw.epilog66 67sw.bb1: ; preds = %for.body68 call void @b(ptr nonnull %res)69 br label %sw.epilog70 71sw.epilog: ; preds = %for.body, %sw.bb1, %sw.bb72 %inc = add nuw nsw i32 %i.07, 173 %exitcond = icmp eq i32 %inc, %len74 br i1 %exitcond, label %for.cond.cleanup.loopexit, label %for.body75}76