[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