[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / partial-tail-dup.ll
blob691f3e70c286cca00d6abbe4dc4efbc8292dd14a
1 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
4 @gvar = external global i32
6 ; dupbb has two predecessors, p1 and p2. p1 is hot, p2 is cold. So dupbb
7 ; should be placed after p1, and not duplicated into p2.
9 ; CHECK-LABEL: test1
10 ; CHECK:       %p1
11 ; CHECK:       .LBB0_4: # %dupbb
12 ; CHECK:       %p2
13 ; CHECK:       jmp .LBB0_4
15 define void @test1(ptr %p) !prof !1 {
16 entry:
17   br label %header
19 header:
20   %call = call zeroext i1 @a()
21   br i1 %call, label %p1, label %p2, !prof !2
23 p1:
24   call void @b()
25   br label %dupbb
27 p2:
28   call void @c()
29   br label %dupbb
31 dupbb:
32   %cond = icmp eq ptr @gvar, %p
33   br i1 %cond, label %header, label %latch, !prof !3
35 latch:
36   %call3 = call zeroext i1 @a()
37   br i1 %call3, label %header, label %end, !prof !2
39 end:
40   ret void
44 ; dupbb has four predecessors p1, p2, p3 and p4. p1 and p2 are hot, p3 and  p4
45 ; are cold. So dupbb should be placed after p1, duplicated into p2. p3 and p4
46 ; should jump to dupbb.
48 ; CHECK-LABEL: test2
49 ; CHECK:       %p1
50 ; CHECK:       .LBB1_8: # %dupbb
52 ; CHECK:       %p2
53 ; CHECK:       callq c
54 ; CHECK-NEXT:  cmpq
55 ; CHECK-NEXT:  je
56 ; CHECK-NEXT:  jmp
58 ; CHECK:       %p3
59 ; CHECK:       jmp .LBB1_8
60 ; CHECK:       %p4
61 ; CHECK:       jmp .LBB1_8
63 define void @test2(ptr %p) !prof !1 {
64 entry:
65   br label %header
67 header:
68   %call = call zeroext i1 @a()
69   br i1 %call, label %bb1, label %bb2, !prof !2
71 bb1:
72   %call1 = call zeroext i1 @a()
73   br i1 %call1, label %p1, label %p2, !prof !4
75 bb2:
76   %call2 = call zeroext i1 @a()
77   br i1 %call2, label %p3, label %p4, !prof !4
79 p1:
80   call void @b()
81   br label %dupbb
83 p2:
84   call void @c()
85   br label %dupbb
87 p3:
88   call void @d()
89   br label %dupbb
91 p4:
92   call void @e()
93   br label %dupbb
95 dupbb:
96   %cond = icmp eq ptr @gvar, %p
97   br i1 %cond, label %bb3, label %bb4, !prof !4
99 bb3:
100   call void @b()
101   br label %bb4
103 bb4:
104   %call4 = call zeroext i1 @a()
105   br i1 %call4, label %header, label %latch, !prof !3
107 latch:
108   %call3 = call zeroext i1 @a()
109   br i1 %call3, label %header, label %end, !prof !2
111 end:
112   ret void
116 ; dupbb has three predecessors p1, p2 and p3. p3 has two successors, so dupbb
117 ; can't be duplicated into p3, but it should not block it to be duplicated into
118 ; other predecessors.
120 ; CHECK-LABEL: test3
121 ; CHECK:       %p1
122 ; CHECK:       .LBB2_6: # %dupbb
124 ; CHECK:       %p2
125 ; CHECK:       callq c
126 ; CHECK:       cmpq
127 ; CHECK-NEXT:  je
128 ; CHECK-NEXT:  jmp
130 ; CHECK:       %p3
131 ; CHECK:       jne .LBB2_6
133 define void @test3(ptr %p) !prof !1 {
134 entry:
135   br label %header
137 header:
138   %call = call zeroext i1 @a()
139   br i1 %call, label %bb1, label %p3, !prof !2
141 bb1:
142   %call1 = call zeroext i1 @a()
143   br i1 %call1, label %p1, label %p2, !prof !4
146   call void @b()
147   br label %dupbb
150   call void @c()
151   br label %dupbb
154   %call2 = call zeroext i1 @a()
155   br i1 %call2, label %dupbb, label %bb4, !prof !4
157 dupbb:
158   %cond = icmp eq ptr @gvar, %p
159   br i1 %cond, label %bb3, label %bb4, !prof !4
161 bb3:
162   call void @b()
163   br label %bb4
165 bb4:
166   %call4 = call zeroext i1 @a()
167   br i1 %call4, label %header, label %latch, !prof !3
169 latch:
170   %call3 = call zeroext i1 @a()
171   br i1 %call3, label %header, label %end, !prof !2
173 end:
174   ret void
177 declare zeroext i1 @a()
178 declare void @b()
179 declare void @c()
180 declare void @d()
181 declare void @e()
182 declare void @f()
184 !1 = !{!"function_entry_count", i64 1000}
185 !2 = !{!"branch_weights", i32 100, i32 1}
186 !3 = !{!"branch_weights", i32 1, i32 100}
187 !4 = !{!"branch_weights", i32 60, i32 40}