xref: /llvm-project/llvm/test/CodeGen/X86/apx/ctest.ll (revision e8e2cff1607627e52079741af368064cea3e28d4)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ccmp -verify-machineinstrs | FileCheck %s
3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ccmp,+ndd -verify-machineinstrs | FileCheck %s --check-prefix=NDD
4
5define void @ctest8rr_zf(i8 noundef %a, i8 noundef %b) {
6; CHECK-LABEL: ctest8rr_zf:
7; CHECK:       # %bb.0: # %entry
8; CHECK-NEXT:    testb %dil, %dil
9; CHECK-NEXT:    ctestneb {dfv=zf} %sil, %sil
10; CHECK-NEXT:    jne .LBB0_1
11; CHECK-NEXT:  # %bb.2: # %if.then
12; CHECK-NEXT:    xorl %eax, %eax
13; CHECK-NEXT:    jmp foo # TAILCALL
14; CHECK-NEXT:  .LBB0_1: # %if.end
15; CHECK-NEXT:    retq
16;
17; NDD-LABEL: ctest8rr_zf:
18; NDD:       # %bb.0: # %entry
19; NDD-NEXT:    testb %dil, %dil
20; NDD-NEXT:    ctestneb {dfv=zf} %sil, %sil
21; NDD-NEXT:    jne .LBB0_1
22; NDD-NEXT:  # %bb.2: # %if.then
23; NDD-NEXT:    xorl %eax, %eax
24; NDD-NEXT:    jmp foo # TAILCALL
25; NDD-NEXT:  .LBB0_1: # %if.end
26; NDD-NEXT:    retq
27entry:
28  %cmp = icmp eq i8 %a, 0
29  %cmp1 = icmp eq i8 %b, 0
30  %or.cond = or i1 %cmp, %cmp1
31  br i1 %or.cond, label %if.then, label %if.end
32
33if.then:                                          ; preds = %entry
34  tail call void (...) @foo()
35  br label %if.end
36
37if.end:                                           ; preds = %entry, %if.then
38  ret void
39}
40
41define i8 @ctest8rr_zf_double(i8 %a, double %b, i8* nocapture %c)  {
42; CHECK-LABEL: ctest8rr_zf_double:
43; CHECK:       # %bb.0: # %entry
44; CHECK-NEXT:    xorpd %xmm1, %xmm1
45; CHECK-NEXT:    ucomisd %xmm1, %xmm0
46; CHECK-NEXT:    ctesteb {dfv=zf} %dil, %dil
47; CHECK-NEXT:    je .LBB1_2
48; CHECK-NEXT:  # %bb.1: # %if.then
49; CHECK-NEXT:    movb %dil, (%rsi)
50; CHECK-NEXT:  .LBB1_2: # %if.end
51; CHECK-NEXT:    xorl %eax, %eax
52; CHECK-NEXT:    retq
53;
54; NDD-LABEL: ctest8rr_zf_double:
55; NDD:       # %bb.0: # %entry
56; NDD-NEXT:    xorpd %xmm1, %xmm1
57; NDD-NEXT:    ucomisd %xmm1, %xmm0
58; NDD-NEXT:    ctesteb {dfv=zf} %dil, %dil
59; NDD-NEXT:    je .LBB1_2
60; NDD-NEXT:  # %bb.1: # %if.then
61; NDD-NEXT:    movb %dil, (%rsi)
62; NDD-NEXT:  .LBB1_2: # %if.end
63; NDD-NEXT:    xorl %eax, %eax
64; NDD-NEXT:    retq
65entry:
66  %tobool = icmp ne i8 %a, 0
67  %cmp = fcmp ueq double %b, 0.0
68  %or.cond = select i1 %tobool, i1 %cmp, i1 false
69  br i1 %or.cond, label %if.then, label %if.end
70
71if.then:
72  store i8 %a, i8* %c, align 4
73  br label %if.end
74
75if.end:
76  ret i8 0
77}
78
79define i8 @ctest8rr_zf_double_p(i8 %a, double %b, i8* nocapture %c)  {
80; CHECK-LABEL: ctest8rr_zf_double_p:
81; CHECK:       # %bb.0: # %entry
82; CHECK-NEXT:    testb %dil, %dil
83; CHECK-NEXT:    setne %al
84; CHECK-NEXT:    ucomisd %xmm0, %xmm0
85; CHECK-NEXT:    setp %cl
86; CHECK-NEXT:    andb %al, %cl
87; CHECK-NEXT:    cmpb $1, %cl
88; CHECK-NEXT:    jne .LBB2_2
89; CHECK-NEXT:  # %bb.1: # %if.then
90; CHECK-NEXT:    movb %dil, (%rsi)
91; CHECK-NEXT:  .LBB2_2: # %if.end
92; CHECK-NEXT:    xorl %eax, %eax
93; CHECK-NEXT:    retq
94;
95; NDD-LABEL: ctest8rr_zf_double_p:
96; NDD:       # %bb.0: # %entry
97; NDD-NEXT:    testb %dil, %dil
98; NDD-NEXT:    setne %al
99; NDD-NEXT:    ucomisd %xmm0, %xmm0
100; NDD-NEXT:    setp %cl
101; NDD-NEXT:    andb %cl, %al
102; NDD-NEXT:    cmpb $1, %al
103; NDD-NEXT:    jne .LBB2_2
104; NDD-NEXT:  # %bb.1: # %if.then
105; NDD-NEXT:    movb %dil, (%rsi)
106; NDD-NEXT:  .LBB2_2: # %if.end
107; NDD-NEXT:    xorl %eax, %eax
108; NDD-NEXT:    retq
109entry:
110  %tobool = icmp ne i8 %a, 0
111  %cmp = fcmp uno double %b, 0.0
112  %or.cond = select i1 %tobool, i1 %cmp, i1 false
113  br i1 %or.cond, label %if.then, label %if.end
114
115if.then:
116  store i8 %a, i8* %c, align 4
117  br label %if.end
118
119if.end:
120  ret i8 0
121}
122
123define i8 @ctest8rr_zf_double_np(i8 %a, double %b, i8* nocapture %c)  {
124; CHECK-LABEL: ctest8rr_zf_double_np:
125; CHECK:       # %bb.0: # %entry
126; CHECK-NEXT:    testb %dil, %dil
127; CHECK-NEXT:    setne %al
128; CHECK-NEXT:    ucomisd %xmm0, %xmm0
129; CHECK-NEXT:    setnp %cl
130; CHECK-NEXT:    andb %al, %cl
131; CHECK-NEXT:    cmpb $1, %cl
132; CHECK-NEXT:    jne .LBB3_2
133; CHECK-NEXT:  # %bb.1: # %if.then
134; CHECK-NEXT:    movb %dil, (%rsi)
135; CHECK-NEXT:  .LBB3_2: # %if.end
136; CHECK-NEXT:    xorl %eax, %eax
137; CHECK-NEXT:    retq
138;
139; NDD-LABEL: ctest8rr_zf_double_np:
140; NDD:       # %bb.0: # %entry
141; NDD-NEXT:    testb %dil, %dil
142; NDD-NEXT:    setne %al
143; NDD-NEXT:    ucomisd %xmm0, %xmm0
144; NDD-NEXT:    setnp %cl
145; NDD-NEXT:    andb %cl, %al
146; NDD-NEXT:    cmpb $1, %al
147; NDD-NEXT:    jne .LBB3_2
148; NDD-NEXT:  # %bb.1: # %if.then
149; NDD-NEXT:    movb %dil, (%rsi)
150; NDD-NEXT:  .LBB3_2: # %if.end
151; NDD-NEXT:    xorl %eax, %eax
152; NDD-NEXT:    retq
153entry:
154  %tobool = icmp ne i8 %a, 0
155  %cmp = fcmp ord double %b, 0.0
156  %or.cond = select i1 %tobool, i1 %cmp, i1 false
157  br i1 %or.cond, label %if.then, label %if.end
158
159if.then:
160  store i8 %a, i8* %c, align 4
161  br label %if.end
162
163if.end:
164  ret i8 0
165}
166
167define void @ctest8rr_sf(i8 noundef %a, i8 noundef %b) {
168; CHECK-LABEL: ctest8rr_sf:
169; CHECK:       # %bb.0: # %entry
170; CHECK-NEXT:    testb %dil, %dil
171; CHECK-NEXT:    ctesteb {dfv=sf} %sil, %sil
172; CHECK-NEXT:    js .LBB4_1
173; CHECK-NEXT:  # %bb.2: # %if.then
174; CHECK-NEXT:    xorl %eax, %eax
175; CHECK-NEXT:    jmp foo # TAILCALL
176; CHECK-NEXT:  .LBB4_1: # %if.end
177; CHECK-NEXT:    retq
178;
179; NDD-LABEL: ctest8rr_sf:
180; NDD:       # %bb.0: # %entry
181; NDD-NEXT:    testb %dil, %dil
182; NDD-NEXT:    ctesteb {dfv=sf} %sil, %sil
183; NDD-NEXT:    js .LBB4_1
184; NDD-NEXT:  # %bb.2: # %if.then
185; NDD-NEXT:    xorl %eax, %eax
186; NDD-NEXT:    jmp foo # TAILCALL
187; NDD-NEXT:  .LBB4_1: # %if.end
188; NDD-NEXT:    retq
189entry:
190  %cmp = icmp ule i8 %a, 0
191  %tobool = icmp sge i8 %b, 0
192  %or.cond = and i1 %cmp, %tobool
193  br i1 %or.cond, label %if.then, label %if.end
194
195if.then:                                          ; preds = %entry
196  tail call void (...) @foo()
197  br label %if.end
198
199if.end:                                           ; preds = %if.then, %entry
200  ret void
201}
202
203define i8 @ctest8rr_sf_2(i8 %a, i8 %b, i8* nocapture %c)  {
204; CHECK-LABEL: ctest8rr_sf_2:
205; CHECK:       # %bb.0: # %entry
206; CHECK-NEXT:    testb %dil, %dil
207; CHECK-NEXT:    ctestleb {dfv=sf} %sil, %sil
208; CHECK-NEXT:    jns .LBB5_2
209; CHECK-NEXT:  # %bb.1: # %if.then
210; CHECK-NEXT:    movb %dil, (%rdx)
211; CHECK-NEXT:  .LBB5_2: # %if.end
212; CHECK-NEXT:    xorl %eax, %eax
213; CHECK-NEXT:    retq
214;
215; NDD-LABEL: ctest8rr_sf_2:
216; NDD:       # %bb.0: # %entry
217; NDD-NEXT:    testb %dil, %dil
218; NDD-NEXT:    ctestleb {dfv=sf} %sil, %sil
219; NDD-NEXT:    jns .LBB5_2
220; NDD-NEXT:  # %bb.1: # %if.then
221; NDD-NEXT:    movb %dil, (%rdx)
222; NDD-NEXT:  .LBB5_2: # %if.end
223; NDD-NEXT:    xorl %eax, %eax
224; NDD-NEXT:    retq
225entry:
226  %tobool = icmp sgt i8 %a, 0
227  %cmp = icmp slt i8 %b, 0
228  %or.cond = select i1 %tobool, i1 true, i1 %cmp
229  br i1 %or.cond, label %if.then, label %if.end
230
231if.then:
232  store i8 %a, i8* %c, align 4
233  br label %if.end
234
235if.end:
236  ret i8 0
237}
238
239define i8 @ctest8rr_none(i8 %a, i8 %b, i8* nocapture %c)  {
240; CHECK-LABEL: ctest8rr_none:
241; CHECK:       # %bb.0: # %entry
242; CHECK-NEXT:    testb %dil, %dil
243; CHECK-NEXT:    ctestneb {dfv=} %sil, %sil
244; CHECK-NEXT:    jne .LBB6_2
245; CHECK-NEXT:  # %bb.1: # %if.then
246; CHECK-NEXT:    movb %dil, (%rdx)
247; CHECK-NEXT:  .LBB6_2: # %if.end
248; CHECK-NEXT:    xorl %eax, %eax
249; CHECK-NEXT:    retq
250;
251; NDD-LABEL: ctest8rr_none:
252; NDD:       # %bb.0: # %entry
253; NDD-NEXT:    testb %dil, %dil
254; NDD-NEXT:    ctestneb {dfv=} %sil, %sil
255; NDD-NEXT:    jne .LBB6_2
256; NDD-NEXT:  # %bb.1: # %if.then
257; NDD-NEXT:    movb %dil, (%rdx)
258; NDD-NEXT:  .LBB6_2: # %if.end
259; NDD-NEXT:    xorl %eax, %eax
260; NDD-NEXT:    retq
261entry:
262  %tobool = icmp ne i8 %a, 0
263  %cmp = icmp eq i8 %b, 0
264  %or.cond = select i1 %tobool, i1 %cmp, i1 false
265  br i1 %or.cond, label %if.then, label %if.end
266
267if.then:
268  store i8 %a, i8* %c, align 4
269  br label %if.end
270
271if.end:
272  ret i8 0
273}
274
275define void @ctest16rr_sf(i16 noundef %a, i16 noundef %b) {
276; CHECK-LABEL: ctest16rr_sf:
277; CHECK:       # %bb.0: # %entry
278; CHECK-NEXT:    testw %di, %di
279; CHECK-NEXT:    ctestlew {dfv=sf} %si, %si
280; CHECK-NEXT:    jns .LBB7_1
281; CHECK-NEXT:  # %bb.2: # %if.then
282; CHECK-NEXT:    xorl %eax, %eax
283; CHECK-NEXT:    jmp foo # TAILCALL
284; CHECK-NEXT:  .LBB7_1: # %if.end
285; CHECK-NEXT:    retq
286;
287; NDD-LABEL: ctest16rr_sf:
288; NDD:       # %bb.0: # %entry
289; NDD-NEXT:    testw %di, %di
290; NDD-NEXT:    ctestlew {dfv=sf} %si, %si
291; NDD-NEXT:    jns .LBB7_1
292; NDD-NEXT:  # %bb.2: # %if.then
293; NDD-NEXT:    xorl %eax, %eax
294; NDD-NEXT:    jmp foo # TAILCALL
295; NDD-NEXT:  .LBB7_1: # %if.end
296; NDD-NEXT:    retq
297entry:
298  %cmp = icmp sgt i16 %a, 0
299  %cmp1 = icmp slt i16 %b, 0
300  %or.cond = or i1 %cmp, %cmp1
301  br i1 %or.cond, label %if.then, label %if.end
302
303if.then:                                          ; preds = %entry
304  tail call void (...) @foo()
305  br label %if.end
306
307if.end:                                           ; preds = %entry, %if.then
308  ret void
309}
310
311define void @ctest32rr_zf(i32 noundef %a, i32 noundef %b) {
312; CHECK-LABEL: ctest32rr_zf:
313; CHECK:       # %bb.0: # %entry
314; CHECK-NEXT:    testl %edi, %edi
315; CHECK-NEXT:    ctestsl {dfv=zf} %esi, %esi
316; CHECK-NEXT:    jne .LBB8_1
317; CHECK-NEXT:  # %bb.2: # %if.then
318; CHECK-NEXT:    xorl %eax, %eax
319; CHECK-NEXT:    jmp foo # TAILCALL
320; CHECK-NEXT:  .LBB8_1: # %if.end
321; CHECK-NEXT:    retq
322;
323; NDD-LABEL: ctest32rr_zf:
324; NDD:       # %bb.0: # %entry
325; NDD-NEXT:    testl %edi, %edi
326; NDD-NEXT:    ctestsl {dfv=zf} %esi, %esi
327; NDD-NEXT:    jne .LBB8_1
328; NDD-NEXT:  # %bb.2: # %if.then
329; NDD-NEXT:    xorl %eax, %eax
330; NDD-NEXT:    jmp foo # TAILCALL
331; NDD-NEXT:  .LBB8_1: # %if.end
332; NDD-NEXT:    retq
333entry:
334  %cmp = icmp sge i32 %a, 0
335  %cmp1 = icmp eq i32 %b, 0
336  %or.cond = or i1 %cmp, %cmp1
337  br i1 %or.cond, label %if.then, label %if.end
338
339if.then:                                          ; preds = %entry
340  tail call void (...) @foo()
341  br label %if.end
342
343if.end:                                           ; preds = %entry, %if.then
344  ret void
345}
346
347define void @ctest8ri_zf(i8 noundef %a, i8 noundef %b) {
348; CHECK-LABEL: ctest8ri_zf:
349; CHECK:       # %bb.0: # %entry
350; CHECK-NEXT:    testb %dil, %dil
351; CHECK-NEXT:    ctestneb {dfv=zf} $123, %sil
352; CHECK-NEXT:    jne .LBB9_1
353; CHECK-NEXT:  # %bb.2: # %if.then
354; CHECK-NEXT:    xorl %eax, %eax
355; CHECK-NEXT:    jmp foo # TAILCALL
356; CHECK-NEXT:  .LBB9_1: # %if.end
357; CHECK-NEXT:    retq
358;
359; NDD-LABEL: ctest8ri_zf:
360; NDD:       # %bb.0: # %entry
361; NDD-NEXT:    testb %dil, %dil
362; NDD-NEXT:    ctestneb {dfv=zf} $123, %sil
363; NDD-NEXT:    jne .LBB9_1
364; NDD-NEXT:  # %bb.2: # %if.then
365; NDD-NEXT:    xorl %eax, %eax
366; NDD-NEXT:    jmp foo # TAILCALL
367; NDD-NEXT:  .LBB9_1: # %if.end
368; NDD-NEXT:    retq
369entry:
370  %cmp = icmp eq i8 %a, 0
371  %and = and i8 %b, 123
372  %cmp1 = icmp eq i8 %and, 0
373  %or.cond = or i1 %cmp, %cmp1
374  br i1 %or.cond, label %if.then, label %if.end
375
376if.then:                                          ; preds = %entry
377  tail call void (...) @foo()
378  br label %if.end
379
380if.end:                                           ; preds = %entry, %if.then
381  ret void
382}
383
384define void @ctest16ri_zf(i16 noundef %a, i16 noundef %b) {
385; CHECK-LABEL: ctest16ri_zf:
386; CHECK:       # %bb.0: # %entry
387; CHECK-NEXT:    andl $1234, %esi # imm = 0x4D2
388; CHECK-NEXT:    testw %di, %di
389; CHECK-NEXT:    ctestnew {dfv=zf} %si, %si
390; CHECK-NEXT:    jne .LBB10_1
391; CHECK-NEXT:  # %bb.2: # %if.then
392; CHECK-NEXT:    xorl %eax, %eax
393; CHECK-NEXT:    jmp foo # TAILCALL
394; CHECK-NEXT:  .LBB10_1: # %if.end
395; CHECK-NEXT:    retq
396;
397; NDD-LABEL: ctest16ri_zf:
398; NDD:       # %bb.0: # %entry
399; NDD-NEXT:    testw %di, %di
400; NDD-NEXT:    ctestnew {dfv=zf} $1234, %si # imm = 0x4D2
401; NDD-NEXT:    jne .LBB10_1
402; NDD-NEXT:  # %bb.2: # %if.then
403; NDD-NEXT:    xorl %eax, %eax
404; NDD-NEXT:    jmp foo # TAILCALL
405; NDD-NEXT:  .LBB10_1: # %if.end
406; NDD-NEXT:    retq
407entry:
408  %cmp = icmp eq i16 %a, 0
409  %and = and i16 %b, 1234
410  %cmp1 = icmp eq i16 %and, 0
411  %or.cond = or i1 %cmp, %cmp1
412  br i1 %or.cond, label %if.then, label %if.end
413
414if.then:                                          ; preds = %entry
415  tail call void (...) @foo()
416  br label %if.end
417
418if.end:                                           ; preds = %entry, %if.then
419  ret void
420}
421
422define void @ctest32ri_zf(i32 noundef %a, i32 noundef %b) {
423; CHECK-LABEL: ctest32ri_zf:
424; CHECK:       # %bb.0: # %entry
425; CHECK-NEXT:    testl %edi, %edi
426; CHECK-NEXT:    ctestnel {dfv=zf} $12345, %esi # imm = 0x3039
427; CHECK-NEXT:    jne .LBB11_1
428; CHECK-NEXT:  # %bb.2: # %if.then
429; CHECK-NEXT:    xorl %eax, %eax
430; CHECK-NEXT:    jmp foo # TAILCALL
431; CHECK-NEXT:  .LBB11_1: # %if.end
432; CHECK-NEXT:    retq
433;
434; NDD-LABEL: ctest32ri_zf:
435; NDD:       # %bb.0: # %entry
436; NDD-NEXT:    testl %edi, %edi
437; NDD-NEXT:    ctestnel {dfv=zf} $12345, %esi # imm = 0x3039
438; NDD-NEXT:    jne .LBB11_1
439; NDD-NEXT:  # %bb.2: # %if.then
440; NDD-NEXT:    xorl %eax, %eax
441; NDD-NEXT:    jmp foo # TAILCALL
442; NDD-NEXT:  .LBB11_1: # %if.end
443; NDD-NEXT:    retq
444entry:
445  %cmp = icmp eq i32 %a, 0
446  %and = and i32 %b, 12345
447  %cmp1 = icmp eq i32 %and, 0
448  %or.cond = or i1 %cmp, %cmp1
449  br i1 %or.cond, label %if.then, label %if.end
450
451if.then:                                          ; preds = %entry
452  tail call void (...) @foo()
453  br label %if.end
454
455if.end:                                           ; preds = %entry, %if.then
456  ret void
457}
458
459define void @ctest64ri32_zf(i64 noundef %a, i64 noundef %b) {
460; CHECK-LABEL: ctest64ri32_zf:
461; CHECK:       # %bb.0: # %entry
462; CHECK-NEXT:    testq %rdi, %rdi
463; CHECK-NEXT:    ctestneq {dfv=zf} $123456, %rsi # imm = 0x1E240
464; CHECK-NEXT:    jne .LBB12_1
465; CHECK-NEXT:  # %bb.2: # %if.then
466; CHECK-NEXT:    xorl %eax, %eax
467; CHECK-NEXT:    jmp foo # TAILCALL
468; CHECK-NEXT:  .LBB12_1: # %if.end
469; CHECK-NEXT:    retq
470;
471; NDD-LABEL: ctest64ri32_zf:
472; NDD:       # %bb.0: # %entry
473; NDD-NEXT:    testq %rdi, %rdi
474; NDD-NEXT:    ctestneq {dfv=zf} $123456, %rsi # imm = 0x1E240
475; NDD-NEXT:    jne .LBB12_1
476; NDD-NEXT:  # %bb.2: # %if.then
477; NDD-NEXT:    xorl %eax, %eax
478; NDD-NEXT:    jmp foo # TAILCALL
479; NDD-NEXT:  .LBB12_1: # %if.end
480; NDD-NEXT:    retq
481entry:
482  %cmp = icmp eq i64 %a, 0
483  %and = and i64 %b, 123456
484  %cmp1 = icmp eq i64 %and, 0
485  %or.cond = or i1 %cmp, %cmp1
486  br i1 %or.cond, label %if.then, label %if.end
487
488if.then:                                          ; preds = %entry
489  tail call void (...) @foo()
490  br label %if.end
491
492if.end:                                           ; preds = %entry, %if.then
493  ret void
494}
495
496define void @ctest8mr_zf(i8 noundef %a, ptr %ptr) {
497; CHECK-LABEL: ctest8mr_zf:
498; CHECK:       # %bb.0: # %entry
499; CHECK-NEXT:    movzbl (%rsi), %eax
500; CHECK-NEXT:    testb %dil, %dil
501; CHECK-NEXT:    ctestneb {dfv=zf} %al, %al
502; CHECK-NEXT:    jne .LBB13_1
503; CHECK-NEXT:  # %bb.2: # %if.then
504; CHECK-NEXT:    xorl %eax, %eax
505; CHECK-NEXT:    jmp foo # TAILCALL
506; CHECK-NEXT:  .LBB13_1: # %if.end
507; CHECK-NEXT:    retq
508;
509; NDD-LABEL: ctest8mr_zf:
510; NDD:       # %bb.0: # %entry
511; NDD-NEXT:    movzbl (%rsi), %eax
512; NDD-NEXT:    testb %dil, %dil
513; NDD-NEXT:    ctestneb {dfv=zf} %al, %al
514; NDD-NEXT:    jne .LBB13_1
515; NDD-NEXT:  # %bb.2: # %if.then
516; NDD-NEXT:    xorl %eax, %eax
517; NDD-NEXT:    jmp foo # TAILCALL
518; NDD-NEXT:  .LBB13_1: # %if.end
519; NDD-NEXT:    retq
520entry:
521  %b = load i8, ptr %ptr
522  %cmp = icmp eq i8 %a, 0
523  %cmp1 = icmp eq i8 %b, 0
524  %or.cond = or i1 %cmp, %cmp1
525  br i1 %or.cond, label %if.then, label %if.end
526
527if.then:                                          ; preds = %entry
528  tail call void (...) @foo()
529  br label %if.end
530
531if.end:                                           ; preds = %entry, %if.then
532  ret void
533}
534
535define void @ctest16mr_zf(i16 noundef %a, ptr %ptr) {
536; CHECK-LABEL: ctest16mr_zf:
537; CHECK:       # %bb.0: # %entry
538; CHECK-NEXT:    movzwl (%rsi), %eax
539; CHECK-NEXT:    testw %di, %di
540; CHECK-NEXT:    ctestnew {dfv=zf} %ax, %ax
541; CHECK-NEXT:    jne .LBB14_1
542; CHECK-NEXT:  # %bb.2: # %if.then
543; CHECK-NEXT:    xorl %eax, %eax
544; CHECK-NEXT:    jmp foo # TAILCALL
545; CHECK-NEXT:  .LBB14_1: # %if.end
546; CHECK-NEXT:    retq
547;
548; NDD-LABEL: ctest16mr_zf:
549; NDD:       # %bb.0: # %entry
550; NDD-NEXT:    movzwl (%rsi), %eax
551; NDD-NEXT:    testw %di, %di
552; NDD-NEXT:    ctestnew {dfv=zf} %ax, %ax
553; NDD-NEXT:    jne .LBB14_1
554; NDD-NEXT:  # %bb.2: # %if.then
555; NDD-NEXT:    xorl %eax, %eax
556; NDD-NEXT:    jmp foo # TAILCALL
557; NDD-NEXT:  .LBB14_1: # %if.end
558; NDD-NEXT:    retq
559entry:
560  %b = load i16, ptr %ptr
561  %cmp = icmp eq i16 %a, 0
562  %cmp1 = icmp eq i16 %b, 0
563  %or.cond = or i1 %cmp, %cmp1
564  br i1 %or.cond, label %if.then, label %if.end
565
566if.then:                                          ; preds = %entry
567  tail call void (...) @foo()
568  br label %if.end
569
570if.end:                                           ; preds = %entry, %if.then
571  ret void
572}
573
574define void @ctest32mr_cf(i32 noundef %a, ptr %ptr) {
575; CHECK-LABEL: ctest32mr_cf:
576; CHECK:       # %bb.0: # %entry
577; CHECK-NEXT:    movl (%rsi), %eax
578; CHECK-NEXT:    testl %edi, %edi
579; CHECK-NEXT:    ctestnel {dfv=zf} %eax, %eax
580; CHECK-NEXT:    jne .LBB15_1
581; CHECK-NEXT:  # %bb.2: # %if.then
582; CHECK-NEXT:    xorl %eax, %eax
583; CHECK-NEXT:    jmp foo # TAILCALL
584; CHECK-NEXT:  .LBB15_1: # %if.end
585; CHECK-NEXT:    retq
586;
587; NDD-LABEL: ctest32mr_cf:
588; NDD:       # %bb.0: # %entry
589; NDD-NEXT:    movl (%rsi), %eax
590; NDD-NEXT:    testl %edi, %edi
591; NDD-NEXT:    ctestnel {dfv=zf} %eax, %eax
592; NDD-NEXT:    jne .LBB15_1
593; NDD-NEXT:  # %bb.2: # %if.then
594; NDD-NEXT:    xorl %eax, %eax
595; NDD-NEXT:    jmp foo # TAILCALL
596; NDD-NEXT:  .LBB15_1: # %if.end
597; NDD-NEXT:    retq
598entry:
599  %b = load i32, ptr %ptr
600  %cmp = icmp eq i32 %a, 0
601  %cmp1 = icmp eq i32 %b, 0
602  %or.cond = or i1 %cmp, %cmp1
603  br i1 %or.cond, label %if.then, label %if.end
604
605if.then:                                          ; preds = %entry
606  tail call void (...) @foo()
607  br label %if.end
608
609if.end:                                           ; preds = %entry, %if.then
610  ret void
611}
612
613define void @ctest64mr_zf(i64 noundef %a, ptr %ptr) {
614; CHECK-LABEL: ctest64mr_zf:
615; CHECK:       # %bb.0: # %entry
616; CHECK-NEXT:    movq (%rsi), %rax
617; CHECK-NEXT:    testq %rdi, %rdi
618; CHECK-NEXT:    ctestneq {dfv=zf} %rax, %rax
619; CHECK-NEXT:    jne .LBB16_1
620; CHECK-NEXT:  # %bb.2: # %if.then
621; CHECK-NEXT:    xorl %eax, %eax
622; CHECK-NEXT:    jmp foo # TAILCALL
623; CHECK-NEXT:  .LBB16_1: # %if.end
624; CHECK-NEXT:    retq
625;
626; NDD-LABEL: ctest64mr_zf:
627; NDD:       # %bb.0: # %entry
628; NDD-NEXT:    movq (%rsi), %rax
629; NDD-NEXT:    testq %rdi, %rdi
630; NDD-NEXT:    ctestneq {dfv=zf} %rax, %rax
631; NDD-NEXT:    jne .LBB16_1
632; NDD-NEXT:  # %bb.2: # %if.then
633; NDD-NEXT:    xorl %eax, %eax
634; NDD-NEXT:    jmp foo # TAILCALL
635; NDD-NEXT:  .LBB16_1: # %if.end
636; NDD-NEXT:    retq
637entry:
638  %b = load i64, ptr %ptr
639  %cmp = icmp eq i64 %a, 0
640  %cmp1 = icmp eq i64 %b, 0
641  %or.cond = or i1 %cmp, %cmp1
642  br i1 %or.cond, label %if.then, label %if.end
643
644if.then:                                          ; preds = %entry
645  tail call void (...) @foo()
646  br label %if.end
647
648if.end:                                           ; preds = %entry, %if.then
649  ret void
650}
651
652define void @ctest8mi_zf(i8 noundef %a, ptr %ptr) {
653; CHECK-LABEL: ctest8mi_zf:
654; CHECK:       # %bb.0: # %entry
655; CHECK-NEXT:    testb %dil, %dil
656; CHECK-NEXT:    ctestneb {dfv=zf} $123, (%rsi)
657; CHECK-NEXT:    jne .LBB17_1
658; CHECK-NEXT:  # %bb.2: # %if.then
659; CHECK-NEXT:    xorl %eax, %eax
660; CHECK-NEXT:    jmp foo # TAILCALL
661; CHECK-NEXT:  .LBB17_1: # %if.end
662; CHECK-NEXT:    retq
663;
664; NDD-LABEL: ctest8mi_zf:
665; NDD:       # %bb.0: # %entry
666; NDD-NEXT:    testb %dil, %dil
667; NDD-NEXT:    ctestneb {dfv=zf} $123, (%rsi)
668; NDD-NEXT:    jne .LBB17_1
669; NDD-NEXT:  # %bb.2: # %if.then
670; NDD-NEXT:    xorl %eax, %eax
671; NDD-NEXT:    jmp foo # TAILCALL
672; NDD-NEXT:  .LBB17_1: # %if.end
673; NDD-NEXT:    retq
674entry:
675  %b = load i8, ptr %ptr
676  %cmp = icmp eq i8 %a, 0
677  %and = and i8 %b, 123
678  %cmp1 = icmp eq i8 %and, 0
679  %or.cond = or i1 %cmp, %cmp1
680  br i1 %or.cond, label %if.then, label %if.end
681
682if.then:                                          ; preds = %entry
683  tail call void (...) @foo()
684  br label %if.end
685
686if.end:                                           ; preds = %entry, %if.then
687  ret void
688}
689
690define void @ctest16mi_zf(i16 noundef %a, ptr %ptr) {
691; CHECK-LABEL: ctest16mi_zf:
692; CHECK:       # %bb.0: # %entry
693; CHECK-NEXT:    movzwl (%rsi), %eax
694; CHECK-NEXT:    andl $1234, %eax # imm = 0x4D2
695; CHECK-NEXT:    testw %di, %di
696; CHECK-NEXT:    ctestnew {dfv=zf} %ax, %ax
697; CHECK-NEXT:    jne .LBB18_1
698; CHECK-NEXT:  # %bb.2: # %if.then
699; CHECK-NEXT:    xorl %eax, %eax
700; CHECK-NEXT:    jmp foo # TAILCALL
701; CHECK-NEXT:  .LBB18_1: # %if.end
702; CHECK-NEXT:    retq
703;
704; NDD-LABEL: ctest16mi_zf:
705; NDD:       # %bb.0: # %entry
706; NDD-NEXT:    testw %di, %di
707; NDD-NEXT:    ctestnew {dfv=zf} $1234, (%rsi) # imm = 0x4D2
708; NDD-NEXT:    jne .LBB18_1
709; NDD-NEXT:  # %bb.2: # %if.then
710; NDD-NEXT:    xorl %eax, %eax
711; NDD-NEXT:    jmp foo # TAILCALL
712; NDD-NEXT:  .LBB18_1: # %if.end
713; NDD-NEXT:    retq
714entry:
715  %b = load i16, ptr %ptr
716  %cmp = icmp eq i16 %a, 0
717  %and = and i16 %b, 1234
718  %cmp1 = icmp eq i16 %and, 0
719  %or.cond = or i1 %cmp, %cmp1
720  br i1 %or.cond, label %if.then, label %if.end
721
722if.then:                                          ; preds = %entry
723  tail call void (...) @foo()
724  br label %if.end
725
726if.end:                                           ; preds = %entry, %if.then
727  ret void
728}
729
730define void @ctest32mi_zf(i32 noundef %a, ptr %ptr) {
731; CHECK-LABEL: ctest32mi_zf:
732; CHECK:       # %bb.0: # %entry
733; CHECK-NEXT:    movzwl (%rsi), %eax
734; CHECK-NEXT:    andl $12345, %eax # imm = 0x3039
735; CHECK-NEXT:    testl %edi, %edi
736; CHECK-NEXT:    ctestnew {dfv=zf} %ax, %ax
737; CHECK-NEXT:    jne .LBB19_1
738; CHECK-NEXT:  # %bb.2: # %if.then
739; CHECK-NEXT:    xorl %eax, %eax
740; CHECK-NEXT:    jmp foo # TAILCALL
741; CHECK-NEXT:  .LBB19_1: # %if.end
742; CHECK-NEXT:    retq
743;
744; NDD-LABEL: ctest32mi_zf:
745; NDD:       # %bb.0: # %entry
746; NDD-NEXT:    testl %edi, %edi
747; NDD-NEXT:    ctestnew {dfv=zf} $12345, (%rsi) # imm = 0x3039
748; NDD-NEXT:    jne .LBB19_1
749; NDD-NEXT:  # %bb.2: # %if.then
750; NDD-NEXT:    xorl %eax, %eax
751; NDD-NEXT:    jmp foo # TAILCALL
752; NDD-NEXT:  .LBB19_1: # %if.end
753; NDD-NEXT:    retq
754entry:
755  %b = load i32, ptr %ptr
756  %cmp = icmp eq i32 %a, 0
757  %and = and i32 %b, 12345
758  %cmp1 = icmp eq i32 %and, 0
759  %or.cond = or i1 %cmp, %cmp1
760  br i1 %or.cond, label %if.then, label %if.end
761
762if.then:                                          ; preds = %entry
763  tail call void (...) @foo()
764  br label %if.end
765
766if.end:                                           ; preds = %entry, %if.then
767  ret void
768}
769
770define void @ctest64mi32_zf(i64 noundef %a, ptr %ptr) {
771; CHECK-LABEL: ctest64mi32_zf:
772; CHECK:       # %bb.0: # %entry
773; CHECK-NEXT:    testq %rdi, %rdi
774; CHECK-NEXT:    ctestnel {dfv=zf} $123456, (%rsi) # imm = 0x1E240
775; CHECK-NEXT:    jne .LBB20_1
776; CHECK-NEXT:  # %bb.2: # %if.then
777; CHECK-NEXT:    xorl %eax, %eax
778; CHECK-NEXT:    jmp foo # TAILCALL
779; CHECK-NEXT:  .LBB20_1: # %if.end
780; CHECK-NEXT:    retq
781;
782; NDD-LABEL: ctest64mi32_zf:
783; NDD:       # %bb.0: # %entry
784; NDD-NEXT:    testq %rdi, %rdi
785; NDD-NEXT:    ctestnel {dfv=zf} $123456, (%rsi) # imm = 0x1E240
786; NDD-NEXT:    jne .LBB20_1
787; NDD-NEXT:  # %bb.2: # %if.then
788; NDD-NEXT:    xorl %eax, %eax
789; NDD-NEXT:    jmp foo # TAILCALL
790; NDD-NEXT:  .LBB20_1: # %if.end
791; NDD-NEXT:    retq
792entry:
793  %b = load i64, ptr %ptr
794  %cmp = icmp eq i64 %a, 0
795  %and = and i64 %b, 123456
796  %cmp1 = icmp eq i64 %and, 0
797  %or.cond = or i1 %cmp, %cmp1
798  br i1 %or.cond, label %if.then, label %if.end
799
800if.then:                                          ; preds = %entry
801  tail call void (...) @foo()
802  br label %if.end
803
804if.end:                                           ; preds = %entry, %if.then
805  ret void
806}
807
808define void @ctest_continous(i32 noundef %a, i32 noundef %b, i32 noundef %c) {
809; CHECK-LABEL: ctest_continous:
810; CHECK:       # %bb.0: # %entry
811; CHECK-NEXT:    cmpl %esi, %edi
812; CHECK-NEXT:    ctestll {dfv=} %esi, %esi
813; CHECK-NEXT:    ctestnsl {dfv=sf} %edx, %edx
814; CHECK-NEXT:    jns .LBB21_1
815; CHECK-NEXT:  # %bb.2: # %if.then
816; CHECK-NEXT:    xorl %eax, %eax
817; CHECK-NEXT:    jmp foo # TAILCALL
818; CHECK-NEXT:  .LBB21_1: # %if.end
819; CHECK-NEXT:    retq
820;
821; NDD-LABEL: ctest_continous:
822; NDD:       # %bb.0: # %entry
823; NDD-NEXT:    cmpl %esi, %edi
824; NDD-NEXT:    ctestll {dfv=} %esi, %esi
825; NDD-NEXT:    ctestnsl {dfv=sf} %edx, %edx
826; NDD-NEXT:    jns .LBB21_1
827; NDD-NEXT:  # %bb.2: # %if.then
828; NDD-NEXT:    xorl %eax, %eax
829; NDD-NEXT:    jmp foo # TAILCALL
830; NDD-NEXT:  .LBB21_1: # %if.end
831; NDD-NEXT:    retq
832entry:
833  %cmp = icmp slt i32 %a, %b
834  %cmp1 = icmp slt i32 %b, 0
835  %or.cond = and i1 %cmp, %cmp1
836  %cmp2 = icmp slt i32 %c, 0
837  %or.cond3 = or i1 %or.cond, %cmp2
838  br i1 %or.cond3, label %if.then, label %if.end
839
840if.then:                                          ; preds = %entry
841  tail call void (...) @foo()
842  br label %if.end
843
844if.end:                                           ; preds = %if.then, %entry
845  ret void
846}
847
848define i32 @ctest_nobranch(i32 noundef %a, i32 noundef %b) {
849; CHECK-LABEL: ctest_nobranch:
850; CHECK:       # %bb.0: # %entry
851; CHECK-NEXT:    testl %edi, %edi
852; CHECK-NEXT:    ctestlel {dfv=} %esi, %esi
853; CHECK-NEXT:    setg %al
854; CHECK-NEXT:    movzbl %al, %eax
855; CHECK-NEXT:    retq
856;
857; NDD-LABEL: ctest_nobranch:
858; NDD:       # %bb.0: # %entry
859; NDD-NEXT:    testl %edi, %edi
860; NDD-NEXT:    ctestlel {dfv=} %esi, %esi
861; NDD-NEXT:    setg %al
862; NDD-NEXT:    movzbl %al, %eax
863; NDD-NEXT:    retq
864entry:
865  %cmp = icmp sgt i32 %a, 0
866  %cmp1 = icmp sgt i32 %b, 0
867  %or.cond.not = or i1 %cmp, %cmp1
868  %. = zext i1 %or.cond.not to i32
869  ret i32 %.
870}
871
872define i32 @ctest_continous_nobranch(i32 noundef %a, i32 noundef %b, i32 noundef %c) {
873; CHECK-LABEL: ctest_continous_nobranch:
874; CHECK:       # %bb.0: # %entry
875; CHECK-NEXT:    testl %edi, %edi
876; CHECK-NEXT:    ctestlel {dfv=sf} %esi, %esi
877; CHECK-NEXT:    ctestsl {dfv=zf} %edx, %edx
878; CHECK-NEXT:    setg %al
879; CHECK-NEXT:    movzbl %al, %eax
880; CHECK-NEXT:    retq
881;
882; NDD-LABEL: ctest_continous_nobranch:
883; NDD:       # %bb.0: # %entry
884; NDD-NEXT:    testl %edi, %edi
885; NDD-NEXT:    ctestlel {dfv=sf} %esi, %esi
886; NDD-NEXT:    ctestsl {dfv=zf} %edx, %edx
887; NDD-NEXT:    setg %al
888; NDD-NEXT:    movzbl %al, %eax
889; NDD-NEXT:    retq
890entry:
891  %cmp = icmp sgt i32 %a, 0
892  %cmp1 = icmp slt i32 %b, 0
893  %cmp2 = icmp sgt i32 %c, 0
894  %or1 = or i1 %cmp, %cmp1
895  %or2 =  and i1 %or1, %cmp2
896  %. = zext i1 %or2 to i32
897  ret i32 %.
898}
899
900define void @ctest64ri64(i64 noundef %a, i64 noundef %b) {
901; CHECK-LABEL: ctest64ri64:
902; CHECK:       # %bb.0: # %entry
903; CHECK-NEXT:    testq %rdi, %rdi
904; CHECK-NEXT:    movabsq $9992147483647, %rax # imm = 0x9167A66BBFF
905; CHECK-NEXT:    ctestneq {dfv=zf} %rax, %rsi
906; CHECK-NEXT:    jne .LBB24_1
907; CHECK-NEXT:  # %bb.2: # %if.then
908; CHECK-NEXT:    xorl %eax, %eax
909; CHECK-NEXT:    jmp foo # TAILCALL
910; CHECK-NEXT:  .LBB24_1: # %if.end
911; CHECK-NEXT:    retq
912;
913; NDD-LABEL: ctest64ri64:
914; NDD:       # %bb.0: # %entry
915; NDD-NEXT:    testq %rdi, %rdi
916; NDD-NEXT:    movabsq $9992147483647, %rax # imm = 0x9167A66BBFF
917; NDD-NEXT:    ctestneq {dfv=zf} %rax, %rsi
918; NDD-NEXT:    jne .LBB24_1
919; NDD-NEXT:  # %bb.2: # %if.then
920; NDD-NEXT:    xorl %eax, %eax
921; NDD-NEXT:    jmp foo # TAILCALL
922; NDD-NEXT:  .LBB24_1: # %if.end
923; NDD-NEXT:    retq
924entry:
925  %cmp = icmp eq i64 %a, 0
926  %and = and i64 %b, 9992147483647
927  %cmp1 = icmp eq i64 %and, 0
928  %or.cond = or i1 %cmp, %cmp1
929  br i1 %or.cond, label %if.then, label %if.end
930
931if.then:                                          ; preds = %entry
932  tail call void (...) @foo()
933  br label %if.end
934
935if.end:                                           ; preds = %entry, %if.then
936  ret void
937}
938
939declare dso_local void @foo(...)
940