[llvm] [AArch64] Fix swapped operands in tryFoldCselToFMaxMin (PR #203230)

David Green via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 11 03:01:17 PDT 2026


https://github.com/davemgreen created https://github.com/llvm/llvm-project/pull/203230

These swapped operands will treat nan the wrong way, make sure we only use the matching direction when converting to fminnm/fmaxnm.

>From f92af28d28e8daebc3f5b6475f6715f2877996ac Mon Sep 17 00:00:00 2001
From: David Green <david.green at arm.com>
Date: Thu, 11 Jun 2026 10:47:34 +0100
Subject: [PATCH] [AArch64] Fix swapped operands in tryFoldCselToFMaxMin

These swapped operands will treat nan the wrong way, make sure we only use the
matching direction when converting to fminnm/fmaxnm.
---
 .../Target/AArch64/AArch64ISelDAGToDAG.cpp    |  4 ---
 .../AArch64/fmaximumnum-fminimumnum-select.ll | 30 +++++++++++++++++++
 2 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp b/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
index 499bb2325186d..3f383799c0033 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
@@ -8120,15 +8120,11 @@ SDValue AArch64DAGToDAGISel::tryFoldCselToFMaxMin(SDNode &N) {
   if (CondCode == AArch64CC::GT || CondCode == AArch64CC::GE) {
     if (TVal == CmpLHS && FVal == CmpRHS)
       isMax = true;
-    else if (TVal == CmpRHS && FVal == CmpLHS)
-      isMax = false;
     else
       return SDValue();
   } else if (CondCode == AArch64CC::MI || CondCode == AArch64CC::LS) {
     if (TVal == CmpLHS && FVal == CmpRHS)
       isMax = false;
-    else if (TVal == CmpRHS && FVal == CmpLHS)
-      isMax = true;
     else
       return SDValue();
   } else {
diff --git a/llvm/test/CodeGen/AArch64/fmaximumnum-fminimumnum-select.ll b/llvm/test/CodeGen/AArch64/fmaximumnum-fminimumnum-select.ll
index 5e21c25215887..bfc470bc17edf 100644
--- a/llvm/test/CodeGen/AArch64/fmaximumnum-fminimumnum-select.ll
+++ b/llvm/test/CodeGen/AArch64/fmaximumnum-fminimumnum-select.ll
@@ -169,3 +169,33 @@ entry:
   %min = select i1 %cmp, float %mul, float 1.000000e+00
   ret float %min
 }
+
+define float @max_oge_swapped(float %a, float %b) {
+; CHECK-LABEL: max_oge_swapped:
+; CHECK:       // %bb.0: // %entry
+; CHECK-NEXT:    fmul s0, s0, s1
+; CHECK-NEXT:    fmov s1, #1.00000000
+; CHECK-NEXT:    fcmp s0, s1
+; CHECK-NEXT:    fcsel s0, s1, s0, ge
+; CHECK-NEXT:    ret
+entry:
+  %mul = fmul float %a, %b
+  %cmp = fcmp nsz oge float %mul, 1.000000e+00
+  %max = select i1 %cmp, float 1.000000e+00, float %mul
+  ret float %max
+}
+
+define float @min_ole_swapped(float %a, float %b) {
+; CHECK-LABEL: min_ole_swapped:
+; CHECK:       // %bb.0: // %entry
+; CHECK-NEXT:    fmul s0, s0, s1
+; CHECK-NEXT:    fmov s1, #1.00000000
+; CHECK-NEXT:    fcmp s0, s1
+; CHECK-NEXT:    fcsel s0, s1, s0, ls
+; CHECK-NEXT:    ret
+entry:
+  %mul = fmul float %a, %b
+  %cmp = fcmp nsz ole float %mul, 1.000000e+00
+  %min = select i1 %cmp, float 1.000000e+00, float %mul
+  ret float %min
+}



More information about the llvm-commits mailing list