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( , Ci ). // Constant fold lshr( , Ci ). // Constant fold shl( , Ci ). @@ -3341,32 +3368,6 @@ std::optional 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: