[llvm] [InstCombine][X86] Move simplifyX86FPMaxMin handling from simplifyDemandedVectorEltsIntrinsic to instCombineIntrinsic (PR #175441)

via llvm-commits llvm-commits at lists.llvm.org
Sun Jan 11 08:10:22 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-x86

Author: Simon Pilgrim (RKSimon)

<details>
<summary>Changes</summary>

My fault for missing this when reviewing #<!-- -->174806 - technically we might benefit from demanded elts handling for these intrinsics some day, but the base implementation should be in instCombineIntrinsic

Noticed while reviewing #<!-- -->175375 which I recommended reuses more of the simplifyX86FPMaxMin handling.

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


1 Files Affected:

- (modified) llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp (+27-26) 


``````````diff
diff --git a/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp b/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
index 5eff38b214aef..7345dc794de7b 100644
--- a/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
+++ b/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
@@ -2524,6 +2524,33 @@ X86TTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const {
     }
     break;
 
+  // Generalize SSE/AVX FP to maxnum/minnum.
+  case Intrinsic::x86_sse_max_ps:
+  case Intrinsic::x86_sse2_max_pd:
+  case Intrinsic::x86_avx_max_pd_256:
+  case Intrinsic::x86_avx_max_ps_256:
+  case Intrinsic::x86_avx512_max_pd_512:
+  case Intrinsic::x86_avx512_max_ps_512:
+  case Intrinsic::x86_avx512fp16_max_ph_128:
+  case Intrinsic::x86_avx512fp16_max_ph_256:
+  case Intrinsic::x86_avx512fp16_max_ph_512:
+    if (Value *V = simplifyX86FPMaxMin(II, IC.Builder, Intrinsic::maxnum))
+      return IC.replaceInstUsesWith(II, V);
+    break;
+
+  case Intrinsic::x86_sse_min_ps:
+  case Intrinsic::x86_sse2_min_pd:
+  case Intrinsic::x86_avx_min_pd_256:
+  case Intrinsic::x86_avx_min_ps_256:
+  case Intrinsic::x86_avx512_min_pd_512:
+  case Intrinsic::x86_avx512_min_ps_512:
+  case Intrinsic::x86_avx512fp16_min_ph_128:
+  case Intrinsic::x86_avx512fp16_min_ph_256:
+  case Intrinsic::x86_avx512fp16_min_ph_512:
+    if (Value *V = simplifyX86FPMaxMin(II, IC.Builder, Intrinsic::minnum))
+      return IC.replaceInstUsesWith(II, V);
+    break;
+
   // Constant fold ashr( <A x Bi>, Ci ).
   // Constant fold lshr( <A x Bi>, Ci ).
   // Constant fold shl( <A x Bi>, Ci ).
@@ -3341,32 +3368,6 @@ std::optional<Value *> X86TTIImpl::simplifyDemandedVectorEltsIntrinsic(
     break;
   }
 
-  // Generalize SSE/AVX FP to maxnum/minnum.
-  case Intrinsic::x86_sse_max_ps:
-  case Intrinsic::x86_sse2_max_pd:
-  case Intrinsic::x86_avx_max_pd_256:
-  case Intrinsic::x86_avx_max_ps_256:
-  case Intrinsic::x86_avx512_max_pd_512:
-  case Intrinsic::x86_avx512_max_ps_512:
-  case Intrinsic::x86_avx512fp16_max_ph_128:
-  case Intrinsic::x86_avx512fp16_max_ph_256:
-  case Intrinsic::x86_avx512fp16_max_ph_512:
-    if (Value *V = simplifyX86FPMaxMin(II, IC.Builder, Intrinsic::maxnum))
-      return IC.replaceInstUsesWith(II, V);
-    break;
-  case Intrinsic::x86_sse_min_ps:
-  case Intrinsic::x86_sse2_min_pd:
-  case Intrinsic::x86_avx_min_pd_256:
-  case Intrinsic::x86_avx_min_ps_256:
-  case Intrinsic::x86_avx512_min_pd_512:
-  case Intrinsic::x86_avx512_min_ps_512:
-  case Intrinsic::x86_avx512fp16_min_ph_128:
-  case Intrinsic::x86_avx512fp16_min_ph_256:
-  case Intrinsic::x86_avx512fp16_min_ph_512:
-    if (Value *V = simplifyX86FPMaxMin(II, IC.Builder, Intrinsic::minnum))
-      return IC.replaceInstUsesWith(II, V);
-    break;
-
   // General per-element vector operations.
   case Intrinsic::x86_avx2_psllv_d:
   case Intrinsic::x86_avx2_psllv_d_256:

``````````

</details>


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


More information about the llvm-commits mailing list