[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / flags-copy-lowering.mir
bloba08c63c285e155ecb3efc1467e36ce12bf61a3ae
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2 # RUN: llc  -mtriple=x86_64 -run-pass x86-flags-copy-lowering -verify-machineinstrs -o - %s | FileCheck %s
3 # Lower various interesting copy patterns of EFLAGS without using LAHF/SAHF.
5 ...
6 ---
7 name:            test_branch
8 body:             |
9   ; CHECK-LABEL: name: test_branch
10   ; CHECK: bb.0:
11   ; CHECK-NEXT:   successors: %bb.1(0x2aaaaaab), %bb.4(0x55555556)
12   ; CHECK-NEXT:   liveins: $rdi, $rsi
13   ; CHECK-NEXT: {{  $}}
14   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gr64 = COPY $rdi
15   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
16   ; CHECK-NEXT:   CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags
17   ; CHECK-NEXT:   [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags
18   ; CHECK-NEXT:   [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags
19   ; CHECK-NEXT:   INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags
20   ; CHECK-NEXT:   TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags
21   ; CHECK-NEXT:   JCC_1 %bb.1, 5, implicit killed $eflags
22   ; CHECK-NEXT: {{  $}}
23   ; CHECK-NEXT: bb.4:
24   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
25   ; CHECK-NEXT: {{  $}}
26   ; CHECK-NEXT:   TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags
27   ; CHECK-NEXT:   JCC_1 %bb.2, 5, implicit killed $eflags
28   ; CHECK-NEXT:   JMP_1 %bb.3
29   ; CHECK-NEXT: {{  $}}
30   ; CHECK-NEXT: bb.1:
31   ; CHECK-NEXT:   [[MOV32ri:%[0-9]+]]:gr32 = MOV32ri 42
32   ; CHECK-NEXT:   $eax = COPY [[MOV32ri]]
33   ; CHECK-NEXT:   RET 0, $eax
34   ; CHECK-NEXT: {{  $}}
35   ; CHECK-NEXT: bb.2:
36   ; CHECK-NEXT:   [[MOV32ri1:%[0-9]+]]:gr32 = MOV32ri 43
37   ; CHECK-NEXT:   $eax = COPY [[MOV32ri1]]
38   ; CHECK-NEXT:   RET 0, $eax
39   ; CHECK-NEXT: {{  $}}
40   ; CHECK-NEXT: bb.3:
41   ; CHECK-NEXT:   [[MOV32r0_:%[0-9]+]]:gr32 = MOV32r0 implicit-def dead $eflags
42   ; CHECK-NEXT:   $eax = COPY [[MOV32r0_]]
43   ; CHECK-NEXT:   RET 0, $eax
44   bb.0:
45     successors: %bb.1, %bb.2, %bb.3
46     liveins: $rdi, $rsi
48     %0:gr64 = COPY $rdi
49     %1:gr64 = COPY $rsi
50     CMP64rr %0, %1, implicit-def $eflags
51     %2:gr64 = COPY $eflags
53     INLINEASM &nop, 1, 12, implicit-def dead $eflags
55     $eflags = COPY %2
56     JCC_1 %bb.1, 7, implicit $eflags
57     JCC_1 %bb.2, 2, implicit $eflags
58     JMP_1 %bb.3
60   bb.1:
61     %3:gr32 = MOV32ri 42
62     $eax = COPY %3
63     RET 0, $eax
65   bb.2:
66     %4:gr32 = MOV32ri 43
67     $eax = COPY %4
68     RET 0, $eax
70   bb.3:
71     %5:gr32 = MOV32r0 implicit-def dead $eflags
72     $eax = COPY %5
73     RET 0, $eax
75 ...
76 ---
77 name:            test_branch_fallthrough
78 body:             |
79   ; CHECK-LABEL: name: test_branch_fallthrough
80   ; CHECK: bb.0:
81   ; CHECK-NEXT:   successors: %bb.4(0x55555556), %bb.2(0x2aaaaaab)
82   ; CHECK-NEXT:   liveins: $rdi, $rsi
83   ; CHECK-NEXT: {{  $}}
84   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gr64 = COPY $rdi
85   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
86   ; CHECK-NEXT:   CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags
87   ; CHECK-NEXT:   [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags
88   ; CHECK-NEXT:   [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags
89   ; CHECK-NEXT:   INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags
90   ; CHECK-NEXT:   TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags
91   ; CHECK-NEXT:   JCC_1 %bb.2, 5, implicit killed $eflags
92   ; CHECK-NEXT: {{  $}}
93   ; CHECK-NEXT: bb.4:
94   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.3(0x40000000)
95   ; CHECK-NEXT: {{  $}}
96   ; CHECK-NEXT:   TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags
97   ; CHECK-NEXT:   JCC_1 %bb.3, 5, implicit killed $eflags
98   ; CHECK-NEXT: {{  $}}
99   ; CHECK-NEXT: bb.1:
100   ; CHECK-NEXT:   [[MOV32r0_:%[0-9]+]]:gr32 = MOV32r0 implicit-def dead $eflags
101   ; CHECK-NEXT:   $eax = COPY [[MOV32r0_]]
102   ; CHECK-NEXT:   RET 0, $eax
103   ; CHECK-NEXT: {{  $}}
104   ; CHECK-NEXT: bb.2:
105   ; CHECK-NEXT:   [[MOV32ri:%[0-9]+]]:gr32 = MOV32ri 42
106   ; CHECK-NEXT:   $eax = COPY [[MOV32ri]]
107   ; CHECK-NEXT:   RET 0, $eax
108   ; CHECK-NEXT: {{  $}}
109   ; CHECK-NEXT: bb.3:
110   ; CHECK-NEXT:   [[MOV32ri1:%[0-9]+]]:gr32 = MOV32ri 43
111   ; CHECK-NEXT:   $eax = COPY [[MOV32ri1]]
112   ; CHECK-NEXT:   RET 0, $eax
113   bb.0:
114     successors: %bb.1, %bb.2, %bb.3
115     liveins: $rdi, $rsi
117     %0:gr64 = COPY $rdi
118     %1:gr64 = COPY $rsi
119     CMP64rr %0, %1, implicit-def $eflags
120     %2:gr64 = COPY $eflags
122     INLINEASM &nop, 1, 12, implicit-def dead $eflags
124     $eflags = COPY %2
125     JCC_1 %bb.2, 7, implicit $eflags
126     JCC_1 %bb.3, 2, implicit $eflags
128   bb.1:
129     %5:gr32 = MOV32r0 implicit-def dead $eflags
130     $eax = COPY %5
131     RET 0, $eax
133   bb.2:
134     %3:gr32 = MOV32ri 42
135     $eax = COPY %3
136     RET 0, $eax
138   bb.3:
139     %4:gr32 = MOV32ri 43
140     $eax = COPY %4
141     RET 0, $eax
145 name:            test_setcc
146 body:             |
147   bb.0:
148     liveins: $rdi, $rsi
150     ; CHECK-LABEL: name: test_setcc
151     ; CHECK: liveins: $rdi, $rsi
152     ; CHECK-NEXT: {{  $}}
153     ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi
154     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
155     ; CHECK-NEXT: CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags
156     ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags
157     ; CHECK-NEXT: [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags
158     ; CHECK-NEXT: [[SETCCr2:%[0-9]+]]:gr8 = SETCCr 4, implicit $eflags
159     ; CHECK-NEXT: [[SETCCr3:%[0-9]+]]:gr8 = SETCCr 5, implicit $eflags
160     ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags
161     ; CHECK-NEXT: MOV8mr $rsp, 1, $noreg, -16, $noreg, [[SETCCr3]]
162     ; CHECK-NEXT: MOV8mr $rsp, 1, $noreg, -16, $noreg, [[SETCCr]]
163     ; CHECK-NEXT: MOV8mr $rsp, 1, $noreg, -16, $noreg, [[SETCCr1]]
164     ; CHECK-NEXT: MOV8mr $rsp, 1, $noreg, -16, $noreg, [[SETCCr2]]
165     ; CHECK-NEXT: RET 0
166     %0:gr64 = COPY $rdi
167     %1:gr64 = COPY $rsi
168     CMP64rr %0, %1, implicit-def $eflags
169     %2:gr64 = COPY $eflags
171     INLINEASM &nop, 1, 12, implicit-def dead $eflags
173     $eflags = COPY %2
174     %3:gr8 = SETCCr 7, implicit $eflags
175     %4:gr8 = SETCCr 2, implicit $eflags
176     %5:gr8 = SETCCr 4, implicit $eflags
177     SETCCm $rsp, 1, $noreg, -16, $noreg, 5, implicit killed $eflags
178     MOV8mr $rsp, 1, $noreg, -16, $noreg, killed %3
179     MOV8mr $rsp, 1, $noreg, -16, $noreg, killed %4
180     MOV8mr $rsp, 1, $noreg, -16, $noreg, killed %5
182     RET 0
186 name:            test_cmov
187 body:             |
188   bb.0:
189     liveins: $rdi, $rsi
191     ; CHECK-LABEL: name: test_cmov
192     ; CHECK: liveins: $rdi, $rsi
193     ; CHECK-NEXT: {{  $}}
194     ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi
195     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
196     ; CHECK-NEXT: CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags
197     ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags
198     ; CHECK-NEXT: [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags
199     ; CHECK-NEXT: [[SETCCr2:%[0-9]+]]:gr8 = SETCCr 4, implicit $eflags
200     ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags
201     ; CHECK-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags
202     ; CHECK-NEXT: [[CMOV64rr:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags
203     ; CHECK-NEXT: TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags
204     ; CHECK-NEXT: [[CMOV64rr1:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags
205     ; CHECK-NEXT: TEST8rr [[SETCCr2]], [[SETCCr2]], implicit-def $eflags
206     ; CHECK-NEXT: [[CMOV64rr2:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags
207     ; CHECK-NEXT: TEST8rr [[SETCCr2]], [[SETCCr2]], implicit-def $eflags
208     ; CHECK-NEXT: [[CMOV64rr3:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 4, implicit killed $eflags
209     ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr]]
210     ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr1]]
211     ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr2]]
212     ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr3]]
213     ; CHECK-NEXT: RET 0
214     %0:gr64 = COPY $rdi
215     %1:gr64 = COPY $rsi
216     CMP64rr %0, %1, implicit-def $eflags
217     %2:gr64 = COPY $eflags
219     INLINEASM &nop, 1, 12, implicit-def dead $eflags
221     $eflags = COPY %2
222     %3:gr64 = CMOV64rr %0, %1, 7, implicit $eflags
223     %4:gr64 = CMOV64rr %0, %1, 2, implicit $eflags
224     %5:gr64 = CMOV64rr %0, %1, 4, implicit $eflags
225     %6:gr64 = CMOV64rr %0, %1, 5, implicit killed $eflags
226     MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %3
227     MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %4
228     MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5
229     MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %6
231     RET 0
235 name:            test_adc
236 body:             |
237   bb.0:
238     liveins: $rdi, $rsi
240     ; CHECK-LABEL: name: test_adc
241     ; CHECK: liveins: $rdi, $rsi
242     ; CHECK-NEXT: {{  $}}
243     ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi
244     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
245     ; CHECK-NEXT: [[ADD64rr:%[0-9]+]]:gr64 = ADD64rr [[COPY]], [[COPY1]], implicit-def $eflags
246     ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags
247     ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags
248     ; CHECK-NEXT: dead [[ADD8ri:%[0-9]+]]:gr8 = ADD8ri [[SETCCr]], 255, implicit-def $eflags
249     ; CHECK-NEXT: [[ADC64ri32_:%[0-9]+]]:gr64 = ADC64ri32 [[ADD64rr]], 42, implicit-def $eflags, implicit killed $eflags
250     ; CHECK-NEXT: [[ADC64ri32_1:%[0-9]+]]:gr64 = ADC64ri32 [[ADC64ri32_]], 42, implicit-def $eflags, implicit $eflags
251     ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[ADC64ri32_1]]
252     ; CHECK-NEXT: RET 0
253     %0:gr64 = COPY $rdi
254     %1:gr64 = COPY $rsi
255     %2:gr64 = ADD64rr %0, %1, implicit-def $eflags
256     %3:gr64 = COPY $eflags
258     INLINEASM &nop, 1, 12, implicit-def dead $eflags
260     $eflags = COPY %3
261     %4:gr64 = ADC64ri32 %2:gr64, 42, implicit-def $eflags, implicit $eflags
262     %5:gr64 = ADC64ri32 %4:gr64, 42, implicit-def $eflags, implicit $eflags
263     MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5
265     RET 0
269 name:            test_sbb
270 body:             |
271   bb.0:
272     liveins: $rdi, $rsi
274     ; CHECK-LABEL: name: test_sbb
275     ; CHECK: liveins: $rdi, $rsi
276     ; CHECK-NEXT: {{  $}}
277     ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi
278     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
279     ; CHECK-NEXT: [[SUB64rr:%[0-9]+]]:gr64 = SUB64rr [[COPY]], [[COPY1]], implicit-def $eflags
280     ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags
281     ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags
282     ; CHECK-NEXT: dead [[ADD8ri:%[0-9]+]]:gr8 = ADD8ri [[SETCCr]], 255, implicit-def $eflags
283     ; CHECK-NEXT: [[SBB64ri32_:%[0-9]+]]:gr64 = SBB64ri32 [[SUB64rr]], 42, implicit-def $eflags, implicit killed $eflags
284     ; CHECK-NEXT: [[SBB64ri32_1:%[0-9]+]]:gr64 = SBB64ri32 [[SBB64ri32_]], 42, implicit-def dead $eflags, implicit killed $eflags
285     ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[SBB64ri32_1]]
286     ; CHECK-NEXT: RET 0
287     %0:gr64 = COPY $rdi
288     %1:gr64 = COPY $rsi
289     %2:gr64 = SUB64rr %0, %1, implicit-def $eflags
290     %3:gr64 = COPY killed $eflags
292     INLINEASM &nop, 1, 12, implicit-def dead $eflags
294     $eflags = COPY %3
295     %4:gr64 = SBB64ri32 %2:gr64, 42, implicit-def $eflags, implicit killed $eflags
296     %5:gr64 = SBB64ri32 %4:gr64, 42, implicit-def dead $eflags, implicit killed $eflags
297     MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5
299     RET 0
303 name:            test_rcl
304 body:             |
305   bb.0:
306     liveins: $rdi, $rsi
308     ; CHECK-LABEL: name: test_rcl
309     ; CHECK: liveins: $rdi, $rsi
310     ; CHECK-NEXT: {{  $}}
311     ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi
312     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
313     ; CHECK-NEXT: [[ADD64rr:%[0-9]+]]:gr64 = ADD64rr [[COPY]], [[COPY1]], implicit-def $eflags
314     ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags
315     ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags
316     ; CHECK-NEXT: dead [[ADD8ri:%[0-9]+]]:gr8 = ADD8ri [[SETCCr]], 255, implicit-def $eflags
317     ; CHECK-NEXT: [[RCL64r1_:%[0-9]+]]:gr64 = RCL64r1 [[ADD64rr]], implicit-def $eflags, implicit killed $eflags
318     ; CHECK-NEXT: [[RCL64r1_1:%[0-9]+]]:gr64 = RCL64r1 [[RCL64r1_]], implicit-def $eflags, implicit $eflags
319     ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[RCL64r1_1]]
320     ; CHECK-NEXT: RET 0
321     %0:gr64 = COPY $rdi
322     %1:gr64 = COPY $rsi
323     %2:gr64 = ADD64rr %0, %1, implicit-def $eflags
324     %3:gr64 = COPY $eflags
326     INLINEASM &nop, 1, 12, implicit-def dead $eflags
328     $eflags = COPY %3
329     %4:gr64 = RCL64r1 %2:gr64, implicit-def $eflags, implicit $eflags
330     %5:gr64 = RCL64r1 %4:gr64, implicit-def $eflags, implicit $eflags
331     MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5
333     RET 0
337 name:            test_rcr
338 body:             |
339   bb.0:
340     liveins: $rdi, $rsi
342     ; CHECK-LABEL: name: test_rcr
343     ; CHECK: liveins: $rdi, $rsi
344     ; CHECK-NEXT: {{  $}}
345     ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi
346     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
347     ; CHECK-NEXT: [[ADD64rr:%[0-9]+]]:gr64 = ADD64rr [[COPY]], [[COPY1]], implicit-def $eflags
348     ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags
349     ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags
350     ; CHECK-NEXT: dead [[ADD8ri:%[0-9]+]]:gr8 = ADD8ri [[SETCCr]], 255, implicit-def $eflags
351     ; CHECK-NEXT: [[RCR64r1_:%[0-9]+]]:gr64 = RCR64r1 [[ADD64rr]], implicit-def $eflags, implicit killed $eflags
352     ; CHECK-NEXT: [[RCR64r1_1:%[0-9]+]]:gr64 = RCR64r1 [[RCR64r1_]], implicit-def $eflags, implicit $eflags
353     ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[RCR64r1_1]]
354     ; CHECK-NEXT: RET 0
355     %0:gr64 = COPY $rdi
356     %1:gr64 = COPY $rsi
357     %2:gr64 = ADD64rr %0, %1, implicit-def $eflags
358     %3:gr64 = COPY $eflags
360     INLINEASM &nop, 1, 12, implicit-def dead $eflags
362     $eflags = COPY %3
363     %4:gr64 = RCR64r1 %2:gr64, implicit-def $eflags, implicit $eflags
364     %5:gr64 = RCR64r1 %4:gr64, implicit-def $eflags, implicit $eflags
365     MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5
367     RET 0
371 name:            test_setb_c
372 body:             |
373   bb.0:
374     liveins: $rdi, $rsi
376     ; CHECK-LABEL: name: test_setb_c
377     ; CHECK: liveins: $rdi, $rsi
378     ; CHECK-NEXT: {{  $}}
379     ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi
380     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
381     ; CHECK-NEXT: [[ADD64rr:%[0-9]+]]:gr64 = ADD64rr [[COPY]], [[COPY1]], implicit-def $eflags
382     ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags
383     ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags
384     ; CHECK-NEXT: dead [[ADD8ri:%[0-9]+]]:gr8 = ADD8ri [[SETCCr]], 255, implicit-def $eflags
385     ; CHECK-NEXT: [[SETB_C32r:%[0-9]+]]:gr32 = SETB_C32r implicit-def $eflags, implicit killed $eflags
386     ; CHECK-NEXT: MOV32mr $rsp, 1, $noreg, -16, $noreg, killed [[SETB_C32r]]
387     ; CHECK-NEXT: dead [[ADD8ri1:%[0-9]+]]:gr8 = ADD8ri [[SETCCr]], 255, implicit-def $eflags
388     ; CHECK-NEXT: [[SETB_C64r:%[0-9]+]]:gr64 = SETB_C64r implicit-def $eflags, implicit killed $eflags
389     ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[SETB_C64r]]
390     ; CHECK-NEXT: RET 0
391     %0:gr64 = COPY $rdi
392     %1:gr64 = COPY $rsi
393     %2:gr64 = ADD64rr %0, %1, implicit-def $eflags
394     %3:gr64 = COPY $eflags
396     INLINEASM &nop, 1, 12, implicit-def dead $eflags
398     $eflags = COPY %3
399     %4:gr32 = SETB_C32r implicit-def $eflags, implicit $eflags
400     MOV32mr $rsp, 1, $noreg, -16, $noreg, killed %4
402     $eflags = COPY %3
403     %5:gr64 = SETB_C64r implicit-def $eflags, implicit $eflags
404     MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5
406     RET 0
410 name:            test_branch_with_livein_and_kill
411 body:             |
412   ; CHECK-LABEL: name: test_branch_with_livein_and_kill
413   ; CHECK: bb.0:
414   ; CHECK-NEXT:   successors: %bb.1(0x2aaaaaab), %bb.4(0x55555556)
415   ; CHECK-NEXT:   liveins: $rdi, $rsi
416   ; CHECK-NEXT: {{  $}}
417   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gr64 = COPY $rdi
418   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
419   ; CHECK-NEXT:   CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags
420   ; CHECK-NEXT:   [[SETCCr:%[0-9]+]]:gr8 = SETCCr 8, implicit $eflags
421   ; CHECK-NEXT:   [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 5, implicit $eflags
422   ; CHECK-NEXT:   [[SETCCr2:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags
423   ; CHECK-NEXT:   [[SETCCr3:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags
424   ; CHECK-NEXT:   INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags
425   ; CHECK-NEXT:   TEST8rr [[SETCCr2]], [[SETCCr2]], implicit-def $eflags
426   ; CHECK-NEXT:   JCC_1 %bb.1, 5, implicit killed $eflags
427   ; CHECK-NEXT: {{  $}}
428   ; CHECK-NEXT: bb.4:
429   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
430   ; CHECK-NEXT: {{  $}}
431   ; CHECK-NEXT:   TEST8rr [[SETCCr3]], [[SETCCr3]], implicit-def $eflags
432   ; CHECK-NEXT:   JCC_1 %bb.2, 5, implicit killed $eflags
433   ; CHECK-NEXT:   JMP_1 %bb.3
434   ; CHECK-NEXT: {{  $}}
435   ; CHECK-NEXT: bb.1:
436   ; CHECK-NEXT:   TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags
437   ; CHECK-NEXT:   [[CMOV64rr:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 4, implicit killed $eflags
438   ; CHECK-NEXT:   $rax = COPY [[CMOV64rr]]
439   ; CHECK-NEXT:   RET 0, $rax
440   ; CHECK-NEXT: {{  $}}
441   ; CHECK-NEXT: bb.2:
442   ; CHECK-NEXT:   TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags
443   ; CHECK-NEXT:   [[CMOV64rr1:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags
444   ; CHECK-NEXT:   $rax = COPY [[CMOV64rr1]]
445   ; CHECK-NEXT:   RET 0, $rax
446   ; CHECK-NEXT: {{  $}}
447   ; CHECK-NEXT: bb.3:
448   ; CHECK-NEXT:   TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags
449   ; CHECK-NEXT:   [[CMOV64rr2:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags
450   ; CHECK-NEXT:   $rax = COPY [[CMOV64rr2]]
451   ; CHECK-NEXT:   RET 0, $rax
452   bb.0:
453     successors: %bb.1, %bb.2, %bb.3
454     liveins: $rdi, $rsi
456     %0:gr64 = COPY $rdi
457     %1:gr64 = COPY $rsi
458     CMP64rr %0, %1, implicit-def $eflags
459     %2:gr64 = COPY $eflags
461     INLINEASM &nop, 1, 12, implicit-def dead $eflags
463     $eflags = COPY %2
464     JCC_1 %bb.1, 7, implicit $eflags
465     JCC_1 %bb.2, 2, implicit $eflags
466     JMP_1 %bb.3
468   bb.1:
469     liveins: $eflags
471     %3:gr64 = CMOV64rr %0, %1, 4, implicit killed $eflags
472     $rax = COPY %3
473     RET 0, $rax
475   bb.2:
476     liveins: $eflags
478     %4:gr64 = CMOV64rr %0, %1, 5, implicit killed $eflags
479     $rax = COPY %4
480     RET 0, $rax
482   bb.3:
483     liveins: $eflags
485     %5:gr64 = CMOV64rr %0, %1, 8, implicit killed $eflags
486     $rax = COPY %5
487     RET 0, $rax
491 name:            test_branch_with_interleaved_livein_and_kill
492 body:             |
493   ; CHECK-LABEL: name: test_branch_with_interleaved_livein_and_kill
494   ; CHECK: bb.0:
495   ; CHECK-NEXT:   successors: %bb.1(0x2aaaaaab), %bb.6(0x55555556)
496   ; CHECK-NEXT:   liveins: $rdi, $rsi
497   ; CHECK-NEXT: {{  $}}
498   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gr64 = COPY $rdi
499   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
500   ; CHECK-NEXT:   CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags
501   ; CHECK-NEXT:   [[SETCCr:%[0-9]+]]:gr8 = SETCCr 8, implicit $eflags
502   ; CHECK-NEXT:   [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 10, implicit $eflags
503   ; CHECK-NEXT:   [[SETCCr2:%[0-9]+]]:gr8 = SETCCr 5, implicit $eflags
504   ; CHECK-NEXT:   [[SETCCr3:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags
505   ; CHECK-NEXT:   [[SETCCr4:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags
506   ; CHECK-NEXT:   [[SETCCr5:%[0-9]+]]:gr8 = SETCCr 0, implicit $eflags
507   ; CHECK-NEXT:   INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags
508   ; CHECK-NEXT:   TEST8rr [[SETCCr3]], [[SETCCr3]], implicit-def $eflags
509   ; CHECK-NEXT:   JCC_1 %bb.1, 5, implicit killed $eflags
510   ; CHECK-NEXT: {{  $}}
511   ; CHECK-NEXT: bb.6:
512   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.5(0x40000000)
513   ; CHECK-NEXT: {{  $}}
514   ; CHECK-NEXT:   TEST8rr [[SETCCr4]], [[SETCCr4]], implicit-def $eflags
515   ; CHECK-NEXT:   JCC_1 %bb.2, 5, implicit killed $eflags
516   ; CHECK-NEXT:   JMP_1 %bb.5
517   ; CHECK-NEXT: {{  $}}
518   ; CHECK-NEXT: bb.1:
519   ; CHECK-NEXT:   TEST8rr [[SETCCr2]], [[SETCCr2]], implicit-def $eflags
520   ; CHECK-NEXT:   [[CMOV64rr:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 4, implicit killed $eflags
521   ; CHECK-NEXT:   $rax = COPY [[CMOV64rr]]
522   ; CHECK-NEXT:   RET 0, $rax
523   ; CHECK-NEXT: {{  $}}
524   ; CHECK-NEXT: bb.2:
525   ; CHECK-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
526   ; CHECK-NEXT: {{  $}}
527   ; CHECK-NEXT:   TEST8rr [[SETCCr5]], [[SETCCr5]], implicit-def $eflags
528   ; CHECK-NEXT:   JCC_1 %bb.3, 5, implicit killed $eflags
529   ; CHECK-NEXT:   JMP_1 %bb.4
530   ; CHECK-NEXT: {{  $}}
531   ; CHECK-NEXT: bb.3:
532   ; CHECK-NEXT:   TEST8rr [[SETCCr2]], [[SETCCr2]], implicit-def $eflags
533   ; CHECK-NEXT:   [[CMOV64rr1:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags
534   ; CHECK-NEXT:   $rax = COPY [[CMOV64rr1]]
535   ; CHECK-NEXT:   RET 0, $rax
536   ; CHECK-NEXT: {{  $}}
537   ; CHECK-NEXT: bb.4:
538   ; CHECK-NEXT:   TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags
539   ; CHECK-NEXT:   [[CMOV64rr2:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags
540   ; CHECK-NEXT:   $rax = COPY [[CMOV64rr2]]
541   ; CHECK-NEXT:   RET 0, $rax
542   ; CHECK-NEXT: {{  $}}
543   ; CHECK-NEXT: bb.5:
544   ; CHECK-NEXT:   TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags
545   ; CHECK-NEXT:   [[CMOV64rr3:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags
546   ; CHECK-NEXT:   $rax = COPY [[CMOV64rr3]]
547   ; CHECK-NEXT:   RET 0, $rax
548   bb.0:
549     successors: %bb.1, %bb.2, %bb.5
550     liveins: $rdi, $rsi
552     %0:gr64 = COPY $rdi
553     %1:gr64 = COPY $rsi
554     CMP64rr %0, %1, implicit-def $eflags
555     %2:gr64 = COPY $eflags
557     INLINEASM &nop, 1, 12, implicit-def dead $eflags
559     $eflags = COPY %2
560     JCC_1 %bb.1, 7, implicit $eflags
561     JCC_1 %bb.2, 2, implicit $eflags
562     JMP_1 %bb.5
564   bb.1:
565     liveins: $eflags
567     %3:gr64 = CMOV64rr %0, %1, 4, implicit killed $eflags
568     $rax = COPY %3
569     RET 0, $rax
571   bb.2:
572     successors: %bb.3, %bb.4
573     liveins: $eflags
575     JCC_1 %bb.3, 0, implicit $eflags
576     JMP_1 %bb.4
578   bb.3:
579     liveins: $eflags
581     %4:gr64 = CMOV64rr %0, %1, 5, implicit $eflags
582     $rax = COPY %4
583     RET 0, $rax
585   bb.4:
586     liveins: $eflags
588     %5:gr64 = CMOV64rr %0, %1, 10, implicit $eflags
589     $rax = COPY %5
590     RET 0, $rax
592   bb.5:
593     liveins: $eflags
595     %6:gr64 = CMOV64rr %0, %1, 8, implicit killed $eflags
596     $rax = COPY %6
597     RET 0, $rax
601 # This test case is designed to exercise a particularly challenging situation:
602 # when the flags are copied and restored *inside* of a complex and cyclic CFG
603 # all of which have live-in flags. To correctly handle this case we have to walk
604 # up the dominator tree and locate a viable reaching definition location,
605 # checking for clobbers along any path. The CFG for this function looks like the
606 # following diagram, control flowing out the bottom of blocks and in the top:
608 #  bb.0
609 #   | __________________
610 #   |/                  \
611 #  bb.1                  |
612 #   |\_________          |
613 #   | __       \ ____    |
614 #   |/  \      |/    \   |
615 #  bb.2  |    bb.4    |  |
616 #   |\__/     / \     |  |
617 #   |        /   \    |  |
618 #  bb.3    bb.5  bb.6 |  |
619 #   |        \   /    |  |
620 #   |         \ /     |  |
621 #   |         bb.7    |  |
622 #   | ________/ \____/   |
623 #   |/                   |
624 #  bb.8                  |
625 #   |\__________________/
626 #   |
627 #  bb.9
629 # We set EFLAGS in bb.0, clobber them in bb.3, and copy them in bb.2 and bb.6.
630 # Because of the cycles this requires hoisting the `SETcc` instructions to
631 # capture the flags for the bb.6 copy to bb.1 and using them for the copy in
632 # `bb.2` as well despite the clobber in `bb.3`. The clobber in `bb.3` also
633 # prevents hoisting the `SETcc`s up to `bb.0`.
635 # Throughout the test we use branch instructions that are totally bogus (as the
636 # flags are obviously not changing!) but this is just to allow us to send
637 # a small but complex CFG structure through the backend and force it to choose
638 # plausible lowering decisions based on the core CFG presented, regardless of
639 # the futility of the actual branches.
640 name:            test_mid_cycle_copies
641 body:             |
642   ; CHECK-LABEL: name: test_mid_cycle_copies
643   ; CHECK: bb.0:
644   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
645   ; CHECK-NEXT:   liveins: $rdi, $rsi
646   ; CHECK-NEXT: {{  $}}
647   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gr64 = COPY $rdi
648   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
649   ; CHECK-NEXT:   CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags
650   ; CHECK-NEXT:   JMP_1 %bb.1
651   ; CHECK-NEXT: {{  $}}
652   ; CHECK-NEXT: bb.1:
653   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.4(0x40000000)
654   ; CHECK-NEXT:   liveins: $eflags
655   ; CHECK-NEXT: {{  $}}
656   ; CHECK-NEXT:   [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags
657   ; CHECK-NEXT:   [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 4, implicit $eflags
658   ; CHECK-NEXT:   [[SETCCr2:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags
659   ; CHECK-NEXT:   JCC_1 %bb.2, 4, implicit $eflags
660   ; CHECK-NEXT:   JMP_1 %bb.4
661   ; CHECK-NEXT: {{  $}}
662   ; CHECK-NEXT: bb.2:
663   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
664   ; CHECK-NEXT: {{  $}}
665   ; CHECK-NEXT:   TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags
666   ; CHECK-NEXT:   JCC_1 %bb.2, 5, implicit killed $eflags
667   ; CHECK-NEXT:   JMP_1 %bb.3
668   ; CHECK-NEXT: {{  $}}
669   ; CHECK-NEXT: bb.3:
670   ; CHECK-NEXT:   successors: %bb.8(0x80000000)
671   ; CHECK-NEXT: {{  $}}
672   ; CHECK-NEXT:   dead [[ADD8ri:%[0-9]+]]:gr8 = ADD8ri [[SETCCr2]], 255, implicit-def $eflags
673   ; CHECK-NEXT:   [[ADC64ri32_:%[0-9]+]]:gr64 = ADC64ri32 [[COPY]], 42, implicit-def dead $eflags, implicit killed $eflags
674   ; CHECK-NEXT:   MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[ADC64ri32_]]
675   ; CHECK-NEXT:   JMP_1 %bb.8
676   ; CHECK-NEXT: {{  $}}
677   ; CHECK-NEXT: bb.4:
678   ; CHECK-NEXT:   successors: %bb.5(0x40000000), %bb.6(0x40000000)
679   ; CHECK-NEXT: {{  $}}
680   ; CHECK-NEXT:   TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags
681   ; CHECK-NEXT:   JCC_1 %bb.5, 5, implicit killed $eflags
682   ; CHECK-NEXT:   JMP_1 %bb.6
683   ; CHECK-NEXT: {{  $}}
684   ; CHECK-NEXT: bb.5:
685   ; CHECK-NEXT:   successors: %bb.7(0x80000000)
686   ; CHECK-NEXT: {{  $}}
687   ; CHECK-NEXT:   TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags
688   ; CHECK-NEXT:   [[CMOV64rr:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags
689   ; CHECK-NEXT:   MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr]]
690   ; CHECK-NEXT:   JMP_1 %bb.7
691   ; CHECK-NEXT: {{  $}}
692   ; CHECK-NEXT: bb.6:
693   ; CHECK-NEXT:   successors: %bb.7(0x80000000)
694   ; CHECK-NEXT: {{  $}}
695   ; CHECK-NEXT:   TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags
696   ; CHECK-NEXT:   [[CMOV64rr1:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags
697   ; CHECK-NEXT:   MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr1]]
698   ; CHECK-NEXT:   TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags
699   ; CHECK-NEXT:   [[CMOV64rr2:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags
700   ; CHECK-NEXT:   MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr2]]
701   ; CHECK-NEXT:   JMP_1 %bb.7
702   ; CHECK-NEXT: {{  $}}
703   ; CHECK-NEXT: bb.7:
704   ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.8(0x40000000)
705   ; CHECK-NEXT: {{  $}}
706   ; CHECK-NEXT:   TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags
707   ; CHECK-NEXT:   JCC_1 %bb.4, 5, implicit killed $eflags
708   ; CHECK-NEXT:   JMP_1 %bb.8
709   ; CHECK-NEXT: {{  $}}
710   ; CHECK-NEXT: bb.8:
711   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.9(0x40000000)
712   ; CHECK-NEXT: {{  $}}
713   ; CHECK-NEXT:   CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags
714   ; CHECK-NEXT:   JCC_1 %bb.1, 4, implicit $eflags
715   ; CHECK-NEXT:   JMP_1 %bb.9
716   ; CHECK-NEXT: {{  $}}
717   ; CHECK-NEXT: bb.9:
718   ; CHECK-NEXT:   liveins: $eflags
719   ; CHECK-NEXT: {{  $}}
720   ; CHECK-NEXT:   [[CMOV64rr3:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 4, implicit killed $eflags
721   ; CHECK-NEXT:   $rax = COPY [[CMOV64rr3]]
722   ; CHECK-NEXT:   RET 0, $rax
723   bb.0:
724     successors: %bb.1
725     liveins: $rdi, $rsi
727     %0:gr64 = COPY $rdi
728     %1:gr64 = COPY $rsi
729     CMP64rr %0, %1, implicit-def $eflags
730     JMP_1 %bb.1
732   bb.1:
733     successors: %bb.2, %bb.4
734     liveins: $eflags
736     JCC_1 %bb.2, 4, implicit $eflags
737     JMP_1 %bb.4
739   bb.2:
740     successors: %bb.2, %bb.3
741     liveins: $eflags
743     %2:gr64 = COPY $eflags
744     $eflags = COPY %2
745     JCC_1 %bb.2, 4, implicit $eflags
746     JMP_1 %bb.3
748   bb.3:
749     successors: %bb.8
750     liveins: $eflags
752     %3:gr64 = ADC64ri32 %0, 42, implicit-def dead $eflags, implicit $eflags
753     MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %3
754     JMP_1 %bb.8
756   bb.4:
757     successors: %bb.5, %bb.6
758     liveins: $eflags
760     JCC_1 %bb.5, 4, implicit $eflags
761     JMP_1 %bb.6
763   bb.5:
764     successors: %bb.7
765     liveins: $eflags
767     %4:gr64 = CMOV64rr %0, %1, 7, implicit $eflags
768     MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %4
769     JMP_1 %bb.7
771   bb.6:
772     successors: %bb.7
773     liveins: $eflags
775     %5:gr64 = CMOV64rr %0, %1, 7, implicit $eflags
776     MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5
778     %6:gr64 = COPY $eflags
779     $eflags = COPY %6:gr64
781     %7:gr64 = CMOV64rr %0, %1, 7, implicit $eflags
782     MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %7
783     JMP_1 %bb.7
785   bb.7:
786     successors: %bb.4, %bb.8
787     liveins: $eflags
789     JCC_1 %bb.4, 4, implicit $eflags
790     JMP_1 %bb.8
792   bb.8:
793     successors: %bb.1, %bb.9
795     CMP64rr %0, %1, implicit-def $eflags
796     JCC_1 %bb.1, 4, implicit $eflags
797     JMP_1 %bb.9
799   bb.9:
800     liveins: $eflags
802     %8:gr64 = CMOV64rr %0, %1, 4, implicit killed $eflags
803     $rax = COPY %8
804     RET 0, $rax
808 name:            test_existing_setcc
809 body:             |
810   ; CHECK-LABEL: name: test_existing_setcc
811   ; CHECK: bb.0:
812   ; CHECK-NEXT:   successors: %bb.1(0x2aaaaaab), %bb.4(0x55555556)
813   ; CHECK-NEXT:   liveins: $rdi, $rsi
814   ; CHECK-NEXT: {{  $}}
815   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gr64 = COPY $rdi
816   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
817   ; CHECK-NEXT:   CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags
818   ; CHECK-NEXT:   [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags
819   ; CHECK-NEXT:   [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 3, implicit $eflags
820   ; CHECK-NEXT:   INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags
821   ; CHECK-NEXT:   TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags
822   ; CHECK-NEXT:   JCC_1 %bb.1, 5, implicit killed $eflags
823   ; CHECK-NEXT: {{  $}}
824   ; CHECK-NEXT: bb.4:
825   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
826   ; CHECK-NEXT: {{  $}}
827   ; CHECK-NEXT:   TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags
828   ; CHECK-NEXT:   JCC_1 %bb.2, 4, implicit killed $eflags
829   ; CHECK-NEXT:   JMP_1 %bb.3
830   ; CHECK-NEXT: {{  $}}
831   ; CHECK-NEXT: bb.1:
832   ; CHECK-NEXT:   [[MOV32ri:%[0-9]+]]:gr32 = MOV32ri 42
833   ; CHECK-NEXT:   $eax = COPY [[MOV32ri]]
834   ; CHECK-NEXT:   RET 0, $eax
835   ; CHECK-NEXT: {{  $}}
836   ; CHECK-NEXT: bb.2:
837   ; CHECK-NEXT:   [[MOV32ri1:%[0-9]+]]:gr32 = MOV32ri 43
838   ; CHECK-NEXT:   $eax = COPY [[MOV32ri1]]
839   ; CHECK-NEXT:   RET 0, $eax
840   ; CHECK-NEXT: {{  $}}
841   ; CHECK-NEXT: bb.3:
842   ; CHECK-NEXT:   [[MOV32r0_:%[0-9]+]]:gr32 = MOV32r0 implicit-def dead $eflags
843   ; CHECK-NEXT:   $eax = COPY [[MOV32r0_]]
844   ; CHECK-NEXT:   RET 0, $eax
845   bb.0:
846     successors: %bb.1, %bb.2, %bb.3
847     liveins: $rdi, $rsi
849     %0:gr64 = COPY $rdi
850     %1:gr64 = COPY $rsi
851     CMP64rr %0, %1, implicit-def $eflags
852     %2:gr8 = SETCCr 7, implicit $eflags
853     %3:gr8 = SETCCr 3, implicit $eflags
854     %4:gr64 = COPY $eflags
856     INLINEASM &nop, 1, 12, implicit-def dead $eflags
858     $eflags = COPY %4
859     JCC_1 %bb.1, 7, implicit $eflags
860     JCC_1 %bb.2, 2, implicit $eflags
861     JMP_1 %bb.3
863   bb.1:
864     %5:gr32 = MOV32ri 42
865     $eax = COPY %5
866     RET 0, $eax
868   bb.2:
869     %6:gr32 = MOV32ri 43
870     $eax = COPY %6
871     RET 0, $eax
873   bb.3:
874     %7:gr32 = MOV32r0 implicit-def dead $eflags
875     $eax = COPY %7
876     RET 0, $eax
880 # We cannot reuse this SETE because it stores the flag directly to memory,
881 # so we have two SETEs here. FIXME: It'd be great if something could fold
882 # these automatically. If not, maybe we want to unfold SETcc instructions
883 # writing to memory so we can reuse them.
885 name:            test_existing_setcc_memory
886 body:             |
887   ; CHECK-LABEL: name: test_existing_setcc_memory
888   ; CHECK: bb.0:
889   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
890   ; CHECK-NEXT:   liveins: $rdi, $rsi
891   ; CHECK-NEXT: {{  $}}
892   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:gr64 = COPY $rdi
893   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:gr64 = COPY $rsi
894   ; CHECK-NEXT:   CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags
895   ; CHECK-NEXT:   SETCCm [[COPY]], 1, $noreg, -16, $noreg, 4, implicit $eflags
896   ; CHECK-NEXT:   [[SETCCr:%[0-9]+]]:gr8 = SETCCr 4, implicit $eflags
897   ; CHECK-NEXT:   INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags
898   ; CHECK-NEXT:   TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags
899   ; CHECK-NEXT:   JCC_1 %bb.1, 5, implicit killed $eflags
900   ; CHECK-NEXT:   JMP_1 %bb.2
901   ; CHECK-NEXT: {{  $}}
902   ; CHECK-NEXT: bb.1:
903   ; CHECK-NEXT:   [[MOV32ri:%[0-9]+]]:gr32 = MOV32ri 42
904   ; CHECK-NEXT:   $eax = COPY [[MOV32ri]]
905   ; CHECK-NEXT:   RET 0, $eax
906   ; CHECK-NEXT: {{  $}}
907   ; CHECK-NEXT: bb.2:
908   ; CHECK-NEXT:   [[MOV32ri1:%[0-9]+]]:gr32 = MOV32ri 43
909   ; CHECK-NEXT:   $eax = COPY [[MOV32ri1]]
910   ; CHECK-NEXT:   RET 0, $eax
911   bb.0:
912     successors: %bb.1, %bb.2
913     liveins: $rdi, $rsi
915     %0:gr64 = COPY $rdi
916     %1:gr64 = COPY $rsi
917     CMP64rr %0, %1, implicit-def $eflags
918     SETCCm %0, 1, $noreg, -16, $noreg, 4, implicit $eflags
919     %2:gr64 = COPY $eflags
921     INLINEASM &nop, 1, 12, implicit-def dead $eflags
923     $eflags = COPY %2
924     JCC_1 %bb.1, 4, implicit $eflags
925     JMP_1 %bb.2
927   bb.1:
928     %3:gr32 = MOV32ri 42
929     $eax = COPY %3
930     RET 0, $eax
932   bb.2:
933     %4:gr32 = MOV32ri 43
934     $eax = COPY %4
935     RET 0, $eax