xref: /llvm-project/llvm/test/CodeGen/X86/apx/ccmp.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 -show-mc-encoding -verify-machineinstrs | FileCheck %s
3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ccmp,+ndd -show-mc-encoding -verify-machineinstrs | FileCheck %s --check-prefix=NDD
4
5define void @ccmp8rr_zf(i8 noundef %a, i8 noundef %b, i8 noundef %c) {
6; CHECK-LABEL: ccmp8rr_zf:
7; CHECK:       # %bb.0: # %entry
8; CHECK-NEXT:    cmpb %dl, %dil # encoding: [0x40,0x38,0xd7]
9; CHECK-NEXT:    ccmpneb {dfv=zf} %dl, %sil # encoding: [0x62,0xf4,0x14,0x05,0x38,0xd6]
10; CHECK-NEXT:    jne .LBB0_1 # encoding: [0x75,A]
11; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB0_1-1, kind: FK_PCRel_1
12; CHECK-NEXT:  # %bb.2: # %if.then
13; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
14; CHECK-NEXT:    jmp foo # TAILCALL
15; CHECK-NEXT:    # encoding: [0xeb,A]
16; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
17; CHECK-NEXT:  .LBB0_1: # %if.end
18; CHECK-NEXT:    retq # encoding: [0xc3]
19;
20; NDD-LABEL: ccmp8rr_zf:
21; NDD:       # %bb.0: # %entry
22; NDD-NEXT:    cmpb %dl, %dil # encoding: [0x40,0x38,0xd7]
23; NDD-NEXT:    ccmpneb {dfv=zf} %dl, %sil # encoding: [0x62,0xf4,0x14,0x05,0x38,0xd6]
24; NDD-NEXT:    jne .LBB0_1 # encoding: [0x75,A]
25; NDD-NEXT:    # fixup A - offset: 1, value: .LBB0_1-1, kind: FK_PCRel_1
26; NDD-NEXT:  # %bb.2: # %if.then
27; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
28; NDD-NEXT:    jmp foo # TAILCALL
29; NDD-NEXT:    # encoding: [0xeb,A]
30; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
31; NDD-NEXT:  .LBB0_1: # %if.end
32; NDD-NEXT:    retq # encoding: [0xc3]
33entry:
34  %cmp = icmp eq i8 %a, %c
35  %cmp1 = icmp eq i8 %b, %c
36  %or.cond = or i1 %cmp, %cmp1
37  br i1 %or.cond, label %if.then, label %if.end
38
39if.then:                                          ; preds = %entry
40  tail call void (...) @foo()
41  br label %if.end
42
43if.end:                                           ; preds = %entry, %if.then
44  ret void
45}
46
47define void @ccmp8rr_cf(i8 noundef %a, i8 noundef %b) {
48; CHECK-LABEL: ccmp8rr_cf:
49; CHECK:       # %bb.0: # %entry
50; CHECK-NEXT:    cmpb $2, %dil # encoding: [0x40,0x80,0xff,0x02]
51; CHECK-NEXT:    ccmpgeb {dfv=cf} $2, %sil # encoding: [0x62,0xf4,0x0c,0x0d,0x80,0xfe,0x02]
52; CHECK-NEXT:    jb .LBB1_1 # encoding: [0x72,A]
53; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB1_1-1, kind: FK_PCRel_1
54; CHECK-NEXT:  # %bb.2: # %if.then
55; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
56; CHECK-NEXT:    jmp foo # TAILCALL
57; CHECK-NEXT:    # encoding: [0xeb,A]
58; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
59; CHECK-NEXT:  .LBB1_1: # %if.end
60; CHECK-NEXT:    retq # encoding: [0xc3]
61;
62; NDD-LABEL: ccmp8rr_cf:
63; NDD:       # %bb.0: # %entry
64; NDD-NEXT:    cmpb $2, %dil # encoding: [0x40,0x80,0xff,0x02]
65; NDD-NEXT:    ccmpgeb {dfv=cf} $2, %sil # encoding: [0x62,0xf4,0x0c,0x0d,0x80,0xfe,0x02]
66; NDD-NEXT:    jb .LBB1_1 # encoding: [0x72,A]
67; NDD-NEXT:    # fixup A - offset: 1, value: .LBB1_1-1, kind: FK_PCRel_1
68; NDD-NEXT:  # %bb.2: # %if.then
69; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
70; NDD-NEXT:    jmp foo # TAILCALL
71; NDD-NEXT:    # encoding: [0xeb,A]
72; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
73; NDD-NEXT:  .LBB1_1: # %if.end
74; NDD-NEXT:    retq # encoding: [0xc3]
75entry:
76  %cmp = icmp sgt i8 %a, 1
77  %tobool = icmp ugt i8 %b, 1
78  %or.cond = and i1 %cmp, %tobool
79  br i1 %or.cond, label %if.then, label %if.end
80
81if.then:                                          ; preds = %entry
82  tail call void (...) @foo()
83  br label %if.end
84
85if.end:                                           ; preds = %if.then, %entry
86  ret void
87}
88
89define i8 @ccmp8rr_sf(i8 %a, i8 %b, i8* nocapture %c)  {
90; CHECK-LABEL: ccmp8rr_sf:
91; CHECK:       # %bb.0: # %entry
92; CHECK-NEXT:    testb %dil, %dil # encoding: [0x40,0x84,0xff]
93; CHECK-NEXT:    ccmpneb {dfv=sf} $2, %sil # encoding: [0x62,0xf4,0x24,0x05,0x80,0xfe,0x02]
94; CHECK-NEXT:    jl .LBB2_2 # encoding: [0x7c,A]
95; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB2_2-1, kind: FK_PCRel_1
96; CHECK-NEXT:  # %bb.1: # %if.then
97; CHECK-NEXT:    movb %dil, (%rdx) # encoding: [0x40,0x88,0x3a]
98; CHECK-NEXT:  .LBB2_2: # %if.end
99; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
100; CHECK-NEXT:    retq # encoding: [0xc3]
101;
102; NDD-LABEL: ccmp8rr_sf:
103; NDD:       # %bb.0: # %entry
104; NDD-NEXT:    testb %dil, %dil # encoding: [0x40,0x84,0xff]
105; NDD-NEXT:    ccmpneb {dfv=sf} $2, %sil # encoding: [0x62,0xf4,0x24,0x05,0x80,0xfe,0x02]
106; NDD-NEXT:    jl .LBB2_2 # encoding: [0x7c,A]
107; NDD-NEXT:    # fixup A - offset: 1, value: .LBB2_2-1, kind: FK_PCRel_1
108; NDD-NEXT:  # %bb.1: # %if.then
109; NDD-NEXT:    movb %dil, (%rdx) # encoding: [0x40,0x88,0x3a]
110; NDD-NEXT:  .LBB2_2: # %if.end
111; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
112; NDD-NEXT:    retq # encoding: [0xc3]
113entry:
114  %tobool = icmp ne i8 %a, 0
115  %cmp = icmp sgt i8 %b, 1
116  %or.cond = select i1 %tobool, i1 %cmp, i1 false
117  br i1 %or.cond, label %if.then, label %if.end
118
119if.then:
120  store i8 %a, i8* %c, align 4
121  br label %if.end
122
123if.end:
124  ret i8 0
125}
126
127define i8 @ccmp8rr_none(i8 %a, i8 %b, i8* nocapture %c)  {
128; CHECK-LABEL: ccmp8rr_none:
129; CHECK:       # %bb.0: # %entry
130; CHECK-NEXT:    testb %dil, %dil # encoding: [0x40,0x84,0xff]
131; CHECK-NEXT:    ccmpeb {dfv=} $2, %sil # encoding: [0x62,0xf4,0x04,0x04,0x80,0xfe,0x02]
132; CHECK-NEXT:    jl .LBB3_2 # encoding: [0x7c,A]
133; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB3_2-1, kind: FK_PCRel_1
134; CHECK-NEXT:  # %bb.1: # %if.then
135; CHECK-NEXT:    movb %dil, (%rdx) # encoding: [0x40,0x88,0x3a]
136; CHECK-NEXT:  .LBB3_2: # %if.end
137; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
138; CHECK-NEXT:    retq # encoding: [0xc3]
139;
140; NDD-LABEL: ccmp8rr_none:
141; NDD:       # %bb.0: # %entry
142; NDD-NEXT:    testb %dil, %dil # encoding: [0x40,0x84,0xff]
143; NDD-NEXT:    ccmpeb {dfv=} $2, %sil # encoding: [0x62,0xf4,0x04,0x04,0x80,0xfe,0x02]
144; NDD-NEXT:    jl .LBB3_2 # encoding: [0x7c,A]
145; NDD-NEXT:    # fixup A - offset: 1, value: .LBB3_2-1, kind: FK_PCRel_1
146; NDD-NEXT:  # %bb.1: # %if.then
147; NDD-NEXT:    movb %dil, (%rdx) # encoding: [0x40,0x88,0x3a]
148; NDD-NEXT:  .LBB3_2: # %if.end
149; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
150; NDD-NEXT:    retq # encoding: [0xc3]
151entry:
152  %tobool = icmp ne i8 %a, 0
153  %cmp = icmp sgt i8 %b, 1
154  %or.cond = select i1 %tobool, i1 true, i1 %cmp
155  br i1 %or.cond, label %if.then, label %if.end
156
157if.then:
158  store i8 %a, i8* %c, align 4
159  br label %if.end
160
161if.end:
162  ret i8 0
163}
164
165define void @ccmp16rr_sf(i16 noundef %a, i16 noundef %b, i16 noundef %c) {
166; CHECK-LABEL: ccmp16rr_sf:
167; CHECK:       # %bb.0: # %entry
168; CHECK-NEXT:    cmpw %dx, %di # encoding: [0x66,0x39,0xd7]
169; CHECK-NEXT:    ccmplew {dfv=sf} %dx, %si # encoding: [0x62,0xf4,0x25,0x0e,0x39,0xd6]
170; CHECK-NEXT:    jge .LBB4_1 # encoding: [0x7d,A]
171; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB4_1-1, kind: FK_PCRel_1
172; CHECK-NEXT:  # %bb.2: # %if.then
173; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
174; CHECK-NEXT:    jmp foo # TAILCALL
175; CHECK-NEXT:    # encoding: [0xeb,A]
176; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
177; CHECK-NEXT:  .LBB4_1: # %if.end
178; CHECK-NEXT:    retq # encoding: [0xc3]
179;
180; NDD-LABEL: ccmp16rr_sf:
181; NDD:       # %bb.0: # %entry
182; NDD-NEXT:    cmpw %dx, %di # encoding: [0x66,0x39,0xd7]
183; NDD-NEXT:    ccmplew {dfv=sf} %dx, %si # encoding: [0x62,0xf4,0x25,0x0e,0x39,0xd6]
184; NDD-NEXT:    jge .LBB4_1 # encoding: [0x7d,A]
185; NDD-NEXT:    # fixup A - offset: 1, value: .LBB4_1-1, kind: FK_PCRel_1
186; NDD-NEXT:  # %bb.2: # %if.then
187; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
188; NDD-NEXT:    jmp foo # TAILCALL
189; NDD-NEXT:    # encoding: [0xeb,A]
190; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
191; NDD-NEXT:  .LBB4_1: # %if.end
192; NDD-NEXT:    retq # encoding: [0xc3]
193entry:
194  %cmp = icmp sgt i16 %a, %c
195  %cmp1 = icmp slt i16 %b, %c
196  %or.cond = or i1 %cmp, %cmp1
197  br i1 %or.cond, label %if.then, label %if.end
198
199if.then:                                          ; preds = %entry
200  tail call void (...) @foo()
201  br label %if.end
202
203if.end:                                           ; preds = %entry, %if.then
204  ret void
205}
206
207define void @ccmp32rr_cf(i32 noundef %a, i32 noundef %b, i32 noundef %c) {
208; CHECK-LABEL: ccmp32rr_cf:
209; CHECK:       # %bb.0: # %entry
210; CHECK-NEXT:    cmpl %edx, %edi # encoding: [0x39,0xd7]
211; CHECK-NEXT:    ccmpbl {dfv=cf} %edx, %esi # encoding: [0x62,0xf4,0x0c,0x02,0x39,0xd6]
212; CHECK-NEXT:    ja .LBB5_1 # encoding: [0x77,A]
213; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB5_1-1, kind: FK_PCRel_1
214; CHECK-NEXT:  # %bb.2: # %if.then
215; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
216; CHECK-NEXT:    jmp foo # TAILCALL
217; CHECK-NEXT:    # encoding: [0xeb,A]
218; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
219; CHECK-NEXT:  .LBB5_1: # %if.end
220; CHECK-NEXT:    retq # encoding: [0xc3]
221;
222; NDD-LABEL: ccmp32rr_cf:
223; NDD:       # %bb.0: # %entry
224; NDD-NEXT:    cmpl %edx, %edi # encoding: [0x39,0xd7]
225; NDD-NEXT:    ccmpbl {dfv=cf} %edx, %esi # encoding: [0x62,0xf4,0x0c,0x02,0x39,0xd6]
226; NDD-NEXT:    ja .LBB5_1 # encoding: [0x77,A]
227; NDD-NEXT:    # fixup A - offset: 1, value: .LBB5_1-1, kind: FK_PCRel_1
228; NDD-NEXT:  # %bb.2: # %if.then
229; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
230; NDD-NEXT:    jmp foo # TAILCALL
231; NDD-NEXT:    # encoding: [0xeb,A]
232; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
233; NDD-NEXT:  .LBB5_1: # %if.end
234; NDD-NEXT:    retq # encoding: [0xc3]
235entry:
236  %cmp = icmp uge i32 %a, %c
237  %cmp1 = icmp ule i32 %b, %c
238  %or.cond = or i1 %cmp, %cmp1
239  br i1 %or.cond, label %if.then, label %if.end
240
241if.then:                                          ; preds = %entry
242  tail call void (...) @foo()
243  br label %if.end
244
245if.end:                                           ; preds = %entry, %if.then
246  ret void
247}
248
249define void @ccmp64rr_of(i64 %a, i64 %b, i64 %c) {
250; CHECK-LABEL: ccmp64rr_of:
251; CHECK:       # %bb.0: # %bb
252; CHECK-NEXT:    cmpq %rdx, %rdi # encoding: [0x48,0x39,0xd7]
253; CHECK-NEXT:    ccmpbq {dfv=of} %rsi, %rdi # encoding: [0x62,0xf4,0xc4,0x02,0x39,0xf7]
254; CHECK-NEXT:    jno .LBB6_1 # encoding: [0x71,A]
255; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB6_1-1, kind: FK_PCRel_1
256; CHECK-NEXT:  # %bb.2: # %if.then
257; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
258; CHECK-NEXT:    jmp foo # TAILCALL
259; CHECK-NEXT:    # encoding: [0xeb,A]
260; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
261; CHECK-NEXT:  .LBB6_1: # %if.end
262; CHECK-NEXT:    retq # encoding: [0xc3]
263;
264; NDD-LABEL: ccmp64rr_of:
265; NDD:       # %bb.0: # %bb
266; NDD-NEXT:    cmpq %rdx, %rdi # encoding: [0x48,0x39,0xd7]
267; NDD-NEXT:    ccmpbq {dfv=of} %rsi, %rdi # encoding: [0x62,0xf4,0xc4,0x02,0x39,0xf7]
268; NDD-NEXT:    jno .LBB6_1 # encoding: [0x71,A]
269; NDD-NEXT:    # fixup A - offset: 1, value: .LBB6_1-1, kind: FK_PCRel_1
270; NDD-NEXT:  # %bb.2: # %if.then
271; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
272; NDD-NEXT:    jmp foo # TAILCALL
273; NDD-NEXT:    # encoding: [0xeb,A]
274; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
275; NDD-NEXT:  .LBB6_1: # %if.end
276; NDD-NEXT:    retq # encoding: [0xc3]
277bb:
278  %cmp = icmp uge i64 %a, %c
279  %smul = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %a, i64 %b)
280  %obit = extractvalue {i64, i1} %smul, 1
281  %or.cond = or i1 %cmp, %obit
282  br i1 %or.cond, label %if.then, label %if.end
283
284if.then:                                          ; preds = %entry
285  tail call void (...) @foo()
286  br label %if.end
287
288if.end:                                           ; preds = %entry, %if.then
289  ret void
290}
291
292define void @ccmp64rr_of_crossbb(i64 %a, i64 %b) {
293; CHECK-LABEL: ccmp64rr_of_crossbb:
294; CHECK:       # %bb.0: # %bb
295; CHECK-NEXT:    testq %rdi, %rdi # encoding: [0x48,0x85,0xff]
296; CHECK-NEXT:    je .LBB7_2 # encoding: [0x74,A]
297; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB7_2-1, kind: FK_PCRel_1
298; CHECK-NEXT:  # %bb.1: # %bb1
299; CHECK-NEXT:    cmpq %rsi, %rdi # encoding: [0x48,0x39,0xf7]
300; CHECK-NEXT:  .LBB7_2: # %bb3
301; CHECK-NEXT:    retq # encoding: [0xc3]
302;
303; NDD-LABEL: ccmp64rr_of_crossbb:
304; NDD:       # %bb.0: # %bb
305; NDD-NEXT:    testq %rdi, %rdi # encoding: [0x48,0x85,0xff]
306; NDD-NEXT:    je .LBB7_2 # encoding: [0x74,A]
307; NDD-NEXT:    # fixup A - offset: 1, value: .LBB7_2-1, kind: FK_PCRel_1
308; NDD-NEXT:  # %bb.1: # %bb1
309; NDD-NEXT:    cmpq %rsi, %rdi # encoding: [0x48,0x39,0xf7]
310; NDD-NEXT:  .LBB7_2: # %bb3
311; NDD-NEXT:    retq # encoding: [0xc3]
312bb:
313  %cond1 = icmp eq i64 %a, 0
314  br i1 %cond1, label %bb3, label %bb1
315
316bb1:                                              ; preds = %bb
317  %smul = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %a, i64 %b)
318  %obit = extractvalue {i64, i1} %smul, 1
319  br i1 %obit, label %bb3, label %bb2
320
321bb2:                                              ; preds = %bb1
322  %tmp = ptrtoint ptr null to i64
323  br label %bb3
324
325bb3:                                              ; preds = %bb2, %bb1, %bb
326  ret void
327}
328
329define void @ccmp8ri_zf(i8 noundef %a, i8 noundef %b, i8 noundef %c) {
330; CHECK-LABEL: ccmp8ri_zf:
331; CHECK:       # %bb.0: # %entry
332; CHECK-NEXT:    cmpb %dl, %dil # encoding: [0x40,0x38,0xd7]
333; CHECK-NEXT:    ccmpleb {dfv=zf} $123, %sil # encoding: [0x62,0xf4,0x14,0x0e,0x80,0xfe,0x7b]
334; CHECK-NEXT:    jne .LBB8_1 # encoding: [0x75,A]
335; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB8_1-1, kind: FK_PCRel_1
336; CHECK-NEXT:  # %bb.2: # %if.then
337; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
338; CHECK-NEXT:    jmp foo # TAILCALL
339; CHECK-NEXT:    # encoding: [0xeb,A]
340; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
341; CHECK-NEXT:  .LBB8_1: # %if.end
342; CHECK-NEXT:    retq # encoding: [0xc3]
343;
344; NDD-LABEL: ccmp8ri_zf:
345; NDD:       # %bb.0: # %entry
346; NDD-NEXT:    cmpb %dl, %dil # encoding: [0x40,0x38,0xd7]
347; NDD-NEXT:    ccmpleb {dfv=zf} $123, %sil # encoding: [0x62,0xf4,0x14,0x0e,0x80,0xfe,0x7b]
348; NDD-NEXT:    jne .LBB8_1 # encoding: [0x75,A]
349; NDD-NEXT:    # fixup A - offset: 1, value: .LBB8_1-1, kind: FK_PCRel_1
350; NDD-NEXT:  # %bb.2: # %if.then
351; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
352; NDD-NEXT:    jmp foo # TAILCALL
353; NDD-NEXT:    # encoding: [0xeb,A]
354; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
355; NDD-NEXT:  .LBB8_1: # %if.end
356; NDD-NEXT:    retq # encoding: [0xc3]
357entry:
358  %cmp = icmp sgt i8 %a, %c
359  %cmp1 = icmp eq i8 %b, 123
360  %or.cond = or i1 %cmp, %cmp1
361  br i1 %or.cond, label %if.then, label %if.end
362
363if.then:                                          ; preds = %entry
364  tail call void (...) @foo()
365  br label %if.end
366
367if.end:                                           ; preds = %entry, %if.then
368  ret void
369}
370
371define i8 @ccmp8ri_zf_double(i8 %a, double %b, i8* nocapture %c)  {
372; CHECK-LABEL: ccmp8ri_zf_double:
373; CHECK:       # %bb.0: # %entry
374; CHECK-NEXT:    xorpd %xmm1, %xmm1 # encoding: [0x66,0x0f,0x57,0xc9]
375; CHECK-NEXT:    ucomisd %xmm1, %xmm0 # encoding: [0x66,0x0f,0x2e,0xc1]
376; CHECK-NEXT:    ccmpeb {dfv=zf} $123, %dil # encoding: [0x62,0xf4,0x14,0x04,0x80,0xff,0x7b]
377; CHECK-NEXT:    je .LBB9_2 # encoding: [0x74,A]
378; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB9_2-1, kind: FK_PCRel_1
379; CHECK-NEXT:  # %bb.1: # %if.then
380; CHECK-NEXT:    movb %dil, (%rsi) # encoding: [0x40,0x88,0x3e]
381; CHECK-NEXT:  .LBB9_2: # %if.end
382; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
383; CHECK-NEXT:    retq # encoding: [0xc3]
384;
385; NDD-LABEL: ccmp8ri_zf_double:
386; NDD:       # %bb.0: # %entry
387; NDD-NEXT:    xorpd %xmm1, %xmm1 # encoding: [0x66,0x0f,0x57,0xc9]
388; NDD-NEXT:    ucomisd %xmm1, %xmm0 # encoding: [0x66,0x0f,0x2e,0xc1]
389; NDD-NEXT:    ccmpeb {dfv=zf} $123, %dil # encoding: [0x62,0xf4,0x14,0x04,0x80,0xff,0x7b]
390; NDD-NEXT:    je .LBB9_2 # encoding: [0x74,A]
391; NDD-NEXT:    # fixup A - offset: 1, value: .LBB9_2-1, kind: FK_PCRel_1
392; NDD-NEXT:  # %bb.1: # %if.then
393; NDD-NEXT:    movb %dil, (%rsi) # encoding: [0x40,0x88,0x3e]
394; NDD-NEXT:  .LBB9_2: # %if.end
395; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
396; NDD-NEXT:    retq # encoding: [0xc3]
397entry:
398  %tobool = icmp ne i8 %a, 123
399  %cmp = fcmp ueq double %b, 0.0
400  %or.cond = select i1 %tobool, i1 %cmp, i1 false
401  br i1 %or.cond, label %if.then, label %if.end
402
403if.then:
404  store i8 %a, i8* %c, align 4
405  br label %if.end
406
407if.end:
408  ret i8 0
409}
410
411define i8 @ccmp8ri_zf_double_p(i8 %a, double %b, i8* nocapture %c)  {
412; CHECK-LABEL: ccmp8ri_zf_double_p:
413; CHECK:       # %bb.0: # %entry
414; CHECK-NEXT:    cmpb $123, %dil # encoding: [0x40,0x80,0xff,0x7b]
415; CHECK-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]
416; CHECK-NEXT:    ucomisd %xmm0, %xmm0 # encoding: [0x66,0x0f,0x2e,0xc0]
417; CHECK-NEXT:    setp %cl # encoding: [0x0f,0x9a,0xc1]
418; CHECK-NEXT:    andb %al, %cl # encoding: [0x20,0xc1]
419; CHECK-NEXT:    cmpb $1, %cl # encoding: [0x80,0xf9,0x01]
420; CHECK-NEXT:    jne .LBB10_2 # encoding: [0x75,A]
421; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB10_2-1, kind: FK_PCRel_1
422; CHECK-NEXT:  # %bb.1: # %if.then
423; CHECK-NEXT:    movb %dil, (%rsi) # encoding: [0x40,0x88,0x3e]
424; CHECK-NEXT:  .LBB10_2: # %if.end
425; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
426; CHECK-NEXT:    retq # encoding: [0xc3]
427;
428; NDD-LABEL: ccmp8ri_zf_double_p:
429; NDD:       # %bb.0: # %entry
430; NDD-NEXT:    cmpb $123, %dil # encoding: [0x40,0x80,0xff,0x7b]
431; NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]
432; NDD-NEXT:    ucomisd %xmm0, %xmm0 # encoding: [0x66,0x0f,0x2e,0xc0]
433; NDD-NEXT:    setp %cl # encoding: [0x0f,0x9a,0xc1]
434; NDD-NEXT:    andb %cl, %al # EVEX TO LEGACY Compression encoding: [0x20,0xc8]
435; NDD-NEXT:    cmpb $1, %al # encoding: [0x3c,0x01]
436; NDD-NEXT:    jne .LBB10_2 # encoding: [0x75,A]
437; NDD-NEXT:    # fixup A - offset: 1, value: .LBB10_2-1, kind: FK_PCRel_1
438; NDD-NEXT:  # %bb.1: # %if.then
439; NDD-NEXT:    movb %dil, (%rsi) # encoding: [0x40,0x88,0x3e]
440; NDD-NEXT:  .LBB10_2: # %if.end
441; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
442; NDD-NEXT:    retq # encoding: [0xc3]
443entry:
444  %tobool = icmp ne i8 %a, 123
445  %cmp = fcmp uno double %b, 0.0
446  %or.cond = select i1 %tobool, i1 %cmp, i1 false
447  br i1 %or.cond, label %if.then, label %if.end
448
449if.then:
450  store i8 %a, i8* %c, align 4
451  br label %if.end
452
453if.end:
454  ret i8 0
455}
456
457define i8 @ccmp8ri_zf_double_np(i8 %a, double %b, i8* nocapture %c)  {
458; CHECK-LABEL: ccmp8ri_zf_double_np:
459; CHECK:       # %bb.0: # %entry
460; CHECK-NEXT:    cmpb $123, %dil # encoding: [0x40,0x80,0xff,0x7b]
461; CHECK-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]
462; CHECK-NEXT:    ucomisd %xmm0, %xmm0 # encoding: [0x66,0x0f,0x2e,0xc0]
463; CHECK-NEXT:    setnp %cl # encoding: [0x0f,0x9b,0xc1]
464; CHECK-NEXT:    andb %al, %cl # encoding: [0x20,0xc1]
465; CHECK-NEXT:    cmpb $1, %cl # encoding: [0x80,0xf9,0x01]
466; CHECK-NEXT:    jne .LBB11_2 # encoding: [0x75,A]
467; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB11_2-1, kind: FK_PCRel_1
468; CHECK-NEXT:  # %bb.1: # %if.then
469; CHECK-NEXT:    movb %dil, (%rsi) # encoding: [0x40,0x88,0x3e]
470; CHECK-NEXT:  .LBB11_2: # %if.end
471; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
472; CHECK-NEXT:    retq # encoding: [0xc3]
473;
474; NDD-LABEL: ccmp8ri_zf_double_np:
475; NDD:       # %bb.0: # %entry
476; NDD-NEXT:    cmpb $123, %dil # encoding: [0x40,0x80,0xff,0x7b]
477; NDD-NEXT:    setne %al # encoding: [0x0f,0x95,0xc0]
478; NDD-NEXT:    ucomisd %xmm0, %xmm0 # encoding: [0x66,0x0f,0x2e,0xc0]
479; NDD-NEXT:    setnp %cl # encoding: [0x0f,0x9b,0xc1]
480; NDD-NEXT:    andb %cl, %al # EVEX TO LEGACY Compression encoding: [0x20,0xc8]
481; NDD-NEXT:    cmpb $1, %al # encoding: [0x3c,0x01]
482; NDD-NEXT:    jne .LBB11_2 # encoding: [0x75,A]
483; NDD-NEXT:    # fixup A - offset: 1, value: .LBB11_2-1, kind: FK_PCRel_1
484; NDD-NEXT:  # %bb.1: # %if.then
485; NDD-NEXT:    movb %dil, (%rsi) # encoding: [0x40,0x88,0x3e]
486; NDD-NEXT:  .LBB11_2: # %if.end
487; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
488; NDD-NEXT:    retq # encoding: [0xc3]
489entry:
490  %tobool = icmp ne i8 %a, 123
491  %cmp = fcmp ord double %b, 0.0
492  %or.cond = select i1 %tobool, i1 %cmp, i1 false
493  br i1 %or.cond, label %if.then, label %if.end
494
495if.then:
496  store i8 %a, i8* %c, align 4
497  br label %if.end
498
499if.end:
500  ret i8 0
501}
502
503define void @ccmp16ri_zf(i16 noundef %a, i16 noundef %b, i16 noundef %c) {
504; CHECK-LABEL: ccmp16ri_zf:
505; CHECK:       # %bb.0: # %entry
506; CHECK-NEXT:    cmpw %dx, %di # encoding: [0x66,0x39,0xd7]
507; CHECK-NEXT:    movswl %si, %eax # encoding: [0x0f,0xbf,0xc6]
508; CHECK-NEXT:    ccmpael {dfv=sf} $1234, %eax # encoding: [0x62,0xf4,0x24,0x03,0x81,0xf8,0xd2,0x04,0x00,0x00]
509; CHECK-NEXT:    # imm = 0x4D2
510; CHECK-NEXT:    jge .LBB12_1 # encoding: [0x7d,A]
511; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB12_1-1, kind: FK_PCRel_1
512; CHECK-NEXT:  # %bb.2: # %if.then
513; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
514; CHECK-NEXT:    jmp foo # TAILCALL
515; CHECK-NEXT:    # encoding: [0xeb,A]
516; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
517; CHECK-NEXT:  .LBB12_1: # %if.end
518; CHECK-NEXT:    retq # encoding: [0xc3]
519;
520; NDD-LABEL: ccmp16ri_zf:
521; NDD:       # %bb.0: # %entry
522; NDD-NEXT:    cmpw %dx, %di # encoding: [0x66,0x39,0xd7]
523; NDD-NEXT:    movswl %si, %eax # encoding: [0x0f,0xbf,0xc6]
524; NDD-NEXT:    ccmpael {dfv=sf} $1234, %eax # encoding: [0x62,0xf4,0x24,0x03,0x81,0xf8,0xd2,0x04,0x00,0x00]
525; NDD-NEXT:    # imm = 0x4D2
526; NDD-NEXT:    jge .LBB12_1 # encoding: [0x7d,A]
527; NDD-NEXT:    # fixup A - offset: 1, value: .LBB12_1-1, kind: FK_PCRel_1
528; NDD-NEXT:  # %bb.2: # %if.then
529; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
530; NDD-NEXT:    jmp foo # TAILCALL
531; NDD-NEXT:    # encoding: [0xeb,A]
532; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
533; NDD-NEXT:  .LBB12_1: # %if.end
534; NDD-NEXT:    retq # encoding: [0xc3]
535entry:
536  %cmp = icmp ult i16 %a, %c
537  %cmp1 = icmp slt i16 %b, 1234
538  %or.cond = or i1 %cmp, %cmp1
539  br i1 %or.cond, label %if.then, label %if.end
540
541if.then:                                          ; preds = %entry
542  tail call void (...) @foo()
543  br label %if.end
544
545if.end:                                           ; preds = %entry, %if.then
546  ret void
547}
548
549define void @ccmp32ri_cf(i32 noundef %a, i32 noundef %b, i32 noundef %c) {
550; CHECK-LABEL: ccmp32ri_cf:
551; CHECK:       # %bb.0: # %entry
552; CHECK-NEXT:    cmpl %edx, %edi # encoding: [0x39,0xd7]
553; CHECK-NEXT:    ccmpbl {dfv=cf} $1048577, %esi # encoding: [0x62,0xf4,0x0c,0x02,0x81,0xfe,0x01,0x00,0x10,0x00]
554; CHECK-NEXT:    # imm = 0x100001
555; CHECK-NEXT:    jae .LBB13_1 # encoding: [0x73,A]
556; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB13_1-1, kind: FK_PCRel_1
557; CHECK-NEXT:  # %bb.2: # %if.then
558; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
559; CHECK-NEXT:    jmp foo # TAILCALL
560; CHECK-NEXT:    # encoding: [0xeb,A]
561; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
562; CHECK-NEXT:  .LBB13_1: # %if.end
563; CHECK-NEXT:    retq # encoding: [0xc3]
564;
565; NDD-LABEL: ccmp32ri_cf:
566; NDD:       # %bb.0: # %entry
567; NDD-NEXT:    cmpl %edx, %edi # encoding: [0x39,0xd7]
568; NDD-NEXT:    ccmpbl {dfv=cf} $1048577, %esi # encoding: [0x62,0xf4,0x0c,0x02,0x81,0xfe,0x01,0x00,0x10,0x00]
569; NDD-NEXT:    # imm = 0x100001
570; NDD-NEXT:    jae .LBB13_1 # encoding: [0x73,A]
571; NDD-NEXT:    # fixup A - offset: 1, value: .LBB13_1-1, kind: FK_PCRel_1
572; NDD-NEXT:  # %bb.2: # %if.then
573; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
574; NDD-NEXT:    jmp foo # TAILCALL
575; NDD-NEXT:    # encoding: [0xeb,A]
576; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
577; NDD-NEXT:  .LBB13_1: # %if.end
578; NDD-NEXT:    retq # encoding: [0xc3]
579entry:
580  %cmp = icmp uge i32 %a, %c
581  %cmp1 = icmp ule i32 %b, 1048576
582  %or.cond = or i1 %cmp, %cmp1
583  br i1 %or.cond, label %if.then, label %if.end
584
585if.then:                                          ; preds = %entry
586  tail call void (...) @foo()
587  br label %if.end
588
589if.end:                                           ; preds = %entry, %if.then
590  ret void
591}
592
593define void @ccmp64ri32_zf(i64 noundef %a, i64 noundef %b, i64 noundef %c) {
594; CHECK-LABEL: ccmp64ri32_zf:
595; CHECK:       # %bb.0: # %entry
596; CHECK-NEXT:    cmpq %rdx, %rdi # encoding: [0x48,0x39,0xd7]
597; CHECK-NEXT:    ccmpbeq {dfv=sf} $123456, %rsi # encoding: [0x62,0xf4,0xa4,0x06,0x81,0xfe,0x40,0xe2,0x01,0x00]
598; CHECK-NEXT:    # imm = 0x1E240
599; CHECK-NEXT:    jge .LBB14_1 # encoding: [0x7d,A]
600; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB14_1-1, kind: FK_PCRel_1
601; CHECK-NEXT:  # %bb.2: # %if.then
602; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
603; CHECK-NEXT:    jmp foo # TAILCALL
604; CHECK-NEXT:    # encoding: [0xeb,A]
605; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
606; CHECK-NEXT:  .LBB14_1: # %if.end
607; CHECK-NEXT:    retq # encoding: [0xc3]
608;
609; NDD-LABEL: ccmp64ri32_zf:
610; NDD:       # %bb.0: # %entry
611; NDD-NEXT:    cmpq %rdx, %rdi # encoding: [0x48,0x39,0xd7]
612; NDD-NEXT:    ccmpbeq {dfv=sf} $123456, %rsi # encoding: [0x62,0xf4,0xa4,0x06,0x81,0xfe,0x40,0xe2,0x01,0x00]
613; NDD-NEXT:    # imm = 0x1E240
614; NDD-NEXT:    jge .LBB14_1 # encoding: [0x7d,A]
615; NDD-NEXT:    # fixup A - offset: 1, value: .LBB14_1-1, kind: FK_PCRel_1
616; NDD-NEXT:  # %bb.2: # %if.then
617; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
618; NDD-NEXT:    jmp foo # TAILCALL
619; NDD-NEXT:    # encoding: [0xeb,A]
620; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
621; NDD-NEXT:  .LBB14_1: # %if.end
622; NDD-NEXT:    retq # encoding: [0xc3]
623entry:
624  %cmp = icmp ugt i64 %a, %c
625  %cmp1 = icmp slt i64 %b, 123456
626  %or.cond = or i1 %cmp, %cmp1
627  br i1 %or.cond, label %if.then, label %if.end
628
629if.then:                                          ; preds = %entry
630  tail call void (...) @foo()
631  br label %if.end
632
633if.end:                                           ; preds = %entry, %if.then
634  ret void
635}
636
637define void @ccmp8rm_zf(i8 noundef %a, i8 noundef %b, i8 noundef %c, ptr %ptr) {
638; CHECK-LABEL: ccmp8rm_zf:
639; CHECK:       # %bb.0: # %entry
640; CHECK-NEXT:    cmpb %dl, %dil # encoding: [0x40,0x38,0xd7]
641; CHECK-NEXT:    ccmpneb {dfv=zf} (%rcx), %sil # encoding: [0x62,0xf4,0x14,0x05,0x3a,0x31]
642; CHECK-NEXT:    jne .LBB15_1 # encoding: [0x75,A]
643; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB15_1-1, kind: FK_PCRel_1
644; CHECK-NEXT:  # %bb.2: # %if.then
645; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
646; CHECK-NEXT:    jmp foo # TAILCALL
647; CHECK-NEXT:    # encoding: [0xeb,A]
648; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
649; CHECK-NEXT:  .LBB15_1: # %if.end
650; CHECK-NEXT:    retq # encoding: [0xc3]
651;
652; NDD-LABEL: ccmp8rm_zf:
653; NDD:       # %bb.0: # %entry
654; NDD-NEXT:    cmpb %dl, %dil # encoding: [0x40,0x38,0xd7]
655; NDD-NEXT:    ccmpneb {dfv=zf} (%rcx), %sil # encoding: [0x62,0xf4,0x14,0x05,0x3a,0x31]
656; NDD-NEXT:    jne .LBB15_1 # encoding: [0x75,A]
657; NDD-NEXT:    # fixup A - offset: 1, value: .LBB15_1-1, kind: FK_PCRel_1
658; NDD-NEXT:  # %bb.2: # %if.then
659; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
660; NDD-NEXT:    jmp foo # TAILCALL
661; NDD-NEXT:    # encoding: [0xeb,A]
662; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
663; NDD-NEXT:  .LBB15_1: # %if.end
664; NDD-NEXT:    retq # encoding: [0xc3]
665entry:
666  %d = load i8, ptr %ptr
667  %cmp = icmp eq i8 %a, %c
668  %cmp1 = icmp eq i8 %b, %d
669  %or.cond = or i1 %cmp, %cmp1
670  br i1 %or.cond, label %if.then, label %if.end
671
672if.then:                                          ; preds = %entry
673  tail call void (...) @foo()
674  br label %if.end
675
676if.end:                                           ; preds = %entry, %if.then
677  ret void
678}
679
680define void @ccmp16rm_sf(i16 noundef %a, i16 noundef %b, i16 noundef %c, ptr %ptr) {
681; CHECK-LABEL: ccmp16rm_sf:
682; CHECK:       # %bb.0: # %entry
683; CHECK-NEXT:    cmpw %dx, %di # encoding: [0x66,0x39,0xd7]
684; CHECK-NEXT:    ccmplew {dfv=sf} (%rcx), %si # encoding: [0x62,0xf4,0x25,0x0e,0x3b,0x31]
685; CHECK-NEXT:    jge .LBB16_1 # encoding: [0x7d,A]
686; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB16_1-1, kind: FK_PCRel_1
687; CHECK-NEXT:  # %bb.2: # %if.then
688; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
689; CHECK-NEXT:    jmp foo # TAILCALL
690; CHECK-NEXT:    # encoding: [0xeb,A]
691; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
692; CHECK-NEXT:  .LBB16_1: # %if.end
693; CHECK-NEXT:    retq # encoding: [0xc3]
694;
695; NDD-LABEL: ccmp16rm_sf:
696; NDD:       # %bb.0: # %entry
697; NDD-NEXT:    cmpw %dx, %di # encoding: [0x66,0x39,0xd7]
698; NDD-NEXT:    ccmplew {dfv=sf} (%rcx), %si # encoding: [0x62,0xf4,0x25,0x0e,0x3b,0x31]
699; NDD-NEXT:    jge .LBB16_1 # encoding: [0x7d,A]
700; NDD-NEXT:    # fixup A - offset: 1, value: .LBB16_1-1, kind: FK_PCRel_1
701; NDD-NEXT:  # %bb.2: # %if.then
702; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
703; NDD-NEXT:    jmp foo # TAILCALL
704; NDD-NEXT:    # encoding: [0xeb,A]
705; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
706; NDD-NEXT:  .LBB16_1: # %if.end
707; NDD-NEXT:    retq # encoding: [0xc3]
708entry:
709  %d = load i16, ptr %ptr
710  %cmp = icmp sgt i16 %a, %c
711  %cmp1 = icmp slt i16 %b, %d
712  %or.cond = or i1 %cmp, %cmp1
713  br i1 %or.cond, label %if.then, label %if.end
714
715if.then:                                          ; preds = %entry
716  tail call void (...) @foo()
717  br label %if.end
718
719if.end:                                           ; preds = %entry, %if.then
720  ret void
721}
722
723define void @ccmp32rm_cf(i32 noundef %a, i32 noundef %b, i32 noundef %c, ptr %ptr) {
724; CHECK-LABEL: ccmp32rm_cf:
725; CHECK:       # %bb.0: # %entry
726; CHECK-NEXT:    cmpl %edx, %edi # encoding: [0x39,0xd7]
727; CHECK-NEXT:    ccmpgl {dfv=cf} (%rcx), %esi # encoding: [0x62,0xf4,0x0c,0x0f,0x3b,0x31]
728; CHECK-NEXT:    ja .LBB17_1 # encoding: [0x77,A]
729; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB17_1-1, kind: FK_PCRel_1
730; CHECK-NEXT:  # %bb.2: # %if.then
731; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
732; CHECK-NEXT:    jmp foo # TAILCALL
733; CHECK-NEXT:    # encoding: [0xeb,A]
734; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
735; CHECK-NEXT:  .LBB17_1: # %if.end
736; CHECK-NEXT:    retq # encoding: [0xc3]
737;
738; NDD-LABEL: ccmp32rm_cf:
739; NDD:       # %bb.0: # %entry
740; NDD-NEXT:    cmpl %edx, %edi # encoding: [0x39,0xd7]
741; NDD-NEXT:    ccmpgl {dfv=cf} (%rcx), %esi # encoding: [0x62,0xf4,0x0c,0x0f,0x3b,0x31]
742; NDD-NEXT:    ja .LBB17_1 # encoding: [0x77,A]
743; NDD-NEXT:    # fixup A - offset: 1, value: .LBB17_1-1, kind: FK_PCRel_1
744; NDD-NEXT:  # %bb.2: # %if.then
745; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
746; NDD-NEXT:    jmp foo # TAILCALL
747; NDD-NEXT:    # encoding: [0xeb,A]
748; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
749; NDD-NEXT:  .LBB17_1: # %if.end
750; NDD-NEXT:    retq # encoding: [0xc3]
751entry:
752  %d = load i32, ptr %ptr
753  %cmp = icmp sle i32 %a, %c
754  %cmp1 = icmp ule i32 %b, %d
755  %or.cond = or i1 %cmp, %cmp1
756  br i1 %or.cond, label %if.then, label %if.end
757
758if.then:                                          ; preds = %entry
759  tail call void (...) @foo()
760  br label %if.end
761
762if.end:                                           ; preds = %entry, %if.then
763  ret void
764}
765
766define void @ccmp64rm_sf(i64 noundef %a, i64 noundef %b, i64 noundef %c, ptr %ptr) {
767; CHECK-LABEL: ccmp64rm_sf:
768; CHECK:       # %bb.0: # %entry
769; CHECK-NEXT:    cmpq %rdx, %rdi # encoding: [0x48,0x39,0xd7]
770; CHECK-NEXT:    ccmpleq {dfv=sf} (%rcx), %rsi # encoding: [0x62,0xf4,0xa4,0x0e,0x3b,0x31]
771; CHECK-NEXT:    jge .LBB18_1 # encoding: [0x7d,A]
772; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB18_1-1, kind: FK_PCRel_1
773; CHECK-NEXT:  # %bb.2: # %if.then
774; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
775; CHECK-NEXT:    jmp foo # TAILCALL
776; CHECK-NEXT:    # encoding: [0xeb,A]
777; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
778; CHECK-NEXT:  .LBB18_1: # %if.end
779; CHECK-NEXT:    retq # encoding: [0xc3]
780;
781; NDD-LABEL: ccmp64rm_sf:
782; NDD:       # %bb.0: # %entry
783; NDD-NEXT:    cmpq %rdx, %rdi # encoding: [0x48,0x39,0xd7]
784; NDD-NEXT:    ccmpleq {dfv=sf} (%rcx), %rsi # encoding: [0x62,0xf4,0xa4,0x0e,0x3b,0x31]
785; NDD-NEXT:    jge .LBB18_1 # encoding: [0x7d,A]
786; NDD-NEXT:    # fixup A - offset: 1, value: .LBB18_1-1, kind: FK_PCRel_1
787; NDD-NEXT:  # %bb.2: # %if.then
788; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
789; NDD-NEXT:    jmp foo # TAILCALL
790; NDD-NEXT:    # encoding: [0xeb,A]
791; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
792; NDD-NEXT:  .LBB18_1: # %if.end
793; NDD-NEXT:    retq # encoding: [0xc3]
794entry:
795  %d = load i64, ptr %ptr
796  %cmp = icmp sgt i64 %a, %c
797  %cmp1 = icmp slt i64 %b, %d
798  %or.cond = or i1 %cmp, %cmp1
799  br i1 %or.cond, label %if.then, label %if.end
800
801if.then:                                          ; preds = %entry
802  tail call void (...) @foo()
803  br label %if.end
804
805if.end:                                           ; preds = %entry, %if.then
806  ret void
807}
808
809define void @ccmp8mr_zf(i8 noundef %a, i8 noundef %c, ptr %ptr) {
810; CHECK-LABEL: ccmp8mr_zf:
811; CHECK:       # %bb.0: # %entry
812; CHECK-NEXT:    cmpb %sil, %dil # encoding: [0x40,0x38,0xf7]
813; CHECK-NEXT:    ccmpgeb {dfv=zf} %sil, (%rdx) # encoding: [0x62,0xf4,0x14,0x0d,0x38,0x32]
814; CHECK-NEXT:    jne .LBB19_1 # encoding: [0x75,A]
815; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB19_1-1, kind: FK_PCRel_1
816; CHECK-NEXT:  # %bb.2: # %if.then
817; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
818; CHECK-NEXT:    jmp foo # TAILCALL
819; CHECK-NEXT:    # encoding: [0xeb,A]
820; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
821; CHECK-NEXT:  .LBB19_1: # %if.end
822; CHECK-NEXT:    retq # encoding: [0xc3]
823;
824; NDD-LABEL: ccmp8mr_zf:
825; NDD:       # %bb.0: # %entry
826; NDD-NEXT:    cmpb %sil, %dil # encoding: [0x40,0x38,0xf7]
827; NDD-NEXT:    ccmpgeb {dfv=zf} %sil, (%rdx) # encoding: [0x62,0xf4,0x14,0x0d,0x38,0x32]
828; NDD-NEXT:    jne .LBB19_1 # encoding: [0x75,A]
829; NDD-NEXT:    # fixup A - offset: 1, value: .LBB19_1-1, kind: FK_PCRel_1
830; NDD-NEXT:  # %bb.2: # %if.then
831; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
832; NDD-NEXT:    jmp foo # TAILCALL
833; NDD-NEXT:    # encoding: [0xeb,A]
834; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
835; NDD-NEXT:  .LBB19_1: # %if.end
836; NDD-NEXT:    retq # encoding: [0xc3]
837entry:
838  %b = load i8, ptr %ptr
839  %cmp = icmp slt i8 %a, %c
840  %cmp1 = icmp eq i8 %b, %c
841  %or.cond = or i1 %cmp, %cmp1
842  br i1 %or.cond, label %if.then, label %if.end
843
844if.then:                                          ; preds = %entry
845  tail call void (...) @foo()
846  br label %if.end
847
848if.end:                                           ; preds = %entry, %if.then
849  ret void
850}
851
852define void @ccmp16mr_sf(i16 noundef %a, i16 noundef %c, ptr %ptr) {
853; CHECK-LABEL: ccmp16mr_sf:
854; CHECK:       # %bb.0: # %entry
855; CHECK-NEXT:    cmpw %si, %di # encoding: [0x66,0x39,0xf7]
856; CHECK-NEXT:    ccmplew {dfv=sf} %si, (%rdx) # encoding: [0x62,0xf4,0x25,0x0e,0x39,0x32]
857; CHECK-NEXT:    jge .LBB20_1 # encoding: [0x7d,A]
858; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB20_1-1, kind: FK_PCRel_1
859; CHECK-NEXT:  # %bb.2: # %if.then
860; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
861; CHECK-NEXT:    jmp foo # TAILCALL
862; CHECK-NEXT:    # encoding: [0xeb,A]
863; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
864; CHECK-NEXT:  .LBB20_1: # %if.end
865; CHECK-NEXT:    retq # encoding: [0xc3]
866;
867; NDD-LABEL: ccmp16mr_sf:
868; NDD:       # %bb.0: # %entry
869; NDD-NEXT:    cmpw %si, %di # encoding: [0x66,0x39,0xf7]
870; NDD-NEXT:    ccmplew {dfv=sf} %si, (%rdx) # encoding: [0x62,0xf4,0x25,0x0e,0x39,0x32]
871; NDD-NEXT:    jge .LBB20_1 # encoding: [0x7d,A]
872; NDD-NEXT:    # fixup A - offset: 1, value: .LBB20_1-1, kind: FK_PCRel_1
873; NDD-NEXT:  # %bb.2: # %if.then
874; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
875; NDD-NEXT:    jmp foo # TAILCALL
876; NDD-NEXT:    # encoding: [0xeb,A]
877; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
878; NDD-NEXT:  .LBB20_1: # %if.end
879; NDD-NEXT:    retq # encoding: [0xc3]
880entry:
881  %b = load i16, ptr %ptr
882  %cmp = icmp sgt i16 %a, %c
883  %cmp1 = icmp slt i16 %b, %c
884  %or.cond = or i1 %cmp, %cmp1
885  br i1 %or.cond, label %if.then, label %if.end
886
887if.then:                                          ; preds = %entry
888  tail call void (...) @foo()
889  br label %if.end
890
891if.end:                                           ; preds = %entry, %if.then
892  ret void
893}
894
895define void @ccmp32mr_cf(i32 noundef %a, i32 noundef %c, ptr %ptr) {
896; CHECK-LABEL: ccmp32mr_cf:
897; CHECK:       # %bb.0: # %entry
898; CHECK-NEXT:    cmpl %esi, %edi # encoding: [0x39,0xf7]
899; CHECK-NEXT:    ccmpll {dfv=cf} %esi, (%rdx) # encoding: [0x62,0xf4,0x0c,0x0c,0x39,0x32]
900; CHECK-NEXT:    ja .LBB21_1 # encoding: [0x77,A]
901; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB21_1-1, kind: FK_PCRel_1
902; CHECK-NEXT:  # %bb.2: # %if.then
903; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
904; CHECK-NEXT:    jmp foo # TAILCALL
905; CHECK-NEXT:    # encoding: [0xeb,A]
906; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
907; CHECK-NEXT:  .LBB21_1: # %if.end
908; CHECK-NEXT:    retq # encoding: [0xc3]
909;
910; NDD-LABEL: ccmp32mr_cf:
911; NDD:       # %bb.0: # %entry
912; NDD-NEXT:    cmpl %esi, %edi # encoding: [0x39,0xf7]
913; NDD-NEXT:    ccmpll {dfv=cf} %esi, (%rdx) # encoding: [0x62,0xf4,0x0c,0x0c,0x39,0x32]
914; NDD-NEXT:    ja .LBB21_1 # encoding: [0x77,A]
915; NDD-NEXT:    # fixup A - offset: 1, value: .LBB21_1-1, kind: FK_PCRel_1
916; NDD-NEXT:  # %bb.2: # %if.then
917; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
918; NDD-NEXT:    jmp foo # TAILCALL
919; NDD-NEXT:    # encoding: [0xeb,A]
920; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
921; NDD-NEXT:  .LBB21_1: # %if.end
922; NDD-NEXT:    retq # encoding: [0xc3]
923entry:
924  %b = load i32, ptr %ptr
925  %cmp = icmp sge i32 %a, %c
926  %cmp1 = icmp ule i32 %b, %c
927  %or.cond = or i1 %cmp, %cmp1
928  br i1 %or.cond, label %if.then, label %if.end
929
930if.then:                                          ; preds = %entry
931  tail call void (...) @foo()
932  br label %if.end
933
934if.end:                                           ; preds = %entry, %if.then
935  ret void
936}
937
938define void @ccmp64mr_sf(i64 noundef %a, i64 noundef %c, ptr %ptr) {
939; CHECK-LABEL: ccmp64mr_sf:
940; CHECK:       # %bb.0: # %entry
941; CHECK-NEXT:    cmpq %rsi, %rdi # encoding: [0x48,0x39,0xf7]
942; CHECK-NEXT:    ccmpleq {dfv=sf} %rsi, (%rdx) # encoding: [0x62,0xf4,0xa4,0x0e,0x39,0x32]
943; CHECK-NEXT:    jge .LBB22_1 # encoding: [0x7d,A]
944; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB22_1-1, kind: FK_PCRel_1
945; CHECK-NEXT:  # %bb.2: # %if.then
946; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
947; CHECK-NEXT:    jmp foo # TAILCALL
948; CHECK-NEXT:    # encoding: [0xeb,A]
949; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
950; CHECK-NEXT:  .LBB22_1: # %if.end
951; CHECK-NEXT:    retq # encoding: [0xc3]
952;
953; NDD-LABEL: ccmp64mr_sf:
954; NDD:       # %bb.0: # %entry
955; NDD-NEXT:    cmpq %rsi, %rdi # encoding: [0x48,0x39,0xf7]
956; NDD-NEXT:    ccmpleq {dfv=sf} %rsi, (%rdx) # encoding: [0x62,0xf4,0xa4,0x0e,0x39,0x32]
957; NDD-NEXT:    jge .LBB22_1 # encoding: [0x7d,A]
958; NDD-NEXT:    # fixup A - offset: 1, value: .LBB22_1-1, kind: FK_PCRel_1
959; NDD-NEXT:  # %bb.2: # %if.then
960; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
961; NDD-NEXT:    jmp foo # TAILCALL
962; NDD-NEXT:    # encoding: [0xeb,A]
963; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
964; NDD-NEXT:  .LBB22_1: # %if.end
965; NDD-NEXT:    retq # encoding: [0xc3]
966entry:
967  %b = load i64, ptr %ptr
968  %cmp = icmp sgt i64 %a, %c
969  %cmp1 = icmp slt i64 %b, %c
970  %or.cond = or i1 %cmp, %cmp1
971  br i1 %or.cond, label %if.then, label %if.end
972
973if.then:                                          ; preds = %entry
974  tail call void (...) @foo()
975  br label %if.end
976
977if.end:                                           ; preds = %entry, %if.then
978  ret void
979}
980
981define void @ccmp8mi_zf(i8 noundef %a, i8 noundef %c, ptr %ptr) {
982; CHECK-LABEL: ccmp8mi_zf:
983; CHECK:       # %bb.0: # %entry
984; CHECK-NEXT:    cmpb %sil, %dil # encoding: [0x40,0x38,0xf7]
985; CHECK-NEXT:    ccmpneb {dfv=zf} $123, (%rdx) # encoding: [0x62,0xf4,0x14,0x05,0x80,0x3a,0x7b]
986; CHECK-NEXT:    jne .LBB23_1 # encoding: [0x75,A]
987; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB23_1-1, kind: FK_PCRel_1
988; CHECK-NEXT:  # %bb.2: # %if.then
989; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
990; CHECK-NEXT:    jmp foo # TAILCALL
991; CHECK-NEXT:    # encoding: [0xeb,A]
992; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
993; CHECK-NEXT:  .LBB23_1: # %if.end
994; CHECK-NEXT:    retq # encoding: [0xc3]
995;
996; NDD-LABEL: ccmp8mi_zf:
997; NDD:       # %bb.0: # %entry
998; NDD-NEXT:    cmpb %sil, %dil # encoding: [0x40,0x38,0xf7]
999; NDD-NEXT:    ccmpneb {dfv=zf} $123, (%rdx) # encoding: [0x62,0xf4,0x14,0x05,0x80,0x3a,0x7b]
1000; NDD-NEXT:    jne .LBB23_1 # encoding: [0x75,A]
1001; NDD-NEXT:    # fixup A - offset: 1, value: .LBB23_1-1, kind: FK_PCRel_1
1002; NDD-NEXT:  # %bb.2: # %if.then
1003; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
1004; NDD-NEXT:    jmp foo # TAILCALL
1005; NDD-NEXT:    # encoding: [0xeb,A]
1006; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
1007; NDD-NEXT:  .LBB23_1: # %if.end
1008; NDD-NEXT:    retq # encoding: [0xc3]
1009entry:
1010  %b = load i8, ptr %ptr
1011  %cmp = icmp eq i8 %a, %c
1012  %cmp1 = icmp eq i8 %b, 123
1013  %or.cond = or i1 %cmp, %cmp1
1014  br i1 %or.cond, label %if.then, label %if.end
1015
1016if.then:                                          ; preds = %entry
1017  tail call void (...) @foo()
1018  br label %if.end
1019
1020if.end:                                           ; preds = %entry, %if.then
1021  ret void
1022}
1023
1024define void @ccmp16mi_zf(i16 noundef %a, i16 noundef %c, ptr %ptr) {
1025; CHECK-LABEL: ccmp16mi_zf:
1026; CHECK:       # %bb.0: # %entry
1027; CHECK-NEXT:    cmpw %si, %di # encoding: [0x66,0x39,0xf7]
1028; CHECK-NEXT:    ccmplew {dfv=sf} $1234, (%rdx) # encoding: [0x62,0xf4,0x25,0x0e,0x81,0x3a,0xd2,0x04]
1029; CHECK-NEXT:    # imm = 0x4D2
1030; CHECK-NEXT:    jge .LBB24_1 # encoding: [0x7d,A]
1031; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB24_1-1, kind: FK_PCRel_1
1032; CHECK-NEXT:  # %bb.2: # %if.then
1033; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
1034; CHECK-NEXT:    jmp foo # TAILCALL
1035; CHECK-NEXT:    # encoding: [0xeb,A]
1036; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
1037; CHECK-NEXT:  .LBB24_1: # %if.end
1038; CHECK-NEXT:    retq # encoding: [0xc3]
1039;
1040; NDD-LABEL: ccmp16mi_zf:
1041; NDD:       # %bb.0: # %entry
1042; NDD-NEXT:    cmpw %si, %di # encoding: [0x66,0x39,0xf7]
1043; NDD-NEXT:    ccmplew {dfv=sf} $1234, (%rdx) # encoding: [0x62,0xf4,0x25,0x0e,0x81,0x3a,0xd2,0x04]
1044; NDD-NEXT:    # imm = 0x4D2
1045; NDD-NEXT:    jge .LBB24_1 # encoding: [0x7d,A]
1046; NDD-NEXT:    # fixup A - offset: 1, value: .LBB24_1-1, kind: FK_PCRel_1
1047; NDD-NEXT:  # %bb.2: # %if.then
1048; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
1049; NDD-NEXT:    jmp foo # TAILCALL
1050; NDD-NEXT:    # encoding: [0xeb,A]
1051; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
1052; NDD-NEXT:  .LBB24_1: # %if.end
1053; NDD-NEXT:    retq # encoding: [0xc3]
1054entry:
1055  %b = load i16, ptr %ptr
1056  %cmp = icmp sgt i16 %a, %c
1057  %cmp1 = icmp slt i16 %b, 1234
1058  %or.cond = or i1 %cmp, %cmp1
1059  br i1 %or.cond, label %if.then, label %if.end
1060
1061if.then:                                          ; preds = %entry
1062  tail call void (...) @foo()
1063  br label %if.end
1064
1065if.end:                                           ; preds = %entry, %if.then
1066  ret void
1067}
1068
1069define void @ccmp32mi_cf(i32 noundef %a, i32 noundef %c, ptr %ptr) {
1070; CHECK-LABEL: ccmp32mi_cf:
1071; CHECK:       # %bb.0: # %entry
1072; CHECK-NEXT:    cmpl %esi, %edi # encoding: [0x39,0xf7]
1073; CHECK-NEXT:    ccmpnel {dfv=cf} $123457, (%rdx) # encoding: [0x62,0xf4,0x0c,0x05,0x81,0x3a,0x41,0xe2,0x01,0x00]
1074; CHECK-NEXT:    # imm = 0x1E241
1075; CHECK-NEXT:    jae .LBB25_1 # encoding: [0x73,A]
1076; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB25_1-1, kind: FK_PCRel_1
1077; CHECK-NEXT:  # %bb.2: # %if.then
1078; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
1079; CHECK-NEXT:    jmp foo # TAILCALL
1080; CHECK-NEXT:    # encoding: [0xeb,A]
1081; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
1082; CHECK-NEXT:  .LBB25_1: # %if.end
1083; CHECK-NEXT:    retq # encoding: [0xc3]
1084;
1085; NDD-LABEL: ccmp32mi_cf:
1086; NDD:       # %bb.0: # %entry
1087; NDD-NEXT:    cmpl %esi, %edi # encoding: [0x39,0xf7]
1088; NDD-NEXT:    ccmpnel {dfv=cf} $123457, (%rdx) # encoding: [0x62,0xf4,0x0c,0x05,0x81,0x3a,0x41,0xe2,0x01,0x00]
1089; NDD-NEXT:    # imm = 0x1E241
1090; NDD-NEXT:    jae .LBB25_1 # encoding: [0x73,A]
1091; NDD-NEXT:    # fixup A - offset: 1, value: .LBB25_1-1, kind: FK_PCRel_1
1092; NDD-NEXT:  # %bb.2: # %if.then
1093; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
1094; NDD-NEXT:    jmp foo # TAILCALL
1095; NDD-NEXT:    # encoding: [0xeb,A]
1096; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
1097; NDD-NEXT:  .LBB25_1: # %if.end
1098; NDD-NEXT:    retq # encoding: [0xc3]
1099entry:
1100  %b = load i32, ptr %ptr
1101  %cmp = icmp eq i32 %a, %c
1102  %cmp1 = icmp ule i32 %b, 123456
1103  %or.cond = or i1 %cmp, %cmp1
1104  br i1 %or.cond, label %if.then, label %if.end
1105
1106if.then:                                          ; preds = %entry
1107  tail call void (...) @foo()
1108  br label %if.end
1109
1110if.end:                                           ; preds = %entry, %if.then
1111  ret void
1112}
1113
1114define void @ccmp64mi32_zf(i64 noundef %a, i64 noundef %c, ptr %ptr) {
1115; CHECK-LABEL: ccmp64mi32_zf:
1116; CHECK:       # %bb.0: # %entry
1117; CHECK-NEXT:    cmpq %rsi, %rdi # encoding: [0x48,0x39,0xf7]
1118; CHECK-NEXT:    ccmpleq {dfv=sf} $123456, (%rdx) # encoding: [0x62,0xf4,0xa4,0x0e,0x81,0x3a,0x40,0xe2,0x01,0x00]
1119; CHECK-NEXT:    # imm = 0x1E240
1120; CHECK-NEXT:    jge .LBB26_1 # encoding: [0x7d,A]
1121; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB26_1-1, kind: FK_PCRel_1
1122; CHECK-NEXT:  # %bb.2: # %if.then
1123; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
1124; CHECK-NEXT:    jmp foo # TAILCALL
1125; CHECK-NEXT:    # encoding: [0xeb,A]
1126; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
1127; CHECK-NEXT:  .LBB26_1: # %if.end
1128; CHECK-NEXT:    retq # encoding: [0xc3]
1129;
1130; NDD-LABEL: ccmp64mi32_zf:
1131; NDD:       # %bb.0: # %entry
1132; NDD-NEXT:    cmpq %rsi, %rdi # encoding: [0x48,0x39,0xf7]
1133; NDD-NEXT:    ccmpleq {dfv=sf} $123456, (%rdx) # encoding: [0x62,0xf4,0xa4,0x0e,0x81,0x3a,0x40,0xe2,0x01,0x00]
1134; NDD-NEXT:    # imm = 0x1E240
1135; NDD-NEXT:    jge .LBB26_1 # encoding: [0x7d,A]
1136; NDD-NEXT:    # fixup A - offset: 1, value: .LBB26_1-1, kind: FK_PCRel_1
1137; NDD-NEXT:  # %bb.2: # %if.then
1138; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
1139; NDD-NEXT:    jmp foo # TAILCALL
1140; NDD-NEXT:    # encoding: [0xeb,A]
1141; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
1142; NDD-NEXT:  .LBB26_1: # %if.end
1143; NDD-NEXT:    retq # encoding: [0xc3]
1144entry:
1145  %b = load i64, ptr %ptr
1146  %cmp = icmp sgt i64 %a, %c
1147  %cmp1 = icmp slt i64 %b, 123456
1148  %or.cond = or i1 %cmp, %cmp1
1149  br i1 %or.cond, label %if.then, label %if.end
1150
1151if.then:                                          ; preds = %entry
1152  tail call void (...) @foo()
1153  br label %if.end
1154
1155if.end:                                           ; preds = %entry, %if.then
1156  ret void
1157}
1158
1159define void @ccmp_continous(i32 noundef %a, i32 noundef %b, i32 noundef %c) {
1160; CHECK-LABEL: ccmp_continous:
1161; CHECK:       # %bb.0: # %entry
1162; CHECK-NEXT:    testl %edi, %edi # encoding: [0x85,0xff]
1163; CHECK-NEXT:    ccmplel {dfv=} $2, %esi # encoding: [0x62,0xf4,0x04,0x0e,0x83,0xfe,0x02]
1164; CHECK-NEXT:    ccmpll {dfv=} $3, %edx # encoding: [0x62,0xf4,0x04,0x0c,0x83,0xfa,0x03]
1165; CHECK-NEXT:    jge .LBB27_1 # encoding: [0x7d,A]
1166; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB27_1-1, kind: FK_PCRel_1
1167; CHECK-NEXT:  # %bb.2: # %if.then
1168; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
1169; CHECK-NEXT:    jmp foo # TAILCALL
1170; CHECK-NEXT:    # encoding: [0xeb,A]
1171; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
1172; CHECK-NEXT:  .LBB27_1: # %if.end
1173; CHECK-NEXT:    retq # encoding: [0xc3]
1174;
1175; NDD-LABEL: ccmp_continous:
1176; NDD:       # %bb.0: # %entry
1177; NDD-NEXT:    testl %edi, %edi # encoding: [0x85,0xff]
1178; NDD-NEXT:    ccmplel {dfv=} $2, %esi # encoding: [0x62,0xf4,0x04,0x0e,0x83,0xfe,0x02]
1179; NDD-NEXT:    ccmpll {dfv=} $3, %edx # encoding: [0x62,0xf4,0x04,0x0c,0x83,0xfa,0x03]
1180; NDD-NEXT:    jge .LBB27_1 # encoding: [0x7d,A]
1181; NDD-NEXT:    # fixup A - offset: 1, value: .LBB27_1-1, kind: FK_PCRel_1
1182; NDD-NEXT:  # %bb.2: # %if.then
1183; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
1184; NDD-NEXT:    jmp foo # TAILCALL
1185; NDD-NEXT:    # encoding: [0xeb,A]
1186; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
1187; NDD-NEXT:  .LBB27_1: # %if.end
1188; NDD-NEXT:    retq # encoding: [0xc3]
1189entry:
1190  %cmp = icmp slt i32 %a, 1
1191  %cmp1 = icmp slt i32 %b, 2
1192  %or.cond = and i1 %cmp, %cmp1
1193  %cmp3 = icmp slt i32 %c, 3
1194  %or.cond4 = and i1 %or.cond, %cmp3
1195  br i1 %or.cond4, label %if.then, label %if.end
1196
1197if.then:                                          ; preds = %entry
1198  tail call void (...) @foo()
1199  br label %if.end
1200
1201if.end:                                           ; preds = %if.then, %entry
1202  ret void
1203}
1204
1205define i32 @ccmp_nobranch(i32 noundef %a, i32 noundef %b) {
1206; CHECK-LABEL: ccmp_nobranch:
1207; CHECK:       # %bb.0: # %entry
1208; CHECK-NEXT:    testl %edi, %edi # encoding: [0x85,0xff]
1209; CHECK-NEXT:    ccmplel {dfv=} $2, %esi # encoding: [0x62,0xf4,0x04,0x0e,0x83,0xfe,0x02]
1210; CHECK-NEXT:    setge %al # encoding: [0x0f,0x9d,0xc0]
1211; CHECK-NEXT:    movzbl %al, %eax # encoding: [0x0f,0xb6,0xc0]
1212; CHECK-NEXT:    retq # encoding: [0xc3]
1213;
1214; NDD-LABEL: ccmp_nobranch:
1215; NDD:       # %bb.0: # %entry
1216; NDD-NEXT:    testl %edi, %edi # encoding: [0x85,0xff]
1217; NDD-NEXT:    ccmplel {dfv=} $2, %esi # encoding: [0x62,0xf4,0x04,0x0e,0x83,0xfe,0x02]
1218; NDD-NEXT:    setge %al # encoding: [0x0f,0x9d,0xc0]
1219; NDD-NEXT:    movzbl %al, %eax # encoding: [0x0f,0xb6,0xc0]
1220; NDD-NEXT:    retq # encoding: [0xc3]
1221entry:
1222  %cmp = icmp sgt i32 %a, 0
1223  %cmp1 = icmp sgt i32 %b, 1
1224  %or.cond.not = or i1 %cmp, %cmp1
1225  %. = zext i1 %or.cond.not to i32
1226  ret i32 %.
1227}
1228
1229define i32 @ccmp_continous_nobranch(i32 noundef %a, i32 noundef %b, i32 noundef %c) {
1230; CHECK-LABEL: ccmp_continous_nobranch:
1231; CHECK:       # %bb.0: # %entry
1232; CHECK-NEXT:    cmpl $2, %edi # encoding: [0x83,0xff,0x02]
1233; CHECK-NEXT:    ccmpll {dfv=sf} $2, %esi # encoding: [0x62,0xf4,0x24,0x0c,0x83,0xfe,0x02]
1234; CHECK-NEXT:    ccmpll {dfv=sf} $4, %edx # encoding: [0x62,0xf4,0x24,0x0c,0x83,0xfa,0x04]
1235; CHECK-NEXT:    setge %al # encoding: [0x0f,0x9d,0xc0]
1236; CHECK-NEXT:    movzbl %al, %eax # encoding: [0x0f,0xb6,0xc0]
1237; CHECK-NEXT:    retq # encoding: [0xc3]
1238;
1239; NDD-LABEL: ccmp_continous_nobranch:
1240; NDD:       # %bb.0: # %entry
1241; NDD-NEXT:    cmpl $2, %edi # encoding: [0x83,0xff,0x02]
1242; NDD-NEXT:    ccmpll {dfv=sf} $2, %esi # encoding: [0x62,0xf4,0x24,0x0c,0x83,0xfe,0x02]
1243; NDD-NEXT:    ccmpll {dfv=sf} $4, %edx # encoding: [0x62,0xf4,0x24,0x0c,0x83,0xfa,0x04]
1244; NDD-NEXT:    setge %al # encoding: [0x0f,0x9d,0xc0]
1245; NDD-NEXT:    movzbl %al, %eax # encoding: [0x0f,0xb6,0xc0]
1246; NDD-NEXT:    retq # encoding: [0xc3]
1247entry:
1248  %cmp = icmp sgt i32 %a, 1
1249  %cmp1 = icmp slt i32 %b, 2
1250  %cmp2 = icmp sgt i32 %c, 3
1251  %or1 = or i1 %cmp, %cmp1
1252  %or2 =  and i1 %or1, %cmp2
1253  %. = zext i1 %or2 to i32
1254  ret i32 %.
1255}
1256
1257define void @ccmp64ri64(i64 noundef %a, i64 noundef %b, i64 noundef %c) {
1258; CHECK-LABEL: ccmp64ri64:
1259; CHECK:       # %bb.0: # %entry
1260; CHECK-NEXT:    cmpq %rdx, %rdi # encoding: [0x48,0x39,0xd7]
1261; CHECK-NEXT:    movabsq $9992147483646, %rax # encoding: [0x48,0xb8,0xfe,0xbb,0x66,0x7a,0x16,0x09,0x00,0x00]
1262; CHECK-NEXT:    # imm = 0x9167A66BBFE
1263; CHECK-NEXT:    ccmpbeq {dfv=zf} %rax, %rsi # encoding: [0x62,0xf4,0x94,0x06,0x39,0xc6]
1264; CHECK-NEXT:    jg .LBB30_1 # encoding: [0x7f,A]
1265; CHECK-NEXT:    # fixup A - offset: 1, value: .LBB30_1-1, kind: FK_PCRel_1
1266; CHECK-NEXT:  # %bb.2: # %if.then
1267; CHECK-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
1268; CHECK-NEXT:    jmp foo # TAILCALL
1269; CHECK-NEXT:    # encoding: [0xeb,A]
1270; CHECK-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
1271; CHECK-NEXT:  .LBB30_1: # %if.end
1272; CHECK-NEXT:    retq # encoding: [0xc3]
1273;
1274; NDD-LABEL: ccmp64ri64:
1275; NDD:       # %bb.0: # %entry
1276; NDD-NEXT:    cmpq %rdx, %rdi # encoding: [0x48,0x39,0xd7]
1277; NDD-NEXT:    movabsq $9992147483646, %rax # encoding: [0x48,0xb8,0xfe,0xbb,0x66,0x7a,0x16,0x09,0x00,0x00]
1278; NDD-NEXT:    # imm = 0x9167A66BBFE
1279; NDD-NEXT:    ccmpbeq {dfv=zf} %rax, %rsi # encoding: [0x62,0xf4,0x94,0x06,0x39,0xc6]
1280; NDD-NEXT:    jg .LBB30_1 # encoding: [0x7f,A]
1281; NDD-NEXT:    # fixup A - offset: 1, value: .LBB30_1-1, kind: FK_PCRel_1
1282; NDD-NEXT:  # %bb.2: # %if.then
1283; NDD-NEXT:    xorl %eax, %eax # encoding: [0x31,0xc0]
1284; NDD-NEXT:    jmp foo # TAILCALL
1285; NDD-NEXT:    # encoding: [0xeb,A]
1286; NDD-NEXT:    # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
1287; NDD-NEXT:  .LBB30_1: # %if.end
1288; NDD-NEXT:    retq # encoding: [0xc3]
1289entry:
1290  %cmp = icmp ugt i64 %a, %c
1291  %cmp1 = icmp slt i64 %b, 9992147483647
1292  %or.cond = or i1 %cmp, %cmp1
1293  br i1 %or.cond, label %if.then, label %if.end
1294
1295if.then:                                          ; preds = %entry
1296  tail call void (...) @foo()
1297  br label %if.end
1298
1299if.end:                                           ; preds = %entry, %if.then
1300  ret void
1301}
1302
1303declare dso_local void @foo(...)
1304declare {i64, i1} @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone
1305