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

via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 11 03:02:10 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-aarch64

Author: David Green (davemgreen)

<details>
<summary>Changes</summary>

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

---
Full diff: https://github.com/llvm/llvm-project/pull/203230.diff


2 Files Affected:

- (modified) llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp (-4) 
- (modified) llvm/test/CodeGen/AArch64/fmaximumnum-fminimumnum-select.ll (+30) 


``````````diff
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
+}

``````````

</details>


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


More information about the llvm-commits mailing list