brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.2 KiB · 08e6820 Raw
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