diff --git a/clang/include/clang/Basic/BuiltinsX86.def b/clang/include/clang/Basic/BuiltinsX86.def --- a/clang/include/clang/Basic/BuiltinsX86.def +++ b/clang/include/clang/Basic/BuiltinsX86.def @@ -1871,6 +1871,24 @@ TARGET_BUILTIN(__builtin_ia32_selectss_128, "V4fUcV4fV4f", "ncV:128:", "avx512f") TARGET_BUILTIN(__builtin_ia32_selectsd_128, "V2dUcV2dV2d", "ncV:128:", "avx512f") +// generic reduction intrinsics +TARGET_BUILTIN(__builtin_ia32_reduce_add_d512, "iV16i", "ncV:512:", "avx512f") +TARGET_BUILTIN(__builtin_ia32_reduce_add_q512, "OiV8Oi", "ncV:512:", "avx512f") +TARGET_BUILTIN(__builtin_ia32_reduce_and_d512, "iV16i", "ncV:512:", "avx512f") +TARGET_BUILTIN(__builtin_ia32_reduce_and_q512, "OiV8Oi", "ncV:512:", "avx512f") +TARGET_BUILTIN(__builtin_ia32_reduce_mul_d512, "iV16i", "ncV:512:", "avx512f") +TARGET_BUILTIN(__builtin_ia32_reduce_mul_q512, "OiV8Oi", "ncV:512:", "avx512f") +TARGET_BUILTIN(__builtin_ia32_reduce_or_d512, "iV16i", "ncV:512:", "avx512f") +TARGET_BUILTIN(__builtin_ia32_reduce_or_q512, "OiV8Oi", "ncV:512:", "avx512f") +TARGET_BUILTIN(__builtin_ia32_reduce_smax_d512, "iV16i", "ncV:512:", "avx512f") +TARGET_BUILTIN(__builtin_ia32_reduce_smax_q512, "OiV8Oi", "ncV:512:", "avx512f") +TARGET_BUILTIN(__builtin_ia32_reduce_smin_d512, "iV16i", "ncV:512:", "avx512f") +TARGET_BUILTIN(__builtin_ia32_reduce_smin_q512, "OiV8Oi", "ncV:512:", "avx512f") +TARGET_BUILTIN(__builtin_ia32_reduce_umax_d512, "iV16i", "ncV:512:", "avx512f") +TARGET_BUILTIN(__builtin_ia32_reduce_umax_q512, "OiV8Oi", "ncV:512:", "avx512f") +TARGET_BUILTIN(__builtin_ia32_reduce_umin_d512, "iV16i", "ncV:512:", "avx512f") +TARGET_BUILTIN(__builtin_ia32_reduce_umin_q512, "OiV8Oi", "ncV:512:", "avx512f") + // MONITORX/MWAITX TARGET_BUILTIN(__builtin_ia32_monitorx, "vvC*UiUi", "n", "mwaitx") TARGET_BUILTIN(__builtin_ia32_mwaitx, "vUiUiUi", "n", "mwaitx") diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -13416,6 +13416,56 @@ // Ops 0 and 1 are swapped. return EmitX86FunnelShift(*this, Ops[1], Ops[0], Ops[2], true); + // Reductions + case X86::BI__builtin_ia32_reduce_add_d512: + case X86::BI__builtin_ia32_reduce_add_q512: { + Function *F = + CGM.getIntrinsic(Intrinsic::vector_reduce_add, Ops[0]->getType()); + return Builder.CreateCall(F, {Ops[0]}); + } + case X86::BI__builtin_ia32_reduce_and_d512: + case X86::BI__builtin_ia32_reduce_and_q512: { + Function *F = + CGM.getIntrinsic(Intrinsic::vector_reduce_and, Ops[0]->getType()); + return Builder.CreateCall(F, {Ops[0]}); + } + case X86::BI__builtin_ia32_reduce_mul_d512: + case X86::BI__builtin_ia32_reduce_mul_q512: { + Function *F = + CGM.getIntrinsic(Intrinsic::vector_reduce_mul, Ops[0]->getType()); + return Builder.CreateCall(F, {Ops[0]}); + } + case X86::BI__builtin_ia32_reduce_or_d512: + case X86::BI__builtin_ia32_reduce_or_q512: { + Function *F = + CGM.getIntrinsic(Intrinsic::vector_reduce_or, Ops[0]->getType()); + return Builder.CreateCall(F, {Ops[0]}); + } + case X86::BI__builtin_ia32_reduce_smax_d512: + case X86::BI__builtin_ia32_reduce_smax_q512: { + Function *F = + CGM.getIntrinsic(Intrinsic::vector_reduce_smax, Ops[0]->getType()); + return Builder.CreateCall(F, {Ops[0]}); + } + case X86::BI__builtin_ia32_reduce_smin_d512: + case X86::BI__builtin_ia32_reduce_smin_q512: { + Function *F = + CGM.getIntrinsic(Intrinsic::vector_reduce_smin, Ops[0]->getType()); + return Builder.CreateCall(F, {Ops[0]}); + } + case X86::BI__builtin_ia32_reduce_umax_d512: + case X86::BI__builtin_ia32_reduce_umax_q512: { + Function *F = + CGM.getIntrinsic(Intrinsic::vector_reduce_umax, Ops[0]->getType()); + return Builder.CreateCall(F, {Ops[0]}); + } + case X86::BI__builtin_ia32_reduce_umin_d512: + case X86::BI__builtin_ia32_reduce_umin_q512: { + Function *F = + CGM.getIntrinsic(Intrinsic::vector_reduce_umin, Ops[0]->getType()); + return Builder.CreateCall(F, {Ops[0]}); + } + // 3DNow! case X86::BI__builtin_ia32_pswapdsf: case X86::BI__builtin_ia32_pswapdsi: { diff --git a/clang/lib/Headers/avx512fintrin.h b/clang/lib/Headers/avx512fintrin.h --- a/clang/lib/Headers/avx512fintrin.h +++ b/clang/lib/Headers/avx512fintrin.h @@ -9305,57 +9305,45 @@ * This takes log2(n) steps where n is the number of elements in the vector. */ -#define _mm512_mask_reduce_operator(op) \ - __v4du __t1 = (__v4du)_mm512_extracti64x4_epi64(__W, 0); \ - __v4du __t2 = (__v4du)_mm512_extracti64x4_epi64(__W, 1); \ - __m256i __t3 = (__m256i)(__t1 op __t2); \ - __v2du __t4 = (__v2du)_mm256_extracti128_si256(__t3, 0); \ - __v2du __t5 = (__v2du)_mm256_extracti128_si256(__t3, 1); \ - __v2du __t6 = __t4 op __t5; \ - __v2du __t7 = __builtin_shufflevector(__t6, __t6, 1, 0); \ - __v2du __t8 = __t6 op __t7; \ - return __t8[0] - static __inline__ long long __DEFAULT_FN_ATTRS512 _mm512_reduce_add_epi64(__m512i __W) { - _mm512_mask_reduce_operator(+); + return __builtin_ia32_reduce_add_q512(__W); } static __inline__ long long __DEFAULT_FN_ATTRS512 _mm512_reduce_mul_epi64(__m512i __W) { - _mm512_mask_reduce_operator(*); + return __builtin_ia32_reduce_mul_q512(__W); } static __inline__ long long __DEFAULT_FN_ATTRS512 _mm512_reduce_and_epi64(__m512i __W) { - _mm512_mask_reduce_operator(&); + return __builtin_ia32_reduce_and_q512(__W); } static __inline__ long long __DEFAULT_FN_ATTRS512 _mm512_reduce_or_epi64(__m512i __W) { - _mm512_mask_reduce_operator(|); + return __builtin_ia32_reduce_or_q512(__W); } static __inline__ long long __DEFAULT_FN_ATTRS512 _mm512_mask_reduce_add_epi64(__mmask8 __M, __m512i __W) { __W = _mm512_maskz_mov_epi64(__M, __W); - _mm512_mask_reduce_operator(+); + return __builtin_ia32_reduce_add_q512(__W); } static __inline__ long long __DEFAULT_FN_ATTRS512 _mm512_mask_reduce_mul_epi64(__mmask8 __M, __m512i __W) { __W = _mm512_mask_mov_epi64(_mm512_set1_epi64(1), __M, __W); - _mm512_mask_reduce_operator(*); + return __builtin_ia32_reduce_mul_q512(__W); } static __inline__ long long __DEFAULT_FN_ATTRS512 _mm512_mask_reduce_and_epi64(__mmask8 __M, __m512i __W) { __W = _mm512_mask_mov_epi64(_mm512_set1_epi64(~0ULL), __M, __W); - _mm512_mask_reduce_operator(&); + return __builtin_ia32_reduce_and_q512(__W); } static __inline__ long long __DEFAULT_FN_ATTRS512 _mm512_mask_reduce_or_epi64(__mmask8 __M, __m512i __W) { __W = _mm512_maskz_mov_epi64(__M, __W); - _mm512_mask_reduce_operator(|); + return __builtin_ia32_reduce_or_q512(__W); } -#undef _mm512_mask_reduce_operator #define _mm512_mask_reduce_operator(op) \ __m256d __t1 = _mm512_extractf64x4_pd(__W, 0); \ @@ -9389,63 +9377,49 @@ } #undef _mm512_mask_reduce_operator -#define _mm512_mask_reduce_operator(op) \ - __v8su __t1 = (__v8su)_mm512_extracti64x4_epi64(__W, 0); \ - __v8su __t2 = (__v8su)_mm512_extracti64x4_epi64(__W, 1); \ - __m256i __t3 = (__m256i)(__t1 op __t2); \ - __v4su __t4 = (__v4su)_mm256_extracti128_si256(__t3, 0); \ - __v4su __t5 = (__v4su)_mm256_extracti128_si256(__t3, 1); \ - __v4su __t6 = __t4 op __t5; \ - __v4su __t7 = __builtin_shufflevector(__t6, __t6, 2, 3, 0, 1); \ - __v4su __t8 = __t6 op __t7; \ - __v4su __t9 = __builtin_shufflevector(__t8, __t8, 1, 0, 3, 2); \ - __v4su __t10 = __t8 op __t9; \ - return __t10[0] - static __inline__ int __DEFAULT_FN_ATTRS512 _mm512_reduce_add_epi32(__m512i __W) { - _mm512_mask_reduce_operator(+); + return __builtin_ia32_reduce_add_d512((__v16si)__W); } static __inline__ int __DEFAULT_FN_ATTRS512 _mm512_reduce_mul_epi32(__m512i __W) { - _mm512_mask_reduce_operator(*); + return __builtin_ia32_reduce_mul_d512((__v16si)__W); } static __inline__ int __DEFAULT_FN_ATTRS512 _mm512_reduce_and_epi32(__m512i __W) { - _mm512_mask_reduce_operator(&); + return __builtin_ia32_reduce_and_d512((__v16si)__W); } static __inline__ int __DEFAULT_FN_ATTRS512 _mm512_reduce_or_epi32(__m512i __W) { - _mm512_mask_reduce_operator(|); + return __builtin_ia32_reduce_or_d512((__v16si)__W); } static __inline__ int __DEFAULT_FN_ATTRS512 _mm512_mask_reduce_add_epi32( __mmask16 __M, __m512i __W) { __W = _mm512_maskz_mov_epi32(__M, __W); - _mm512_mask_reduce_operator(+); + return __builtin_ia32_reduce_add_d512((__v16si)__W); } static __inline__ int __DEFAULT_FN_ATTRS512 _mm512_mask_reduce_mul_epi32( __mmask16 __M, __m512i __W) { __W = _mm512_mask_mov_epi32(_mm512_set1_epi32(1), __M, __W); - _mm512_mask_reduce_operator(*); + return __builtin_ia32_reduce_mul_d512((__v16si)__W); } static __inline__ int __DEFAULT_FN_ATTRS512 _mm512_mask_reduce_and_epi32( __mmask16 __M, __m512i __W) { __W = _mm512_mask_mov_epi32(_mm512_set1_epi32(~0U), __M, __W); - _mm512_mask_reduce_operator(&); + return __builtin_ia32_reduce_and_d512((__v16si)__W); } static __inline__ int __DEFAULT_FN_ATTRS512 _mm512_mask_reduce_or_epi32(__mmask16 __M, __m512i __W) { __W = _mm512_maskz_mov_epi32(__M, __W); - _mm512_mask_reduce_operator(|); + return __builtin_ia32_reduce_or_d512((__v16si)__W); } -#undef _mm512_mask_reduce_operator #define _mm512_mask_reduce_operator(op) \ __m256 __t1 = (__m256)_mm512_extractf64x4_pd((__m512d)__W, 0); \ @@ -9483,117 +9457,92 @@ } #undef _mm512_mask_reduce_operator -#define _mm512_mask_reduce_operator(op) \ - __m512i __t1 = (__m512i)__builtin_shufflevector((__v8di)__V, (__v8di)__V, 4, 5, 6, 7, 0, 1, 2, 3); \ - __m512i __t2 = _mm512_##op(__V, __t1); \ - __m512i __t3 = (__m512i)__builtin_shufflevector((__v8di)__t2, (__v8di)__t2, 2, 3, 0, 1, 6, 7, 4, 5); \ - __m512i __t4 = _mm512_##op(__t2, __t3); \ - __m512i __t5 = (__m512i)__builtin_shufflevector((__v8di)__t4, (__v8di)__t4, 1, 0, 3, 2, 5, 4, 7, 6); \ - __v8di __t6 = (__v8di)_mm512_##op(__t4, __t5); \ - return __t6[0] - static __inline__ long long __DEFAULT_FN_ATTRS512 _mm512_reduce_max_epi64(__m512i __V) { - _mm512_mask_reduce_operator(max_epi64); + return __builtin_ia32_reduce_smax_q512(__V); } static __inline__ unsigned long long __DEFAULT_FN_ATTRS512 _mm512_reduce_max_epu64(__m512i __V) { - _mm512_mask_reduce_operator(max_epu64); + return __builtin_ia32_reduce_umax_q512(__V); } static __inline__ long long __DEFAULT_FN_ATTRS512 _mm512_reduce_min_epi64(__m512i __V) { - _mm512_mask_reduce_operator(min_epi64); + return __builtin_ia32_reduce_smin_q512(__V); } static __inline__ unsigned long long __DEFAULT_FN_ATTRS512 _mm512_reduce_min_epu64(__m512i __V) { - _mm512_mask_reduce_operator(min_epu64); + return __builtin_ia32_reduce_umin_q512(__V); } static __inline__ long long __DEFAULT_FN_ATTRS512 _mm512_mask_reduce_max_epi64(__mmask8 __M, __m512i __V) { __V = _mm512_mask_mov_epi64(_mm512_set1_epi64(-__LONG_LONG_MAX__ - 1LL), __M, __V); - _mm512_mask_reduce_operator(max_epi64); + return __builtin_ia32_reduce_smax_q512(__V); } static __inline__ unsigned long long __DEFAULT_FN_ATTRS512 _mm512_mask_reduce_max_epu64(__mmask8 __M, __m512i __V) { __V = _mm512_maskz_mov_epi64(__M, __V); - _mm512_mask_reduce_operator(max_epu64); + return __builtin_ia32_reduce_umax_q512(__V); } static __inline__ long long __DEFAULT_FN_ATTRS512 _mm512_mask_reduce_min_epi64(__mmask8 __M, __m512i __V) { __V = _mm512_mask_mov_epi64(_mm512_set1_epi64(__LONG_LONG_MAX__), __M, __V); - _mm512_mask_reduce_operator(min_epi64); + return __builtin_ia32_reduce_smin_q512(__V); } static __inline__ unsigned long long __DEFAULT_FN_ATTRS512 _mm512_mask_reduce_min_epu64(__mmask8 __M, __m512i __V) { __V = _mm512_mask_mov_epi64(_mm512_set1_epi64(~0ULL), __M, __V); - _mm512_mask_reduce_operator(min_epu64); + return __builtin_ia32_reduce_umin_q512(__V); } -#undef _mm512_mask_reduce_operator - -#define _mm512_mask_reduce_operator(op) \ - __m256i __t1 = _mm512_extracti64x4_epi64(__V, 0); \ - __m256i __t2 = _mm512_extracti64x4_epi64(__V, 1); \ - __m256i __t3 = _mm256_##op(__t1, __t2); \ - __m128i __t4 = _mm256_extracti128_si256(__t3, 0); \ - __m128i __t5 = _mm256_extracti128_si256(__t3, 1); \ - __m128i __t6 = _mm_##op(__t4, __t5); \ - __m128i __t7 = (__m128i)__builtin_shufflevector((__v4si)__t6, (__v4si)__t6, 2, 3, 0, 1); \ - __m128i __t8 = _mm_##op(__t6, __t7); \ - __m128i __t9 = (__m128i)__builtin_shufflevector((__v4si)__t8, (__v4si)__t8, 1, 0, 3, 2); \ - __v4si __t10 = (__v4si)_mm_##op(__t8, __t9); \ - return __t10[0] - static __inline__ int __DEFAULT_FN_ATTRS512 _mm512_reduce_max_epi32(__m512i __V) { - _mm512_mask_reduce_operator(max_epi32); + return __builtin_ia32_reduce_smax_d512((__v16si)__V); } static __inline__ unsigned int __DEFAULT_FN_ATTRS512 _mm512_reduce_max_epu32(__m512i __V) { - _mm512_mask_reduce_operator(max_epu32); + return __builtin_ia32_reduce_umax_d512((__v16si)__V); } static __inline__ int __DEFAULT_FN_ATTRS512 _mm512_reduce_min_epi32(__m512i __V) { - _mm512_mask_reduce_operator(min_epi32); + return __builtin_ia32_reduce_smin_d512((__v16si)__V); } static __inline__ unsigned int __DEFAULT_FN_ATTRS512 _mm512_reduce_min_epu32(__m512i __V) { - _mm512_mask_reduce_operator(min_epu32); + return __builtin_ia32_reduce_umin_d512((__v16si)__V); } static __inline__ int __DEFAULT_FN_ATTRS512 _mm512_mask_reduce_max_epi32(__mmask16 __M, __m512i __V) { __V = _mm512_mask_mov_epi32(_mm512_set1_epi32(-__INT_MAX__ - 1), __M, __V); - _mm512_mask_reduce_operator(max_epi32); + return __builtin_ia32_reduce_smax_d512((__v16si)__V); } static __inline__ unsigned int __DEFAULT_FN_ATTRS512 _mm512_mask_reduce_max_epu32(__mmask16 __M, __m512i __V) { __V = _mm512_maskz_mov_epi32(__M, __V); - _mm512_mask_reduce_operator(max_epu32); + return __builtin_ia32_reduce_umax_d512((__v16si)__V); } static __inline__ int __DEFAULT_FN_ATTRS512 _mm512_mask_reduce_min_epi32(__mmask16 __M, __m512i __V) { __V = _mm512_mask_mov_epi32(_mm512_set1_epi32(__INT_MAX__), __M, __V); - _mm512_mask_reduce_operator(min_epi32); + return __builtin_ia32_reduce_smin_d512((__v16si)__V); } static __inline__ unsigned int __DEFAULT_FN_ATTRS512 _mm512_mask_reduce_min_epu32(__mmask16 __M, __m512i __V) { __V = _mm512_mask_mov_epi32(_mm512_set1_epi32(~0U), __M, __V); - _mm512_mask_reduce_operator(min_epu32); + return __builtin_ia32_reduce_umin_d512((__v16si)__V); } -#undef _mm512_mask_reduce_operator #define _mm512_mask_reduce_operator(op) \ __m256d __t1 = _mm512_extractf64x4_pd(__V, 0); \ diff --git a/clang/test/CodeGen/X86/avx512-reduceIntrin.c b/clang/test/CodeGen/X86/avx512-reduceIntrin.c --- a/clang/test/CodeGen/X86/avx512-reduceIntrin.c +++ b/clang/test/CodeGen/X86/avx512-reduceIntrin.c @@ -4,57 +4,25 @@ long long test_mm512_reduce_add_epi64(__m512i __W){ // CHECK-LABEL: @test_mm512_reduce_add_epi64( -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: add <4 x i64> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: add <2 x i64> %{{.*}}, %{{.*}} -// CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> -// CHECK: add <2 x i64> %{{.*}}, %{{.*}} -// CHECK: extractelement <2 x i64> %{{.*}}, i32 0 +// CHECK: call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> %{{.*}}) return _mm512_reduce_add_epi64(__W); } long long test_mm512_reduce_mul_epi64(__m512i __W){ // CHECK-LABEL: @test_mm512_reduce_mul_epi64( -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: mul <4 x i64> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: mul <2 x i64> %{{.*}}, %{{.*}} -// CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> -// CHECK: mul <2 x i64> %{{.*}}, %{{.*}} -// CHECK: extractelement <2 x i64> %{{.*}}, i32 0 +// CHECK: call i64 @llvm.vector.reduce.mul.v8i64(<8 x i64> %{{.*}}) return _mm512_reduce_mul_epi64(__W); } long long test_mm512_reduce_or_epi64(__m512i __W){ // CHECK-LABEL: @test_mm512_reduce_or_epi64( -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: or <4 x i64> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: or <2 x i64> %{{.*}}, %{{.*}} -// CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> -// CHECK: or <2 x i64> %{{.*}}, %{{.*}} -// CHECK: extractelement <2 x i64> %{{.*}}, i32 0 +// CHECK: call i64 @llvm.vector.reduce.or.v8i64(<8 x i64> %{{.*}}) return _mm512_reduce_or_epi64(__W); } long long test_mm512_reduce_and_epi64(__m512i __W){ // CHECK-LABEL: @test_mm512_reduce_and_epi64( -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: and <4 x i64> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: and <2 x i64> %{{.*}}, %{{.*}} -// CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> -// CHECK: and <2 x i64> %{{.*}}, %{{.*}} -// CHECK: extractelement <2 x i64> %{{.*}}, i32 0 +// CHECK: call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %{{.*}}) return _mm512_reduce_and_epi64(__W); } @@ -62,15 +30,7 @@ // CHECK-LABEL: @test_mm512_mask_reduce_add_epi64( // CHECK: bitcast i8 %{{.*}} to <8 x i1> // CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}} -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: add <4 x i64> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: add <2 x i64> %{{.*}}, %{{.*}} -// CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> -// CHECK: add <2 x i64> %{{.*}}, %{{.*}} -// CHECK: extractelement <2 x i64> %{{.*}}, i32 0 +// CHECK: call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> %{{.*}}) return _mm512_mask_reduce_add_epi64(__M, __W); } @@ -78,15 +38,7 @@ // CHECK-LABEL: @test_mm512_mask_reduce_mul_epi64( // CHECK: bitcast i8 %{{.*}} to <8 x i1> // CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}} -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: mul <4 x i64> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: mul <2 x i64> %{{.*}}, %{{.*}} -// CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> -// CHECK: mul <2 x i64> %{{.*}}, %{{.*}} -// CHECK: extractelement <2 x i64> %{{.*}}, i32 0 +// CHECK: call i64 @llvm.vector.reduce.mul.v8i64(<8 x i64> %{{.*}}) return _mm512_mask_reduce_mul_epi64(__M, __W); } @@ -94,15 +46,7 @@ // CHECK-LABEL: @test_mm512_mask_reduce_and_epi64( // CHECK: bitcast i8 %{{.*}} to <8 x i1> // CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}} -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: and <4 x i64> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: and <2 x i64> %{{.*}}, %{{.*}} -// CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> -// CHECK: and <2 x i64> %{{.*}}, %{{.*}} -// CHECK: extractelement <2 x i64> %{{.*}}, i32 0 +// CHECK: call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %{{.*}}) return _mm512_mask_reduce_and_epi64(__M, __W); } @@ -110,79 +54,30 @@ // CHECK-LABEL: @test_mm512_mask_reduce_or_epi64( // CHECK: bitcast i8 %{{.*}} to <8 x i1> // CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}} -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: or <4 x i64> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: or <2 x i64> %{{.*}}, %{{.*}} -// CHECK: shufflevector <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i32> -// CHECK: or <2 x i64> %{{.*}}, %{{.*}} -// CHECK: extractelement <2 x i64> %{{.*}}, i32 0 +// CHECK: call i64 @llvm.vector.reduce.or.v8i64(<8 x i64> %{{.*}}) return _mm512_mask_reduce_or_epi64(__M, __W); } int test_mm512_reduce_add_epi32(__m512i __W){ // CHECK-LABEL: @test_mm512_reduce_add_epi32( -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: add <8 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: add <4 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: add <4 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: add <4 x i32> %{{.*}}, %{{.*}} -// CHECK: extractelement <4 x i32> %{{.*}}, i32 0 +// CHECK: call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %{{.*}}) return _mm512_reduce_add_epi32(__W); } int test_mm512_reduce_mul_epi32(__m512i __W){ // CHECK-LABEL: @test_mm512_reduce_mul_epi32( -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: mul <8 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: mul <4 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: mul <4 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: mul <4 x i32> %{{.*}}, %{{.*}} -// CHECK: extractelement <4 x i32> %{{.*}}, i32 0 +// CHECK: call i32 @llvm.vector.reduce.mul.v16i32(<16 x i32> %{{.*}}) return _mm512_reduce_mul_epi32(__W); } int test_mm512_reduce_or_epi32(__m512i __W){ -// CHECK-LABEL: @test_mm512_reduce_or_epi32( -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: or <8 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: or <4 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: or <4 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: or <4 x i32> %{{.*}}, %{{.*}} -// CHECK: extractelement <4 x i32> %{{.*}}, i32 0 +// CHECK: call i32 @llvm.vector.reduce.or.v16i32(<16 x i32> %{{.*}}) return _mm512_reduce_or_epi32(__W); } int test_mm512_reduce_and_epi32(__m512i __W){ // CHECK-LABEL: @test_mm512_reduce_and_epi32( -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: and <8 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: and <4 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: and <4 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: and <4 x i32> %{{.*}}, %{{.*}} -// CHECK: extractelement <4 x i32> %{{.*}}, i32 0 +// CHECK: call i32 @llvm.vector.reduce.and.v16i32(<16 x i32> %{{.*}}) return _mm512_reduce_and_epi32(__W); } @@ -190,18 +85,7 @@ // CHECK-LABEL: @test_mm512_mask_reduce_add_epi32( // CHECK: bitcast i16 %{{.*}} to <16 x i1> // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}} -// CHECK: bitcast <16 x i32> %{{.*}} to <8 x i64> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: add <8 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: add <4 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: add <4 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: add <4 x i32> %{{.*}}, %{{.*}} -// CHECK: extractelement <4 x i32> %{{.*}}, i32 0 +// CHECK: call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %{{.*}}) return _mm512_mask_reduce_add_epi32(__M, __W); } @@ -209,18 +93,7 @@ // CHECK-LABEL: @test_mm512_mask_reduce_mul_epi32( // CHECK: bitcast i16 %{{.*}} to <16 x i1> // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}} -// CHECK: bitcast <16 x i32> %{{.*}} to <8 x i64> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: mul <8 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: mul <4 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: mul <4 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: mul <4 x i32> %{{.*}}, %{{.*}} -// CHECK: extractelement <4 x i32> %{{.*}}, i32 0 +// CHECK: call i32 @llvm.vector.reduce.mul.v16i32(<16 x i32> %{{.*}}) return _mm512_mask_reduce_mul_epi32(__M, __W); } @@ -228,18 +101,7 @@ // CHECK-LABEL: @test_mm512_mask_reduce_and_epi32( // CHECK: bitcast i16 %{{.*}} to <16 x i1> // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}} -// CHECK: bitcast <16 x i32> %{{.*}} to <8 x i64> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: and <8 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: and <4 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: and <4 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: and <4 x i32> %{{.*}}, %{{.*}} -// CHECK: extractelement <4 x i32> %{{.*}}, i32 0 +// CHECK: call i32 @llvm.vector.reduce.and.v16i32(<16 x i32> %{{.*}}) return _mm512_mask_reduce_and_epi32(__M, __W); } @@ -247,18 +109,7 @@ // CHECK-LABEL: @test_mm512_mask_reduce_or_epi32( // CHECK: bitcast i16 %{{.*}} to <16 x i1> // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}} -// CHECK: bitcast <16 x i32> %{{.*}} to <8 x i64> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: or <8 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: or <4 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: or <4 x i32> %{{.*}}, %{{.*}} -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: or <4 x i32> %{{.*}}, %{{.*}} -// CHECK: extractelement <4 x i32> %{{.*}}, i32 0 +// CHECK: call i32 @llvm.vector.reduce.or.v16i32(<16 x i32> %{{.*}}) return _mm512_mask_reduce_or_epi32(__M, __W); } diff --git a/clang/test/CodeGen/X86/avx512-reduceMinMaxIntrin.c b/clang/test/CodeGen/X86/avx512-reduceMinMaxIntrin.c --- a/clang/test/CodeGen/X86/avx512-reduceMinMaxIntrin.c +++ b/clang/test/CodeGen/X86/avx512-reduceMinMaxIntrin.c @@ -4,25 +4,13 @@ long long test_mm512_reduce_max_epi64(__m512i __W){ // CHECK-LABEL: @test_mm512_reduce_max_epi64( -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.smax.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.smax.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.smax.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: extractelement <8 x i64> %{{.*}}, i32 0 +// CHECK: call i64 @llvm.vector.reduce.smax.v8i64(<8 x i64> %{{.*}}) return _mm512_reduce_max_epi64(__W); } unsigned long long test_mm512_reduce_max_epu64(__m512i __W){ // CHECK-LABEL: @test_mm512_reduce_max_epu64( -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.umax.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.umax.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.umax.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: extractelement <8 x i64> %{{.*}}, i32 0 +// CHECK: call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> %{{.*}}) return _mm512_reduce_max_epu64(__W); } @@ -42,25 +30,13 @@ long long test_mm512_reduce_min_epi64(__m512i __W){ // CHECK-LABEL: @test_mm512_reduce_min_epi64( -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.smin.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.smin.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.smin.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: extractelement <8 x i64> %{{.*}}, i32 0 +// CHECK: call i64 @llvm.vector.reduce.smin.v8i64(<8 x i64> %{{.*}}) return _mm512_reduce_min_epi64(__W); } unsigned long long test_mm512_reduce_min_epu64(__m512i __W){ // CHECK-LABEL: @test_mm512_reduce_min_epu64( -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.umin.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.umin.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.umin.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: extractelement <8 x i64> %{{.*}}, i32 0 +// CHECK: call i64 @llvm.vector.reduce.umin.v8i64(<8 x i64> %{{.*}}) return _mm512_reduce_min_epu64(__W); } @@ -82,13 +58,7 @@ // CHECK-LABEL: @test_mm512_mask_reduce_max_epi64( // CHECK: bitcast i8 %{{.*}} to <8 x i1> // CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}} -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.smax.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.smax.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.smax.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: extractelement <8 x i64> %{{.*}}, i32 0 +// CHECK: call i64 @llvm.vector.reduce.smax.v8i64(<8 x i64> %{{.*}}) return _mm512_mask_reduce_max_epi64(__M, __W); } @@ -96,13 +66,7 @@ // CHECK-LABEL: @test_mm512_mask_reduce_max_epu64( // CHECK: bitcast i8 %{{.*}} to <8 x i1> // CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}} -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.umax.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.umax.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.umax.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: extractelement <8 x i64> %{{.*}}, i32 0 +// CHECK: call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> %{{.*}}) return _mm512_mask_reduce_max_epu64(__M, __W); } @@ -126,13 +90,7 @@ // CHECK-LABEL: @test_mm512_mask_reduce_min_epi64( // CHECK: bitcast i8 %{{.*}} to <8 x i1> // CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}} -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.smin.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.smin.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.smin.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: extractelement <8 x i64> %{{.*}}, i32 0 +// CHECK: call i64 @llvm.vector.reduce.smin.v8i64(<8 x i64> %{{.*}}) return _mm512_mask_reduce_min_epi64(__M, __W); } @@ -140,13 +98,7 @@ // CHECK-LABEL: @test_mm512_mask_reduce_min_epu64( // CHECK: bitcast i8 %{{.*}} to <8 x i1> // CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}} -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.umin.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.umin.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> -// CHECK: call <8 x i64> @llvm.umin.v8i64(<8 x i64> %{{.*}}, <8 x i64> %{{.*}}) -// CHECK: extractelement <8 x i64> %{{.*}}, i32 0 +// CHECK: call i64 @llvm.vector.reduce.umin.v8i64(<8 x i64> %{{.*}}) return _mm512_mask_reduce_min_epu64(__M, __W); } @@ -168,33 +120,13 @@ int test_mm512_reduce_max_epi32(__m512i __W){ // CHECK-LABEL: @test_mm512_reduce_max_epi32( -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: call <8 x i32> @llvm.smax.v8i32(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: call <4 x i32> @llvm.smax.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: call <4 x i32> @llvm.smax.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: call <4 x i32> @llvm.smax.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: extractelement <4 x i32> %{{.*}}, i32 0 +// CHECK: call i32 @llvm.vector.reduce.smax.v16i32(<16 x i32> %{{.*}}) return _mm512_reduce_max_epi32(__W); } unsigned int test_mm512_reduce_max_epu32(__m512i __W){ // CHECK-LABEL: @test_mm512_reduce_max_epu32( -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: call <8 x i32> @llvm.umax.v8i32(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: call <4 x i32> @llvm.umax.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: call <4 x i32> @llvm.umax.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: call <4 x i32> @llvm.umax.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: extractelement <4 x i32> %{{.*}}, i32 0 +// CHECK: call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> %{{.*}}) return _mm512_reduce_max_epu32(__W); } @@ -216,33 +148,13 @@ int test_mm512_reduce_min_epi32(__m512i __W){ // CHECK-LABEL: @test_mm512_reduce_min_epi32( -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: call <8 x i32> @llvm.smin.v8i32(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: call <4 x i32> @llvm.smin.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: call <4 x i32> @llvm.smin.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: call <4 x i32> @llvm.smin.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: extractelement <4 x i32> %{{.*}}, i32 0 +// CHECK: call i32 @llvm.vector.reduce.smin.v16i32(<16 x i32> %{{.*}}) return _mm512_reduce_min_epi32(__W); } unsigned int test_mm512_reduce_min_epu32(__m512i __W){ // CHECK-LABEL: @test_mm512_reduce_min_epu32( -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: call <8 x i32> @llvm.umin.v8i32(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: call <4 x i32> @llvm.umin.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: call <4 x i32> @llvm.umin.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: call <4 x i32> @llvm.umin.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: extractelement <4 x i32> %{{.*}}, i32 0 +// CHECK: call i32 @llvm.vector.reduce.umin.v16i32(<16 x i32> %{{.*}}) return _mm512_reduce_min_epu32(__W); } @@ -266,17 +178,7 @@ // CHECK-LABEL: @test_mm512_mask_reduce_max_epi32( // CHECK: bitcast i16 %{{.*}} to <16 x i1> // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}} -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: call <8 x i32> @llvm.smax.v8i32(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: call <4 x i32> @llvm.smax.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: call <4 x i32> @llvm.smax.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: call <4 x i32> @llvm.smax.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: extractelement <4 x i32> %{{.*}}, i32 0 +// CHECK: call i32 @llvm.vector.reduce.smax.v16i32(<16 x i32> %{{.*}}) return _mm512_mask_reduce_max_epi32(__M, __W); } @@ -284,17 +186,7 @@ // CHECK-LABEL: @test_mm512_mask_reduce_max_epu32( // CHECK: bitcast i16 %{{.*}} to <16 x i1> // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}} -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: call <8 x i32> @llvm.umax.v8i32(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: call <4 x i32> @llvm.umax.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: call <4 x i32> @llvm.umax.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: call <4 x i32> @llvm.umax.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: extractelement <4 x i32> %{{.*}}, i32 0 +// CHECK: call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> %{{.*}}) return _mm512_mask_reduce_max_epu32(__M, __W); } @@ -320,17 +212,7 @@ // CHECK-LABEL: @test_mm512_mask_reduce_min_epi32( // CHECK: bitcast i16 %{{.*}} to <16 x i1> // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}} -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: call <8 x i32> @llvm.smin.v8i32(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: call <4 x i32> @llvm.smin.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: call <4 x i32> @llvm.smin.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: call <4 x i32> @llvm.smin.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: extractelement <4 x i32> %{{.*}}, i32 0 +// CHECK: call i32 @llvm.vector.reduce.smin.v16i32(<16 x i32> %{{.*}}) return _mm512_mask_reduce_min_epi32(__M, __W); } @@ -338,17 +220,7 @@ // CHECK-LABEL: @test_mm512_mask_reduce_min_epu32( // CHECK: bitcast i16 %{{.*}} to <16 x i1> // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}} -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> undef, <4 x i32> -// CHECK: call <8 x i32> @llvm.umin.v8i32(<8 x i32> %{{.*}}, <8 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> undef, <2 x i32> -// CHECK: call <4 x i32> @llvm.umin.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: call <4 x i32> @llvm.umin.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> -// CHECK: call <4 x i32> @llvm.umin.v4i32(<4 x i32> %{{.*}}, <4 x i32> %{{.*}}) -// CHECK: extractelement <4 x i32> %{{.*}}, i32 0 +// CHECK: call i32 @llvm.vector.reduce.umin.v16i32(<16 x i32> %{{.*}}) return _mm512_mask_reduce_min_epu32(__M, __W); }