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

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Sun Jan 11 08:09:55 PST 2026


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

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.

>From 64c7566f1f51531327e837726eda21c4cfcfb014 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Sun, 11 Jan 2026 16:08:30 +0000
Subject: [PATCH] [InstCombine][X86] Move simplifyX86FPMaxMin handling from
 simplifyDemandedVectorEltsIntrinsic to instCombineIntrinsic

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.
---
 .../Target/X86/X86InstCombineIntrinsic.cpp    | 53 ++++++++++---------
 1 file changed, 27 insertions(+), 26 deletions(-)

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:



More information about the llvm-commits mailing list