Skip to content

[X86][AVX512] Check input-types to COMX #118606

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Dec 9, 2024
Merged
6 changes: 4 additions & 2 deletions llvm/lib/Target/X86/X86ISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24228,8 +24228,10 @@ SDValue X86TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
if (Subtarget.hasAVX10_2()) {
if (CC == ISD::SETOEQ || CC == ISD::SETUNE) {
auto NewCC = (CC == ISD::SETOEQ) ? X86::COND_E : (X86::COND_NE);
return getSETCC(NewCC, DAG.getNode(X86ISD::UCOMX, dl, MVT::i32, Op0, Op1),
dl, DAG);
assert(Op0.getSimpleValueType() != MVT::bf16 && "Unsupported Type");
if (Op0.getSimpleValueType() != MVT::f80)
return getSETCC(
NewCC, DAG.getNode(X86ISD::UCOMX, dl, MVT::i32, Op0, Op1), dl, DAG);
}
}
// Handle floating point.
Expand Down
41 changes: 41 additions & 0 deletions llvm/test/CodeGen/X86/avx10_2-cmp.ll
Original file line number Diff line number Diff line change
Expand Up @@ -235,3 +235,44 @@ define i1 @dune_mem(ptr %xp, ptr %yp) {
%1 = fcmp une double %x, %y
ret i1 %1
}

define i32 @PR118606(x86_fp80 %val1) #0 {
; X64-LABEL: PR118606:
; X64: # %bb.0: # %entry
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
; X64-NEXT: fldz
; X64-NEXT: fucomi %st(1), %st
; X64-NEXT: fstp %st(1)
; X64-NEXT: fld1
; X64-NEXT: fcmovne %st(1), %st
; X64-NEXT: fcmovu %st(1), %st
; X64-NEXT: fucompi %st(1), %st
; X64-NEXT: fstp %st(0)
; X64-NEXT: xorl %eax, %eax
; X64-NEXT: retq
;
; X86-LABEL: PR118606:
; X86: # %bb.0: # %entry
; X86-NEXT: fldt {{[0-9]+}}(%esp)
; X86-NEXT: fldz
; X86-NEXT: fucomi %st(1), %st
; X86-NEXT: fstp %st(1)
; X86-NEXT: fld1
; X86-NEXT: fcmovne %st(1), %st
; X86-NEXT: fcmovu %st(1), %st
; X86-NEXT: fucompi %st(1), %st
; X86-NEXT: fstp %st(0)
; X86-NEXT: xorl %eax, %eax
; X86-NEXT: retl
entry:
%cmp8 = fcmp oeq x86_fp80 %val1, 0xK00000000000000000000
%0 = select i1 %cmp8, x86_fp80 0xK3FFF8000000000000000, x86_fp80 0xK00000000000000000000
%cmp64 = fcmp ogt x86_fp80 %0, 0xK00000000000000000000
br i1 %cmp64, label %if.then66, label %if.end70

if.then66: ; preds = %entry
ret i32 0

if.end70: ; preds = %entry
ret i32 0
}
Loading