175 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			LLVM
		
	
	
	
; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -disable-block-placement -verify-machineinstrs | FileCheck %s
 | 
						|
 | 
						|
; Test switch instructions. Block placement is disabled because it reorders
 | 
						|
; the blocks in a way that isn't interesting here.
 | 
						|
 | 
						|
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
 | 
						|
target triple = "wasm32-unknown-unknown"
 | 
						|
 | 
						|
declare void @foo0()
 | 
						|
declare void @foo1()
 | 
						|
declare void @foo2()
 | 
						|
declare void @foo3()
 | 
						|
declare void @foo4()
 | 
						|
declare void @foo5()
 | 
						|
 | 
						|
; CHECK-LABEL: bar32:
 | 
						|
; CHECK: block   {{$}}
 | 
						|
; CHECK: block   {{$}}
 | 
						|
; CHECK: block   {{$}}
 | 
						|
; CHECK: block   {{$}}
 | 
						|
; CHECK: block   {{$}}
 | 
						|
; CHECK: block   {{$}}
 | 
						|
; CHECK: block   {{$}}
 | 
						|
; CHECK: br_table {{[^,]+}}, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 4, 5, 0{{$}}
 | 
						|
; CHECK: .LBB{{[0-9]+}}_2:
 | 
						|
; CHECK:   call foo0{{$}}
 | 
						|
; CHECK: .LBB{{[0-9]+}}_3:
 | 
						|
; CHECK:   call foo1{{$}}
 | 
						|
; CHECK: .LBB{{[0-9]+}}_4:
 | 
						|
; CHECK:   call foo2{{$}}
 | 
						|
; CHECK: .LBB{{[0-9]+}}_5:
 | 
						|
; CHECK:   call foo3{{$}}
 | 
						|
; CHECK: .LBB{{[0-9]+}}_6:
 | 
						|
; CHECK:   call foo4{{$}}
 | 
						|
; CHECK: .LBB{{[0-9]+}}_7:
 | 
						|
; CHECK:   call foo5{{$}}
 | 
						|
; CHECK: .LBB{{[0-9]+}}_8:
 | 
						|
; CHECK:   return{{$}}
 | 
						|
define void @bar32(i32 %n) {
 | 
						|
entry:
 | 
						|
  switch i32 %n, label %sw.epilog [
 | 
						|
    i32 0, label %sw.bb
 | 
						|
    i32 1, label %sw.bb
 | 
						|
    i32 2, label %sw.bb
 | 
						|
    i32 3, label %sw.bb
 | 
						|
    i32 4, label %sw.bb
 | 
						|
    i32 5, label %sw.bb
 | 
						|
    i32 6, label %sw.bb
 | 
						|
    i32 7, label %sw.bb.1
 | 
						|
    i32 8, label %sw.bb.1
 | 
						|
    i32 9, label %sw.bb.1
 | 
						|
    i32 10, label %sw.bb.1
 | 
						|
    i32 11, label %sw.bb.1
 | 
						|
    i32 12, label %sw.bb.1
 | 
						|
    i32 13, label %sw.bb.1
 | 
						|
    i32 14, label %sw.bb.1
 | 
						|
    i32 15, label %sw.bb.2
 | 
						|
    i32 16, label %sw.bb.2
 | 
						|
    i32 17, label %sw.bb.2
 | 
						|
    i32 18, label %sw.bb.2
 | 
						|
    i32 19, label %sw.bb.2
 | 
						|
    i32 20, label %sw.bb.2
 | 
						|
    i32 21, label %sw.bb.3
 | 
						|
    i32 22, label %sw.bb.4
 | 
						|
    i32 23, label %sw.bb.5
 | 
						|
  ]
 | 
						|
 | 
						|
sw.bb:                                            ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry
 | 
						|
  tail call void @foo0()
 | 
						|
  br label %sw.epilog
 | 
						|
 | 
						|
sw.bb.1:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry
 | 
						|
  tail call void @foo1()
 | 
						|
  br label %sw.epilog
 | 
						|
 | 
						|
sw.bb.2:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry
 | 
						|
  tail call void @foo2()
 | 
						|
  br label %sw.epilog
 | 
						|
 | 
						|
sw.bb.3:                                          ; preds = %entry
 | 
						|
  tail call void @foo3()
 | 
						|
  br label %sw.epilog
 | 
						|
 | 
						|
sw.bb.4:                                          ; preds = %entry
 | 
						|
  tail call void @foo4()
 | 
						|
  br label %sw.epilog
 | 
						|
 | 
						|
sw.bb.5:                                          ; preds = %entry
 | 
						|
  tail call void @foo5()
 | 
						|
  br label %sw.epilog
 | 
						|
 | 
						|
sw.epilog:                                        ; preds = %entry, %sw.bb.5, %sw.bb.4, %sw.bb.3, %sw.bb.2, %sw.bb.1, %sw.bb
 | 
						|
  ret void
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: bar64:
 | 
						|
; CHECK: block   {{$}}
 | 
						|
; CHECK: block   {{$}}
 | 
						|
; CHECK: block   {{$}}
 | 
						|
; CHECK: block   {{$}}
 | 
						|
; CHECK: block   {{$}}
 | 
						|
; CHECK: block   {{$}}
 | 
						|
; CHECK: block   {{$}}
 | 
						|
; CHECK: br_table {{[^,]+}}, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 4, 5, 0{{$}}
 | 
						|
; CHECK: .LBB{{[0-9]+}}_2:
 | 
						|
; CHECK:   call foo0{{$}}
 | 
						|
; CHECK: .LBB{{[0-9]+}}_3:
 | 
						|
; CHECK:   call foo1{{$}}
 | 
						|
; CHECK: .LBB{{[0-9]+}}_4:
 | 
						|
; CHECK:   call foo2{{$}}
 | 
						|
; CHECK: .LBB{{[0-9]+}}_5:
 | 
						|
; CHECK:   call foo3{{$}}
 | 
						|
; CHECK: .LBB{{[0-9]+}}_6:
 | 
						|
; CHECK:   call foo4{{$}}
 | 
						|
; CHECK: .LBB{{[0-9]+}}_7:
 | 
						|
; CHECK:   call foo5{{$}}
 | 
						|
; CHECK: .LBB{{[0-9]+}}_8:
 | 
						|
; CHECK:   return{{$}}
 | 
						|
define void @bar64(i64 %n) {
 | 
						|
entry:
 | 
						|
  switch i64 %n, label %sw.epilog [
 | 
						|
    i64 0, label %sw.bb
 | 
						|
    i64 1, label %sw.bb
 | 
						|
    i64 2, label %sw.bb
 | 
						|
    i64 3, label %sw.bb
 | 
						|
    i64 4, label %sw.bb
 | 
						|
    i64 5, label %sw.bb
 | 
						|
    i64 6, label %sw.bb
 | 
						|
    i64 7, label %sw.bb.1
 | 
						|
    i64 8, label %sw.bb.1
 | 
						|
    i64 9, label %sw.bb.1
 | 
						|
    i64 10, label %sw.bb.1
 | 
						|
    i64 11, label %sw.bb.1
 | 
						|
    i64 12, label %sw.bb.1
 | 
						|
    i64 13, label %sw.bb.1
 | 
						|
    i64 14, label %sw.bb.1
 | 
						|
    i64 15, label %sw.bb.2
 | 
						|
    i64 16, label %sw.bb.2
 | 
						|
    i64 17, label %sw.bb.2
 | 
						|
    i64 18, label %sw.bb.2
 | 
						|
    i64 19, label %sw.bb.2
 | 
						|
    i64 20, label %sw.bb.2
 | 
						|
    i64 21, label %sw.bb.3
 | 
						|
    i64 22, label %sw.bb.4
 | 
						|
    i64 23, label %sw.bb.5
 | 
						|
  ]
 | 
						|
 | 
						|
sw.bb:                                            ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry
 | 
						|
  tail call void @foo0()
 | 
						|
  br label %sw.epilog
 | 
						|
 | 
						|
sw.bb.1:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry
 | 
						|
  tail call void @foo1()
 | 
						|
  br label %sw.epilog
 | 
						|
 | 
						|
sw.bb.2:                                          ; preds = %entry, %entry, %entry, %entry, %entry, %entry
 | 
						|
  tail call void @foo2()
 | 
						|
  br label %sw.epilog
 | 
						|
 | 
						|
sw.bb.3:                                          ; preds = %entry
 | 
						|
  tail call void @foo3()
 | 
						|
  br label %sw.epilog
 | 
						|
 | 
						|
sw.bb.4:                                          ; preds = %entry
 | 
						|
  tail call void @foo4()
 | 
						|
  br label %sw.epilog
 | 
						|
 | 
						|
sw.bb.5:                                          ; preds = %entry
 | 
						|
  tail call void @foo5()
 | 
						|
  br label %sw.epilog
 | 
						|
 | 
						|
sw.epilog:                                        ; preds = %entry, %sw.bb.5, %sw.bb.4, %sw.bb.3, %sw.bb.2, %sw.bb.1, %sw.bb
 | 
						|
  ret void
 | 
						|
}
 |