CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
1468 lines
51 KiB
LLVM
1468 lines
51 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ccmp,+nf -verify-machineinstrs | FileCheck %s
|
|
; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ccmp,+ndd,+nf -verify-machineinstrs | FileCheck %s --check-prefix=NDD
|
|
; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+zu -verify-machineinstrs --show-mc-encoding | FileCheck %s --check-prefix=SETZUCC
|
|
|
|
define void @ctest8rr_zf(i8 noundef %a, i8 noundef %b) {
|
|
; CHECK-LABEL: ctest8rr_zf:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testb %dil, %dil
|
|
; CHECK-NEXT: ctestneb {dfv=zf} %sil, %sil
|
|
; CHECK-NEXT: jne .LBB0_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB0_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest8rr_zf:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testb %dil, %dil
|
|
; NDD-NEXT: ctestneb {dfv=zf} %sil, %sil
|
|
; NDD-NEXT: jne .LBB0_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB0_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest8rr_zf:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testb %dil, %dil # encoding: [0x40,0x84,0xff]
|
|
; SETZUCC-NEXT: je .LBB0_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB0_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: testb %sil, %sil # encoding: [0x40,0x84,0xf6]
|
|
; SETZUCC-NEXT: je .LBB0_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB0_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
; SETZUCC-NEXT: .LBB0_3: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
entry:
|
|
%cmp = icmp eq i8 %a, 0
|
|
%cmp1 = icmp eq i8 %b, 0
|
|
%or.cond = or i1 %cmp, %cmp1
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %entry, %if.then
|
|
ret void
|
|
}
|
|
|
|
define i8 @ctest8rr_zf_double(i8 %a, double %b, i8* nocapture %c) {
|
|
; CHECK-LABEL: ctest8rr_zf_double:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: xorpd %xmm1, %xmm1
|
|
; CHECK-NEXT: ucomisd %xmm1, %xmm0
|
|
; CHECK-NEXT: ctesteb {dfv=zf} %dil, %dil
|
|
; CHECK-NEXT: je .LBB1_2
|
|
; CHECK-NEXT: # %bb.1: # %if.then
|
|
; CHECK-NEXT: movb %dil, (%rsi)
|
|
; CHECK-NEXT: .LBB1_2: # %if.end
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest8rr_zf_double:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: xorpd %xmm1, %xmm1
|
|
; NDD-NEXT: ucomisd %xmm1, %xmm0
|
|
; NDD-NEXT: ctesteb {dfv=zf} %dil, %dil
|
|
; NDD-NEXT: je .LBB1_2
|
|
; NDD-NEXT: # %bb.1: # %if.then
|
|
; NDD-NEXT: movb %dil, (%rsi)
|
|
; NDD-NEXT: .LBB1_2: # %if.end
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest8rr_zf_double:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testb %dil, %dil # encoding: [0x40,0x84,0xff]
|
|
; SETZUCC-NEXT: je .LBB1_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB1_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: xorpd %xmm1, %xmm1 # encoding: [0x66,0x0f,0x57,0xc9]
|
|
; SETZUCC-NEXT: ucomisd %xmm1, %xmm0 # encoding: [0x66,0x0f,0x2e,0xc1]
|
|
; SETZUCC-NEXT: jne .LBB1_3 # encoding: [0x75,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB1_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.then
|
|
; SETZUCC-NEXT: movb %dil, (%rsi) # encoding: [0x40,0x88,0x3e]
|
|
; SETZUCC-NEXT: .LBB1_3: # %if.end
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
entry:
|
|
%tobool = icmp ne i8 %a, 0
|
|
%cmp = fcmp ueq double %b, 0.0
|
|
%or.cond = select i1 %tobool, i1 %cmp, i1 false
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then:
|
|
store i8 %a, i8* %c, align 4
|
|
br label %if.end
|
|
|
|
if.end:
|
|
ret i8 0
|
|
}
|
|
|
|
define i8 @ctest8rr_zf_double_p(i8 %a, double %b, i8* nocapture %c) {
|
|
; CHECK-LABEL: ctest8rr_zf_double_p:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testb %dil, %dil
|
|
; CHECK-NEXT: setne %al
|
|
; CHECK-NEXT: ucomisd %xmm0, %xmm0
|
|
; CHECK-NEXT: setp %cl
|
|
; CHECK-NEXT: andb %al, %cl
|
|
; CHECK-NEXT: cmpb $1, %cl
|
|
; CHECK-NEXT: jne .LBB2_2
|
|
; CHECK-NEXT: # %bb.1: # %if.then
|
|
; CHECK-NEXT: movb %dil, (%rsi)
|
|
; CHECK-NEXT: .LBB2_2: # %if.end
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest8rr_zf_double_p:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testb %dil, %dil
|
|
; NDD-NEXT: setne %al
|
|
; NDD-NEXT: ucomisd %xmm0, %xmm0
|
|
; NDD-NEXT: setp %cl
|
|
; NDD-NEXT: andb %cl, %al
|
|
; NDD-NEXT: cmpb $1, %al
|
|
; NDD-NEXT: jne .LBB2_2
|
|
; NDD-NEXT: # %bb.1: # %if.then
|
|
; NDD-NEXT: movb %dil, (%rsi)
|
|
; NDD-NEXT: .LBB2_2: # %if.end
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest8rr_zf_double_p:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testb %dil, %dil # encoding: [0x40,0x84,0xff]
|
|
; SETZUCC-NEXT: je .LBB2_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB2_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: ucomisd %xmm0, %xmm0 # encoding: [0x66,0x0f,0x2e,0xc0]
|
|
; SETZUCC-NEXT: jnp .LBB2_3 # encoding: [0x7b,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB2_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.then
|
|
; SETZUCC-NEXT: movb %dil, (%rsi) # encoding: [0x40,0x88,0x3e]
|
|
; SETZUCC-NEXT: .LBB2_3: # %if.end
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
entry:
|
|
%tobool = icmp ne i8 %a, 0
|
|
%cmp = fcmp uno double %b, 0.0
|
|
%or.cond = select i1 %tobool, i1 %cmp, i1 false
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then:
|
|
store i8 %a, i8* %c, align 4
|
|
br label %if.end
|
|
|
|
if.end:
|
|
ret i8 0
|
|
}
|
|
|
|
define i8 @ctest8rr_zf_double_np(i8 %a, double %b, i8* nocapture %c) {
|
|
; CHECK-LABEL: ctest8rr_zf_double_np:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testb %dil, %dil
|
|
; CHECK-NEXT: setne %al
|
|
; CHECK-NEXT: ucomisd %xmm0, %xmm0
|
|
; CHECK-NEXT: setnp %cl
|
|
; CHECK-NEXT: andb %al, %cl
|
|
; CHECK-NEXT: cmpb $1, %cl
|
|
; CHECK-NEXT: jne .LBB3_2
|
|
; CHECK-NEXT: # %bb.1: # %if.then
|
|
; CHECK-NEXT: movb %dil, (%rsi)
|
|
; CHECK-NEXT: .LBB3_2: # %if.end
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest8rr_zf_double_np:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testb %dil, %dil
|
|
; NDD-NEXT: setne %al
|
|
; NDD-NEXT: ucomisd %xmm0, %xmm0
|
|
; NDD-NEXT: setnp %cl
|
|
; NDD-NEXT: andb %cl, %al
|
|
; NDD-NEXT: cmpb $1, %al
|
|
; NDD-NEXT: jne .LBB3_2
|
|
; NDD-NEXT: # %bb.1: # %if.then
|
|
; NDD-NEXT: movb %dil, (%rsi)
|
|
; NDD-NEXT: .LBB3_2: # %if.end
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest8rr_zf_double_np:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testb %dil, %dil # encoding: [0x40,0x84,0xff]
|
|
; SETZUCC-NEXT: je .LBB3_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB3_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: ucomisd %xmm0, %xmm0 # encoding: [0x66,0x0f,0x2e,0xc0]
|
|
; SETZUCC-NEXT: jp .LBB3_3 # encoding: [0x7a,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB3_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.then
|
|
; SETZUCC-NEXT: movb %dil, (%rsi) # encoding: [0x40,0x88,0x3e]
|
|
; SETZUCC-NEXT: .LBB3_3: # %if.end
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
entry:
|
|
%tobool = icmp ne i8 %a, 0
|
|
%cmp = fcmp ord double %b, 0.0
|
|
%or.cond = select i1 %tobool, i1 %cmp, i1 false
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then:
|
|
store i8 %a, i8* %c, align 4
|
|
br label %if.end
|
|
|
|
if.end:
|
|
ret i8 0
|
|
}
|
|
|
|
define void @ctest8rr_sf(i8 noundef %a, i8 noundef %b) {
|
|
; CHECK-LABEL: ctest8rr_sf:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testb %dil, %dil
|
|
; CHECK-NEXT: ctesteb {dfv=sf} %sil, %sil
|
|
; CHECK-NEXT: js .LBB4_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB4_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest8rr_sf:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testb %dil, %dil
|
|
; NDD-NEXT: ctesteb {dfv=sf} %sil, %sil
|
|
; NDD-NEXT: js .LBB4_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB4_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest8rr_sf:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testb %dil, %dil # encoding: [0x40,0x84,0xff]
|
|
; SETZUCC-NEXT: setzune %al # encoding: [0x62,0xf4,0x7f,0x18,0x45,0xc0]
|
|
; SETZUCC-NEXT: testb %sil, %sil # encoding: [0x40,0x84,0xf6]
|
|
; SETZUCC-NEXT: setzus %cl # encoding: [0x62,0xf4,0x7f,0x18,0x48,0xc1]
|
|
; SETZUCC-NEXT: orb %al, %cl # encoding: [0x08,0xc1]
|
|
; SETZUCC-NEXT: jne .LBB4_1 # encoding: [0x75,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB4_1, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: .LBB4_1: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
entry:
|
|
%cmp = icmp ule i8 %a, 0
|
|
%tobool = icmp sge i8 %b, 0
|
|
%or.cond = and i1 %cmp, %tobool
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %if.then, %entry
|
|
ret void
|
|
}
|
|
|
|
define i8 @ctest8rr_sf_2(i8 %a, i8 %b, i8* nocapture %c) {
|
|
; CHECK-LABEL: ctest8rr_sf_2:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testb %dil, %dil
|
|
; CHECK-NEXT: ctestleb {dfv=sf} %sil, %sil
|
|
; CHECK-NEXT: jns .LBB5_2
|
|
; CHECK-NEXT: # %bb.1: # %if.then
|
|
; CHECK-NEXT: movb %dil, (%rdx)
|
|
; CHECK-NEXT: .LBB5_2: # %if.end
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest8rr_sf_2:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testb %dil, %dil
|
|
; NDD-NEXT: ctestleb {dfv=sf} %sil, %sil
|
|
; NDD-NEXT: jns .LBB5_2
|
|
; NDD-NEXT: # %bb.1: # %if.then
|
|
; NDD-NEXT: movb %dil, (%rdx)
|
|
; NDD-NEXT: .LBB5_2: # %if.end
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest8rr_sf_2:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testb %dil, %dil # encoding: [0x40,0x84,0xff]
|
|
; SETZUCC-NEXT: setzug %al # encoding: [0x62,0xf4,0x7f,0x18,0x4f,0xc0]
|
|
; SETZUCC-NEXT: testb %sil, %sil # encoding: [0x40,0x84,0xf6]
|
|
; SETZUCC-NEXT: setzus %cl # encoding: [0x62,0xf4,0x7f,0x18,0x48,0xc1]
|
|
; SETZUCC-NEXT: orb %al, %cl # encoding: [0x08,0xc1]
|
|
; SETZUCC-NEXT: cmpb $1, %cl # encoding: [0x80,0xf9,0x01]
|
|
; SETZUCC-NEXT: jne .LBB5_2 # encoding: [0x75,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB5_2, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %if.then
|
|
; SETZUCC-NEXT: movb %dil, (%rdx) # encoding: [0x40,0x88,0x3a]
|
|
; SETZUCC-NEXT: .LBB5_2: # %if.end
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
entry:
|
|
%tobool = icmp sgt i8 %a, 0
|
|
%cmp = icmp slt i8 %b, 0
|
|
%or.cond = select i1 %tobool, i1 true, i1 %cmp
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then:
|
|
store i8 %a, i8* %c, align 4
|
|
br label %if.end
|
|
|
|
if.end:
|
|
ret i8 0
|
|
}
|
|
|
|
define i8 @ctest8rr_none(i8 %a, i8 %b, i8* nocapture %c) {
|
|
; CHECK-LABEL: ctest8rr_none:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testb %dil, %dil
|
|
; CHECK-NEXT: ctestneb {dfv=} %sil, %sil
|
|
; CHECK-NEXT: jne .LBB6_2
|
|
; CHECK-NEXT: # %bb.1: # %if.then
|
|
; CHECK-NEXT: movb %dil, (%rdx)
|
|
; CHECK-NEXT: .LBB6_2: # %if.end
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest8rr_none:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testb %dil, %dil
|
|
; NDD-NEXT: ctestneb {dfv=} %sil, %sil
|
|
; NDD-NEXT: jne .LBB6_2
|
|
; NDD-NEXT: # %bb.1: # %if.then
|
|
; NDD-NEXT: movb %dil, (%rdx)
|
|
; NDD-NEXT: .LBB6_2: # %if.end
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest8rr_none:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testb %dil, %dil # encoding: [0x40,0x84,0xff]
|
|
; SETZUCC-NEXT: setzune %al # encoding: [0x62,0xf4,0x7f,0x18,0x45,0xc0]
|
|
; SETZUCC-NEXT: testb %sil, %sil # encoding: [0x40,0x84,0xf6]
|
|
; SETZUCC-NEXT: setzue %cl # encoding: [0x62,0xf4,0x7f,0x18,0x44,0xc1]
|
|
; SETZUCC-NEXT: andb %al, %cl # encoding: [0x20,0xc1]
|
|
; SETZUCC-NEXT: cmpb $1, %cl # encoding: [0x80,0xf9,0x01]
|
|
; SETZUCC-NEXT: jne .LBB6_2 # encoding: [0x75,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB6_2, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %if.then
|
|
; SETZUCC-NEXT: movb %dil, (%rdx) # encoding: [0x40,0x88,0x3a]
|
|
; SETZUCC-NEXT: .LBB6_2: # %if.end
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
entry:
|
|
%tobool = icmp ne i8 %a, 0
|
|
%cmp = icmp eq i8 %b, 0
|
|
%or.cond = select i1 %tobool, i1 %cmp, i1 false
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then:
|
|
store i8 %a, i8* %c, align 4
|
|
br label %if.end
|
|
|
|
if.end:
|
|
ret i8 0
|
|
}
|
|
|
|
define void @ctest16rr_sf(i16 noundef %a, i16 noundef %b) {
|
|
; CHECK-LABEL: ctest16rr_sf:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testw %di, %di
|
|
; CHECK-NEXT: ctestlew {dfv=sf} %si, %si
|
|
; CHECK-NEXT: jns .LBB7_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB7_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest16rr_sf:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testw %di, %di
|
|
; NDD-NEXT: ctestlew {dfv=sf} %si, %si
|
|
; NDD-NEXT: jns .LBB7_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB7_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest16rr_sf:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testw %di, %di # encoding: [0x66,0x85,0xff]
|
|
; SETZUCC-NEXT: setzule %al # encoding: [0x62,0xf4,0x7f,0x18,0x4e,0xc0]
|
|
; SETZUCC-NEXT: testw %si, %si # encoding: [0x66,0x85,0xf6]
|
|
; SETZUCC-NEXT: setzuns %cl # encoding: [0x62,0xf4,0x7f,0x18,0x49,0xc1]
|
|
; SETZUCC-NEXT: testb %cl, %al # encoding: [0x84,0xc8]
|
|
; SETZUCC-NEXT: jne .LBB7_1 # encoding: [0x75,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB7_1, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: .LBB7_1: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
entry:
|
|
%cmp = icmp sgt i16 %a, 0
|
|
%cmp1 = icmp slt i16 %b, 0
|
|
%or.cond = or i1 %cmp, %cmp1
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %entry, %if.then
|
|
ret void
|
|
}
|
|
|
|
define void @ctest32rr_zf(i32 noundef %a, i32 noundef %b) {
|
|
; CHECK-LABEL: ctest32rr_zf:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testl %edi, %edi
|
|
; CHECK-NEXT: ctestsl {dfv=zf} %esi, %esi
|
|
; CHECK-NEXT: jne .LBB8_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB8_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest32rr_zf:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testl %edi, %edi
|
|
; NDD-NEXT: ctestsl {dfv=zf} %esi, %esi
|
|
; NDD-NEXT: jne .LBB8_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB8_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest32rr_zf:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testl %edi, %edi # encoding: [0x85,0xff]
|
|
; SETZUCC-NEXT: setzus %al # encoding: [0x62,0xf4,0x7f,0x18,0x48,0xc0]
|
|
; SETZUCC-NEXT: testl %esi, %esi # encoding: [0x85,0xf6]
|
|
; SETZUCC-NEXT: setzune %cl # encoding: [0x62,0xf4,0x7f,0x18,0x45,0xc1]
|
|
; SETZUCC-NEXT: testb %cl, %al # encoding: [0x84,0xc8]
|
|
; SETZUCC-NEXT: jne .LBB8_1 # encoding: [0x75,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB8_1, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: .LBB8_1: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
entry:
|
|
%cmp = icmp sge i32 %a, 0
|
|
%cmp1 = icmp eq i32 %b, 0
|
|
%or.cond = or i1 %cmp, %cmp1
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %entry, %if.then
|
|
ret void
|
|
}
|
|
|
|
define void @ctest8ri_zf(i8 noundef %a, i8 noundef %b) {
|
|
; CHECK-LABEL: ctest8ri_zf:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testb %dil, %dil
|
|
; CHECK-NEXT: ctestneb {dfv=zf} $123, %sil
|
|
; CHECK-NEXT: jne .LBB9_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB9_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest8ri_zf:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testb %dil, %dil
|
|
; NDD-NEXT: ctestneb {dfv=zf} $123, %sil
|
|
; NDD-NEXT: jne .LBB9_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB9_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest8ri_zf:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testb %dil, %dil # encoding: [0x40,0x84,0xff]
|
|
; SETZUCC-NEXT: je .LBB9_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB9_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: andb $123, %sil # encoding: [0x40,0x80,0xe6,0x7b]
|
|
; SETZUCC-NEXT: je .LBB9_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB9_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
; SETZUCC-NEXT: .LBB9_3: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
entry:
|
|
%cmp = icmp eq i8 %a, 0
|
|
%and = and i8 %b, 123
|
|
%cmp1 = icmp eq i8 %and, 0
|
|
%or.cond = or i1 %cmp, %cmp1
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %entry, %if.then
|
|
ret void
|
|
}
|
|
|
|
define void @ctest16ri_zf(i16 noundef %a, i16 noundef %b) {
|
|
; CHECK-LABEL: ctest16ri_zf:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: andl $1234, %esi # imm = 0x4D2
|
|
; CHECK-NEXT: testw %di, %di
|
|
; CHECK-NEXT: ctestnew {dfv=zf} %si, %si
|
|
; CHECK-NEXT: jne .LBB10_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB10_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest16ri_zf:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testw %di, %di
|
|
; NDD-NEXT: ctestnew {dfv=zf} $1234, %si # imm = 0x4D2
|
|
; NDD-NEXT: jne .LBB10_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB10_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest16ri_zf:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testw %di, %di # encoding: [0x66,0x85,0xff]
|
|
; SETZUCC-NEXT: je .LBB10_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB10_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: andl $1234, %esi # encoding: [0x81,0xe6,0xd2,0x04,0x00,0x00]
|
|
; SETZUCC-NEXT: # imm = 0x4D2
|
|
; SETZUCC-NEXT: je .LBB10_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB10_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
; SETZUCC-NEXT: .LBB10_3: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
entry:
|
|
%cmp = icmp eq i16 %a, 0
|
|
%and = and i16 %b, 1234
|
|
%cmp1 = icmp eq i16 %and, 0
|
|
%or.cond = or i1 %cmp, %cmp1
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %entry, %if.then
|
|
ret void
|
|
}
|
|
|
|
define void @ctest32ri_zf(i32 noundef %a, i32 noundef %b) {
|
|
; CHECK-LABEL: ctest32ri_zf:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testl %edi, %edi
|
|
; CHECK-NEXT: ctestnel {dfv=zf} $12345, %esi # imm = 0x3039
|
|
; CHECK-NEXT: jne .LBB11_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB11_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest32ri_zf:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testl %edi, %edi
|
|
; NDD-NEXT: ctestnel {dfv=zf} $12345, %esi # imm = 0x3039
|
|
; NDD-NEXT: jne .LBB11_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB11_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest32ri_zf:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testl %edi, %edi # encoding: [0x85,0xff]
|
|
; SETZUCC-NEXT: je .LBB11_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB11_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: andl $12345, %esi # encoding: [0x81,0xe6,0x39,0x30,0x00,0x00]
|
|
; SETZUCC-NEXT: # imm = 0x3039
|
|
; SETZUCC-NEXT: je .LBB11_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB11_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
; SETZUCC-NEXT: .LBB11_3: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
entry:
|
|
%cmp = icmp eq i32 %a, 0
|
|
%and = and i32 %b, 12345
|
|
%cmp1 = icmp eq i32 %and, 0
|
|
%or.cond = or i1 %cmp, %cmp1
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %entry, %if.then
|
|
ret void
|
|
}
|
|
|
|
define void @ctest64ri32_zf(i64 noundef %a, i64 noundef %b) {
|
|
; CHECK-LABEL: ctest64ri32_zf:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testq %rdi, %rdi
|
|
; CHECK-NEXT: ctestneq {dfv=zf} $123456, %rsi # imm = 0x1E240
|
|
; CHECK-NEXT: jne .LBB12_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB12_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest64ri32_zf:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testq %rdi, %rdi
|
|
; NDD-NEXT: ctestneq {dfv=zf} $123456, %rsi # imm = 0x1E240
|
|
; NDD-NEXT: jne .LBB12_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB12_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest64ri32_zf:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testq %rdi, %rdi # encoding: [0x48,0x85,0xff]
|
|
; SETZUCC-NEXT: je .LBB12_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB12_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: andl $123456, %esi # encoding: [0x81,0xe6,0x40,0xe2,0x01,0x00]
|
|
; SETZUCC-NEXT: # imm = 0x1E240
|
|
; SETZUCC-NEXT: je .LBB12_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB12_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
; SETZUCC-NEXT: .LBB12_3: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
entry:
|
|
%cmp = icmp eq i64 %a, 0
|
|
%and = and i64 %b, 123456
|
|
%cmp1 = icmp eq i64 %and, 0
|
|
%or.cond = or i1 %cmp, %cmp1
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %entry, %if.then
|
|
ret void
|
|
}
|
|
|
|
define void @ctest8mr_zf(i8 noundef %a, ptr %ptr) {
|
|
; CHECK-LABEL: ctest8mr_zf:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: movzbl (%rsi), %eax
|
|
; CHECK-NEXT: testb %dil, %dil
|
|
; CHECK-NEXT: ctestneb {dfv=zf} %al, %al
|
|
; CHECK-NEXT: jne .LBB13_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB13_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest8mr_zf:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: movzbl (%rsi), %eax
|
|
; NDD-NEXT: testb %dil, %dil
|
|
; NDD-NEXT: ctestneb {dfv=zf} %al, %al
|
|
; NDD-NEXT: jne .LBB13_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB13_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest8mr_zf:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testb %dil, %dil # encoding: [0x40,0x84,0xff]
|
|
; SETZUCC-NEXT: je .LBB13_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB13_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: cmpb $0, (%rsi) # encoding: [0x80,0x3e,0x00]
|
|
; SETZUCC-NEXT: je .LBB13_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB13_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
; SETZUCC-NEXT: .LBB13_3: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
entry:
|
|
%b = load i8, ptr %ptr
|
|
%cmp = icmp eq i8 %a, 0
|
|
%cmp1 = icmp eq i8 %b, 0
|
|
%or.cond = or i1 %cmp, %cmp1
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %entry, %if.then
|
|
ret void
|
|
}
|
|
|
|
define void @ctest16mr_zf(i16 noundef %a, ptr %ptr) {
|
|
; CHECK-LABEL: ctest16mr_zf:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: movzwl (%rsi), %eax
|
|
; CHECK-NEXT: testw %di, %di
|
|
; CHECK-NEXT: ctestnew {dfv=zf} %ax, %ax
|
|
; CHECK-NEXT: jne .LBB14_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB14_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest16mr_zf:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: movzwl (%rsi), %eax
|
|
; NDD-NEXT: testw %di, %di
|
|
; NDD-NEXT: ctestnew {dfv=zf} %ax, %ax
|
|
; NDD-NEXT: jne .LBB14_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB14_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest16mr_zf:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testw %di, %di # encoding: [0x66,0x85,0xff]
|
|
; SETZUCC-NEXT: je .LBB14_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB14_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: cmpw $0, (%rsi) # encoding: [0x66,0x83,0x3e,0x00]
|
|
; SETZUCC-NEXT: je .LBB14_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB14_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
; SETZUCC-NEXT: .LBB14_3: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
entry:
|
|
%b = load i16, ptr %ptr
|
|
%cmp = icmp eq i16 %a, 0
|
|
%cmp1 = icmp eq i16 %b, 0
|
|
%or.cond = or i1 %cmp, %cmp1
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %entry, %if.then
|
|
ret void
|
|
}
|
|
|
|
define void @ctest32mr_cf(i32 noundef %a, ptr %ptr) {
|
|
; CHECK-LABEL: ctest32mr_cf:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: movl (%rsi), %eax
|
|
; CHECK-NEXT: testl %edi, %edi
|
|
; CHECK-NEXT: ctestnel {dfv=zf} %eax, %eax
|
|
; CHECK-NEXT: jne .LBB15_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB15_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest32mr_cf:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: movl (%rsi), %eax
|
|
; NDD-NEXT: testl %edi, %edi
|
|
; NDD-NEXT: ctestnel {dfv=zf} %eax, %eax
|
|
; NDD-NEXT: jne .LBB15_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB15_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest32mr_cf:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testl %edi, %edi # encoding: [0x85,0xff]
|
|
; SETZUCC-NEXT: je .LBB15_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB15_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: cmpl $0, (%rsi) # encoding: [0x83,0x3e,0x00]
|
|
; SETZUCC-NEXT: je .LBB15_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB15_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
; SETZUCC-NEXT: .LBB15_3: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
entry:
|
|
%b = load i32, ptr %ptr
|
|
%cmp = icmp eq i32 %a, 0
|
|
%cmp1 = icmp eq i32 %b, 0
|
|
%or.cond = or i1 %cmp, %cmp1
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %entry, %if.then
|
|
ret void
|
|
}
|
|
|
|
define void @ctest64mr_zf(i64 noundef %a, ptr %ptr) {
|
|
; CHECK-LABEL: ctest64mr_zf:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: movq (%rsi), %rax
|
|
; CHECK-NEXT: testq %rdi, %rdi
|
|
; CHECK-NEXT: ctestneq {dfv=zf} %rax, %rax
|
|
; CHECK-NEXT: jne .LBB16_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB16_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest64mr_zf:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: movq (%rsi), %rax
|
|
; NDD-NEXT: testq %rdi, %rdi
|
|
; NDD-NEXT: ctestneq {dfv=zf} %rax, %rax
|
|
; NDD-NEXT: jne .LBB16_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB16_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest64mr_zf:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testq %rdi, %rdi # encoding: [0x48,0x85,0xff]
|
|
; SETZUCC-NEXT: je .LBB16_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB16_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: cmpq $0, (%rsi) # encoding: [0x48,0x83,0x3e,0x00]
|
|
; SETZUCC-NEXT: je .LBB16_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB16_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
; SETZUCC-NEXT: .LBB16_3: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
entry:
|
|
%b = load i64, ptr %ptr
|
|
%cmp = icmp eq i64 %a, 0
|
|
%cmp1 = icmp eq i64 %b, 0
|
|
%or.cond = or i1 %cmp, %cmp1
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %entry, %if.then
|
|
ret void
|
|
}
|
|
|
|
define void @ctest8mi_zf(i8 noundef %a, ptr %ptr) {
|
|
; CHECK-LABEL: ctest8mi_zf:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testb %dil, %dil
|
|
; CHECK-NEXT: ctestneb {dfv=zf} $123, (%rsi)
|
|
; CHECK-NEXT: jne .LBB17_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB17_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest8mi_zf:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testb %dil, %dil
|
|
; NDD-NEXT: ctestneb {dfv=zf} $123, (%rsi)
|
|
; NDD-NEXT: jne .LBB17_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB17_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest8mi_zf:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testb %dil, %dil # encoding: [0x40,0x84,0xff]
|
|
; SETZUCC-NEXT: je .LBB17_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB17_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: movzbl (%rsi), %eax # encoding: [0x0f,0xb6,0x06]
|
|
; SETZUCC-NEXT: andb $123, %al # encoding: [0x24,0x7b]
|
|
; SETZUCC-NEXT: je .LBB17_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB17_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
; SETZUCC-NEXT: .LBB17_3: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
entry:
|
|
%b = load i8, ptr %ptr
|
|
%cmp = icmp eq i8 %a, 0
|
|
%and = and i8 %b, 123
|
|
%cmp1 = icmp eq i8 %and, 0
|
|
%or.cond = or i1 %cmp, %cmp1
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %entry, %if.then
|
|
ret void
|
|
}
|
|
|
|
define void @ctest16mi_zf(i16 noundef %a, ptr %ptr) {
|
|
; CHECK-LABEL: ctest16mi_zf:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: movzwl (%rsi), %eax
|
|
; CHECK-NEXT: andl $1234, %eax # imm = 0x4D2
|
|
; CHECK-NEXT: testw %di, %di
|
|
; CHECK-NEXT: ctestnew {dfv=zf} %ax, %ax
|
|
; CHECK-NEXT: jne .LBB18_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB18_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest16mi_zf:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testw %di, %di
|
|
; NDD-NEXT: ctestnew {dfv=zf} $1234, (%rsi) # imm = 0x4D2
|
|
; NDD-NEXT: jne .LBB18_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB18_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest16mi_zf:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testw %di, %di # encoding: [0x66,0x85,0xff]
|
|
; SETZUCC-NEXT: je .LBB18_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB18_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: movzwl (%rsi), %eax # encoding: [0x0f,0xb7,0x06]
|
|
; SETZUCC-NEXT: andl $1234, %eax # encoding: [0x25,0xd2,0x04,0x00,0x00]
|
|
; SETZUCC-NEXT: # imm = 0x4D2
|
|
; SETZUCC-NEXT: je .LBB18_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB18_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
; SETZUCC-NEXT: .LBB18_3: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
entry:
|
|
%b = load i16, ptr %ptr
|
|
%cmp = icmp eq i16 %a, 0
|
|
%and = and i16 %b, 1234
|
|
%cmp1 = icmp eq i16 %and, 0
|
|
%or.cond = or i1 %cmp, %cmp1
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %entry, %if.then
|
|
ret void
|
|
}
|
|
|
|
define void @ctest32mi_zf(i32 noundef %a, ptr %ptr) {
|
|
; CHECK-LABEL: ctest32mi_zf:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: movzwl (%rsi), %eax
|
|
; CHECK-NEXT: andl $12345, %eax # imm = 0x3039
|
|
; CHECK-NEXT: testl %edi, %edi
|
|
; CHECK-NEXT: ctestnew {dfv=zf} %ax, %ax
|
|
; CHECK-NEXT: jne .LBB19_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB19_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest32mi_zf:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testl %edi, %edi
|
|
; NDD-NEXT: ctestnew {dfv=zf} $12345, (%rsi) # imm = 0x3039
|
|
; NDD-NEXT: jne .LBB19_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB19_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest32mi_zf:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testl %edi, %edi # encoding: [0x85,0xff]
|
|
; SETZUCC-NEXT: je .LBB19_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB19_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: movl $12345, %eax # encoding: [0xb8,0x39,0x30,0x00,0x00]
|
|
; SETZUCC-NEXT: # imm = 0x3039
|
|
; SETZUCC-NEXT: andl (%rsi), %eax # encoding: [0x23,0x06]
|
|
; SETZUCC-NEXT: je .LBB19_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB19_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
; SETZUCC-NEXT: .LBB19_3: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
entry:
|
|
%b = load i32, ptr %ptr
|
|
%cmp = icmp eq i32 %a, 0
|
|
%and = and i32 %b, 12345
|
|
%cmp1 = icmp eq i32 %and, 0
|
|
%or.cond = or i1 %cmp, %cmp1
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %entry, %if.then
|
|
ret void
|
|
}
|
|
|
|
define void @ctest64mi32_zf(i64 noundef %a, ptr %ptr) {
|
|
; CHECK-LABEL: ctest64mi32_zf:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testq %rdi, %rdi
|
|
; CHECK-NEXT: ctestnel {dfv=zf} $123456, (%rsi) # imm = 0x1E240
|
|
; CHECK-NEXT: jne .LBB20_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB20_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest64mi32_zf:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testq %rdi, %rdi
|
|
; NDD-NEXT: ctestnel {dfv=zf} $123456, (%rsi) # imm = 0x1E240
|
|
; NDD-NEXT: jne .LBB20_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB20_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest64mi32_zf:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testq %rdi, %rdi # encoding: [0x48,0x85,0xff]
|
|
; SETZUCC-NEXT: je .LBB20_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB20_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: movq (%rsi), %rax # encoding: [0x48,0x8b,0x06]
|
|
; SETZUCC-NEXT: andl $123456, %eax # encoding: [0x25,0x40,0xe2,0x01,0x00]
|
|
; SETZUCC-NEXT: # imm = 0x1E240
|
|
; SETZUCC-NEXT: je .LBB20_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB20_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
; SETZUCC-NEXT: .LBB20_3: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
entry:
|
|
%b = load i64, ptr %ptr
|
|
%cmp = icmp eq i64 %a, 0
|
|
%and = and i64 %b, 123456
|
|
%cmp1 = icmp eq i64 %and, 0
|
|
%or.cond = or i1 %cmp, %cmp1
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %entry, %if.then
|
|
ret void
|
|
}
|
|
|
|
define void @ctest_continous(i32 noundef %a, i32 noundef %b, i32 noundef %c) {
|
|
; CHECK-LABEL: ctest_continous:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: cmpl %esi, %edi
|
|
; CHECK-NEXT: ctestll {dfv=} %esi, %esi
|
|
; CHECK-NEXT: ctestnsl {dfv=sf} %edx, %edx
|
|
; CHECK-NEXT: jns .LBB21_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB21_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest_continous:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: cmpl %esi, %edi
|
|
; NDD-NEXT: ctestll {dfv=} %esi, %esi
|
|
; NDD-NEXT: ctestnsl {dfv=sf} %edx, %edx
|
|
; NDD-NEXT: jns .LBB21_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB21_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest_continous:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: cmpl %esi, %edi # encoding: [0x39,0xf7]
|
|
; SETZUCC-NEXT: setzuge %al # encoding: [0x62,0xf4,0x7f,0x18,0x4d,0xc0]
|
|
; SETZUCC-NEXT: testl %esi, %esi # encoding: [0x85,0xf6]
|
|
; SETZUCC-NEXT: setzuns %cl # encoding: [0x62,0xf4,0x7f,0x18,0x49,0xc1]
|
|
; SETZUCC-NEXT: orb %al, %cl # encoding: [0x08,0xc1]
|
|
; SETZUCC-NEXT: testl %edx, %edx # encoding: [0x85,0xd2]
|
|
; SETZUCC-NEXT: setzuns %al # encoding: [0x62,0xf4,0x7f,0x18,0x49,0xc0]
|
|
; SETZUCC-NEXT: testb %al, %cl # encoding: [0x84,0xc1]
|
|
; SETZUCC-NEXT: jne .LBB21_1 # encoding: [0x75,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB21_1, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: .LBB21_1: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
entry:
|
|
%cmp = icmp slt i32 %a, %b
|
|
%cmp1 = icmp slt i32 %b, 0
|
|
%or.cond = and i1 %cmp, %cmp1
|
|
%cmp2 = icmp slt i32 %c, 0
|
|
%or.cond3 = or i1 %or.cond, %cmp2
|
|
br i1 %or.cond3, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %if.then, %entry
|
|
ret void
|
|
}
|
|
|
|
define i32 @ctest_nobranch(i32 noundef %a, i32 noundef %b) {
|
|
; CHECK-LABEL: ctest_nobranch:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testl %edi, %edi
|
|
; CHECK-NEXT: ctestlel {dfv=} %esi, %esi
|
|
; CHECK-NEXT: setg %al
|
|
; CHECK-NEXT: movzbl %al, %eax
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest_nobranch:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testl %edi, %edi
|
|
; NDD-NEXT: ctestlel {dfv=} %esi, %esi
|
|
; NDD-NEXT: setg %al
|
|
; NDD-NEXT: movzbl %al, %eax
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest_nobranch:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testl %edi, %edi # encoding: [0x85,0xff]
|
|
; SETZUCC-NEXT: setzug %al # encoding: [0x62,0xf4,0x7f,0x18,0x4f,0xc0]
|
|
; SETZUCC-NEXT: testl %esi, %esi # encoding: [0x85,0xf6]
|
|
; SETZUCC-NEXT: setzug %cl # encoding: [0x62,0xf4,0x7f,0x18,0x4f,0xc1]
|
|
; SETZUCC-NEXT: orb %al, %cl # encoding: [0x08,0xc1]
|
|
; SETZUCC-NEXT: movzbl %cl, %eax # encoding: [0x0f,0xb6,0xc1]
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
entry:
|
|
%cmp = icmp sgt i32 %a, 0
|
|
%cmp1 = icmp sgt i32 %b, 0
|
|
%or.cond.not = or i1 %cmp, %cmp1
|
|
%. = zext i1 %or.cond.not to i32
|
|
ret i32 %.
|
|
}
|
|
|
|
define i32 @ctest_continous_nobranch(i32 noundef %a, i32 noundef %b, i32 noundef %c) {
|
|
; CHECK-LABEL: ctest_continous_nobranch:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testl %edi, %edi
|
|
; CHECK-NEXT: ctestlel {dfv=sf} %esi, %esi
|
|
; CHECK-NEXT: ctestsl {dfv=zf} %edx, %edx
|
|
; CHECK-NEXT: setg %al
|
|
; CHECK-NEXT: movzbl %al, %eax
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest_continous_nobranch:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testl %edi, %edi
|
|
; NDD-NEXT: ctestlel {dfv=sf} %esi, %esi
|
|
; NDD-NEXT: ctestsl {dfv=zf} %edx, %edx
|
|
; NDD-NEXT: setg %al
|
|
; NDD-NEXT: movzbl %al, %eax
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest_continous_nobranch:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testl %edi, %edi # encoding: [0x85,0xff]
|
|
; SETZUCC-NEXT: setzug %al # encoding: [0x62,0xf4,0x7f,0x18,0x4f,0xc0]
|
|
; SETZUCC-NEXT: testl %esi, %esi # encoding: [0x85,0xf6]
|
|
; SETZUCC-NEXT: setzus %cl # encoding: [0x62,0xf4,0x7f,0x18,0x48,0xc1]
|
|
; SETZUCC-NEXT: testl %edx, %edx # encoding: [0x85,0xd2]
|
|
; SETZUCC-NEXT: setzug %dl # encoding: [0x62,0xf4,0x7f,0x18,0x4f,0xc2]
|
|
; SETZUCC-NEXT: orb %al, %cl # encoding: [0x08,0xc1]
|
|
; SETZUCC-NEXT: andb %dl, %cl # encoding: [0x20,0xd1]
|
|
; SETZUCC-NEXT: movzbl %cl, %eax # encoding: [0x0f,0xb6,0xc1]
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
entry:
|
|
%cmp = icmp sgt i32 %a, 0
|
|
%cmp1 = icmp slt i32 %b, 0
|
|
%cmp2 = icmp sgt i32 %c, 0
|
|
%or1 = or i1 %cmp, %cmp1
|
|
%or2 = and i1 %or1, %cmp2
|
|
%. = zext i1 %or2 to i32
|
|
ret i32 %.
|
|
}
|
|
|
|
define void @ctest64ri64(i64 noundef %a, i64 noundef %b) {
|
|
; CHECK-LABEL: ctest64ri64:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: testq %rdi, %rdi
|
|
; CHECK-NEXT: movabsq $9992147483647, %rax # imm = 0x9167A66BBFF
|
|
; CHECK-NEXT: ctestneq {dfv=zf} %rax, %rsi
|
|
; CHECK-NEXT: jne .LBB24_1
|
|
; CHECK-NEXT: # %bb.2: # %if.then
|
|
; CHECK-NEXT: xorl %eax, %eax
|
|
; CHECK-NEXT: jmp foo # TAILCALL
|
|
; CHECK-NEXT: .LBB24_1: # %if.end
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: ctest64ri64:
|
|
; NDD: # %bb.0: # %entry
|
|
; NDD-NEXT: testq %rdi, %rdi
|
|
; NDD-NEXT: movabsq $9992147483647, %rax # imm = 0x9167A66BBFF
|
|
; NDD-NEXT: ctestneq {dfv=zf} %rax, %rsi
|
|
; NDD-NEXT: jne .LBB24_1
|
|
; NDD-NEXT: # %bb.2: # %if.then
|
|
; NDD-NEXT: xorl %eax, %eax
|
|
; NDD-NEXT: jmp foo # TAILCALL
|
|
; NDD-NEXT: .LBB24_1: # %if.end
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: ctest64ri64:
|
|
; SETZUCC: # %bb.0: # %entry
|
|
; SETZUCC-NEXT: testq %rdi, %rdi # encoding: [0x48,0x85,0xff]
|
|
; SETZUCC-NEXT: je .LBB24_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB24_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.1: # %entry
|
|
; SETZUCC-NEXT: movabsq $9992147483647, %rax # encoding: [0x48,0xb8,0xff,0xbb,0x66,0x7a,0x16,0x09,0x00,0x00]
|
|
; SETZUCC-NEXT: # imm = 0x9167A66BBFF
|
|
; SETZUCC-NEXT: andq %rax, %rsi # encoding: [0x48,0x21,0xc6]
|
|
; SETZUCC-NEXT: je .LBB24_3 # encoding: [0x74,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: .LBB24_3, kind: FK_PCRel_1
|
|
; SETZUCC-NEXT: # %bb.2: # %if.end
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
; SETZUCC-NEXT: .LBB24_3: # %if.then
|
|
; SETZUCC-NEXT: xorl %eax, %eax # encoding: [0x31,0xc0]
|
|
; SETZUCC-NEXT: jmp foo # TAILCALL
|
|
; SETZUCC-NEXT: # encoding: [0xeb,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 1, value: foo, kind: FK_PCRel_1
|
|
entry:
|
|
%cmp = icmp eq i64 %a, 0
|
|
%and = and i64 %b, 9992147483647
|
|
%cmp1 = icmp eq i64 %and, 0
|
|
%or.cond = or i1 %cmp, %cmp1
|
|
br i1 %or.cond, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
tail call void (...) @foo()
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %entry, %if.then
|
|
ret void
|
|
}
|
|
|
|
define void @cmp_srem(ptr %p, i32 %a, ptr %b) {
|
|
; CHECK-LABEL: cmp_srem:
|
|
; CHECK: # %bb.0: # %bb
|
|
; CHECK-NEXT: movq %rdx, %rcx
|
|
; CHECK-NEXT: movl %esi, %eax
|
|
; CHECK-NEXT: subl $1, %eax
|
|
; CHECK-NEXT: movl (%rdi), %edi
|
|
; CHECK-NEXT: cltd
|
|
; CHECK-NEXT: {nf} idivl %edi
|
|
; CHECK-NEXT: ctestnel {dfv=} %edx, %edx
|
|
; CHECK-NEXT: sete %al
|
|
; CHECK-NEXT: cmpl $1, %esi
|
|
; CHECK-NEXT: ccmpael {dfv=zf} $1, %edi
|
|
; CHECK-NEXT: sete %dl
|
|
; CHECK-NEXT: orb %al, %dl
|
|
; CHECK-NEXT: movb %dl, (%rcx)
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: cmp_srem:
|
|
; NDD: # %bb.0: # %bb
|
|
; NDD-NEXT: movq %rdx, %rcx
|
|
; NDD-NEXT: subl $1, %esi, %eax
|
|
; NDD-NEXT: movl (%rdi), %edi
|
|
; NDD-NEXT: cltd
|
|
; NDD-NEXT: {nf} idivl %edi
|
|
; NDD-NEXT: ctestnel {dfv=} %edx, %edx
|
|
; NDD-NEXT: sete %al
|
|
; NDD-NEXT: cmpl $1, %esi
|
|
; NDD-NEXT: ccmpael {dfv=zf} $1, %edi
|
|
; NDD-NEXT: sete %dl
|
|
; NDD-NEXT: orb %dl, %al
|
|
; NDD-NEXT: movb %al, (%rcx)
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: cmp_srem:
|
|
; SETZUCC: # %bb.0: # %bb
|
|
; SETZUCC-NEXT: movq %rdx, %rcx # encoding: [0x48,0x89,0xd1]
|
|
; SETZUCC-NEXT: movl %esi, %eax # encoding: [0x89,0xf0]
|
|
; SETZUCC-NEXT: movl (%rdi), %esi # encoding: [0x8b,0x37]
|
|
; SETZUCC-NEXT: cmpl $1, %esi # encoding: [0x83,0xfe,0x01]
|
|
; SETZUCC-NEXT: setzue %dl # encoding: [0x62,0xf4,0x7f,0x18,0x44,0xc2]
|
|
; SETZUCC-NEXT: subl $1, %eax # encoding: [0x83,0xe8,0x01]
|
|
; SETZUCC-NEXT: setzub %dil # encoding: [0x62,0xf4,0x7f,0x18,0x42,0xc7]
|
|
; SETZUCC-NEXT: setzune %r8b # encoding: [0x62,0xd4,0x7f,0x18,0x45,0xc0]
|
|
; SETZUCC-NEXT: orb %dl, %dil # encoding: [0x40,0x08,0xd7]
|
|
; SETZUCC-NEXT: cltd # encoding: [0x99]
|
|
; SETZUCC-NEXT: idivl %esi # encoding: [0xf7,0xfe]
|
|
; SETZUCC-NEXT: testl %edx, %edx # encoding: [0x85,0xd2]
|
|
; SETZUCC-NEXT: setzue %al # encoding: [0x62,0xf4,0x7f,0x18,0x44,0xc0]
|
|
; SETZUCC-NEXT: andb %r8b, %al # encoding: [0x44,0x20,0xc0]
|
|
; SETZUCC-NEXT: orb %dil, %al # encoding: [0x40,0x08,0xf8]
|
|
; SETZUCC-NEXT: movb %al, (%rcx) # encoding: [0x88,0x01]
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
bb:
|
|
%i = icmp eq i32 %a, 0
|
|
%i2 = load i32, ptr %p, align 4
|
|
%i3 = icmp eq i32 %i2, 1
|
|
%i4 = or i1 %i, %i3
|
|
%i5 = add i32 %a, -1
|
|
%i6 = srem i32 %i5, %i2
|
|
%i7 = icmp eq i32 %i6, 0
|
|
%i8 = icmp ne i32 %a, 1
|
|
%i9 = and i1 %i8, %i7
|
|
%i10 = or i1 %i4, %i9
|
|
store i1 %i10, ptr %b, align 1
|
|
ret void
|
|
}
|
|
|
|
; Fast-math patterns with CTEST instructions.
|
|
; Fast-math canonicalization can introduce FREEZE nodes around SETCC operations.
|
|
; With SETCC in isGuaranteedNotToBeUndefOrPoisonForTargetNode, these FREEZE
|
|
; nodes are eliminated early, allowing CTEST pattern matching to work naturally.
|
|
define i32 @test_and_fp_int(double %a, i32 %b) {
|
|
; CHECK-LABEL: test_and_fp_int:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: ucomisd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
|
|
; CHECK-NEXT: ctestbl {dfv=zf} %edi, %edi
|
|
; CHECK-NEXT: setne %al
|
|
; CHECK-NEXT: movzbl %al, %eax
|
|
; CHECK-NEXT: retq
|
|
;
|
|
; NDD-LABEL: test_and_fp_int:
|
|
; NDD: # %bb.0:
|
|
; NDD-NEXT: ucomisd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
|
|
; NDD-NEXT: ctestbl {dfv=zf} %edi, %edi
|
|
; NDD-NEXT: setne %al
|
|
; NDD-NEXT: movzbl %al, %eax
|
|
; NDD-NEXT: retq
|
|
;
|
|
; SETZUCC-LABEL: test_and_fp_int:
|
|
; SETZUCC: # %bb.0:
|
|
; SETZUCC-NEXT: testl %edi, %edi # encoding: [0x85,0xff]
|
|
; SETZUCC-NEXT: setzune %al # encoding: [0x62,0xf4,0x7f,0x18,0x45,0xc0]
|
|
; SETZUCC-NEXT: ucomisd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # encoding: [0x66,0x0f,0x2e,0x05,A,A,A,A]
|
|
; SETZUCC-NEXT: # fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: reloc_riprel_4byte
|
|
; SETZUCC-NEXT: setzub %cl # encoding: [0x62,0xf4,0x7f,0x18,0x42,0xc1]
|
|
; SETZUCC-NEXT: andb %al, %cl # encoding: [0x20,0xc1]
|
|
; SETZUCC-NEXT: movzbl %cl, %eax # encoding: [0x0f,0xb6,0xc1]
|
|
; SETZUCC-NEXT: retq # encoding: [0xc3]
|
|
%cmp = icmp ne i32 %b, 0
|
|
%cmp1 = fcmp fast olt double %a, 1.500000e+00
|
|
%sel = select i1 %cmp, i1 %cmp1, i1 false
|
|
%ext = zext i1 %sel to i32
|
|
ret i32 %ext
|
|
}
|
|
declare dso_local void @foo(...)
|