blob: e38865699d2e644d0aa529bfad88a11ba3921cc8 [file] [log] [blame]
Shawn Landden24f40852019-06-13 19:36:38 +00001; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
Eric Christophercee313d2019-04-17 04:52:47 +00002; RUN: opt < %s -simplifycfg -S | FileCheck %s
3
4; Test that we can thread a simple known condition through switch statements.
5
6declare void @foo1()
7
8declare void @foo2()
9
10declare void @DEAD()
11
12define void @test1(i32 %V) {
Eric Christophercee313d2019-04-17 04:52:47 +000013; CHECK-LABEL: @test1(
Shawn Landden24f40852019-06-13 19:36:38 +000014; CHECK-NEXT: switch i32 [[V:%.*]], label [[A:%.*]] [
15; CHECK-NEXT: i32 4, label [[T:%.*]]
16; CHECK-NEXT: i32 17, label [[DONE:%.*]]
Eric Christophercee313d2019-04-17 04:52:47 +000017; CHECK-NEXT: ]
18; CHECK: T:
19; CHECK-NEXT: call void @foo1()
20; CHECK-NEXT: call void @foo2()
Shawn Landden24f40852019-06-13 19:36:38 +000021; CHECK-NEXT: br label [[DONE]]
Eric Christophercee313d2019-04-17 04:52:47 +000022; CHECK: A:
23; CHECK-NEXT: call void @foo1()
Shawn Landden24f40852019-06-13 19:36:38 +000024; CHECK-NEXT: br label [[DONE]]
Eric Christophercee313d2019-04-17 04:52:47 +000025; CHECK: Done:
26; CHECK-NEXT: ret void
Shawn Landden24f40852019-06-13 19:36:38 +000027;
28 switch i32 %V, label %A [
29 i32 4, label %T
30 i32 17, label %Done
31 i32 1234, label %A
32 ]
33;; V == 4 if we get here.
34T: ; preds = %0
35 call void @foo1( )
36 ;; This switch is always statically determined.
37 switch i32 %V, label %A2 [
38 i32 4, label %B
39 i32 17, label %C
40 i32 42, label %C
41 ]
42A2: ; preds = %T
43 call void @DEAD( )
44 call void @DEAD( )
45 ;; always true
46 %cond2 = icmp eq i32 %V, 4 ; <i1> [#uses=1]
47 br i1 %cond2, label %Done, label %C
48A: ; preds = %0, %0
49 call void @foo1( )
50 ;; always true
51 %cond = icmp ne i32 %V, 4 ; <i1> [#uses=1]
52 br i1 %cond, label %Done, label %C
53Done: ; preds = %B, %A, %A2, %0
54 ret void
55B: ; preds = %T
56 call void @foo2( )
57 ;; always true
58 %cond3 = icmp eq i32 %V, 4 ; <i1> [#uses=1]
59 br i1 %cond3, label %Done, label %C
60C: ; preds = %B, %A, %A2, %T, %T
61 call void @DEAD( )
62 ret void
63
Eric Christophercee313d2019-04-17 04:52:47 +000064}
65
66define void @test2(i32 %V) {
Eric Christophercee313d2019-04-17 04:52:47 +000067; CHECK-LABEL: @test2(
Shawn Landden24f40852019-06-13 19:36:38 +000068; CHECK-NEXT: switch i32 [[V:%.*]], label [[A:%.*]] [
69; CHECK-NEXT: i32 4, label [[T:%.*]]
70; CHECK-NEXT: i32 17, label [[D:%.*]]
71; CHECK-NEXT: i32 1234, label [[E:%.*]]
Eric Christophercee313d2019-04-17 04:52:47 +000072; CHECK-NEXT: ]
73; CHECK: A:
74; CHECK-NEXT: call void @foo1()
Shawn Landden24f40852019-06-13 19:36:38 +000075; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[V]], 42
76; CHECK-NEXT: br i1 [[COND]], label [[D]], label [[E]]
Eric Christophercee313d2019-04-17 04:52:47 +000077; CHECK: T:
78; CHECK-NEXT: call void @foo1()
79; CHECK-NEXT: call void @foo1()
80; CHECK-NEXT: ret void
81; CHECK: D:
82; CHECK-NEXT: call void @foo1()
83; CHECK-NEXT: ret void
84; CHECK: E:
85; CHECK-NEXT: ret void
Shawn Landden24f40852019-06-13 19:36:38 +000086;
87 switch i32 %V, label %A [
88 i32 4, label %T
89 i32 17, label %D
90 i32 1234, label %E
91 ]
92;; V != 4, 17, 1234 here.
93A: ; preds = %0
94 call void @foo1( )
95 ;; This switch is always statically determined.
96 switch i32 %V, label %E [
97 i32 4, label %C
98 i32 17, label %C
99 i32 42, label %D
100 ]
101;; unreacahble.
102C: ; preds = %A, %A
103 call void @DEAD( )
104 ret void
105T: ; preds = %0
106 call void @foo1( )
107 call void @foo1( )
108 ret void
109D: ; preds = %A, %0
110 call void @foo1( )
111 ret void
112E: ; preds = %A, %0
113 ret void
114
Eric Christophercee313d2019-04-17 04:52:47 +0000115}
116