summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll
diff options
context:
space:
mode:
authorShawn Landden <shawn@git.icu>2019-06-13 02:24:24 +0000
committerShawn Landden <shawn@git.icu>2019-06-13 02:24:24 +0000
commitf93b99b2b6a429f020aca2ea8c503e7553f3777c (patch)
tree3da484444848c18ab5bb7532d5c6b3e83e05d3ed /llvm/test/Transforms/SimplifyCFG/switch-dead-default.ll
parentf3356722184362c2e99ad6590f26eacadb507377 (diff)
downloadbcm5719-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.ll162
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
OpenPOWER on IntegriCloud