1; RUN: opt -codegenprepare  < %s  -mtriple=aarch64-none-linux-gnu -S  | FileCheck %s
2
3target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
4target triple = "aarch64--linux-gnu"
5
6; Expect to skip merging two empty blocks (sw.bb and sw.bb2) into sw.epilog
7; as both of them are unlikely executed.
8define i32 @f_switch(i32 %c)  {
9; CHECK-LABEL: @f_switch
10; CHECK-LABEL: entry:
11; CHECK: i32 10, label %sw.bb
12; CHECK: i32 20, label %sw.bb2
13entry:
14  switch i32 %c, label %sw.default [
15    i32 10, label %sw.bb
16    i32 20, label %sw.bb2
17    i32 30, label %sw.bb3
18    i32 40, label %sw.bb4
19  ], !prof !0
20
21sw.bb:                                            ; preds = %entry
22  br label %sw.epilog
23
24sw.bb2:                                           ; preds = %entry
25  br label %sw.epilog
26
27sw.bb3:                                           ; preds = %entry
28  call void bitcast (void (...)* @callcase3 to void ()*)()
29  br label %sw.epilog
30
31sw.bb4:                                           ; preds = %entry
32  call void bitcast (void (...)* @callcase4 to void ()*)()
33  br label %sw.epilog
34
35sw.default:                                       ; preds = %entry
36  call void bitcast (void (...)* @calldefault to void ()*)()
37  br label %sw.epilog
38
39; CHECK-LABEL: sw.epilog:
40; CHECK: %fp.0 = phi void (...)* [ @FD, %sw.default ], [ @F4, %sw.bb4 ], [ @F3, %sw.bb3 ], [ @F2, %sw.bb2 ], [ @F1, %sw.bb ]
41sw.epilog:                                        ; preds = %sw.default, %sw.bb3, %sw.bb2, %sw.bb
42  %fp.0 = phi void (...)* [ @FD, %sw.default ], [ @F4, %sw.bb4 ], [ @F3, %sw.bb3 ], [ @F2, %sw.bb2 ], [ @F1, %sw.bb ]
43  %callee.knr.cast = bitcast void (...)* %fp.0 to void ()*
44  call void %callee.knr.cast()
45  ret i32 0
46}
47
48; Expect not to merge sw.bb2 because of the conflict in the incoming value from
49; sw.bb which is already merged.
50define i32 @f_switch2(i32 %c)  {
51; CHECK-LABEL: @f_switch2
52; CHECK-LABEL: entry:
53; CHECK: i32 10, label %sw.epilog
54; CHECK: i32 20, label %sw.bb2
55entry:
56  switch i32 %c, label %sw.default [
57    i32 10, label %sw.bb
58    i32 20, label %sw.bb2
59    i32 30, label %sw.bb3
60    i32 40, label %sw.bb4
61  ], !prof !1
62
63sw.bb:                                            ; preds = %entry
64  br label %sw.epilog
65
66sw.bb2:                                           ; preds = %entry
67  br label %sw.epilog
68
69sw.bb3:                                           ; preds = %entry
70  call void bitcast (void (...)* @callcase3 to void ()*)()
71  br label %sw.epilog
72
73sw.bb4:                                           ; preds = %entry
74  call void bitcast (void (...)* @callcase4 to void ()*)()
75  br label %sw.epilog
76
77sw.default:                                       ; preds = %entry
78  call void bitcast (void (...)* @calldefault to void ()*)()
79  br label %sw.epilog
80
81; CHECK-LABEL: sw.epilog:
82; CHECK: %fp.0 = phi void (...)* [ @FD, %sw.default ], [ @F4, %sw.bb4 ], [ @F3, %sw.bb3 ], [ @F2, %sw.bb2 ], [ @F1, %entry ]
83sw.epilog:                                        ; preds = %sw.default, %sw.bb3, %sw.bb2, %sw.bb
84  %fp.0 = phi void (...)* [ @FD, %sw.default ], [ @F4, %sw.bb4 ], [ @F3, %sw.bb3 ], [ @F2, %sw.bb2 ], [ @F1, %sw.bb ]
85  %callee.knr.cast = bitcast void (...)* %fp.0 to void ()*
86  call void %callee.knr.cast()
87  ret i32 0
88}
89
90; Multiple empty blocks should be considered together if all incoming values
91; from them are same.  We expect to merge both empty blocks (sw.bb and sw.bb2)
92; because the sum of frequencies are higer than the threshold.
93define i32 @f_switch3(i32 %c)  {
94; CHECK-LABEL: @f_switch3
95; CHECK-LABEL: entry:
96; CHECK: i32 10, label %sw.epilog
97; CHECK: i32 20, label %sw.epilog
98entry:
99  switch i32 %c, label %sw.default [
100    i32 10, label %sw.bb
101    i32 20, label %sw.bb2
102    i32 30, label %sw.bb3
103    i32 40, label %sw.bb4
104  ], !prof !2
105
106sw.bb:                                            ; preds = %entry
107  br label %sw.epilog
108
109sw.bb2:                                           ; preds = %entry
110  br label %sw.epilog
111
112sw.bb3:                                           ; preds = %entry
113  call void bitcast (void (...)* @callcase3 to void ()*)()
114  br label %sw.epilog
115
116sw.bb4:                                           ; preds = %entry
117  call void bitcast (void (...)* @callcase4 to void ()*)()
118  br label %sw.epilog
119
120sw.default:                                       ; preds = %entry
121  call void bitcast (void (...)* @calldefault to void ()*)()
122  br label %sw.epilog
123
124; CHECK-LABEL: sw.epilog:
125; CHECK: %fp.0 = phi void (...)* [ @FD, %sw.default ], [ @F4, %sw.bb4 ], [ @F3, %sw.bb3 ], [ @F1, %entry ], [ @F1, %entry ]
126sw.epilog:                                        ; preds = %sw.default, %sw.bb3, %sw.bb2, %sw.bb
127  %fp.0 = phi void (...)* [ @FD, %sw.default ], [ @F4, %sw.bb4 ], [ @F3, %sw.bb3 ], [ @F1, %sw.bb2 ], [ @F1, %sw.bb ]
128  %callee.knr.cast = bitcast void (...)* %fp.0 to void ()*
129  call void %callee.knr.cast()
130  ret i32 0
131}
132
133declare void @F1(...) local_unnamed_addr
134declare void @F2(...) local_unnamed_addr
135declare void @F3(...) local_unnamed_addr
136declare void @F4(...) local_unnamed_addr
137declare void @FD(...) local_unnamed_addr
138declare void @callcase3(...) local_unnamed_addr
139declare void @callcase4(...) local_unnamed_addr
140declare void @calldefault(...) local_unnamed_addr
141
142!0 = !{!"branch_weights", i32 5, i32 1, i32 1,i32 5, i32 5}
143!1 = !{!"branch_weights", i32 1 , i32 5, i32 1,i32 1, i32 1}
144!2 = !{!"branch_weights", i32 1 , i32 4, i32 1,i32 1, i32 1}
145
146
147; This test that BFI/BPI is created without any assertion in isMergingEmptyBlockProfitable()
148; in the case where empty blocks are removed before creating BFI/BPI.
149@b = common global i32 0, align 4
150@a = common global i32* null, align 8
151define i32 @should_not_assert(i32 %i) local_unnamed_addr {
152entry:
153  %0 = load i32, i32* @b, align 4
154  %cond = icmp eq i32 %0, 6
155  br i1 %cond, label %while.cond.preheader, label %sw.epilog
156
157while.cond.preheader:                             ; preds = %entry
158  %1 = load i32*, i32** @a, align 8
159  %magicptr = ptrtoint i32* %1 to i64
160  %arrayidx = getelementptr inbounds i32, i32* %1, i64 1
161  br label %while.cond
162
163while.cond:                                       ; preds = %while.cond.preheader, %land.rhs
164  switch i64 %magicptr, label %land.rhs [
165    i64 32, label %while.cond2.loopexit
166    i64 0, label %while.cond2.loopexit
167  ]
168
169land.rhs:                                         ; preds = %while.cond
170  %2 = load i32, i32* %arrayidx, align 4
171  %tobool1 = icmp eq i32 %2, 0
172  br i1 %tobool1, label %while.cond2thread-pre-split.loopexit, label %while.cond
173
174while.cond2thread-pre-split.loopexit:             ; preds = %land.rhs
175  br label %while.cond2thread-pre-split
176
177while.cond2thread-pre-split:                      ; preds = %while.cond2thread-pre-split.loopexit, %while.body4
178  %.pr = phi i32* [ %.pr.pre, %while.body4 ], [ %1, %while.cond2thread-pre-split.loopexit ]
179  br label %while.cond2
180
181while.cond2.loopexit:                             ; preds = %while.cond, %while.cond
182  br label %while.cond2
183
184while.cond2:                                      ; preds = %while.cond2.loopexit, %while.cond2thread-pre-split
185  %3 = phi i32* [ %.pr, %while.cond2thread-pre-split ], [ %1, %while.cond2.loopexit ]
186  %tobool3 = icmp eq i32* %3, null
187  br i1 %tobool3, label %sw.epilog, label %while.body4
188
189while.body4:                                      ; preds = %while.cond2
190  tail call void bitcast (void (...)* @fn2 to void ()*)()
191  %.pr.pre = load i32*, i32** @a, align 8
192  br label %while.cond2thread-pre-split
193
194sw.epilog:                                        ; preds = %while.cond2, %entry
195  ret i32 undef
196}
197
198
199declare void @fn2(...) local_unnamed_addr
200
201