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