[WebAssembly] Emit br_table for most switch instructions
Summary: Always convert switches to br_tables unless there is only one case, which is equivalent to a simple branch. This reduces code size for wasm, and we defer possible jump table optimizations to the VM. Addresses PR41502. Reviewers: kripken, sunfish Subscribers: dschuff, sbc100, jgravelle-google, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D60966 llvm-svn: 359038
This commit is contained in:
parent
a746f2b73c
commit
b9f282d384
|
@ -270,6 +270,11 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
|
|||
MaxStoresPerMemset = 1;
|
||||
MaxStoresPerMemsetOptSize = 1;
|
||||
}
|
||||
|
||||
// Always convert switches to br_tables unless there is only one case, which
|
||||
// is equivalent to a simple branch. This reduces code size for wasm, and we
|
||||
// defer possible jump table optimizations to the VM.
|
||||
setMinimumJumpTableEntries(2);
|
||||
}
|
||||
|
||||
TargetLowering::AtomicExpansionKind
|
||||
|
|
|
@ -384,19 +384,13 @@ if.end:
|
|||
; CHECK-NEXT: .functype test4 (i32) -> (){{$}}
|
||||
; CHECK: block {{$}}
|
||||
; CHECK-NEXT: block {{$}}
|
||||
; CHECK: br_if 0, $pop{{[0-9]+}}{{$}}
|
||||
; CHECK: br_if 1, $pop{{[0-9]+}}{{$}}
|
||||
; CHECK: br 1{{$}}
|
||||
; CHECK: br_if 0, $pop{{[0-9]+}}{{$}}
|
||||
; CHECK: br 1{{$}}
|
||||
; CHECK-NEXT: .LBB{{[0-9]+}}_2:
|
||||
; CHECK-NEXT: end_block{{$}}
|
||||
; CHECK-NEXT: br_table $0, 0, 0, 0, 0, 0, 0{{$}}
|
||||
; CHECK-NEXT: .LBB{{[0-9]+}}_3:
|
||||
; CHECK-NEXT: end_block{{$}}
|
||||
; CHECK-NEXT: block {{$}}
|
||||
; CHECK: br_if 0, $pop{{[0-9]+}}{{$}}
|
||||
; CHECK: br_if 1, $pop{{[0-9]+}}{{$}}
|
||||
; CHECK-NEXT: .LBB{{[0-9]+}}_5:
|
||||
; CHECK-NEXT: end_block{{$}}
|
||||
; CHECK-NEXT: return{{$}}
|
||||
; CHECK-NEXT: .LBB{{[0-9]+}}_6:
|
||||
; CHECK-NEXT: end_block{{$}}
|
||||
; CHECK-NEXT: return{{$}}
|
||||
define void @test4(i32 %t) {
|
||||
entry:
|
||||
|
@ -646,29 +640,30 @@ end:
|
|||
; CHECK-LABEL: test10:
|
||||
; CHECK: .LBB{{[0-9]+}}_1:
|
||||
; CHECK-NEXT: loop {{$}}
|
||||
; CHECK-NOT: block
|
||||
; CHECK: br_if 0, {{[^,]+}}{{$}}
|
||||
; CHECK: br_if 0, {{[^,]+}}{{$}}
|
||||
; CHECK: .LBB{{[0-9]+}}_3:
|
||||
; CHECK-NEXT: block {{$}}
|
||||
; CHECK-NEXT: loop {{$}}
|
||||
; CHECK-NOT: block
|
||||
; CHECK: .LBB{{[0-9]+}}_4:
|
||||
; CHECK-NEXT: loop {{$}}
|
||||
; CHECK-NOT: block
|
||||
; CHECK: br_if 0, {{[^,]+}}{{$}}
|
||||
; CHECK: br_if 0, {{[^,]+}}{{$}}
|
||||
; CHECK-NEXT: end_loop{{$}}
|
||||
; CHECK: br_if 1, {{[^,]+}}{{$}}
|
||||
; CHECK-NOT: block
|
||||
; CHECK: br_if 0, {{[^,]+}}{{$}}
|
||||
; CHECK-NEXT: block {{$}}
|
||||
; CHECK: br_if 0, {{[^,]+}}{{$}}
|
||||
; CHECK: br 3{{$}}
|
||||
; CHECK-NEXT: .LBB{{[0-9]+}}_7:
|
||||
; CHECK-NEXT: end_block{{$}}
|
||||
; CHECK: block {{$}}
|
||||
; CHECK-NEXT: br_table $0, 0, 3, 1, 2, 0
|
||||
; CHECK-NEXT: .LBB{{[0-9]+}}_8:
|
||||
; CHECK-NEXT: end_block{{$}}
|
||||
; CHECK-NEXT: end_loop{{$}}
|
||||
; CHECK-NOT: block
|
||||
; CHECK: br_if 1, {{[^,]+}}{{$}}
|
||||
; CHECK-NEXT: return{{$}}
|
||||
; CHECK-NEXT: .LBB{{[0-9]+}}_9:
|
||||
; CHECK-NEXT: end_block{{$}}
|
||||
; CHECK-NOT: block
|
||||
; CHECK: br 0{{$}}
|
||||
; CHECK: br 0{{$}}
|
||||
; CHECK-NEXT: .LBB{{[0-9]+}}_10:
|
||||
; CHECK-NEXT: end_loop{{$}}
|
||||
define void @test10() {
|
||||
bb0:
|
||||
br label %bb1
|
||||
|
@ -772,31 +767,25 @@ bb8:
|
|||
|
||||
; CHECK-LABEL: test12:
|
||||
; CHECK: .LBB{{[0-9]+}}_1:
|
||||
; CHECK-NEXT: block {{$}}
|
||||
; CHECK-NEXT: loop {{$}}
|
||||
; CHECK-NOT: block
|
||||
; CHECK: block {{$}}
|
||||
; CHECK-NEXT: block {{$}}
|
||||
; CHECK: br_if 0, {{[^,]+}}{{$}}
|
||||
; CHECK-NOT: block
|
||||
; CHECK: br_if 1, {{[^,]+}}{{$}}
|
||||
; CHECK-NOT: block
|
||||
; CHECK: br_if 1, {{[^,]+}}{{$}}
|
||||
; CHECK-NEXT: br 3{{$}}
|
||||
; CHECK-NEXT: block {{$}}
|
||||
; CHECK-NEXT: block {{$}}
|
||||
; CHECK: br_if 0, {{[^,]+}}{{$}}
|
||||
; CHECK: br_if 2, {{[^,]+}}{{$}}
|
||||
; CHECK: br_if 1, {{[^,]+}}{{$}}
|
||||
; CHECK-NEXT: br 2{{$}}
|
||||
; CHECK-NEXT: .LBB{{[0-9]+}}_4:
|
||||
; CHECK-NEXT: end_block{{$}}
|
||||
; CHECK-NOT: block
|
||||
; CHECK: br_if 0, {{[^,]+}}{{$}}
|
||||
; CHECK-NOT: block
|
||||
; CHECK: br_if 2, {{[^,]+}}{{$}}
|
||||
; CHECK-NEXT: .LBB{{[0-9]+}}_6:
|
||||
; CHECK-NEXT: end_block{{$}}
|
||||
; CHECK-NOT: block
|
||||
; CHECK: br 0{{$}}
|
||||
; CHECK-NEXT: .LBB{{[0-9]+}}_7:
|
||||
; CHECK-NEXT: end_loop{{$}}
|
||||
; CHECK-NEXT: br_table $2, 1, 0, 0, 0, 1, 1{{$}}
|
||||
; CHECK-NEXT: .LBB{{[0-9]+}}_5:
|
||||
; CHECK-NEXT: end_block{{$}}
|
||||
; CHECK-NEXT: return{{$}}
|
||||
; CHECK-NEXT: .LBB{{[0-9]+}}_6:
|
||||
; CHECK-NEXT: end_block{{$}}
|
||||
; CHECK: br 0{{$}}
|
||||
; CHECK-NEXT: .LBB{{[0-9]+}}_7:
|
||||
; CHECK-NEXT: end_loop{{$}}
|
||||
define void @test12(i8* %arg) {
|
||||
bb:
|
||||
br label %bb1
|
||||
|
|
Loading…
Reference in New Issue