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