[llvm] [X86] InstCombine: Generalize scalar SSE MAX/MIN intrinsics (PR #175375)

Guilherme oliveira de campos via llvm-commits llvm-commits at lists.llvm.org
Sun Jan 11 09:23:28 PST 2026


================
@@ -3138,6 +3138,48 @@ X86TTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const {
       return IC.replaceInstUsesWith(II, V);
     }
     break;
+
+  case Intrinsic::x86_sse_max_ss:
+  case Intrinsic::x86_sse_min_ss:
+  case Intrinsic::x86_sse2_max_sd:
+  case Intrinsic::x86_sse2_min_sd: {
+    Value *Arg0 = II.getArgOperand(0);
+    Value *Arg1 = II.getArgOperand(1);
+    unsigned VWidth = cast<FixedVectorType>(Arg0->getType())->getNumElements();
+
+    FPClassTest Forbidden = fcNan | fcInf | fcSubnormal | fcNegZero;
+    SimplifyQuery SQ = IC.getSimplifyQuery().getWithInstruction(&II);
+
+    APInt DemandedElts = APInt::getOneBitSet(VWidth, 0);
+    // Check if the first element of each vector is in a forbidden ,
+    // if they are safe, we can change this to generic MAXNUM/MINNUM
+    // instructions.
+    KnownFPClass KnownArg0 =
+        computeKnownFPClass(Arg0, DemandedElts, Forbidden, SQ);
+    KnownFPClass KnownArg1 =
+        computeKnownFPClass(Arg1, DemandedElts, Forbidden, SQ);
+
+    if (KnownArg0.isKnownNever(Forbidden) &&
+        KnownArg1.isKnownNever(Forbidden)) {
+      Value *Scalar0 = IC.Builder.CreateExtractElement(Arg0, (uint64_t)0);
+      Value *Scalar1 = IC.Builder.CreateExtractElement(Arg1, (uint64_t)0);
+
+      Value *NewScalar;
+      if (IID == Intrinsic::x86_sse_max_ss ||
+          IID == Intrinsic::x86_sse2_max_sd) {
+        NewScalar = IC.Builder.CreateMaxNum(Scalar0, Scalar1);
+      } else {
+        NewScalar = IC.Builder.CreateMinNum(Scalar0, Scalar1);
+      }
+      // Insert the result back into the bottom element (Index 0) of the first
+      // vector.
+      Value *Result =
+          IC.Builder.CreateInsertElement(Arg0, NewScalar, (uint64_t)0);
+      return IC.replaceInstUsesWith(II, Result);
+    }
+    break;
----------------
guiolidc wrote:

It's done, any suggestions for improvement are welcome. 

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


More information about the llvm-commits mailing list