diff options
| author | Hans Wennborg <hans@hanshq.net> | 2014-03-12 18:35:40 +0000 |
|---|---|---|
| committer | Hans Wennborg <hans@hanshq.net> | 2014-03-12 18:35:40 +0000 |
| commit | b73c0b041da1f9bd36d79185f5bd51d1befe7fdf (patch) | |
| tree | 5d6a933e3913d74b492ba2807486681a4b75688e /llvm/test/Transforms/SimplifyCFG/X86 | |
| parent | 44be154b04c02f17fc2a10476a055dc294cd4918 (diff) | |
| download | bcm5719-llvm-b73c0b041da1f9bd36d79185f5bd51d1befe7fdf.tar.gz bcm5719-llvm-b73c0b041da1f9bd36d79185f5bd51d1befe7fdf.zip | |
Allow switch-to-lookup table for tables with holes by adding bitmask check
This allows us to generate table lookups for code such as:
unsigned test(unsigned x) {
switch (x) {
case 100: return 0;
case 101: return 1;
case 103: return 2;
case 105: return 3;
case 107: return 4;
case 109: return 5;
case 110: return 6;
default: return f(x);
}
}
Since cases 102, 104, etc. are not constants, the lookup table has holes
in those positions. We therefore guard the table lookup with a bitmask check.
Patch by Jasper Neumann!
llvm-svn: 203694
Diffstat (limited to 'llvm/test/Transforms/SimplifyCFG/X86')
| -rw-r--r-- | llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll b/llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll index b47fa02af22..81079b1aa5a 100644 --- a/llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll +++ b/llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll @@ -832,7 +832,7 @@ return: ; CHECK-NOT: switch i32 } -; This lookup table will have holes, so we cannot build it without default result. +; This lookup table will have holes, so we need to test for the holes. define i32 @nodefaultwithholes(i32 %c) { entry: switch i32 %c, label %sw.default [ @@ -853,8 +853,34 @@ return: ret i32 %x ; CHECK-LABEL: @nodefaultwithholes( -; CHECK-NOT: @switch.table +; CHECK: entry: +; CHECK: br i1 %{{.*}}, label %switch.hole_check, label %sw.default +; CHECK: switch.hole_check: +; CHECK-NEXT: %switch.maskindex = trunc i32 %switch.tableidx to i6 +; CHECK-NEXT: %switch.shifted = lshr i6 -17, %switch.maskindex +; The mask is binary 101111. +; CHECK-NEXT: %switch.lobit = trunc i6 %switch.shifted to i1 +; CHECK-NEXT: br i1 %switch.lobit, label %switch.lookup, label %sw.default +; CHECK-NOT: switch i32 +} + +; We don't build lookup tables with holes for switches with less than four cases. +define i32 @threecasesholes(i32 %c) { +entry: + switch i32 %c, label %sw.default [ + i32 0, label %return + i32 1, label %sw.bb1 + i32 3, label %sw.bb2 + ] +sw.bb1: br label %return +sw.bb2: br label %return +sw.default: br label %return +return: + %x = phi i32 [ %c, %sw.default ], [ 5, %sw.bb2 ], [ 7, %sw.bb1 ], [ 9, %entry ] + ret i32 %x +; CHECK-LABEL: @threecasesholes( ; CHECK: switch i32 +; CHECK-NOT: @switch.table } ; We build lookup tables for switches with three or more cases. |

