xref: /llvm-project/llvm/test/CodeGen/X86/optimize-compare.mir (revision c81a121f3f230cfe468b6def6d2904b4aefb855b)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -o - %s -mtriple=x86_64-- -run-pass peephole-opt | FileCheck %s
3
4---
5name: opt_zerocmp_0
6body: |
7  bb.0:
8    ; CHECK-LABEL: name: opt_zerocmp_0
9    ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi
10    ; CHECK-NEXT: [[XOR32ri:%[0-9]+]]:gr32 = XOR32ri [[COPY]], i32 1234, implicit-def $eflags
11    ; CHECK-NEXT: $al = SETCCr 5, implicit $eflags
12    %0:gr32 = COPY $esi
13    %1:gr32 = XOR32ri %0, i32 1234, implicit-def $eflags
14    ; TEST should be removed.
15    TEST32rr %1, %1, implicit-def $eflags
16    $al = SETCCr 5, implicit $eflags
17...
18---
19name: opt_zerocmp_1
20body: |
21  bb.0:
22    ; CHECK-LABEL: name: opt_zerocmp_1
23    ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
24    ; CHECK-NEXT: [[DEC64r:%[0-9]+]]:gr64 = DEC64r [[COPY]], implicit-def $eflags
25    ; CHECK-NEXT: [[LEA64r:%[0-9]+]]:gr64 = LEA64r [[DEC64r]], 5, $noreg, 12, $noreg
26    ; CHECK-NEXT: $al = SETCCr 4, implicit $eflags
27    %0:gr64 = COPY $rsi
28    %1:gr64 = DEC64r %0, implicit-def $eflags
29    ; CMP should be removed.
30    CMP64ri32 %1, 0, implicit-def $eflags
31    %2:gr64 = LEA64r %1, 5, $noreg, 12, $noreg
32    $al = SETCCr 4, implicit $eflags
33...
34---
35name: opt_multiple_blocks
36tracksRegLiveness: true
37body: |
38  ; CHECK-LABEL: name: opt_multiple_blocks
39  ; CHECK: bb.0:
40  ; CHECK-NEXT:   successors: %bb.1(0x80000000)
41  ; CHECK-NEXT: {{  $}}
42  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gr64 = COPY undef $rsi
43  ; CHECK-NEXT:   [[INC64r:%[0-9]+]]:gr64 = INC64r [[COPY]], implicit-def $eflags
44  ; CHECK-NEXT:   PUSH64r undef $rcx, implicit-def $rsp, implicit $rsp
45  ; CHECK-NEXT:   $rcx = POP64r implicit-def $rsp, implicit $rsp
46  ; CHECK-NEXT:   JMP_1 %bb.1
47  ; CHECK-NEXT: {{  $}}
48  ; CHECK-NEXT: bb.1:
49  ; CHECK-NEXT:   liveins: $eflags
50  ; CHECK-NEXT: {{  $}}
51  ; CHECK-NEXT:   [[LEA64r:%[0-9]+]]:gr64 = LEA64r [[INC64r]], 5, $noreg, 12, $noreg
52  ; CHECK-NEXT:   $al = SETCCr 4, implicit $eflags
53  bb.0:
54    %0:gr64 = COPY undef $rsi
55    %1:gr64 = INC64r %0, implicit-def $eflags
56    PUSH64r undef $rcx, implicit-def $rsp, implicit $rsp
57    $rcx = POP64r implicit-def $rsp, implicit $rsp
58    JMP_1 %bb.1
59
60  bb.1:
61    ; TEST should be removed.
62    TEST64rr %1, %1, implicit-def $eflags
63    %2:gr64 = LEA64r %1, 5, $noreg, 12, $noreg
64    $al = SETCCr 4, implicit $eflags
65...
66---
67name: opt_multiple_blocks_noopt_0
68body: |
69  ; CHECK-LABEL: name: opt_multiple_blocks_noopt_0
70  ; CHECK: bb.0:
71  ; CHECK-NEXT:   successors: %bb.1(0x80000000)
72  ; CHECK-NEXT: {{  $}}
73  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gr64 = COPY undef $rsi
74  ; CHECK-NEXT:   [[INC64r:%[0-9]+]]:gr64 = INC64r [[COPY]], implicit-def $eflags
75  ; CHECK-NEXT:   JMP_1 %bb.1
76  ; CHECK-NEXT: {{  $}}
77  ; CHECK-NEXT: bb.1:
78  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
79  ; CHECK-NEXT: {{  $}}
80  ; CHECK-NEXT:   TEST64rr [[INC64r]], [[INC64r]], implicit-def $eflags
81  ; CHECK-NEXT:   [[LEA64r:%[0-9]+]]:gr64 = LEA64r [[INC64r]], 5, $noreg, 12, $noreg
82  ; CHECK-NEXT:   $al = SETCCr 4, implicit $eflags
83  ; CHECK-NEXT:   JCC_1 %bb.1, 2, implicit $eflags
84  ; CHECK-NEXT: {{  $}}
85  ; CHECK-NEXT: bb.2:
86  bb.0:
87    %0:gr64 = COPY undef $rsi
88    %1:gr64 = INC64r %0, implicit-def $eflags
89    JMP_1 %bb.1
90
91  bb.1:
92    ; The TEST64rr should not be removed, since there are multiple preds.
93    TEST64rr %1, %1, implicit-def $eflags
94    %2:gr64 = LEA64r %1, 5, $noreg, 12, $noreg
95    $al = SETCCr 4, implicit $eflags
96    JCC_1 %bb.1, 2, implicit $eflags
97
98  bb.2:
99...
100---
101name: opt_multiple_blocks_noopt_1
102body: |
103  ; CHECK-LABEL: name: opt_multiple_blocks_noopt_1
104  ; CHECK: bb.0:
105  ; CHECK-NEXT:   successors: %bb.1(0x80000000)
106  ; CHECK-NEXT: {{  $}}
107  ; CHECK-NEXT:   JMP_1 %bb.1
108  ; CHECK-NEXT: {{  $}}
109  ; CHECK-NEXT: bb.1:
110  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
111  ; CHECK-NEXT: {{  $}}
112  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gr64 = COPY undef $rsi
113  ; CHECK-NEXT:   TEST64rr [[COPY]], [[COPY]], implicit-def $eflags
114  ; CHECK-NEXT:   JCC_1 %bb.1, 2, implicit $eflags
115  ; CHECK-NEXT: {{  $}}
116  ; CHECK-NEXT: bb.2:
117  ; CHECK-NEXT:   [[MOV32r0_:%[0-9]+]]:gr32 = MOV32r0 implicit-def $eflags
118  ; CHECK-NEXT:   TEST64rr [[COPY]], [[COPY]], implicit-def $eflags
119  ; CHECK-NEXT:   $al = SETCCr 4, implicit $eflags
120  bb.0:
121    JMP_1 %bb.1
122
123  bb.1:
124    %0:gr64 = COPY undef $rsi
125    TEST64rr %0, %0, implicit-def $eflags
126    JCC_1 %bb.1, 2, implicit $eflags
127
128  bb.2:
129    ; We should not move MOV32r0 up into the loop (that would be correct but
130    ; slow).
131    %1:gr32 = MOV32r0 implicit-def $eflags
132    ; TEST should not be removed because of MOV32r0.
133    TEST64rr %0, %0, implicit-def $eflags
134    $al = SETCCr 4, implicit $eflags
135...
136---
137name: opt_zerocmp_user_0
138body: |
139  bb.0:
140    ; CHECK-LABEL: name: opt_zerocmp_user_0
141    ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi
142    ; CHECK-NEXT: [[NEG32r:%[0-9]+]]:gr32 = NEG32r [[COPY]], implicit-def $eflags
143    ; CHECK-NEXT: $al = SETCCr 3, implicit $eflags
144    %0:gr32 = COPY $esi
145    %1:gr32 = NEG32r %0, implicit-def dead $eflags
146    ; TEST should be removed.
147    TEST32rr %0, %0, implicit-def $eflags
148    $al = SETCCr 4, implicit $eflags
149...
150---
151name: opt_redundant_flags_0
152body: |
153  bb.0:
154    ; CHECK-LABEL: name: opt_redundant_flags_0
155    ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi
156    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi
157    ; CHECK-NEXT: [[SUB32rr:%[0-9]+]]:gr32 = SUB32rr [[COPY]], [[COPY1]], implicit-def $eflags
158    ; CHECK-NEXT: $eax = COPY [[SUB32rr]]
159    ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags
160    %0:gr32 = COPY $esi
161    %1:gr32 = COPY $edi
162    %2:gr32 = SUB32rr %0, %1, implicit-def dead $eflags
163    $eax = COPY %2
164    ; CMP should be removed.
165    CMP32rr %0, %1, implicit-def $eflags
166    $bl = SETCCr 2, implicit $eflags
167...
168---
169name: opt_redundant_flags_1
170body: |
171  bb.0:
172    ; CHECK-LABEL: name: opt_redundant_flags_1
173    ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi
174    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi
175    ; CHECK-NEXT: [[SUB32rr:%[0-9]+]]:gr32 = SUB32rr [[COPY]], [[COPY1]], implicit-def $eflags
176    ; CHECK-NEXT: $eax = COPY [[SUB32rr]]
177    ; CHECK-NEXT: $bl = SETCCr 6, implicit $eflags
178    %0:gr32 = COPY $esi
179    %1:gr32 = COPY $edi
180    %2:gr32 = SUB32rr %0, %1, implicit-def dead $eflags
181    $eax = COPY %2
182    ; CMP should be removed.
183    CMP32rr %1, %0, implicit-def $eflags
184    $bl = SETCCr 3, implicit $eflags
185...
186---
187name: opt_redundant_flags_2
188body: |
189  bb.0:
190    ; CHECK-LABEL: name: opt_redundant_flags_2
191    ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi
192    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi
193    ; CHECK-NEXT: [[SUB32rr:%[0-9]+]]:gr32 = SUB32rr [[COPY]], [[COPY1]], implicit-def $eflags
194    ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags
195    ; CHECK-NEXT: $eax = COPY [[SUB32rr]]
196    ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags
197    %0:gr32 = COPY $esi
198    %1:gr32 = COPY $edi
199    %2:gr32 = SUB32rr %0, %1, implicit-def $eflags
200    ; an extra eflags reader shouldn't stop optimization.
201    $cl = SETCCr 2, implicit $eflags
202    $eax = COPY %2
203    CMP32rr %0, %1, implicit-def $eflags
204    $bl = SETCCr 2, implicit $eflags
205...
206---
207name: opt_redundant_flags_cmp_cmp
208body: |
209  bb.0:
210    ; CHECK-LABEL: name: opt_redundant_flags_cmp_cmp
211    ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi
212    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi
213    ; CHECK-NEXT: CMP32rr [[COPY]], [[COPY1]], implicit-def $eflags
214    ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags
215    ; CHECK-NEXT: $bl = SETCCr 7, implicit $eflags
216    %0:gr32 = COPY $esi
217    %1:gr32 = COPY $edi
218    CMP32rr %0, %1, implicit-def $eflags
219    $cl = SETCCr 2, implicit $eflags
220    ; 2nd CMP should be removed.
221    CMP32rr %1, %0, implicit-def $eflags
222    $bl = SETCCr 2, implicit $eflags
223...
224---
225name: opt_redundant_flags_cmp_cmp_2
226body: |
227  bb.0:
228    ; CHECK-LABEL: name: opt_redundant_flags_cmp_cmp_2
229    ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
230    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rdi
231    ; CHECK-NEXT: CMP64ri32 [[COPY]], 15, implicit-def $eflags
232    ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags
233    ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags
234    %0:gr64 = COPY $rsi
235    %1:gr64 = COPY $rdi
236    CMP64ri32 %0, 15, implicit-def $eflags
237    $cl = SETCCr 2, implicit $eflags
238    ; 2nd CMP should be removed.
239    CMP64ri32 %0, 15, implicit-def $eflags
240    $bl = SETCCr 2, implicit $eflags
241...
242---
243name: opt_redundant_flags_test_test
244body: |
245  bb.0:
246    ; CHECK-LABEL: name: opt_redundant_flags_test_test
247    ; CHECK: [[COPY:%[0-9]+]]:gr16 = COPY $ax
248    ; CHECK-NEXT: TEST16rr [[COPY]], [[COPY]], implicit-def $eflags
249    ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags
250    ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags
251    %0:gr16 = COPY $ax
252    TEST16rr %0, %0, implicit-def $eflags
253    $cl = SETCCr 2, implicit $eflags
254    ; 2nd CMP should be removed.
255    TEST16rr %0, %0, implicit-def $eflags
256    $bl = SETCCr 2, implicit $eflags
257...
258---
259name: opt_redundant_flags_cmp_sub
260body: |
261  bb.0:
262    ; CHECK-LABEL: name: opt_redundant_flags_cmp_sub
263    ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi
264    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi
265    ; CHECK-NEXT: CMP32rr [[COPY]], [[COPY1]], implicit-def $eflags
266    ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags
267    ; CHECK-NEXT: $bl = SETCCr 7, implicit $eflags
268    %0:gr32 = COPY $esi
269    %1:gr32 = COPY $edi
270    CMP32rr %0, %1, implicit-def $eflags
271    $cl = SETCCr 2, implicit $eflags
272    ; SUB should be removed.
273    dead %2:gr32 = SUB32rr %1, %0, implicit-def $eflags
274    $bl = SETCCr 2, implicit $eflags
275...
276---
277name: opt_redundant_flags_cmp_sub_2
278body: |
279  bb.0:
280    ; CHECK-LABEL: name: opt_redundant_flags_cmp_sub_2
281    ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi
282    ; CHECK-NEXT: CMP32ri [[COPY]], -12345, implicit-def $eflags
283    ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags
284    ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags
285    %0:gr32 = COPY $esi
286    CMP32ri %0, -12345, implicit-def $eflags
287    $cl = SETCCr 2, implicit $eflags
288    ; SUB should be removed
289    dead %2:gr32 = SUB32ri %0, -12345, implicit-def $eflags
290    $bl = SETCCr 2, implicit $eflags
291...
292---
293name: opt_redundant_flags_cmp_sub_noopt
294body: |
295  bb.0:
296    ; CHECK-LABEL: name: opt_redundant_flags_cmp_sub_noopt
297    ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi
298    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi
299    ; CHECK-NEXT: CMP32rr [[COPY]], [[COPY1]], implicit-def $eflags
300    ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags
301    ; CHECK-NEXT: [[SUB32rr:%[0-9]+]]:gr32 = SUB32rr [[COPY]], [[COPY1]], implicit-def $eflags
302    ; CHECK-NEXT: $rdx = COPY [[SUB32rr]]
303    ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags
304    %0:gr32 = COPY $esi
305    %1:gr32 = COPY $edi
306    CMP32rr %0, %1, implicit-def $eflags
307    $cl = SETCCr 2, implicit $eflags
308    ; cannot optimize the SUB because the result value is used.
309    %2:gr32 = SUB32rr %0, %1, implicit-def $eflags
310    $rdx = COPY %2
311    $bl = SETCCr 2, implicit $eflags
312...
313---
314name: opt_redundant_flags_cmp_test
315body: |
316  bb.0:
317    ; CHECK-LABEL: name: opt_redundant_flags_cmp_test
318    ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi
319    ; CHECK-NEXT: CMP32ri [[COPY]], 0, implicit-def $eflags
320    ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags
321    ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags
322    %0:gr32 = COPY $esi
323    CMP32ri %0, 0, implicit-def $eflags
324    $cl = SETCCr 2, implicit $eflags
325    ; TEST should be removed
326    TEST32rr %0, %0, implicit-def $eflags
327    $bl = SETCCr 2, implicit $eflags
328...
329---
330name: opt_redundant_flags_test_cmp
331body: |
332  bb.0:
333    ; CHECK-LABEL: name: opt_redundant_flags_test_cmp
334    ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi
335    ; CHECK-NEXT: TEST32rr [[COPY]], [[COPY]], implicit-def $eflags
336    ; CHECK-NEXT: $cl = SETCCr 2, implicit $eflags
337    ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags
338    %0:gr32 = COPY $esi
339    TEST32rr %0, %0, implicit-def $eflags
340    $cl = SETCCr 2, implicit $eflags
341    ; TEST should be removed
342    CMP32ri %0, 0, implicit-def $eflags
343    $bl = SETCCr 2, implicit $eflags
344...
345---
346name: opt_redundant_flags_cmp_addr
347stack:
348  - { id: 0, size: 4, alignment: 4 }
349body: |
350  bb.0:
351    ; CHECK-LABEL: name: opt_redundant_flags_cmp_addr
352    ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
353    ; CHECK-NEXT: CMP64ri32 [[COPY]], @opt_redundant_flags_cmp_addr + 4, implicit-def $eflags
354    ; CHECK-NEXT: $cl = SETCCr 7, implicit $eflags
355    ; CHECK-NEXT: $cl = SETCCr 3, implicit $eflags
356    %0:gr64 = COPY $rsi
357    CMP64ri32 %0, @opt_redundant_flags_cmp_addr + 4, implicit-def $eflags
358    $cl = SETCCr 7, implicit $eflags
359    ; CMP should be removed
360    CMP64ri32 %0, @opt_redundant_flags_cmp_addr + 4, implicit-def $eflags
361    $cl = SETCCr 3, implicit $eflags
362...
363---
364name: opt_redundant_flags_cmp_addr_noopt
365stack:
366  - { id: 0, size: 4, alignment: 4 }
367body: |
368  bb.0:
369    ; CHECK-LABEL: name: opt_redundant_flags_cmp_addr_noopt
370    ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
371    ; CHECK-NEXT: CMP64ri32 [[COPY]], @opt_redundant_flags_cmp_addr_noopt + 24, implicit-def $eflags
372    ; CHECK-NEXT: $cl = SETCCr 7, implicit $eflags
373    ; CHECK-NEXT: CMP64ri32 [[COPY]], 24, implicit-def $eflags
374    ; CHECK-NEXT: $cl = SETCCr 3, implicit $eflags
375    %0:gr64 = COPY $rsi
376    CMP64ri32 %0, @opt_redundant_flags_cmp_addr_noopt + 24, implicit-def $eflags
377    $cl = SETCCr 7, implicit $eflags
378    ; CMP should not be removed
379    CMP64ri32 %0, 24, implicit-def $eflags
380    $cl = SETCCr 3, implicit $eflags
381...
382---
383name: opt_redundant_flags_adjusted_imm_0
384body: |
385  bb.0:
386    ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_0
387    ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
388    ; CHECK-NEXT: CMP64ri32 [[COPY]], 1, implicit-def $eflags
389    ; CHECK-NEXT: $cl = SETCCr 4, implicit $eflags
390    ; CHECK-NEXT: $bl = SETCCr 15, implicit $eflags
391    ; CHECK-NEXT: $bl = SETCCr 7, implicit $eflags
392    ; CHECK-NEXT: $bl = SETCCr 14, implicit $eflags
393    ; CHECK-NEXT: $bl = SETCCr 6, implicit $eflags
394    %0:gr64 = COPY $rsi
395    ; CMP+SETCC   %0 == 1
396    CMP64ri32 %0, 1, implicit-def $eflags
397    $cl = SETCCr 4, implicit $eflags
398    ; CMP+SETCC   %0 >= 2; CMP can be removed.
399    CMP64ri32 %0, 2, implicit-def $eflags
400    ; %0 >=s 2  -->  %0 >s 1
401    $bl = SETCCr 13, implicit $eflags
402    ; %0 >=u 2  -->  %0 >u 1
403    $bl = SETCCr 3, implicit $eflags
404    ; %0 <s 2  -->  %0 <=s 1
405    $bl = SETCCr 12, implicit $eflags
406    ; %0 <u 2  -->  %0 <=u 1
407    $bl = SETCCr 2, implicit $eflags
408...
409---
410name: opt_redundant_flags_adjusted_imm_1
411body: |
412  bb.0:
413    ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_1
414    ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
415    ; CHECK-NEXT: CMP64ri32 [[COPY]], 42, implicit-def $eflags
416    ; CHECK-NEXT: $cl = SETCCr 5, implicit $eflags
417    ; CHECK-NEXT: $bl = SETCCr 13, implicit $eflags
418    ; CHECK-NEXT: $bl = SETCCr 3, implicit $eflags
419    ; CHECK-NEXT: $bl = SETCCr 12, implicit $eflags
420    ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags
421    %0:gr64 = COPY $rsi
422    ; CMP+SETCC   %0 != 42
423    CMP64ri32 %0, 42, implicit-def $eflags
424    $cl = SETCCr 5, implicit $eflags
425    ; CMP+SETCC   %0 >= 2; CMP can be removed.
426    CMP64ri32 %0, 41, implicit-def $eflags
427    ; %0 >s 41  -->  %0 >=s 42
428    $bl = SETCCr 15, implicit $eflags
429    ; %0 >u 41  -->  %0 >=u 42
430    $bl = SETCCr 7, implicit $eflags
431    ; %0 <=s 41  -->  %0 <s 42
432    $bl = SETCCr 14, implicit $eflags
433    ; %0 <=u 41  -->  %0 <u 42
434    $bl = SETCCr 6, implicit $eflags
435...
436---
437name: opt_redundant_flags_adjusted_imm_test_cmp
438body: |
439  bb.0:
440    ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_test_cmp
441    ; CHECK: [[COPY:%[0-9]+]]:gr8 = COPY $bl
442    ; CHECK-NEXT: TEST8rr [[COPY]], [[COPY]], implicit-def $eflags
443    ; CHECK-NEXT: $cl = SETCCr 14, implicit $eflags
444    ; CHECK-NEXT: $cl = SETCCr 7, implicit $eflags
445    ; CHECK-NEXT: $cl = SETCCr 12, implicit $eflags
446    %0:gr8 = COPY $bl
447    TEST8rr %0, %0, implicit-def $eflags
448    ; SET %0 <=s 0
449    $cl = SETCCr 14, implicit $eflags
450    ; CMP should be removed (%0 >=u 1)
451    CMP8ri %0, 1, implicit-def $eflags
452    $cl = SETCCr 3, implicit $eflags
453
454    ; CMP should be removed (%0 <=s -1)
455    CMP8ri %0, -1, implicit-def $eflags
456    $cl = SETCCr 14, implicit $eflags
457...
458---
459name: opt_redundant_flags_adjusted_imm_cmp_test
460body: |
461  bb.0:
462    ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_cmp_test
463    ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
464    ; CHECK-NEXT: CMP64ri32 [[COPY]], 1, implicit-def $eflags
465    ; CHECK-NEXT: $cl = SETCCr 13, implicit $eflags
466    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $edi
467    ; CHECK-NEXT: CMP64ri32 [[COPY1]], -1, implicit-def $eflags
468    ; CHECK-NEXT: $cl = SETCCr 14, implicit $eflags
469    %0:gr64 = COPY $rsi
470    CMP64ri32 %0, 1, implicit-def $eflags
471    ; TEST should be removed
472    TEST64rr %0, %0, implicit-def $eflags
473    $cl = SETCCr 15, implicit $eflags
474
475    %1:gr64 = COPY $edi
476    CMP64ri32 %1, -1, implicit-def $eflags
477    ; TEST should be removed
478    TEST64rr %1, %1, implicit-def $eflags
479    $cl = SETCCr 12, implicit $eflags
480...
481---
482name: opt_redundant_flags_adjusted_imm_noopt_0
483body: |
484  bb.0:
485    ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_noopt_0
486    ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
487    ; CHECK-NEXT: CMP64ri32 [[COPY]], 42, implicit-def $eflags
488    ; CHECK-NEXT: $cl = SETCCr 4, implicit $eflags
489    ; CHECK-NEXT: CMP64ri32 [[COPY]], 41, implicit-def $eflags
490    ; CHECK-NEXT: $bl = SETCCr 4, implicit $eflags
491    %0:gr64 = COPY $rsi
492    ; CMP+SETCC   %0 <s 1
493    CMP64ri32 %0, 42, implicit-def $eflags
494    $cl = SETCCr 4, implicit $eflags
495    ; CMP should not be removed.
496    CMP64ri32 %0, 41, implicit-def $eflags
497    ; %0 == 41
498    $bl = SETCCr 4, implicit $eflags
499...
500---
501name: opt_redundant_flags_adjusted_imm_noopt_1
502body: |
503  bb.0:
504    ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_noopt_1
505    ; CHECK: [[COPY:%[0-9]+]]:gr32 = COPY $esi
506    ; CHECK-NEXT: CMP32ri [[COPY]], 2147483647, implicit-def $eflags
507    ; CHECK-NEXT: CMP32ri [[COPY]], -2147483648, implicit-def $eflags
508    ; CHECK-NEXT: $bl = SETCCr 12, implicit $eflags
509    ; CHECK-NEXT: CMP32ri [[COPY]], 4294967295, implicit-def $eflags
510    ; CHECK-NEXT: CMP32ri [[COPY]], -2147483648, implicit-def $eflags
511    ; CHECK-NEXT: $bl = SETCCr 12, implicit $eflags
512    ; CHECK-NEXT: CMP32ri [[COPY]], 2147483647, implicit-def $eflags
513    ; CHECK-NEXT: CMP32ri [[COPY]], -2147483648, implicit-def $eflags
514    ; CHECK-NEXT: $bl = SETCCr 13, implicit $eflags
515    ; CHECK-NEXT: CMP32ri [[COPY]], 4294967295, implicit-def $eflags
516    ; CHECK-NEXT: CMP32ri [[COPY]], 0, implicit-def $eflags
517    ; CHECK-NEXT: $bl = SETCCr 2, implicit $eflags
518    ; CHECK-NEXT: CMP32ri [[COPY]], 4294967295, implicit-def $eflags
519    ; CHECK-NEXT: CMP32ri [[COPY]], 0, implicit-def $eflags
520    ; CHECK-NEXT: $bl = SETCCr 3, implicit $eflags
521    %0:gr32 = COPY $esi
522    ; CMP+SETCC   %0 == INT32_MAX
523    CMP32ri %0, 2147483647, implicit-def $eflags
524    ; CMP should not be removed.
525    CMP32ri %0, -2147483648, implicit-def $eflags
526    ; %0 <s INT32_MIN
527    $bl = SETCCr 12, implicit $eflags
528
529    CMP32ri %0, 4294967295, implicit-def $eflags
530    ; CMP should not be removed.
531    CMP32ri %0, -2147483648, implicit-def $eflags
532    $bl = SETCCr 12, implicit $eflags
533
534    CMP32ri %0, 2147483647, implicit-def $eflags
535    ; CMP should not be removed.
536    CMP32ri %0, -2147483648, implicit-def $eflags
537    $bl = SETCCr 13, implicit $eflags
538
539    CMP32ri %0, 4294967295, implicit-def $eflags
540    ; should not be removed
541    CMP32ri %0, 0, implicit-def $eflags
542    $bl = SETCCr 2, implicit $eflags
543
544    CMP32ri %0, 4294967295, implicit-def $eflags
545    ; should not be removed
546    CMP32ri %0, 0, implicit-def $eflags
547    $bl = SETCCr 3, implicit $eflags
548...
549---
550name: opt_redundant_flags_adjusted_imm_noopt_2
551body: |
552  bb.0:
553    ; CHECK-LABEL: name: opt_redundant_flags_adjusted_imm_noopt_2
554    ; CHECK: [[COPY:%[0-9]+]]:gr16 = COPY $cx
555    ; CHECK-NEXT: CMP16ri [[COPY]], -32768, implicit-def $eflags
556    ; CHECK-NEXT: CMP16ri [[COPY]], 32767, implicit-def $eflags
557    ; CHECK-NEXT: $bl = SETCCr 15, implicit $eflags
558    ; CHECK-NEXT: CMP16ri [[COPY]], 65535, implicit-def $eflags
559    ; CHECK-NEXT: CMP16ri [[COPY]], 32767, implicit-def $eflags
560    ; CHECK-NEXT: $bl = SETCCr 15, implicit $eflags
561    ; CHECK-NEXT: CMP16ri [[COPY]], -32768, implicit-def $eflags
562    ; CHECK-NEXT: CMP16ri [[COPY]], 32767, implicit-def $eflags
563    ; CHECK-NEXT: $bl = SETCCr 14, implicit $eflags
564    ; CHECK-NEXT: CMP16ri [[COPY]], 0, implicit-def $eflags
565    ; CHECK-NEXT: CMP16ri [[COPY]], 65535, implicit-def $eflags
566    ; CHECK-NEXT: $bl = SETCCr 4, implicit $eflags
567    ; CHECK-NEXT: CMP16ri [[COPY]], 0, implicit-def $eflags
568    ; CHECK-NEXT: CMP16ri [[COPY]], 65535, implicit-def $eflags
569    ; CHECK-NEXT: $bl = SETCCr 6, implicit $eflags
570    %0:gr16 = COPY $cx
571    ; CMP+SETCC   %0 == INT16_MIN
572    CMP16ri %0, -32768, implicit-def $eflags
573    ; CMP should not be removed.
574    CMP16ri %0, 32767, implicit-def $eflags
575    ; %0 >s INT16_MAX
576    $bl = SETCCr 15, implicit $eflags
577
578    CMP16ri %0, 65535, implicit-def $eflags
579    ; CMP should not be removed.
580    CMP16ri %0, 32767, implicit-def $eflags
581    $bl = SETCCr 15, implicit $eflags
582
583    CMP16ri %0, -32768, implicit-def $eflags
584    ; CMP should not be removed.
585    CMP16ri %0, 32767, implicit-def $eflags
586    $bl = SETCCr 14, implicit $eflags
587
588    CMP16ri %0, 0, implicit-def $eflags
589    ; should not be removed
590    CMP16ri %0, 65535, implicit-def $eflags
591    $bl = SETCCr 4, implicit $eflags
592
593    CMP16ri %0, 0, implicit-def $eflags
594    ; should not be removed
595    CMP16ri %0, 65535, implicit-def $eflags
596    $bl = SETCCr 6, implicit $eflags
597...
598---
599name: opt_adjusted_imm_multiple_blocks
600body: |
601  ; CHECK-LABEL: name: opt_adjusted_imm_multiple_blocks
602  ; CHECK: bb.0:
603  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.3(0x40000000)
604  ; CHECK-NEXT: {{  $}}
605  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gr32 = COPY $eax
606  ; CHECK-NEXT:   CMP32ri [[COPY]], 20, implicit-def $eflags
607  ; CHECK-NEXT:   JCC_1 %bb.1, 4, implicit $eflags
608  ; CHECK-NEXT:   JMP_1 %bb.3
609  ; CHECK-NEXT: {{  $}}
610  ; CHECK-NEXT: bb.1:
611  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
612  ; CHECK-NEXT:   liveins: $eflags
613  ; CHECK-NEXT: {{  $}}
614  ; CHECK-NEXT:   JCC_1 %bb.2, 15, implicit $eflags
615  ; CHECK-NEXT:   JMP_1 %bb.3
616  ; CHECK-NEXT: {{  $}}
617  ; CHECK-NEXT: bb.2:
618  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
619  ; CHECK-NEXT: {{  $}}
620  ; CHECK-NEXT:   JMP_1 %bb.3
621  ; CHECK-NEXT: {{  $}}
622  ; CHECK-NEXT: bb.3:
623  ; CHECK-NEXT:   RET 0
624  bb.0:
625    %0:gr32 = COPY $eax
626    CMP32ri %0, 20, implicit-def $eflags
627    JCC_1 %bb.1, 4, implicit $eflags
628    JMP_1 %bb.3
629
630  bb.1:
631    ; CMP can be removed when adjusting the JCC.
632    CMP32ri %0, 21, implicit-def $eflags
633    JCC_1 %bb.2, 13, implicit $eflags
634    JMP_1 %bb.3
635
636  bb.2:
637    JMP_1 %bb.3
638
639  bb.3:
640    RET 0
641...
642---
643name: opt_adjusted_imm_multiple_blocks_noopt
644body: |
645  ; CHECK-LABEL: name: opt_adjusted_imm_multiple_blocks_noopt
646  ; CHECK: bb.0:
647  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.3(0x40000000)
648  ; CHECK-NEXT: {{  $}}
649  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gr32 = COPY $eax
650  ; CHECK-NEXT:   CMP32ri [[COPY]], 20, implicit-def $eflags
651  ; CHECK-NEXT:   JCC_1 %bb.1, 4, implicit $eflags
652  ; CHECK-NEXT:   JMP_1 %bb.3
653  ; CHECK-NEXT: {{  $}}
654  ; CHECK-NEXT: bb.1:
655  ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
656  ; CHECK-NEXT: {{  $}}
657  ; CHECK-NEXT:   CMP32ri [[COPY]], 21, implicit-def $eflags
658  ; CHECK-NEXT:   JCC_1 %bb.2, 13, implicit $eflags
659  ; CHECK-NEXT:   JMP_1 %bb.3
660  ; CHECK-NEXT: {{  $}}
661  ; CHECK-NEXT: bb.2:
662  ; CHECK-NEXT:   successors: %bb.3(0x80000000)
663  ; CHECK-NEXT:   liveins: $eflags
664  ; CHECK-NEXT: {{  $}}
665  ; CHECK-NEXT:   $al = SETCCr 4, implicit $eflags
666  ; CHECK-NEXT: {{  $}}
667  ; CHECK-NEXT: bb.3:
668  ; CHECK-NEXT:   RET 0
669  bb.0:
670    %0:gr32 = COPY $eax
671    CMP32ri %0, 20, implicit-def $eflags
672    JCC_1 %bb.1, 4, implicit $eflags
673    JMP_1 %bb.3
674
675  bb.1:
676    ; The following CMP should not be optimized because $eflags is live-out
677    CMP32ri %0, 21, implicit-def $eflags
678    JCC_1 %bb.2, 13, implicit $eflags
679    JMP_1 %bb.3
680
681  bb.2:
682    liveins: $eflags
683    $al = SETCCr 4, implicit $eflags
684
685  bb.3:
686    RET 0
687...
688---
689name: opt_shift_cmp_zero
690body: |
691  bb.0:
692    ; CHECK-LABEL: name: opt_shift_cmp_zero
693    ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
694    ; CHECK-NEXT: [[SHL64ri:%[0-9]+]]:gr64 = SHL64ri [[COPY]], 7, implicit-def $eflags
695    ; CHECK-NEXT: $al = SETCCr 4, implicit $eflags
696    %0:gr64 = COPY $rsi
697    %1:gr64 = SHL64ri %0, 7, implicit-def dead $eflags
698    ; TEST should be removed.
699    TEST64rr %1, %1, implicit-def $eflags
700    $al = SETCCr 4, implicit $eflags
701...
702---
703name: noopt_shift_cmp_zero
704body: |
705  bb.0:
706    ; CHECK-LABEL: name: noopt_shift_cmp_zero
707    ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
708    ; CHECK-NEXT: [[SHL64ri:%[0-9]+]]:gr64 = SHL64ri [[COPY]], 9, implicit-def dead $eflags
709    ; CHECK-NEXT: TEST64rr [[SHL64ri]], [[SHL64ri]], implicit-def $eflags
710    ; CHECK-NEXT: $al = SETCCr 14, implicit $eflags
711    %0:gr64 = COPY $rsi
712    %1:gr64 = SHL64ri %0, 9, implicit-def dead $eflags
713    ; TEST cannot be removed if a user relies on the OF flag.
714    TEST64rr %1, %1, implicit-def $eflags
715    $al = SETCCr 14, implicit $eflags
716...
717---
718name: noopt_shift_cmp_zero_multiblock
719body: |
720  ; CHECK-LABEL: name: noopt_shift_cmp_zero_multiblock
721  ; CHECK: bb.0:
722  ; CHECK-NEXT:   successors: %bb.1(0x80000000)
723  ; CHECK-NEXT: {{  $}}
724  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gr64 = COPY $rsi
725  ; CHECK-NEXT:   [[SHL64ri:%[0-9]+]]:gr64 = SHL64ri [[COPY]], 9, implicit-def dead $eflags
726  ; CHECK-NEXT:   TEST64rr [[SHL64ri]], [[SHL64ri]], implicit-def $eflags
727  ; CHECK-NEXT:   JMP_1 %bb.1
728  ; CHECK-NEXT: {{  $}}
729  ; CHECK-NEXT: bb.1:
730  ; CHECK-NEXT:   liveins: $eflags
731  ; CHECK-NEXT: {{  $}}
732  ; CHECK-NEXT:   $al = SETCCr 14, implicit $eflags
733  bb.0:
734    %0:gr64 = COPY $rsi
735    %1:gr64 = SHL64ri %0, 9, implicit-def dead $eflags
736    ; TEST cannot be removed if a user relies on the OF flag.
737    TEST64rr %1, %1, implicit-def $eflags
738    JMP_1 %bb.1
739
740  bb.1:
741    liveins: $eflags
742    $al = SETCCr 14, implicit $eflags
743...
744