diff options
| author | Shawn Landden <shawn@git.icu> | 2019-06-13 02:24:24 +0000 |
|---|---|---|
| committer | Shawn Landden <shawn@git.icu> | 2019-06-13 02:24:24 +0000 |
| commit | f93b99b2b6a429f020aca2ea8c503e7553f3777c (patch) | |
| tree | 3da484444848c18ab5bb7532d5c6b3e83e05d3ed /llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll | |
| parent | f3356722184362c2e99ad6590f26eacadb507377 (diff) | |
| download | bcm5719-llvm-f93b99b2b6a429f020aca2ea8c503e7553f3777c.tar.gz bcm5719-llvm-f93b99b2b6a429f020aca2ea8c503e7553f3777c.zip | |
[SimplifyCFG] NFC, update Switch tests to HEAD so I can
see if my changes change anything
Also add baseline tests to show effect of later patches.
Differential Revision: https://reviews.llvm.org/D61150
llvm-svn: 363222
Diffstat (limited to 'llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll')
| -rw-r--r-- | llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll | 162 |
1 files changed, 123 insertions, 39 deletions
diff --git a/llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll b/llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll index 77d7e748c78..7d281fc93be 100644 --- a/llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll +++ b/llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll @@ -1,11 +1,20 @@ -; RUN: opt %s -S -simplifycfg | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt %s -S -passes='simplify-cfg<switch-to-lookup>' | FileCheck %s +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" declare void @foo(i32) define void @test(i1 %a) { -; CHECK-LABEL: @test -; CHECK: br i1 [[IGNORE:%.*]], label %true, label %false +; CHECK-LABEL: @test( +; CHECK-NEXT: br i1 [[A:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]] +; CHECK: true: +; CHECK-NEXT: tail call void @foo(i32 1) +; CHECK-NEXT: ret void +; CHECK: false: +; CHECK-NEXT: tail call void @foo(i32 3) +; CHECK-NEXT: ret void +; switch i1 %a, label %default [i1 1, label %true - i1 0, label %false] + i1 0, label %false] true: call void @foo(i32 1) ret void @@ -15,14 +24,35 @@ false: default: call void @foo(i32 2) ret void -} +} define void @test2(i2 %a) { -; CHECK-LABEL: @test2 +; CHECK-LABEL: @test2( +; CHECK-NEXT: switch i2 [[A:%.*]], label [[DEFAULT1:%.*]] [ +; CHECK-NEXT: i2 0, label [[CASE0:%.*]] +; CHECK-NEXT: i2 1, label [[CASE1:%.*]] +; CHECK-NEXT: i2 -2, label [[CASE2:%.*]] +; CHECK-NEXT: i2 -1, label [[CASE3:%.*]] +; CHECK-NEXT: ] +; CHECK: case0: +; CHECK-NEXT: tail call void @foo(i32 0) +; CHECK-NEXT: ret void +; CHECK: case1: +; CHECK-NEXT: tail call void @foo(i32 1) +; CHECK-NEXT: ret void +; CHECK: case2: +; CHECK-NEXT: tail call void @foo(i32 2) +; CHECK-NEXT: ret void +; CHECK: case3: +; CHECK-NEXT: tail call void @foo(i32 3) +; CHECK-NEXT: ret void +; CHECK: default1: +; CHECK-NEXT: unreachable +; switch i2 %a, label %default [i2 0, label %case0 - i2 1, label %case1 - i2 2, label %case2 - i2 3, label %case3] + i2 1, label %case1 + i2 2, label %case2 + i2 3, label %case3] case0: call void @foo(i32 0) ret void @@ -36,19 +66,35 @@ case3: call void @foo(i32 3) ret void default: -; CHECK-LABEL: default1: -; CHECK-NEXT: unreachable call void @foo(i32 4) ret void -} +} ; This one is a negative test - we know the value of the default, ; but that's about it define void @test3(i2 %a) { -; CHECK-LABEL: @test3 +; CHECK-LABEL: @test3( +; CHECK-NEXT: switch i2 [[A:%.*]], label [[DEFAULT:%.*]] [ +; CHECK-NEXT: i2 0, label [[CASE0:%.*]] +; CHECK-NEXT: i2 1, label [[CASE1:%.*]] +; CHECK-NEXT: i2 -2, label [[CASE2:%.*]] +; CHECK-NEXT: ] +; CHECK: case0: +; CHECK-NEXT: tail call void @foo(i32 0) +; CHECK-NEXT: ret void +; CHECK: case1: +; CHECK-NEXT: tail call void @foo(i32 1) +; CHECK-NEXT: ret void +; CHECK: case2: +; CHECK-NEXT: tail call void @foo(i32 2) +; CHECK-NEXT: ret void +; CHECK: default: +; CHECK-NEXT: tail call void @foo(i32 0) +; CHECK-NEXT: ret void +; switch i2 %a, label %default [i2 0, label %case0 - i2 1, label %case1 - i2 2, label %case2] + i2 1, label %case1 + i2 2, label %case2] case0: call void @foo(i32 0) @@ -60,18 +106,30 @@ case2: call void @foo(i32 2) ret void default: -; CHECK-LABEL: default: -; CHECK-NEXT: call void @foo call void @foo(i32 0) ret void -} +} ; Negative test - check for possible overflow when computing ; number of possible cases. define void @test4(i128 %a) { -; CHECK-LABEL: @test4 +; CHECK-LABEL: @test4( +; CHECK-NEXT: switch i128 [[A:%.*]], label [[DEFAULT:%.*]] [ +; CHECK-NEXT: i128 0, label [[CASE0:%.*]] +; CHECK-NEXT: i128 1, label [[CASE1:%.*]] +; CHECK-NEXT: ] +; CHECK: case0: +; CHECK-NEXT: tail call void @foo(i32 0) +; CHECK-NEXT: ret void +; CHECK: case1: +; CHECK-NEXT: tail call void @foo(i32 1) +; CHECK-NEXT: ret void +; CHECK: default: +; CHECK-NEXT: tail call void @foo(i32 0) +; CHECK-NEXT: ret void +; switch i128 %a, label %default [i128 0, label %case0 - i128 1, label %case1] + i128 1, label %case1] case0: call void @foo(i32 0) @@ -80,20 +138,28 @@ case1: call void @foo(i32 1) ret void default: -; CHECK-LABEL: default: -; CHECK-NEXT: call void @foo call void @foo(i32 0) ret void -} +} ; All but one bit known zero define void @test5(i8 %a) { -; CHECK-LABEL: @test5 -; CHECK: br i1 [[IGNORE:%.*]], label %true, label %false - %cmp = icmp ult i8 %a, 2 +; CHECK-LABEL: @test5( +; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[A:%.*]], 2 +; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]]) +; CHECK-NEXT: [[SWITCH:%.*]] = icmp eq i8 [[A]], 1 +; CHECK-NEXT: br i1 [[SWITCH]], label [[TRUE:%.*]], label [[FALSE:%.*]] +; CHECK: true: +; CHECK-NEXT: tail call void @foo(i32 1) +; CHECK-NEXT: ret void +; CHECK: false: +; CHECK-NEXT: tail call void @foo(i32 3) +; CHECK-NEXT: ret void +; + %cmp = icmp ult i8 %a, 2 call void @llvm.assume(i1 %cmp) switch i8 %a, label %default [i8 1, label %true - i8 0, label %false] + i8 0, label %false] true: call void @foo(i32 1) ret void @@ -103,18 +169,27 @@ false: default: call void @foo(i32 2) ret void -} +} ;; All but one bit known one define void @test6(i8 %a) { -; CHECK-LABEL: @test6 -; CHECK: @llvm.assume -; CHECK: br i1 [[IGNORE:%.*]], label %true, label %false +; CHECK-LABEL: @test6( +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[A:%.*]], -3 +; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]]) +; CHECK-NEXT: [[SWITCH:%.*]] = icmp eq i8 [[A]], -1 +; CHECK-NEXT: br i1 [[SWITCH]], label [[TRUE:%.*]], label [[FALSE:%.*]] +; CHECK: true: +; CHECK-NEXT: tail call void @foo(i32 1) +; CHECK-NEXT: ret void +; CHECK: false: +; CHECK-NEXT: tail call void @foo(i32 3) +; CHECK-NEXT: ret void +; %and = and i8 %a, 254 - %cmp = icmp eq i8 %and, 254 + %cmp = icmp eq i8 %and, 254 call void @llvm.assume(i1 %cmp) switch i8 %a, label %default [i8 255, label %true - i8 254, label %false] + i8 254, label %false] true: call void @foo(i32 1) ret void @@ -129,15 +204,24 @@ default: ; Check that we can eliminate both dead cases and dead defaults ; within a single run of simplify-cfg define void @test7(i8 %a) { -; CHECK-LABEL: @test7 -; CHECK: @llvm.assume -; CHECK: br i1 [[IGNORE:%.*]], label %true, label %false +; CHECK-LABEL: @test7( +; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[A:%.*]], -3 +; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]]) +; CHECK-NEXT: [[SWITCH:%.*]] = icmp eq i8 [[A]], -1 +; CHECK-NEXT: br i1 [[SWITCH]], label [[TRUE:%.*]], label [[FALSE:%.*]] +; CHECK: true: +; CHECK-NEXT: tail call void @foo(i32 1) +; CHECK-NEXT: ret void +; CHECK: false: +; CHECK-NEXT: tail call void @foo(i32 3) +; CHECK-NEXT: ret void +; %and = and i8 %a, 254 - %cmp = icmp eq i8 %and, 254 + %cmp = icmp eq i8 %and, 254 call void @llvm.assume(i1 %cmp) switch i8 %a, label %default [i8 255, label %true - i8 254, label %false - i8 0, label %also_dead] + i8 254, label %false + i8 0, label %also_dead] true: call void @foo(i32 1) ret void |

