[llvm] [X86] Add PSEUDO_FMIN/PSEUDO_FMAX to canCombineAsMaskOperation (PR #213475)
Timur Golubovich via llvm-commits
llvm-commits at lists.llvm.org
Sat Aug 1 11:17:40 PDT 2026
https://github.com/timurgol007 created https://github.com/llvm/llvm-project/pull/213475
Add FP min/max opcodes to the list of operations that can be folded into write-masked instructions. This allows commuteSelect to recognize these operations and invert the setcc condition to enable ISel to match fused vminps/vmaxps {%k} patterns.
>From 95fd23253f1e689acd613edf2242466a9e87d61d Mon Sep 17 00:00:00 2001
From: Timur Golubovich <timur.golubovich at intel.com>
Date: Sat, 1 Aug 2026 20:14:20 +0200
Subject: [PATCH] [X86] Add PSEUDO_FMIN/PSEUDO_FMAX to
canCombineAsMaskOperation
Add FP min/max opcodes to the list of operations that can be folded
into write-masked instructions. This allows commuteSelect to
recognize these operations and invert the setcc condition to enable
ISel to match fused vminps/vmaxps {%k} patterns.
---
llvm/lib/Target/X86/X86ISelLowering.cpp | 2 +
.../X86/avx512-maxnum-minnum-masked-store.ll | 16 +--
llvm/test/CodeGen/X86/avx512fp16-fmaxnum.ll | 35 +++---
llvm/test/CodeGen/X86/avx512fp16-fminnum.ll | 35 +++---
.../CodeGen/X86/expand-vp-fp-intrinsics.ll | 28 ++---
llvm/test/CodeGen/X86/fmaxnum.ll | 109 ++++++++++++------
llvm/test/CodeGen/X86/fminnum.ll | 109 ++++++++++++------
llvm/test/CodeGen/X86/vector-reduce-fmax.ll | 45 ++++----
llvm/test/CodeGen/X86/vector-reduce-fmin.ll | 45 ++++----
9 files changed, 238 insertions(+), 186 deletions(-)
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 44c847565cb69..4bb22b89068c2 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -18457,6 +18457,8 @@ static bool canCombineAsMaskOperation(SDValue V,
case ISD::SRL:
case ISD::SRA:
case ISD::MUL:
+ case ISD::PSEUDO_FMIN:
+ case ISD::PSEUDO_FMAX:
break;
}
if (!V->hasOneUse())
diff --git a/llvm/test/CodeGen/X86/avx512-maxnum-minnum-masked-store.ll b/llvm/test/CodeGen/X86/avx512-maxnum-minnum-masked-store.ll
index f6ca1490b558c..c190ec1bc719d 100644
--- a/llvm/test/CodeGen/X86/avx512-maxnum-minnum-masked-store.ll
+++ b/llvm/test/CodeGen/X86/avx512-maxnum-minnum-masked-store.ll
@@ -27,8 +27,8 @@ define void @maxnum_v4f32_masked_store(<4 x float> %a, ptr %ptr) {
; AVX512F: # %bb.0:
; AVX512F-NEXT: vmovups (%rdi), %xmm1
; AVX512F-NEXT: vmaxps %xmm0, %xmm1, %xmm1
-; AVX512F-NEXT: vcmpunordps %xmm0, %xmm0, %xmm0
-; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k0
+; AVX512F-NEXT: vcmpordps %xmm0, %xmm0, %xmm0
+; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0
; AVX512F-NEXT: kshiftlw $12, %k0, %k0
; AVX512F-NEXT: kshiftrw $12, %k0, %k1
; AVX512F-NEXT: vmovups %zmm1, (%rdi) {%k1}
@@ -61,8 +61,8 @@ define void @maxnum_v2f64_masked_store(<2 x double> %a, ptr %ptr) {
; AVX512F: # %bb.0:
; AVX512F-NEXT: vmovupd (%rdi), %xmm1
; AVX512F-NEXT: vmaxpd %xmm0, %xmm1, %xmm1
-; AVX512F-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm0
-; AVX512F-NEXT: vptestnmq %zmm0, %zmm0, %k0
+; AVX512F-NEXT: vcmpordpd %xmm0, %xmm0, %xmm0
+; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0
; AVX512F-NEXT: kshiftlw $14, %k0, %k0
; AVX512F-NEXT: kshiftrw $14, %k0, %k1
; AVX512F-NEXT: vmovupd %zmm1, (%rdi) {%k1}
@@ -95,8 +95,8 @@ define void @minnum_v4f32_masked_store(<4 x float> %a, ptr %ptr) {
; AVX512F: # %bb.0:
; AVX512F-NEXT: vmovups (%rdi), %xmm1
; AVX512F-NEXT: vminps %xmm0, %xmm1, %xmm1
-; AVX512F-NEXT: vcmpunordps %xmm0, %xmm0, %xmm0
-; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k0
+; AVX512F-NEXT: vcmpordps %xmm0, %xmm0, %xmm0
+; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0
; AVX512F-NEXT: kshiftlw $12, %k0, %k0
; AVX512F-NEXT: kshiftrw $12, %k0, %k1
; AVX512F-NEXT: vmovups %zmm1, (%rdi) {%k1}
@@ -129,8 +129,8 @@ define void @minnum_v2f64_masked_store(<2 x double> %a, ptr %ptr) {
; AVX512F: # %bb.0:
; AVX512F-NEXT: vmovupd (%rdi), %xmm1
; AVX512F-NEXT: vminpd %xmm0, %xmm1, %xmm1
-; AVX512F-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm0
-; AVX512F-NEXT: vptestnmq %zmm0, %zmm0, %k0
+; AVX512F-NEXT: vcmpordpd %xmm0, %xmm0, %xmm0
+; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0
; AVX512F-NEXT: kshiftlw $14, %k0, %k0
; AVX512F-NEXT: kshiftrw $14, %k0, %k1
; AVX512F-NEXT: vmovupd %zmm1, (%rdi) {%k1}
diff --git a/llvm/test/CodeGen/X86/avx512fp16-fmaxnum.ll b/llvm/test/CodeGen/X86/avx512fp16-fmaxnum.ll
index d941930e4dadf..0a9079894e220 100644
--- a/llvm/test/CodeGen/X86/avx512fp16-fmaxnum.ll
+++ b/llvm/test/CodeGen/X86/avx512fp16-fmaxnum.ll
@@ -32,10 +32,9 @@ define half @test_intrinsic_fmaxh(half %x, half %y) {
define <2 x half> @test_intrinsic_fmax_v2f16(<2 x half> %x, <2 x half> %y) {
; HasVL-LABEL: test_intrinsic_fmax_v2f16:
; HasVL: # %bb.0:
-; HasVL-NEXT: vmaxph %xmm0, %xmm1, %xmm2 # encoding: [0x62,0xf5,0x74,0x08,0x5f,0xd0]
-; HasVL-NEXT: vcmpunordph %xmm0, %xmm0, %k1 # encoding: [0x62,0xf3,0x7c,0x08,0xc2,0xc8,0x03]
-; HasVL-NEXT: vmovdqu16 %xmm1, %xmm2 {%k1} # encoding: [0x62,0xf1,0xff,0x09,0x6f,0xd1]
-; HasVL-NEXT: vmovdqa %xmm2, %xmm0 # EVEX TO VEX Compression encoding: [0xc5,0xf9,0x6f,0xc2]
+; HasVL-NEXT: vcmpordph %xmm0, %xmm0, %k1 # encoding: [0x62,0xf3,0x7c,0x08,0xc2,0xc8,0x07]
+; HasVL-NEXT: vmaxph %xmm0, %xmm1, %xmm1 {%k1} # encoding: [0x62,0xf5,0x74,0x09,0x5f,0xc8]
+; HasVL-NEXT: vmovaps %xmm1, %xmm0 # EVEX TO VEX Compression encoding: [0xc5,0xf8,0x28,0xc1]
; HasVL-NEXT: retq # encoding: [0xc3]
;
; NOVL-LABEL: test_intrinsic_fmax_v2f16:
@@ -110,10 +109,9 @@ define <2 x half> @test_intrinsic_fmax_v2f16(<2 x half> %x, <2 x half> %y) {
define <4 x half> @test_intrinsic_fmax_v4f16(<4 x half> %x, <4 x half> %y) {
; HasVL-LABEL: test_intrinsic_fmax_v4f16:
; HasVL: # %bb.0:
-; HasVL-NEXT: vmaxph %xmm0, %xmm1, %xmm2 # encoding: [0x62,0xf5,0x74,0x08,0x5f,0xd0]
-; HasVL-NEXT: vcmpunordph %xmm0, %xmm0, %k1 # encoding: [0x62,0xf3,0x7c,0x08,0xc2,0xc8,0x03]
-; HasVL-NEXT: vmovdqu16 %xmm1, %xmm2 {%k1} # encoding: [0x62,0xf1,0xff,0x09,0x6f,0xd1]
-; HasVL-NEXT: vmovdqa %xmm2, %xmm0 # EVEX TO VEX Compression encoding: [0xc5,0xf9,0x6f,0xc2]
+; HasVL-NEXT: vcmpordph %xmm0, %xmm0, %k1 # encoding: [0x62,0xf3,0x7c,0x08,0xc2,0xc8,0x07]
+; HasVL-NEXT: vmaxph %xmm0, %xmm1, %xmm1 {%k1} # encoding: [0x62,0xf5,0x74,0x09,0x5f,0xc8]
+; HasVL-NEXT: vmovaps %xmm1, %xmm0 # EVEX TO VEX Compression encoding: [0xc5,0xf8,0x28,0xc1]
; HasVL-NEXT: retq # encoding: [0xc3]
;
; NOVL-LABEL: test_intrinsic_fmax_v4f16:
@@ -188,10 +186,9 @@ define <4 x half> @test_intrinsic_fmax_v4f16(<4 x half> %x, <4 x half> %y) {
define <8 x half> @test_intrinsic_fmax_v8f16(<8 x half> %x, <8 x half> %y) {
; HasVL-LABEL: test_intrinsic_fmax_v8f16:
; HasVL: # %bb.0:
-; HasVL-NEXT: vmaxph %xmm0, %xmm1, %xmm2 # encoding: [0x62,0xf5,0x74,0x08,0x5f,0xd0]
-; HasVL-NEXT: vcmpunordph %xmm0, %xmm0, %k1 # encoding: [0x62,0xf3,0x7c,0x08,0xc2,0xc8,0x03]
-; HasVL-NEXT: vmovdqu16 %xmm1, %xmm2 {%k1} # encoding: [0x62,0xf1,0xff,0x09,0x6f,0xd1]
-; HasVL-NEXT: vmovdqa %xmm2, %xmm0 # EVEX TO VEX Compression encoding: [0xc5,0xf9,0x6f,0xc2]
+; HasVL-NEXT: vcmpordph %xmm0, %xmm0, %k1 # encoding: [0x62,0xf3,0x7c,0x08,0xc2,0xc8,0x07]
+; HasVL-NEXT: vmaxph %xmm0, %xmm1, %xmm1 {%k1} # encoding: [0x62,0xf5,0x74,0x09,0x5f,0xc8]
+; HasVL-NEXT: vmovaps %xmm1, %xmm0 # EVEX TO VEX Compression encoding: [0xc5,0xf8,0x28,0xc1]
; HasVL-NEXT: retq # encoding: [0xc3]
;
; NOVL-LABEL: test_intrinsic_fmax_v8f16:
@@ -266,10 +263,9 @@ define <8 x half> @test_intrinsic_fmax_v8f16(<8 x half> %x, <8 x half> %y) {
define <16 x half> @test_intrinsic_fmax_v16f16(<16 x half> %x, <16 x half> %y) {
; HasVL-LABEL: test_intrinsic_fmax_v16f16:
; HasVL: # %bb.0:
-; HasVL-NEXT: vmaxph %ymm0, %ymm1, %ymm2 # encoding: [0x62,0xf5,0x74,0x28,0x5f,0xd0]
-; HasVL-NEXT: vcmpunordph %ymm0, %ymm0, %k1 # encoding: [0x62,0xf3,0x7c,0x28,0xc2,0xc8,0x03]
-; HasVL-NEXT: vmovdqu16 %ymm1, %ymm2 {%k1} # encoding: [0x62,0xf1,0xff,0x29,0x6f,0xd1]
-; HasVL-NEXT: vmovdqa %ymm2, %ymm0 # EVEX TO VEX Compression encoding: [0xc5,0xfd,0x6f,0xc2]
+; HasVL-NEXT: vcmpordph %ymm0, %ymm0, %k1 # encoding: [0x62,0xf3,0x7c,0x28,0xc2,0xc8,0x07]
+; HasVL-NEXT: vmaxph %ymm0, %ymm1, %ymm1 {%k1} # encoding: [0x62,0xf5,0x74,0x29,0x5f,0xc8]
+; HasVL-NEXT: vmovaps %ymm1, %ymm0 # EVEX TO VEX Compression encoding: [0xc5,0xfc,0x28,0xc1]
; HasVL-NEXT: retq # encoding: [0xc3]
;
; NOVL-LABEL: test_intrinsic_fmax_v16f16:
@@ -408,10 +404,9 @@ define <16 x half> @test_intrinsic_fmax_v16f16(<16 x half> %x, <16 x half> %y) {
define <32 x half> @test_intrinsic_fmax_v32f16(<32 x half> %x, <32 x half> %y) {
; CHECK-LABEL: test_intrinsic_fmax_v32f16:
; CHECK: # %bb.0:
-; CHECK-NEXT: vmaxph %zmm0, %zmm1, %zmm2 # encoding: [0x62,0xf5,0x74,0x48,0x5f,0xd0]
-; CHECK-NEXT: vcmpunordph %zmm0, %zmm0, %k1 # encoding: [0x62,0xf3,0x7c,0x48,0xc2,0xc8,0x03]
-; CHECK-NEXT: vmovdqu16 %zmm1, %zmm2 {%k1} # encoding: [0x62,0xf1,0xff,0x49,0x6f,0xd1]
-; CHECK-NEXT: vmovdqa64 %zmm2, %zmm0 # encoding: [0x62,0xf1,0xfd,0x48,0x6f,0xc2]
+; CHECK-NEXT: vcmpordph %zmm0, %zmm0, %k1 # encoding: [0x62,0xf3,0x7c,0x48,0xc2,0xc8,0x07]
+; CHECK-NEXT: vmaxph %zmm0, %zmm1, %zmm1 {%k1} # encoding: [0x62,0xf5,0x74,0x49,0x5f,0xc8]
+; CHECK-NEXT: vmovaps %zmm1, %zmm0 # encoding: [0x62,0xf1,0x7c,0x48,0x28,0xc1]
; CHECK-NEXT: retq # encoding: [0xc3]
%z = call <32 x half> @llvm.maxnum.v32f16(<32 x half> %x, <32 x half> %y) readnone
ret <32 x half> %z
diff --git a/llvm/test/CodeGen/X86/avx512fp16-fminnum.ll b/llvm/test/CodeGen/X86/avx512fp16-fminnum.ll
index 3df6ee4e85f01..9cddf4b013c56 100644
--- a/llvm/test/CodeGen/X86/avx512fp16-fminnum.ll
+++ b/llvm/test/CodeGen/X86/avx512fp16-fminnum.ll
@@ -32,10 +32,9 @@ define half @test_intrinsic_fminh(half %x, half %y) {
define <2 x half> @test_intrinsic_fmin_v2f16(<2 x half> %x, <2 x half> %y) {
; HasVL-LABEL: test_intrinsic_fmin_v2f16:
; HasVL: # %bb.0:
-; HasVL-NEXT: vminph %xmm0, %xmm1, %xmm2 # encoding: [0x62,0xf5,0x74,0x08,0x5d,0xd0]
-; HasVL-NEXT: vcmpunordph %xmm0, %xmm0, %k1 # encoding: [0x62,0xf3,0x7c,0x08,0xc2,0xc8,0x03]
-; HasVL-NEXT: vmovdqu16 %xmm1, %xmm2 {%k1} # encoding: [0x62,0xf1,0xff,0x09,0x6f,0xd1]
-; HasVL-NEXT: vmovdqa %xmm2, %xmm0 # EVEX TO VEX Compression encoding: [0xc5,0xf9,0x6f,0xc2]
+; HasVL-NEXT: vcmpordph %xmm0, %xmm0, %k1 # encoding: [0x62,0xf3,0x7c,0x08,0xc2,0xc8,0x07]
+; HasVL-NEXT: vminph %xmm0, %xmm1, %xmm1 {%k1} # encoding: [0x62,0xf5,0x74,0x09,0x5d,0xc8]
+; HasVL-NEXT: vmovaps %xmm1, %xmm0 # EVEX TO VEX Compression encoding: [0xc5,0xf8,0x28,0xc1]
; HasVL-NEXT: retq # encoding: [0xc3]
;
; NOVL-LABEL: test_intrinsic_fmin_v2f16:
@@ -110,10 +109,9 @@ define <2 x half> @test_intrinsic_fmin_v2f16(<2 x half> %x, <2 x half> %y) {
define <4 x half> @test_intrinsic_fmin_v4f16(<4 x half> %x, <4 x half> %y) {
; HasVL-LABEL: test_intrinsic_fmin_v4f16:
; HasVL: # %bb.0:
-; HasVL-NEXT: vminph %xmm0, %xmm1, %xmm2 # encoding: [0x62,0xf5,0x74,0x08,0x5d,0xd0]
-; HasVL-NEXT: vcmpunordph %xmm0, %xmm0, %k1 # encoding: [0x62,0xf3,0x7c,0x08,0xc2,0xc8,0x03]
-; HasVL-NEXT: vmovdqu16 %xmm1, %xmm2 {%k1} # encoding: [0x62,0xf1,0xff,0x09,0x6f,0xd1]
-; HasVL-NEXT: vmovdqa %xmm2, %xmm0 # EVEX TO VEX Compression encoding: [0xc5,0xf9,0x6f,0xc2]
+; HasVL-NEXT: vcmpordph %xmm0, %xmm0, %k1 # encoding: [0x62,0xf3,0x7c,0x08,0xc2,0xc8,0x07]
+; HasVL-NEXT: vminph %xmm0, %xmm1, %xmm1 {%k1} # encoding: [0x62,0xf5,0x74,0x09,0x5d,0xc8]
+; HasVL-NEXT: vmovaps %xmm1, %xmm0 # EVEX TO VEX Compression encoding: [0xc5,0xf8,0x28,0xc1]
; HasVL-NEXT: retq # encoding: [0xc3]
;
; NOVL-LABEL: test_intrinsic_fmin_v4f16:
@@ -188,10 +186,9 @@ define <4 x half> @test_intrinsic_fmin_v4f16(<4 x half> %x, <4 x half> %y) {
define <8 x half> @test_intrinsic_fmin_v8f16(<8 x half> %x, <8 x half> %y) {
; HasVL-LABEL: test_intrinsic_fmin_v8f16:
; HasVL: # %bb.0:
-; HasVL-NEXT: vminph %xmm0, %xmm1, %xmm2 # encoding: [0x62,0xf5,0x74,0x08,0x5d,0xd0]
-; HasVL-NEXT: vcmpunordph %xmm0, %xmm0, %k1 # encoding: [0x62,0xf3,0x7c,0x08,0xc2,0xc8,0x03]
-; HasVL-NEXT: vmovdqu16 %xmm1, %xmm2 {%k1} # encoding: [0x62,0xf1,0xff,0x09,0x6f,0xd1]
-; HasVL-NEXT: vmovdqa %xmm2, %xmm0 # EVEX TO VEX Compression encoding: [0xc5,0xf9,0x6f,0xc2]
+; HasVL-NEXT: vcmpordph %xmm0, %xmm0, %k1 # encoding: [0x62,0xf3,0x7c,0x08,0xc2,0xc8,0x07]
+; HasVL-NEXT: vminph %xmm0, %xmm1, %xmm1 {%k1} # encoding: [0x62,0xf5,0x74,0x09,0x5d,0xc8]
+; HasVL-NEXT: vmovaps %xmm1, %xmm0 # EVEX TO VEX Compression encoding: [0xc5,0xf8,0x28,0xc1]
; HasVL-NEXT: retq # encoding: [0xc3]
;
; NOVL-LABEL: test_intrinsic_fmin_v8f16:
@@ -266,10 +263,9 @@ define <8 x half> @test_intrinsic_fmin_v8f16(<8 x half> %x, <8 x half> %y) {
define <16 x half> @test_intrinsic_fmin_v16f16(<16 x half> %x, <16 x half> %y) {
; HasVL-LABEL: test_intrinsic_fmin_v16f16:
; HasVL: # %bb.0:
-; HasVL-NEXT: vminph %ymm0, %ymm1, %ymm2 # encoding: [0x62,0xf5,0x74,0x28,0x5d,0xd0]
-; HasVL-NEXT: vcmpunordph %ymm0, %ymm0, %k1 # encoding: [0x62,0xf3,0x7c,0x28,0xc2,0xc8,0x03]
-; HasVL-NEXT: vmovdqu16 %ymm1, %ymm2 {%k1} # encoding: [0x62,0xf1,0xff,0x29,0x6f,0xd1]
-; HasVL-NEXT: vmovdqa %ymm2, %ymm0 # EVEX TO VEX Compression encoding: [0xc5,0xfd,0x6f,0xc2]
+; HasVL-NEXT: vcmpordph %ymm0, %ymm0, %k1 # encoding: [0x62,0xf3,0x7c,0x28,0xc2,0xc8,0x07]
+; HasVL-NEXT: vminph %ymm0, %ymm1, %ymm1 {%k1} # encoding: [0x62,0xf5,0x74,0x29,0x5d,0xc8]
+; HasVL-NEXT: vmovaps %ymm1, %ymm0 # EVEX TO VEX Compression encoding: [0xc5,0xfc,0x28,0xc1]
; HasVL-NEXT: retq # encoding: [0xc3]
;
; NOVL-LABEL: test_intrinsic_fmin_v16f16:
@@ -408,10 +404,9 @@ define <16 x half> @test_intrinsic_fmin_v16f16(<16 x half> %x, <16 x half> %y) {
define <32 x half> @test_intrinsic_fmin_v32f16(<32 x half> %x, <32 x half> %y) {
; CHECK-LABEL: test_intrinsic_fmin_v32f16:
; CHECK: # %bb.0:
-; CHECK-NEXT: vminph %zmm0, %zmm1, %zmm2 # encoding: [0x62,0xf5,0x74,0x48,0x5d,0xd0]
-; CHECK-NEXT: vcmpunordph %zmm0, %zmm0, %k1 # encoding: [0x62,0xf3,0x7c,0x48,0xc2,0xc8,0x03]
-; CHECK-NEXT: vmovdqu16 %zmm1, %zmm2 {%k1} # encoding: [0x62,0xf1,0xff,0x49,0x6f,0xd1]
-; CHECK-NEXT: vmovdqa64 %zmm2, %zmm0 # encoding: [0x62,0xf1,0xfd,0x48,0x6f,0xc2]
+; CHECK-NEXT: vcmpordph %zmm0, %zmm0, %k1 # encoding: [0x62,0xf3,0x7c,0x48,0xc2,0xc8,0x07]
+; CHECK-NEXT: vminph %zmm0, %zmm1, %zmm1 {%k1} # encoding: [0x62,0xf5,0x74,0x49,0x5d,0xc8]
+; CHECK-NEXT: vmovaps %zmm1, %zmm0 # encoding: [0x62,0xf1,0x7c,0x48,0x28,0xc1]
; CHECK-NEXT: retq # encoding: [0xc3]
%z = call <32 x half> @llvm.minnum.v32f16(<32 x half> %x, <32 x half> %y) readnone
ret <32 x half> %z
diff --git a/llvm/test/CodeGen/X86/expand-vp-fp-intrinsics.ll b/llvm/test/CodeGen/X86/expand-vp-fp-intrinsics.ll
index 018b6c2d20f1e..1e0eaa4526cce 100644
--- a/llvm/test/CodeGen/X86/expand-vp-fp-intrinsics.ll
+++ b/llvm/test/CodeGen/X86/expand-vp-fp-intrinsics.ll
@@ -588,10 +588,9 @@ define <4 x float> @vfmax_vv_v4f32(<4 x float> %va, <4 x float> %vb, <4 x i1> %m
;
; AVX512-LABEL: vfmax_vv_v4f32:
; AVX512: # %bb.0:
-; AVX512-NEXT: vmaxps %xmm0, %xmm1, %xmm2
-; AVX512-NEXT: vcmpunordps %xmm0, %xmm0, %k1
-; AVX512-NEXT: vmovaps %xmm1, %xmm2 {%k1}
-; AVX512-NEXT: vmovaps %xmm2, %xmm0
+; AVX512-NEXT: vcmpordps %xmm0, %xmm0, %k1
+; AVX512-NEXT: vmaxps %xmm0, %xmm1, %xmm1 {%k1}
+; AVX512-NEXT: vmovaps %xmm1, %xmm0
; AVX512-NEXT: retq
%v = call <4 x float> @llvm.vp.maxnum.v4f32(<4 x float> %va, <4 x float> %vb, <4 x i1> %m, i32 %evl)
ret <4 x float> %v
@@ -638,10 +637,9 @@ define <8 x float> @vfmax_vv_v8f32(<8 x float> %va, <8 x float> %vb, <8 x i1> %m
;
; AVX512-LABEL: vfmax_vv_v8f32:
; AVX512: # %bb.0:
-; AVX512-NEXT: vmaxps %ymm0, %ymm1, %ymm2
-; AVX512-NEXT: vcmpunordps %ymm0, %ymm0, %k1
-; AVX512-NEXT: vmovaps %ymm1, %ymm2 {%k1}
-; AVX512-NEXT: vmovaps %ymm2, %ymm0
+; AVX512-NEXT: vcmpordps %ymm0, %ymm0, %k1
+; AVX512-NEXT: vmaxps %ymm0, %ymm1, %ymm1 {%k1}
+; AVX512-NEXT: vmovaps %ymm1, %ymm0
; AVX512-NEXT: retq
%v = call <8 x float> @llvm.vp.maxnum.v8f32(<8 x float> %va, <8 x float> %vb, <8 x i1> %m, i32 %evl)
ret <8 x float> %v
@@ -682,10 +680,9 @@ define <4 x float> @vfmin_vv_v4f32(<4 x float> %va, <4 x float> %vb, <4 x i1> %m
;
; AVX512-LABEL: vfmin_vv_v4f32:
; AVX512: # %bb.0:
-; AVX512-NEXT: vminps %xmm0, %xmm1, %xmm2
-; AVX512-NEXT: vcmpunordps %xmm0, %xmm0, %k1
-; AVX512-NEXT: vmovaps %xmm1, %xmm2 {%k1}
-; AVX512-NEXT: vmovaps %xmm2, %xmm0
+; AVX512-NEXT: vcmpordps %xmm0, %xmm0, %k1
+; AVX512-NEXT: vminps %xmm0, %xmm1, %xmm1 {%k1}
+; AVX512-NEXT: vmovaps %xmm1, %xmm0
; AVX512-NEXT: retq
%v = call <4 x float> @llvm.vp.minnum.v4f32(<4 x float> %va, <4 x float> %vb, <4 x i1> %m, i32 %evl)
ret <4 x float> %v
@@ -732,10 +729,9 @@ define <8 x float> @vfmin_vv_v8f32(<8 x float> %va, <8 x float> %vb, <8 x i1> %m
;
; AVX512-LABEL: vfmin_vv_v8f32:
; AVX512: # %bb.0:
-; AVX512-NEXT: vminps %ymm0, %ymm1, %ymm2
-; AVX512-NEXT: vcmpunordps %ymm0, %ymm0, %k1
-; AVX512-NEXT: vmovaps %ymm1, %ymm2 {%k1}
-; AVX512-NEXT: vmovaps %ymm2, %ymm0
+; AVX512-NEXT: vcmpordps %ymm0, %ymm0, %k1
+; AVX512-NEXT: vminps %ymm0, %ymm1, %ymm1 {%k1}
+; AVX512-NEXT: vmovaps %ymm1, %ymm0
; AVX512-NEXT: retq
%v = call <8 x float> @llvm.vp.minnum.v8f32(<8 x float> %va, <8 x float> %vb, <8 x i1> %m, i32 %evl)
ret <8 x float> %v
diff --git a/llvm/test/CodeGen/X86/fmaxnum.ll b/llvm/test/CodeGen/X86/fmaxnum.ll
index 59d1b5b5232b6..7dabc74b1d40a 100644
--- a/llvm/test/CodeGen/X86/fmaxnum.ll
+++ b/llvm/test/CodeGen/X86/fmaxnum.ll
@@ -196,12 +196,19 @@ define <2 x float> @test_intrinsic_fmax_v2f32(<2 x float> %x, <2 x float> %y) {
; SSE4-NEXT: movaps %xmm2, %xmm0
; SSE4-NEXT: retq
;
-; AVX-LABEL: test_intrinsic_fmax_v2f32:
-; AVX: # %bb.0:
-; AVX-NEXT: vmaxps %xmm0, %xmm1, %xmm2
-; AVX-NEXT: vcmpunordps %xmm0, %xmm0, %xmm0
-; AVX-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0
-; AVX-NEXT: retq
+; AVX1-LABEL: test_intrinsic_fmax_v2f32:
+; AVX1: # %bb.0:
+; AVX1-NEXT: vmaxps %xmm0, %xmm1, %xmm2
+; AVX1-NEXT: vcmpunordps %xmm0, %xmm0, %xmm0
+; AVX1-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0
+; AVX1-NEXT: retq
+;
+; AVX512-LABEL: test_intrinsic_fmax_v2f32:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmaxps %xmm0, %xmm1, %xmm2
+; AVX512-NEXT: vcmpordps %xmm0, %xmm0, %xmm0
+; AVX512-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0
+; AVX512-NEXT: retq
%z = call <2 x float> @llvm.maxnum.v2f32(<2 x float> %x, <2 x float> %y) readnone
ret <2 x float> %z
}
@@ -226,12 +233,19 @@ define <4 x float> @test_intrinsic_fmax_v4f32(<4 x float> %x, <4 x float> %y) {
; SSE4-NEXT: movaps %xmm2, %xmm0
; SSE4-NEXT: retq
;
-; AVX-LABEL: test_intrinsic_fmax_v4f32:
-; AVX: # %bb.0:
-; AVX-NEXT: vmaxps %xmm0, %xmm1, %xmm2
-; AVX-NEXT: vcmpunordps %xmm0, %xmm0, %xmm0
-; AVX-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0
-; AVX-NEXT: retq
+; AVX1-LABEL: test_intrinsic_fmax_v4f32:
+; AVX1: # %bb.0:
+; AVX1-NEXT: vmaxps %xmm0, %xmm1, %xmm2
+; AVX1-NEXT: vcmpunordps %xmm0, %xmm0, %xmm0
+; AVX1-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0
+; AVX1-NEXT: retq
+;
+; AVX512-LABEL: test_intrinsic_fmax_v4f32:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmaxps %xmm0, %xmm1, %xmm2
+; AVX512-NEXT: vcmpordps %xmm0, %xmm0, %xmm0
+; AVX512-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0
+; AVX512-NEXT: retq
%z = call <4 x float> @llvm.maxnum.v4f32(<4 x float> %x, <4 x float> %y) readnone
ret <4 x float> %z
}
@@ -268,12 +282,19 @@ define <8 x float> @test_intrinsic_fmax_v8f32(<8 x float> %x, <8 x float> %y) {
; SSE4-NEXT: movaps %xmm4, %xmm0
; SSE4-NEXT: retq
;
-; AVX-LABEL: test_intrinsic_fmax_v8f32:
-; AVX: # %bb.0:
-; AVX-NEXT: vmaxps %ymm0, %ymm1, %ymm2
-; AVX-NEXT: vcmpunordps %ymm0, %ymm0, %ymm0
-; AVX-NEXT: vblendvps %ymm0, %ymm1, %ymm2, %ymm0
-; AVX-NEXT: retq
+; AVX1-LABEL: test_intrinsic_fmax_v8f32:
+; AVX1: # %bb.0:
+; AVX1-NEXT: vmaxps %ymm0, %ymm1, %ymm2
+; AVX1-NEXT: vcmpunordps %ymm0, %ymm0, %ymm0
+; AVX1-NEXT: vblendvps %ymm0, %ymm1, %ymm2, %ymm0
+; AVX1-NEXT: retq
+;
+; AVX512-LABEL: test_intrinsic_fmax_v8f32:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmaxps %ymm0, %ymm1, %ymm2
+; AVX512-NEXT: vcmpordps %ymm0, %ymm0, %ymm0
+; AVX512-NEXT: vblendvps %ymm0, %ymm2, %ymm1, %ymm0
+; AVX512-NEXT: retq
%z = call <8 x float> @llvm.maxnum.v8f32(<8 x float> %x, <8 x float> %y) readnone
ret <8 x float> %z
}
@@ -346,10 +367,9 @@ define <16 x float> @test_intrinsic_fmax_v16f32(<16 x float> %x, <16 x float> %y
;
; AVX512-LABEL: test_intrinsic_fmax_v16f32:
; AVX512: # %bb.0:
-; AVX512-NEXT: vmaxps %zmm0, %zmm1, %zmm2
-; AVX512-NEXT: vcmpunordps %zmm0, %zmm0, %k1
-; AVX512-NEXT: vmovaps %zmm1, %zmm2 {%k1}
-; AVX512-NEXT: vmovaps %zmm2, %zmm0
+; AVX512-NEXT: vcmpordps %zmm0, %zmm0, %k1
+; AVX512-NEXT: vmaxps %zmm0, %zmm1, %zmm1 {%k1}
+; AVX512-NEXT: vmovaps %zmm1, %zmm0
; AVX512-NEXT: retq
%z = call <16 x float> @llvm.maxnum.v16f32(<16 x float> %x, <16 x float> %y) readnone
ret <16 x float> %z
@@ -375,12 +395,19 @@ define <2 x double> @test_intrinsic_fmax_v2f64(<2 x double> %x, <2 x double> %y)
; SSE4-NEXT: movapd %xmm2, %xmm0
; SSE4-NEXT: retq
;
-; AVX-LABEL: test_intrinsic_fmax_v2f64:
-; AVX: # %bb.0:
-; AVX-NEXT: vmaxpd %xmm0, %xmm1, %xmm2
-; AVX-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm0
-; AVX-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0
-; AVX-NEXT: retq
+; AVX1-LABEL: test_intrinsic_fmax_v2f64:
+; AVX1: # %bb.0:
+; AVX1-NEXT: vmaxpd %xmm0, %xmm1, %xmm2
+; AVX1-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm0
+; AVX1-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0
+; AVX1-NEXT: retq
+;
+; AVX512-LABEL: test_intrinsic_fmax_v2f64:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmaxpd %xmm0, %xmm1, %xmm2
+; AVX512-NEXT: vcmpordpd %xmm0, %xmm0, %xmm0
+; AVX512-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm0
+; AVX512-NEXT: retq
%z = call <2 x double> @llvm.maxnum.v2f64(<2 x double> %x, <2 x double> %y) readnone
ret <2 x double> %z
}
@@ -417,12 +444,19 @@ define <4 x double> @test_intrinsic_fmax_v4f64(<4 x double> %x, <4 x double> %y)
; SSE4-NEXT: movapd %xmm4, %xmm0
; SSE4-NEXT: retq
;
-; AVX-LABEL: test_intrinsic_fmax_v4f64:
-; AVX: # %bb.0:
-; AVX-NEXT: vmaxpd %ymm0, %ymm1, %ymm2
-; AVX-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm0
-; AVX-NEXT: vblendvpd %ymm0, %ymm1, %ymm2, %ymm0
-; AVX-NEXT: retq
+; AVX1-LABEL: test_intrinsic_fmax_v4f64:
+; AVX1: # %bb.0:
+; AVX1-NEXT: vmaxpd %ymm0, %ymm1, %ymm2
+; AVX1-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm0
+; AVX1-NEXT: vblendvpd %ymm0, %ymm1, %ymm2, %ymm0
+; AVX1-NEXT: retq
+;
+; AVX512-LABEL: test_intrinsic_fmax_v4f64:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmaxpd %ymm0, %ymm1, %ymm2
+; AVX512-NEXT: vcmpordpd %ymm0, %ymm0, %ymm0
+; AVX512-NEXT: vblendvpd %ymm0, %ymm2, %ymm1, %ymm0
+; AVX512-NEXT: retq
%z = call <4 x double> @llvm.maxnum.v4f64(<4 x double> %x, <4 x double> %y) readnone
ret <4 x double> %z
}
@@ -495,10 +529,9 @@ define <8 x double> @test_intrinsic_fmax_v8f64(<8 x double> %x, <8 x double> %y)
;
; AVX512-LABEL: test_intrinsic_fmax_v8f64:
; AVX512: # %bb.0:
-; AVX512-NEXT: vmaxpd %zmm0, %zmm1, %zmm2
-; AVX512-NEXT: vcmpunordpd %zmm0, %zmm0, %k1
-; AVX512-NEXT: vmovapd %zmm1, %zmm2 {%k1}
-; AVX512-NEXT: vmovapd %zmm2, %zmm0
+; AVX512-NEXT: vcmpordpd %zmm0, %zmm0, %k1
+; AVX512-NEXT: vmaxpd %zmm0, %zmm1, %zmm1 {%k1}
+; AVX512-NEXT: vmovapd %zmm1, %zmm0
; AVX512-NEXT: retq
%z = call <8 x double> @llvm.maxnum.v8f64(<8 x double> %x, <8 x double> %y) readnone
ret <8 x double> %z
diff --git a/llvm/test/CodeGen/X86/fminnum.ll b/llvm/test/CodeGen/X86/fminnum.ll
index 112d0f25cbaab..c108644eae0bf 100644
--- a/llvm/test/CodeGen/X86/fminnum.ll
+++ b/llvm/test/CodeGen/X86/fminnum.ll
@@ -196,12 +196,19 @@ define <2 x float> @test_intrinsic_fmin_v2f32(<2 x float> %x, <2 x float> %y) {
; SSE4-NEXT: movaps %xmm2, %xmm0
; SSE4-NEXT: retq
;
-; AVX-LABEL: test_intrinsic_fmin_v2f32:
-; AVX: # %bb.0:
-; AVX-NEXT: vminps %xmm0, %xmm1, %xmm2
-; AVX-NEXT: vcmpunordps %xmm0, %xmm0, %xmm0
-; AVX-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0
-; AVX-NEXT: retq
+; AVX1-LABEL: test_intrinsic_fmin_v2f32:
+; AVX1: # %bb.0:
+; AVX1-NEXT: vminps %xmm0, %xmm1, %xmm2
+; AVX1-NEXT: vcmpunordps %xmm0, %xmm0, %xmm0
+; AVX1-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0
+; AVX1-NEXT: retq
+;
+; AVX512-LABEL: test_intrinsic_fmin_v2f32:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vminps %xmm0, %xmm1, %xmm2
+; AVX512-NEXT: vcmpordps %xmm0, %xmm0, %xmm0
+; AVX512-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0
+; AVX512-NEXT: retq
%z = call <2 x float> @llvm.minnum.v2f32(<2 x float> %x, <2 x float> %y) readnone
ret <2 x float> %z
}
@@ -226,12 +233,19 @@ define <4 x float> @test_intrinsic_fmin_v4f32(<4 x float> %x, <4 x float> %y) {
; SSE4-NEXT: movaps %xmm2, %xmm0
; SSE4-NEXT: retq
;
-; AVX-LABEL: test_intrinsic_fmin_v4f32:
-; AVX: # %bb.0:
-; AVX-NEXT: vminps %xmm0, %xmm1, %xmm2
-; AVX-NEXT: vcmpunordps %xmm0, %xmm0, %xmm0
-; AVX-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0
-; AVX-NEXT: retq
+; AVX1-LABEL: test_intrinsic_fmin_v4f32:
+; AVX1: # %bb.0:
+; AVX1-NEXT: vminps %xmm0, %xmm1, %xmm2
+; AVX1-NEXT: vcmpunordps %xmm0, %xmm0, %xmm0
+; AVX1-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0
+; AVX1-NEXT: retq
+;
+; AVX512-LABEL: test_intrinsic_fmin_v4f32:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vminps %xmm0, %xmm1, %xmm2
+; AVX512-NEXT: vcmpordps %xmm0, %xmm0, %xmm0
+; AVX512-NEXT: vblendvps %xmm0, %xmm2, %xmm1, %xmm0
+; AVX512-NEXT: retq
%z = call <4 x float> @llvm.minnum.v4f32(<4 x float> %x, <4 x float> %y) readnone
ret <4 x float> %z
}
@@ -268,12 +282,19 @@ define <8 x float> @test_intrinsic_fmin_v8f32(<8 x float> %x, <8 x float> %y) {
; SSE4-NEXT: movaps %xmm4, %xmm0
; SSE4-NEXT: retq
;
-; AVX-LABEL: test_intrinsic_fmin_v8f32:
-; AVX: # %bb.0:
-; AVX-NEXT: vminps %ymm0, %ymm1, %ymm2
-; AVX-NEXT: vcmpunordps %ymm0, %ymm0, %ymm0
-; AVX-NEXT: vblendvps %ymm0, %ymm1, %ymm2, %ymm0
-; AVX-NEXT: retq
+; AVX1-LABEL: test_intrinsic_fmin_v8f32:
+; AVX1: # %bb.0:
+; AVX1-NEXT: vminps %ymm0, %ymm1, %ymm2
+; AVX1-NEXT: vcmpunordps %ymm0, %ymm0, %ymm0
+; AVX1-NEXT: vblendvps %ymm0, %ymm1, %ymm2, %ymm0
+; AVX1-NEXT: retq
+;
+; AVX512-LABEL: test_intrinsic_fmin_v8f32:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vminps %ymm0, %ymm1, %ymm2
+; AVX512-NEXT: vcmpordps %ymm0, %ymm0, %ymm0
+; AVX512-NEXT: vblendvps %ymm0, %ymm2, %ymm1, %ymm0
+; AVX512-NEXT: retq
%z = call <8 x float> @llvm.minnum.v8f32(<8 x float> %x, <8 x float> %y) readnone
ret <8 x float> %z
}
@@ -346,10 +367,9 @@ define <16 x float> @test_intrinsic_fmin_v16f32(<16 x float> %x, <16 x float> %y
;
; AVX512-LABEL: test_intrinsic_fmin_v16f32:
; AVX512: # %bb.0:
-; AVX512-NEXT: vminps %zmm0, %zmm1, %zmm2
-; AVX512-NEXT: vcmpunordps %zmm0, %zmm0, %k1
-; AVX512-NEXT: vmovaps %zmm1, %zmm2 {%k1}
-; AVX512-NEXT: vmovaps %zmm2, %zmm0
+; AVX512-NEXT: vcmpordps %zmm0, %zmm0, %k1
+; AVX512-NEXT: vminps %zmm0, %zmm1, %zmm1 {%k1}
+; AVX512-NEXT: vmovaps %zmm1, %zmm0
; AVX512-NEXT: retq
%z = call <16 x float> @llvm.minnum.v16f32(<16 x float> %x, <16 x float> %y) readnone
ret <16 x float> %z
@@ -375,12 +395,19 @@ define <2 x double> @test_intrinsic_fmin_v2f64(<2 x double> %x, <2 x double> %y)
; SSE4-NEXT: movapd %xmm2, %xmm0
; SSE4-NEXT: retq
;
-; AVX-LABEL: test_intrinsic_fmin_v2f64:
-; AVX: # %bb.0:
-; AVX-NEXT: vminpd %xmm0, %xmm1, %xmm2
-; AVX-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm0
-; AVX-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0
-; AVX-NEXT: retq
+; AVX1-LABEL: test_intrinsic_fmin_v2f64:
+; AVX1: # %bb.0:
+; AVX1-NEXT: vminpd %xmm0, %xmm1, %xmm2
+; AVX1-NEXT: vcmpunordpd %xmm0, %xmm0, %xmm0
+; AVX1-NEXT: vblendvpd %xmm0, %xmm1, %xmm2, %xmm0
+; AVX1-NEXT: retq
+;
+; AVX512-LABEL: test_intrinsic_fmin_v2f64:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vminpd %xmm0, %xmm1, %xmm2
+; AVX512-NEXT: vcmpordpd %xmm0, %xmm0, %xmm0
+; AVX512-NEXT: vblendvpd %xmm0, %xmm2, %xmm1, %xmm0
+; AVX512-NEXT: retq
%z = call <2 x double> @llvm.minnum.v2f64(<2 x double> %x, <2 x double> %y) readnone
ret <2 x double> %z
}
@@ -417,12 +444,19 @@ define <4 x double> @test_intrinsic_fmin_v4f64(<4 x double> %x, <4 x double> %y)
; SSE4-NEXT: movapd %xmm4, %xmm0
; SSE4-NEXT: retq
;
-; AVX-LABEL: test_intrinsic_fmin_v4f64:
-; AVX: # %bb.0:
-; AVX-NEXT: vminpd %ymm0, %ymm1, %ymm2
-; AVX-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm0
-; AVX-NEXT: vblendvpd %ymm0, %ymm1, %ymm2, %ymm0
-; AVX-NEXT: retq
+; AVX1-LABEL: test_intrinsic_fmin_v4f64:
+; AVX1: # %bb.0:
+; AVX1-NEXT: vminpd %ymm0, %ymm1, %ymm2
+; AVX1-NEXT: vcmpunordpd %ymm0, %ymm0, %ymm0
+; AVX1-NEXT: vblendvpd %ymm0, %ymm1, %ymm2, %ymm0
+; AVX1-NEXT: retq
+;
+; AVX512-LABEL: test_intrinsic_fmin_v4f64:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vminpd %ymm0, %ymm1, %ymm2
+; AVX512-NEXT: vcmpordpd %ymm0, %ymm0, %ymm0
+; AVX512-NEXT: vblendvpd %ymm0, %ymm2, %ymm1, %ymm0
+; AVX512-NEXT: retq
%z = call <4 x double> @llvm.minnum.v4f64(<4 x double> %x, <4 x double> %y) readnone
ret <4 x double> %z
}
@@ -495,10 +529,9 @@ define <8 x double> @test_intrinsic_fmin_v8f64(<8 x double> %x, <8 x double> %y)
;
; AVX512-LABEL: test_intrinsic_fmin_v8f64:
; AVX512: # %bb.0:
-; AVX512-NEXT: vminpd %zmm0, %zmm1, %zmm2
-; AVX512-NEXT: vcmpunordpd %zmm0, %zmm0, %k1
-; AVX512-NEXT: vmovapd %zmm1, %zmm2 {%k1}
-; AVX512-NEXT: vmovapd %zmm2, %zmm0
+; AVX512-NEXT: vcmpordpd %zmm0, %zmm0, %k1
+; AVX512-NEXT: vminpd %zmm0, %zmm1, %zmm1 {%k1}
+; AVX512-NEXT: vmovapd %zmm1, %zmm0
; AVX512-NEXT: retq
%z = call <8 x double> @llvm.minnum.v8f64(<8 x double> %x, <8 x double> %y) readnone
ret <8 x double> %z
diff --git a/llvm/test/CodeGen/X86/vector-reduce-fmax.ll b/llvm/test/CodeGen/X86/vector-reduce-fmax.ll
index 7048b98227620..ece1005bcee77 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-fmax.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-fmax.ll
@@ -1039,32 +1039,31 @@ define double @test_v16f64(<16 x double> %a0) {
;
; AVX512-LABEL: test_v16f64:
; AVX512: # %bb.0:
-; AVX512-NEXT: vmaxpd %zmm0, %zmm1, %zmm2
-; AVX512-NEXT: vcmpunordpd %zmm0, %zmm0, %k1
-; AVX512-NEXT: vmovapd %zmm1, %zmm2 {%k1}
-; AVX512-NEXT: vshufpd {{.*#+}} xmm0 = xmm2[1,0]
-; AVX512-NEXT: vmaxsd %xmm2, %xmm0, %xmm1
-; AVX512-NEXT: vcmpunordsd %xmm2, %xmm2, %k1
-; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}
-; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1
-; AVX512-NEXT: vextractf128 $1, %ymm2, %xmm0
-; AVX512-NEXT: vmaxsd %xmm1, %xmm0, %xmm1
-; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}
+; AVX512-NEXT: vcmpordpd %zmm0, %zmm0, %k1
+; AVX512-NEXT: vmaxpd %zmm0, %zmm1, %zmm1 {%k1}
+; AVX512-NEXT: vshufpd {{.*#+}} xmm0 = xmm1[1,0]
+; AVX512-NEXT: vmaxsd %xmm1, %xmm0, %xmm2
; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1
+; AVX512-NEXT: vmovsd %xmm0, %xmm2, %xmm2 {%k1}
+; AVX512-NEXT: vcmpunordsd %xmm2, %xmm2, %k1
+; AVX512-NEXT: vextractf128 $1, %ymm1, %xmm0
+; AVX512-NEXT: vmaxsd %xmm2, %xmm0, %xmm2
+; AVX512-NEXT: vmovsd %xmm0, %xmm2, %xmm2 {%k1}
+; AVX512-NEXT: vcmpunordsd %xmm2, %xmm2, %k1
; AVX512-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]
-; AVX512-NEXT: vmaxsd %xmm1, %xmm0, %xmm1
-; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}
-; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1
-; AVX512-NEXT: vextractf32x4 $2, %zmm2, %xmm0
-; AVX512-NEXT: vmaxsd %xmm1, %xmm0, %xmm1
-; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}
-; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1
+; AVX512-NEXT: vmaxsd %xmm2, %xmm0, %xmm2
+; AVX512-NEXT: vmovsd %xmm0, %xmm2, %xmm2 {%k1}
+; AVX512-NEXT: vcmpunordsd %xmm2, %xmm2, %k1
+; AVX512-NEXT: vextractf32x4 $2, %zmm1, %xmm0
+; AVX512-NEXT: vmaxsd %xmm2, %xmm0, %xmm2
+; AVX512-NEXT: vmovsd %xmm0, %xmm2, %xmm2 {%k1}
+; AVX512-NEXT: vcmpunordsd %xmm2, %xmm2, %k1
; AVX512-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]
-; AVX512-NEXT: vmaxsd %xmm1, %xmm0, %xmm1
-; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}
-; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1
-; AVX512-NEXT: vextractf32x4 $3, %zmm2, %xmm0
-; AVX512-NEXT: vmaxsd %xmm1, %xmm0, %xmm1
+; AVX512-NEXT: vmaxsd %xmm2, %xmm0, %xmm2
+; AVX512-NEXT: vmovsd %xmm0, %xmm2, %xmm2 {%k1}
+; AVX512-NEXT: vcmpunordsd %xmm2, %xmm2, %k1
+; AVX512-NEXT: vextractf32x4 $3, %zmm1, %xmm0
+; AVX512-NEXT: vmaxsd %xmm2, %xmm0, %xmm1
; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}
; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1
; AVX512-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]
diff --git a/llvm/test/CodeGen/X86/vector-reduce-fmin.ll b/llvm/test/CodeGen/X86/vector-reduce-fmin.ll
index 727af12217c67..51fdf9fb9d47e 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-fmin.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-fmin.ll
@@ -1043,32 +1043,31 @@ define double @test_v16f64(<16 x double> %a0) {
;
; AVX512-LABEL: test_v16f64:
; AVX512: # %bb.0:
-; AVX512-NEXT: vminpd %zmm0, %zmm1, %zmm2
-; AVX512-NEXT: vcmpunordpd %zmm0, %zmm0, %k1
-; AVX512-NEXT: vmovapd %zmm1, %zmm2 {%k1}
-; AVX512-NEXT: vshufpd {{.*#+}} xmm0 = xmm2[1,0]
-; AVX512-NEXT: vminsd %xmm2, %xmm0, %xmm1
-; AVX512-NEXT: vcmpunordsd %xmm2, %xmm2, %k1
-; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}
-; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1
-; AVX512-NEXT: vextractf128 $1, %ymm2, %xmm0
-; AVX512-NEXT: vminsd %xmm1, %xmm0, %xmm1
-; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}
+; AVX512-NEXT: vcmpordpd %zmm0, %zmm0, %k1
+; AVX512-NEXT: vminpd %zmm0, %zmm1, %zmm1 {%k1}
+; AVX512-NEXT: vshufpd {{.*#+}} xmm0 = xmm1[1,0]
+; AVX512-NEXT: vminsd %xmm1, %xmm0, %xmm2
; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1
+; AVX512-NEXT: vmovsd %xmm0, %xmm2, %xmm2 {%k1}
+; AVX512-NEXT: vcmpunordsd %xmm2, %xmm2, %k1
+; AVX512-NEXT: vextractf128 $1, %ymm1, %xmm0
+; AVX512-NEXT: vminsd %xmm2, %xmm0, %xmm2
+; AVX512-NEXT: vmovsd %xmm0, %xmm2, %xmm2 {%k1}
+; AVX512-NEXT: vcmpunordsd %xmm2, %xmm2, %k1
; AVX512-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]
-; AVX512-NEXT: vminsd %xmm1, %xmm0, %xmm1
-; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}
-; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1
-; AVX512-NEXT: vextractf32x4 $2, %zmm2, %xmm0
-; AVX512-NEXT: vminsd %xmm1, %xmm0, %xmm1
-; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}
-; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1
+; AVX512-NEXT: vminsd %xmm2, %xmm0, %xmm2
+; AVX512-NEXT: vmovsd %xmm0, %xmm2, %xmm2 {%k1}
+; AVX512-NEXT: vcmpunordsd %xmm2, %xmm2, %k1
+; AVX512-NEXT: vextractf32x4 $2, %zmm1, %xmm0
+; AVX512-NEXT: vminsd %xmm2, %xmm0, %xmm2
+; AVX512-NEXT: vmovsd %xmm0, %xmm2, %xmm2 {%k1}
+; AVX512-NEXT: vcmpunordsd %xmm2, %xmm2, %k1
; AVX512-NEXT: vshufpd {{.*#+}} xmm0 = xmm0[1,0]
-; AVX512-NEXT: vminsd %xmm1, %xmm0, %xmm1
-; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}
-; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1
-; AVX512-NEXT: vextractf32x4 $3, %zmm2, %xmm0
-; AVX512-NEXT: vminsd %xmm1, %xmm0, %xmm1
+; AVX512-NEXT: vminsd %xmm2, %xmm0, %xmm2
+; AVX512-NEXT: vmovsd %xmm0, %xmm2, %xmm2 {%k1}
+; AVX512-NEXT: vcmpunordsd %xmm2, %xmm2, %k1
+; AVX512-NEXT: vextractf32x4 $3, %zmm1, %xmm0
+; AVX512-NEXT: vminsd %xmm2, %xmm0, %xmm1
; AVX512-NEXT: vmovsd %xmm0, %xmm1, %xmm1 {%k1}
; AVX512-NEXT: vcmpunordsd %xmm1, %xmm1, %k1
; AVX512-NEXT: vshufpd {{.*#+}} xmm2 = xmm0[1,0]
More information about the llvm-commits
mailing list