[llvm] 980a7e7 - [X86][AVX10] Fix assertion with strict fcmp (#139500)

via llvm-commits llvm-commits at lists.llvm.org
Mon May 12 05:56:37 PDT 2025


Author: Feng Zou
Date: 2025-05-12T20:56:34+08:00
New Revision: 980a7e75bcc0dec7c12c3d5c50cbee9423778ea8

URL: https://github.com/llvm/llvm-project/commit/980a7e75bcc0dec7c12c3d5c50cbee9423778ea8
DIFF: https://github.com/llvm/llvm-project/commit/980a7e75bcc0dec7c12c3d5c50cbee9423778ea8.diff

LOG: [X86][AVX10] Fix assertion with strict fcmp (#139500)

Check the strict mode and return MERGE_VALUES to fix the assertion of
invalid index for values defined in Res node.

Added: 
    

Modified: 
    llvm/lib/Target/X86/X86ISelLowering.cpp
    llvm/test/CodeGen/X86/avx10_2-cmp.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index ac4fb157a6026..ee295fd83670d 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -24573,9 +24573,11 @@ SDValue X86TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
     if (CC == ISD::SETOEQ || CC == ISD::SETUNE) {
       auto NewCC = (CC == ISD::SETOEQ) ? X86::COND_E : (X86::COND_NE);
       assert(Op0.getSimpleValueType() != MVT::bf16 && "Unsupported Type");
-      if (Op0.getSimpleValueType() != MVT::f80)
-        return getSETCC(
+      if (Op0.getSimpleValueType() != MVT::f80) {
+        SDValue Res = getSETCC(
             NewCC, DAG.getNode(X86ISD::UCOMX, dl, MVT::i32, Op0, Op1), dl, DAG);
+        return IsStrict ? DAG.getMergeValues({Res, Chain}, dl) : Res;
+      }
     }
   }
   // Handle floating point.

diff  --git a/llvm/test/CodeGen/X86/avx10_2-cmp.ll b/llvm/test/CodeGen/X86/avx10_2-cmp.ll
index 140a20c17ea6d..0f90f1a0a3561 100644
--- a/llvm/test/CodeGen/X86/avx10_2-cmp.ll
+++ b/llvm/test/CodeGen/X86/avx10_2-cmp.ll
@@ -276,3 +276,24 @@ if.then66:                                        ; preds = %entry
 if.end70:                                         ; preds = %entry
   ret i32 0
 }
+
+define i1 @constrained_fcmp() {
+; X64-LABEL: constrained_fcmp:
+; X64:       # %bb.0: # %entry
+; X64-NEXT:    vxorpd %xmm0, %xmm0, %xmm0
+; X64-NEXT:    vucomxsd %xmm0, %xmm0
+; X64-NEXT:    setne %al
+; X64-NEXT:    retq
+;
+; X86-LABEL: constrained_fcmp:
+; X86:       # %bb.0: # %entry
+; X86-NEXT:    vxorpd %xmm0, %xmm0, %xmm0
+; X86-NEXT:    vucomxsd %xmm0, %xmm0
+; X86-NEXT:    setne %al
+; X86-NEXT:    retl
+entry:
+  %0 = tail call i1 @llvm.experimental.constrained.fcmps.f64(double 0.000000e+00, double 0.000000e+00, metadata !"une", metadata !"fpexcept.strict")
+  ret i1 %0
+}
+
+declare i1 @llvm.experimental.constrained.fcmps.f64(double, double, metadata, metadata)


        


More information about the llvm-commits mailing list