Skip to content

Commit d6501dc

Browse files
[X86][AVX512] Check input-types to COMX (#118606)
Supported types for COMX are f16, f32 and f64. Without this check there's a crash on f80 types. Fixes: #118605
1 parent 4dcc2f5 commit d6501dc

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -24235,8 +24235,10 @@ SDValue X86TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
2423524235
if (Subtarget.hasAVX10_2()) {
2423624236
if (CC == ISD::SETOEQ || CC == ISD::SETUNE) {
2423724237
auto NewCC = (CC == ISD::SETOEQ) ? X86::COND_E : (X86::COND_NE);
24238-
return getSETCC(NewCC, DAG.getNode(X86ISD::UCOMX, dl, MVT::i32, Op0, Op1),
24239-
dl, DAG);
24238+
assert(Op0.getSimpleValueType() != MVT::bf16 && "Unsupported Type");
24239+
if (Op0.getSimpleValueType() != MVT::f80)
24240+
return getSETCC(
24241+
NewCC, DAG.getNode(X86ISD::UCOMX, dl, MVT::i32, Op0, Op1), dl, DAG);
2424024242
}
2424124243
}
2424224244
// Handle floating point.

llvm/test/CodeGen/X86/avx10_2-cmp.ll

+41
Original file line numberDiff line numberDiff line change
@@ -235,3 +235,44 @@ define i1 @dune_mem(ptr %xp, ptr %yp) {
235235
%1 = fcmp une double %x, %y
236236
ret i1 %1
237237
}
238+
239+
define i32 @PR118606(x86_fp80 %val1) #0 {
240+
; X64-LABEL: PR118606:
241+
; X64: # %bb.0: # %entry
242+
; X64-NEXT: fldt {{[0-9]+}}(%rsp)
243+
; X64-NEXT: fldz
244+
; X64-NEXT: fucomi %st(1), %st
245+
; X64-NEXT: fstp %st(1)
246+
; X64-NEXT: fld1
247+
; X64-NEXT: fcmovne %st(1), %st
248+
; X64-NEXT: fcmovu %st(1), %st
249+
; X64-NEXT: fucompi %st(1), %st
250+
; X64-NEXT: fstp %st(0)
251+
; X64-NEXT: xorl %eax, %eax
252+
; X64-NEXT: retq
253+
;
254+
; X86-LABEL: PR118606:
255+
; X86: # %bb.0: # %entry
256+
; X86-NEXT: fldt {{[0-9]+}}(%esp)
257+
; X86-NEXT: fldz
258+
; X86-NEXT: fucomi %st(1), %st
259+
; X86-NEXT: fstp %st(1)
260+
; X86-NEXT: fld1
261+
; X86-NEXT: fcmovne %st(1), %st
262+
; X86-NEXT: fcmovu %st(1), %st
263+
; X86-NEXT: fucompi %st(1), %st
264+
; X86-NEXT: fstp %st(0)
265+
; X86-NEXT: xorl %eax, %eax
266+
; X86-NEXT: retl
267+
entry:
268+
%cmp8 = fcmp oeq x86_fp80 %val1, 0xK00000000000000000000
269+
%0 = select i1 %cmp8, x86_fp80 0xK3FFF8000000000000000, x86_fp80 0xK00000000000000000000
270+
%cmp64 = fcmp ogt x86_fp80 %0, 0xK00000000000000000000
271+
br i1 %cmp64, label %if.then66, label %if.end70
272+
273+
if.then66: ; preds = %entry
274+
ret i32 0
275+
276+
if.end70: ; preds = %entry
277+
ret i32 0
278+
}

0 commit comments

Comments
 (0)