forked from OSchip/llvm-project
Switch-to-lookup tables: set threshold to 3 cases
There has been an old FIXME to find the right cut-off for when it's worth analyzing and potentially transforming a switch to a lookup table. The switches always have two or more cases. I could not measure any speed-up by transforming a switch with two cases. A switch with three cases gets a nice speed-up, and I couldn't measure any compile-time regression, so I think this is the right threshold. In a Clang self-host, this causes 480 new switches to be transformed, and reduces the final binary size with 8 KB. llvm-svn: 199294
This commit is contained in:
parent
5cf521047f
commit
4744ac1733
|
@ -3684,11 +3684,9 @@ static bool SwitchToLookupTable(SwitchInst *SI,
|
|||
// GEP needs a runtime relocation in PIC code. We should just build one big
|
||||
// string and lookup indices into that.
|
||||
|
||||
// Ignore the switch if the number of cases is too small.
|
||||
// This is similar to the check when building jump tables in
|
||||
// SelectionDAGBuilder::handleJTSwitchCase.
|
||||
// FIXME: Determine the best cut-off.
|
||||
if (SI->getNumCases() < 4)
|
||||
// Ignore switches with less than three cases. Lookup tables will not make them
|
||||
// faster, so we don't analyze them.
|
||||
if (SI->getNumCases() < 3)
|
||||
return false;
|
||||
|
||||
// Figure out the corresponding result for each case value and phi node in the
|
||||
|
|
|
@ -856,3 +856,39 @@ return:
|
|||
; CHECK-NOT: @switch.table
|
||||
; CHECK: switch i32
|
||||
}
|
||||
|
||||
; We build lookup tables for switches with three or more cases.
|
||||
define i32 @threecases(i32 %c) {
|
||||
entry:
|
||||
switch i32 %c, label %sw.default [
|
||||
i32 0, label %return
|
||||
i32 1, label %sw.bb1
|
||||
i32 2, label %sw.bb2
|
||||
]
|
||||
sw.bb1: br label %return
|
||||
sw.bb2: br label %return
|
||||
sw.default: br label %return
|
||||
return:
|
||||
%x = phi i32 [ 3, %sw.default ], [ 5, %sw.bb2 ], [ 7, %sw.bb1 ], [ 9, %entry ]
|
||||
ret i32 %x
|
||||
; CHECK-LABEL: @threecases(
|
||||
; CHECK-NOT: switch i32
|
||||
; CHECK: @switch.table
|
||||
}
|
||||
|
||||
; We don't build tables for switches with two cases.
|
||||
define i32 @twocases(i32 %c) {
|
||||
entry:
|
||||
switch i32 %c, label %sw.default [
|
||||
i32 0, label %return
|
||||
i32 1, label %sw.bb1
|
||||
]
|
||||
sw.bb1: br label %return
|
||||
sw.default: br label %return
|
||||
return:
|
||||
%x = phi i32 [ 3, %sw.default ], [ 7, %sw.bb1 ], [ 9, %entry ]
|
||||
ret i32 %x
|
||||
; CHECK-LABEL: @twocases(
|
||||
; CHECK: switch i32
|
||||
; CHECK-NOT: @switch.table
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue