| ; 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 |
| |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| } |
| |
| declare dso_local void @foo(...) |