Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / ragreedy-bug.ll
blob0d9332ef9cdd1062850998bbd8de576f9d2683e0
1 ; RUN: llc < %s -mtriple=x86_64-apple-macosx -regalloc=greedy | FileCheck %s
3 ; This testing case is reduced from 197.parser prune_match function.
4 ; We make sure register copies are not generated on isupper.exit blocks.
6 ; isupper.exit and isupper.exit223 get tail-duplicated into all their
7 ; predecessors.
8 ; CHECK: cond.true.i.i
9 ; CHECK-NEXT: in Loop
10 ; Mem-move
11 ; CHECK-NEXT: movl
12 ; CHECK-NEXT: andl
13 ; CHECK-NEXT: testl
14 ; CHECK-NEXT: jne
15 ; CHECK: cond.true.i.i217
16 ; CHECK-NEXT: in Loop
17 ; Mem-move
18 ; CHECK-NEXT: movl
19 ; CHECK-NEXT: andl
20 ; CHECK-NEXT: testl
21 ; CHECK-NEXT: je
22 ; CHECK: cond.false.i.i
23 ; CHECK: maskrune
24 ; CHECK-NEXT: movzbl
25 ; CHECK-NEXT: movq
26 ; CHECK-NEXT: testl
27 ; CHECK-NEXT: je
28 ; CHECK: cond.false.i.i219
29 ; CHECK: maskrune
30 ; CHECK-NEXT: movzbl
31 ; CHECK-NEXT: movq
32 ; CHECK-NEXT: testl
33 ; CHECK-NEXT: jne
35 %struct.List_o_links_struct = type { i32, i32, i32, ptr }
36 %struct.Connector_struct = type { i16, i16, i8, i8, ptr, ptr }
37 %struct._RuneLocale = type { [8 x i8], [32 x i8], ptr, ptr, i32, [256 x i32], [256 x i32], [256 x i32], %struct._RuneRange, %struct._RuneRange, %struct._RuneRange, ptr, i32, i32, ptr }
38 %struct._RuneRange = type { i32, ptr }
39 %struct._RuneEntry = type { i32, i32, i32, ptr }
40 %struct._RuneCharClass = type { [14 x i8], i32 }
41 %struct.Exp_struct = type { i8, i8, i8, i8, %union.anon }
42 %union.anon = type { ptr }
43 %struct.E_list_struct = type { ptr, ptr }
44 %struct.domain_struct = type { ptr, i32, ptr, i32, i32, ptr, ptr }
45 %struct.d_tree_leaf_struct = type { ptr, i32, ptr }
46 @_DefaultRuneLocale = external global %struct._RuneLocale
47 declare i32 @__maskrune(i32, i64) #7
48 define fastcc i32 @prune_match(ptr nocapture readonly %a, ptr nocapture readonly %b) #9 {
49 entry:
50   %0 = load i16, ptr %a, align 2
51   %1 = load i16, ptr %b, align 2
52   %cmp = icmp eq i16 %0, %1
53   br i1 %cmp, label %if.end, label %return, !prof !988
54 if.end:
55   %priority = getelementptr inbounds %struct.Connector_struct, ptr %a, i64 0, i32 2
56   %2 = load i8, ptr %priority, align 1
57   %priority5 = getelementptr inbounds %struct.Connector_struct, ptr %b, i64 0, i32 2
58   %3 = load i8, ptr %priority5, align 1
59   %string = getelementptr inbounds %struct.Connector_struct, ptr %a, i64 0, i32 5
60   %4 = load ptr, ptr %string, align 8
61   %string7 = getelementptr inbounds %struct.Connector_struct, ptr %b, i64 0, i32 5
62   %5 = load ptr, ptr %string7, align 8
63   br label %while.cond
64 while.cond:
65   %lsr.iv27 = phi i64 [ %lsr.iv.next28, %if.end17 ], [ 0, %if.end ]
66   %scevgep55 = getelementptr i8, ptr %4, i64 %lsr.iv27
67   %6 = load i8, ptr %scevgep55, align 1
68   %idxprom.i.i = sext i8 %6 to i64
69   %isascii.i.i224 = icmp sgt i8 %6, -1
70   br i1 %isascii.i.i224, label %cond.true.i.i, label %cond.false.i.i, !prof !181
71 cond.true.i.i:
72   %arrayidx.i.i = getelementptr inbounds %struct._RuneLocale, ptr @_DefaultRuneLocale, i64 0, i32 5, i64 %idxprom.i.i
73   %7 = load i32, ptr %arrayidx.i.i, align 4
74   %and.i.i = and i32 %7, 32768
75   br label %isupper.exit
76 cond.false.i.i:
77   %8 = trunc i64 %idxprom.i.i to i8
78   %conv8 = sext i8 %8 to i32
79   %call3.i.i = tail call i32 @__maskrune(i32 %conv8, i64 32768) #3
80   br label %isupper.exit
81 isupper.exit:
82   %tobool1.sink.i.in.i = phi i32 [ %and.i.i, %cond.true.i.i ], [ %call3.i.i, %cond.false.i.i ]
83   %tobool1.sink.i.i = icmp eq i32 %tobool1.sink.i.in.i, 0
84   br i1 %tobool1.sink.i.i, label %lor.rhs, label %while.body, !prof !989
85 lor.rhs:
86   %sunkaddr = ptrtoint ptr %5 to i64
87   %sunkaddr58 = add i64 %sunkaddr, %lsr.iv27
88   %sunkaddr59 = inttoptr i64 %sunkaddr58 to ptr
89   %9 = load i8, ptr %sunkaddr59, align 1
90   %idxprom.i.i214 = sext i8 %9 to i64
91   %isascii.i.i213225 = icmp sgt i8 %9, -1
92   br i1 %isascii.i.i213225, label %cond.true.i.i217, label %cond.false.i.i219, !prof !181
93 cond.true.i.i217:
94   %arrayidx.i.i215 = getelementptr inbounds %struct._RuneLocale, ptr @_DefaultRuneLocale, i64 0, i32 5, i64 %idxprom.i.i214
95   %10 = load i32, ptr %arrayidx.i.i215, align 4
96   %and.i.i216 = and i32 %10, 32768
97   br label %isupper.exit223
98 cond.false.i.i219:
99   %11 = trunc i64 %idxprom.i.i214 to i8
100   %conv9 = sext i8 %11 to i32
101   %call3.i.i218 = tail call i32 @__maskrune(i32 %conv9, i64 32768) #3
102   br label %isupper.exit223
103 isupper.exit223:
104   %tobool1.sink.i.in.i220 = phi i32 [ %and.i.i216, %cond.true.i.i217 ], [ %call3.i.i218, %cond.false.i.i219 ]
105   %tobool1.sink.i.i221 = icmp eq i32 %tobool1.sink.i.in.i220, 0
106   br i1 %tobool1.sink.i.i221, label %while.end, label %while.body, !prof !990
107 while.body:
108   %sunkaddr60 = ptrtoint ptr %4 to i64
109   %sunkaddr61 = add i64 %sunkaddr60, %lsr.iv27
110   %sunkaddr62 = inttoptr i64 %sunkaddr61 to ptr
111   %12 = load i8, ptr %sunkaddr62, align 1
112   %sunkaddr63 = ptrtoint ptr %5 to i64
113   %sunkaddr64 = add i64 %sunkaddr63, %lsr.iv27
114   %sunkaddr65 = inttoptr i64 %sunkaddr64 to ptr
115   %13 = load i8, ptr %sunkaddr65, align 1
116   %cmp14 = icmp eq i8 %12, %13
117   br i1 %cmp14, label %if.end17, label %return, !prof !991
118 if.end17:
119   %lsr.iv.next28 = add i64 %lsr.iv27, 1
120   br label %while.cond
121 while.end:
122   %14 = or i8 %3, %2
123   %15 = icmp eq i8 %14, 0
124   br i1 %15, label %if.then23, label %if.else88, !prof !992
125 if.then23:
126   %sunkaddr66 = ptrtoint ptr %a to i64
127   %sunkaddr67 = add i64 %sunkaddr66, 16
128   %sunkaddr68 = inttoptr i64 %sunkaddr67 to ptr
129   %16 = load ptr, ptr %sunkaddr68, align 8
130   %17 = load i8, ptr %16, align 1
131   %cmp26 = icmp eq i8 %17, 83
132   %sunkaddr69 = ptrtoint ptr %4 to i64
133   %sunkaddr70 = add i64 %sunkaddr69, %lsr.iv27
134   %sunkaddr71 = inttoptr i64 %sunkaddr70 to ptr
135   %18 = load i8, ptr %sunkaddr71, align 1
136   br i1 %cmp26, label %land.lhs.true28, label %while.cond59.preheader, !prof !993
137 land.lhs.true28:
138   switch i8 %18, label %land.rhs.preheader [
139     i8 112, label %land.lhs.true35
140     i8 0, label %return
141   ], !prof !994
142 land.lhs.true35:
143   %sunkaddr72 = ptrtoint ptr %5 to i64
144   %sunkaddr73 = add i64 %sunkaddr72, %lsr.iv27
145   %sunkaddr74 = inttoptr i64 %sunkaddr73 to ptr
146   %19 = load i8, ptr %sunkaddr74, align 1
147   switch i8 %19, label %land.rhs.preheader [
148     i8 112, label %land.lhs.true43
149   ], !prof !995
150 land.lhs.true43:
151   %20 = ptrtoint ptr %16 to i64
152   %21 = sub i64 0, %20
153   %scevgep52 = getelementptr i8, ptr %4, i64 %21
154   %scevgep53 = getelementptr i8, ptr %scevgep52, i64 %lsr.iv27
155   %scevgep54 = getelementptr i8, ptr %scevgep53, i64 -1
156   %cmp45 = icmp eq ptr %scevgep54, null
157   br i1 %cmp45, label %return, label %lor.lhs.false47, !prof !996
158 lor.lhs.false47:
159   %22 = ptrtoint ptr %16 to i64
160   %23 = sub i64 0, %22
161   %scevgep47 = getelementptr i8, ptr %4, i64 %23
162   %scevgep48 = getelementptr i8, ptr %scevgep47, i64 %lsr.iv27
163   %scevgep49 = getelementptr i8, ptr %scevgep48, i64 -2
164   %cmp50 = icmp eq ptr %scevgep49, null
165   br i1 %cmp50, label %land.lhs.true52, label %while.cond59.preheader, !prof !997
166 land.lhs.true52:
167   %sunkaddr75 = ptrtoint ptr %4 to i64
168   %sunkaddr76 = add i64 %sunkaddr75, %lsr.iv27
169   %sunkaddr77 = add i64 %sunkaddr76, -1
170   %sunkaddr78 = inttoptr i64 %sunkaddr77 to ptr
171   %24 = load i8, ptr %sunkaddr78, align 1
172   %cmp55 = icmp eq i8 %24, 73
173   %cmp61233 = icmp eq i8 %18, 0
174   %or.cond265 = or i1 %cmp55, %cmp61233
175   br i1 %or.cond265, label %return, label %land.rhs.preheader, !prof !998
176 while.cond59.preheader:
177   %cmp61233.old = icmp eq i8 %18, 0
178   br i1 %cmp61233.old, label %return, label %land.rhs.preheader, !prof !999
179 land.rhs.preheader:
180   %scevgep33 = getelementptr i8, ptr %5, i64 %lsr.iv27
181   %scevgep43 = getelementptr i8, ptr %4, i64 %lsr.iv27
182   br label %land.rhs
183 land.rhs:
184   %lsr.iv = phi i64 [ 0, %land.rhs.preheader ], [ %lsr.iv.next, %if.then83 ]
185   %25 = phi i8 [ %27, %if.then83 ], [ %18, %land.rhs.preheader ]
186   %scevgep34 = getelementptr i8, ptr %scevgep33, i64 %lsr.iv
187   %26 = load i8, ptr %scevgep34, align 1
188   %cmp64 = icmp eq i8 %26, 0
189   br i1 %cmp64, label %return, label %while.body66, !prof !1000
190 while.body66:
191   %cmp68 = icmp eq i8 %25, 42
192   %cmp72 = icmp eq i8 %26, 42
193   %or.cond = or i1 %cmp68, %cmp72
194   br i1 %or.cond, label %if.then83, label %lor.lhs.false74, !prof !1001
195 lor.lhs.false74:
196   %cmp77 = icmp ne i8 %25, %26
197   %cmp81 = icmp eq i8 %25, 94
198   %or.cond208 = or i1 %cmp77, %cmp81
199   br i1 %or.cond208, label %return, label %if.then83, !prof !1002
200 if.then83:
201   %scevgep44 = getelementptr i8, ptr %scevgep43, i64 %lsr.iv
202   %scevgep45 = getelementptr i8, ptr %scevgep44, i64 1
203   %27 = load i8, ptr %scevgep45, align 1
204   %cmp61 = icmp eq i8 %27, 0
205   %lsr.iv.next = add i64 %lsr.iv, 1
206   br i1 %cmp61, label %return, label %land.rhs, !prof !999
207 if.else88:
208   %cmp89 = icmp eq i8 %2, 1
209   %cmp92 = icmp eq i8 %3, 2
210   %or.cond159 = and i1 %cmp89, %cmp92
211   br i1 %or.cond159, label %while.cond95.preheader, label %if.else123, !prof !1003
212 while.cond95.preheader:
213   %sunkaddr79 = ptrtoint ptr %4 to i64
214   %sunkaddr80 = add i64 %sunkaddr79, %lsr.iv27
215   %sunkaddr81 = inttoptr i64 %sunkaddr80 to ptr
216   %28 = load i8, ptr %sunkaddr81, align 1
217   %cmp97238 = icmp eq i8 %28, 0
218   br i1 %cmp97238, label %return, label %land.rhs99.preheader, !prof !1004
219 land.rhs99.preheader:
220   %scevgep31 = getelementptr i8, ptr %5, i64 %lsr.iv27
221   %scevgep40 = getelementptr i8, ptr %4, i64 %lsr.iv27
222   br label %land.rhs99
223 land.rhs99:
224   %lsr.iv17 = phi i64 [ 0, %land.rhs99.preheader ], [ %lsr.iv.next18, %if.then117 ]
225   %29 = phi i8 [ %31, %if.then117 ], [ %28, %land.rhs99.preheader ]
226   %scevgep32 = getelementptr i8, ptr %scevgep31, i64 %lsr.iv17
227   %30 = load i8, ptr %scevgep32, align 1
228   %cmp101 = icmp eq i8 %30, 0
229   br i1 %cmp101, label %return, label %while.body104, !prof !1005
230 while.body104:
231   %cmp107 = icmp eq i8 %29, %30
232   %cmp111 = icmp eq i8 %29, 42
233   %or.cond209 = or i1 %cmp107, %cmp111
234   %cmp115 = icmp eq i8 %30, 94
235   %or.cond210 = or i1 %or.cond209, %cmp115
236   br i1 %or.cond210, label %if.then117, label %return, !prof !1006
237 if.then117:
238   %scevgep41 = getelementptr i8, ptr %scevgep40, i64 %lsr.iv17
239   %scevgep42 = getelementptr i8, ptr %scevgep41, i64 1
240   %31 = load i8, ptr %scevgep42, align 1
241   %cmp97 = icmp eq i8 %31, 0
242   %lsr.iv.next18 = add i64 %lsr.iv17, 1
243   br i1 %cmp97, label %return, label %land.rhs99, !prof !1004
244 if.else123:
245   %cmp124 = icmp eq i8 %3, 1
246   %cmp127 = icmp eq i8 %2, 2
247   %or.cond160 = and i1 %cmp124, %cmp127
248   br i1 %or.cond160, label %while.cond130.preheader, label %return, !prof !1007
249 while.cond130.preheader:
250   %sunkaddr82 = ptrtoint ptr %4 to i64
251   %sunkaddr83 = add i64 %sunkaddr82, %lsr.iv27
252   %sunkaddr84 = inttoptr i64 %sunkaddr83 to ptr
253   %32 = load i8, ptr %sunkaddr84, align 1
254   %cmp132244 = icmp eq i8 %32, 0
255   br i1 %cmp132244, label %return, label %land.rhs134.preheader, !prof !1008
256 land.rhs134.preheader:
257   %scevgep29 = getelementptr i8, ptr %5, i64 %lsr.iv27
258   %scevgep37 = getelementptr i8, ptr %4, i64 %lsr.iv27
259   br label %land.rhs134
260 land.rhs134:
261   %lsr.iv22 = phi i64 [ 0, %land.rhs134.preheader ], [ %lsr.iv.next23, %if.then152 ]
262   %33 = phi i8 [ %35, %if.then152 ], [ %32, %land.rhs134.preheader ]
263   %scevgep30 = getelementptr i8, ptr %scevgep29, i64 %lsr.iv22
264   %34 = load i8, ptr %scevgep30, align 1
265   %cmp136 = icmp eq i8 %34, 0
266   br i1 %cmp136, label %return, label %while.body139, !prof !1009
267 while.body139:
268   %cmp142 = icmp eq i8 %33, %34
269   %cmp146 = icmp eq i8 %34, 42
270   %or.cond211 = or i1 %cmp142, %cmp146
271   %cmp150 = icmp eq i8 %33, 94
272   %or.cond212 = or i1 %or.cond211, %cmp150
273   br i1 %or.cond212, label %if.then152, label %return, !prof !1010
274 if.then152:
275   %scevgep38 = getelementptr i8, ptr %scevgep37, i64 %lsr.iv22
276   %scevgep39 = getelementptr i8, ptr %scevgep38, i64 1
277   %35 = load i8, ptr %scevgep39, align 1
278   %cmp132 = icmp eq i8 %35, 0
279   %lsr.iv.next23 = add i64 %lsr.iv22, 1
280   br i1 %cmp132, label %return, label %land.rhs134, !prof !1008
281 return:
282   %retval.0 = phi i32 [ 0, %entry ], [ 1, %land.lhs.true52 ], [ 1, %land.lhs.true43 ], [ 0, %if.else123 ], [ 1, %while.cond59.preheader ], [ 1, %while.cond95.preheader ], [ 1, %while.cond130.preheader ], [ 1, %land.lhs.true28 ], [ 1, %if.then83 ], [ 0, %lor.lhs.false74 ], [ 1, %land.rhs ], [ 1, %if.then117 ], [ 0, %while.body104 ], [ 1, %land.rhs99 ], [ 1, %if.then152 ], [ 0, %while.body139 ], [ 1, %land.rhs134 ], [ 0, %while.body ]
283   ret i32 %retval.0
285 !181 = !{!"branch_weights", i32 662038, i32 1}
286 !988 = !{!"branch_weights", i32 12091450, i32 1916}
287 !989 = !{!"branch_weights", i32 7564670, i32 4526781}
288 !990 = !{!"branch_weights", i32 7484958, i32 13283499}
289 !991 = !{!"branch_weights", i32 8677007, i32 4606493}
290 !992 = !{!"branch_weights", i32 -1172426948, i32 145094705}
291 !993 = !{!"branch_weights", i32 1468914, i32 5683688}
292 !994 = !{!"branch_weights", i32 114025221, i32 -1217548794, i32 -1199521551}
293 !995 = !{!"branch_weights", i32 1853716452, i32 -444717951}
294 !996 = !{!"branch_weights", i32 1004870, i32 20259}
295 !997 = !{!"branch_weights", i32 20071, i32 189}
296 !998 = !{!"branch_weights", i32 -1020255939, i32 572177766}
297 !999 = !{!"branch_weights", i32 2666513, i32 3466431}
298 !1000 = !{!"branch_weights", i32 5117635, i32 1859780}
299 !1001 = !{!"branch_weights", i32 354902465, i32 -1444604407}
300 !1002 = !{!"branch_weights", i32 -1762419279, i32 1592770684}
301 !1003 = !{!"branch_weights", i32 1435905930, i32 -1951930624}
302 !1004 = !{!"branch_weights", i32 1, i32 504888}
303 !1005 = !{!"branch_weights", i32 94662, i32 504888}
304 !1006 = !{!"branch_weights", i32 -1897793104, i32 160196332}
305 !1007 = !{!"branch_weights", i32 2074643678, i32 -29579071}
306 !1008 = !{!"branch_weights", i32 1, i32 226163}
307 !1009 = !{!"branch_weights", i32 58357, i32 226163}
308 !1010 = !{!"branch_weights", i32 -2072848646, i32 92907517}