diff --git a/clang/lib/Headers/CMakeLists.txt b/clang/lib/Headers/CMakeLists.txt index 4edce2f7db9c..9a926dbc3693 100644 --- a/clang/lib/Headers/CMakeLists.txt +++ b/clang/lib/Headers/CMakeLists.txt @@ -50,6 +50,8 @@ set(aie_files aiebase_resources.h aiebase_typedefs.h aie_addlog.h + aie_upd_ext_common.h + aie_upd_ext_primitives.h ) # aiev1 set(aiev1_intrin_h diff --git a/clang/lib/Headers/aie2p/aie2p_upd_ext.h b/clang/lib/Headers/aie2p/aie2p_upd_ext.h index 569574e041d4..ff776a97ab66 100644 --- a/clang/lib/Headers/aie2p/aie2p_upd_ext.h +++ b/clang/lib/Headers/aie2p/aie2p_upd_ext.h @@ -4,7 +4,7 @@ // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -// (c) Copyright 2024-2025 Advanced Micro Devices, Inc. or its affiliates +// (c) Copyright 2024-2026 Advanced Micro Devices, Inc. or its affiliates // //===----------------------------------------------------------------------===// @@ -393,303 +393,10 @@ INTRINSIC(unsigned int) extract_elem(v2uint32 v, int idx) { */ -//! @name Scalar updates and extracts -INTRINSIC(unsigned long long) -insert(unsigned long long a, int idx, unsigned int b) { - if (idx == 0) - return (unsigned long long)__builtin_aiev2p_upd_I64_I32((v2uint32)a, b, 0); - else - return (unsigned long long)__builtin_aiev2p_upd_I64_I32((v2uint32)a, b, 1); -} -INTRINSIC(unsigned long long) set_uint64(int idx, unsigned int b) { - if (idx == 0) - return (unsigned long long)__builtin_aiev2p_set_I64_I32(b, 0); - else - return (unsigned long long)__builtin_aiev2p_set_I64_I32(b, 1); -} -INTRINSIC(unsigned int) extract_uint32(unsigned long long a, int idx) { - if (idx == 0) - return __builtin_aiev2p_ext_I32_I64((v2uint32)a, 0); - else - return __builtin_aiev2p_ext_I32_I64((v2uint32)a, 1); -} -INTRINSIC(unsigned long long) concat(unsigned int a, unsigned int b) { - return insert(set_uint64(a, 0), 1, b); -} - -// Generic extract primitives -INTRINSIC(v8int32) extract_256_512(v16int32 a, int idx) { - if (idx % 2 == 0) - return __builtin_shufflevector(a, a, 0, 1, 2, 3, 4, 5, 6, 7); - else - return __builtin_shufflevector(a, a, 8, 9, 10, 11, 12, 13, 14, 15); -} - -INTRINSIC(v16int32) extract_512_1024(v32int32 a, int idx) { - if (idx % 2 == 0) - return __builtin_shufflevector(a, a, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - else - return __builtin_shufflevector(a, a, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31); -} - -INTRINSIC(v8int32) extract_256_1024(v32int32 a, int idx) { - if (idx % 4 == 0) - return __builtin_shufflevector(a, a, 0, 1, 2, 3, 4, 5, 6, 7); - if (idx % 4 == 1) - return __builtin_shufflevector(a, a, 8, 9, 10, 11, 12, 13, 14, 15); - if (idx % 4 == 2) - return __builtin_shufflevector(a, a, 16, 17, 18, 19, 20, 21, 22, 23); - else - return __builtin_shufflevector(a, a, 24, 25, 26, 27, 28, 29, 30, 31); -} - -INTRINSIC(v16acc64) extract_ACC1024_ACC2048(v32acc64 a, int idx) { - if (idx % 2 == 0) - return __builtin_shufflevector(a, a, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - else - return __builtin_shufflevector(a, a, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31); -} - -INTRINSIC(v8acc64) extract_ACC512_ACC2048(v32acc64 a, int idx) { - if (idx % 4 == 0) - return __builtin_shufflevector(a, a, 0, 1, 2, 3, 4, 5, 6, 7); - if (idx % 4 == 1) - return __builtin_shufflevector(a, a, 8, 9, 10, 11, 12, 13, 14, 15); - if (idx % 4 == 2) - return __builtin_shufflevector(a, a, 16, 17, 18, 19, 20, 21, 22, 23); - else - return __builtin_shufflevector(a, a, 24, 25, 26, 27, 28, 29, 30, 31); -} - -// Generic insert primitives -INTRINSIC(v16int32) insert_256_512(v16int32 a, int idx, v8int32 b) { - v8int32 undef; - v16int32 tmp = __builtin_shufflevector(b, undef, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15); - if (idx % 2 == 0) - return __builtin_shufflevector(tmp, a, 0, 1, 2, 3, 4, 5, 6, 7, 24, 25, 26, - 27, 28, 29, 30, 31); - // insert into upper half - return __builtin_shufflevector(a, tmp, 0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, - 20, 21, 22, 23); -} - -INTRINSIC(v32int32) insert_512_1024(v32int32 a, int idx, v16int32 b) { - v16int32 undef; - v32int32 tmp = __builtin_shufflevector( - b, undef, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); - if (idx % 2 == 0) - return __builtin_shufflevector(tmp, a, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63); - // insert into upper half - return __builtin_shufflevector(a, tmp, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47); -} - -INTRINSIC(v32int32) insert_256_1024(v32int32 a, int idx, v8int32 b) { - v8int32 undef_256; - v16int32 undef_512; - v16int32 tmp_512 = __builtin_shufflevector(b, undef_256, 0, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15); - v32int32 tmp_1024 = __builtin_shufflevector( - tmp_512, undef_512, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); - if (idx % 4 == 0) - return __builtin_shufflevector(tmp_1024, a, 0, 1, 2, 3, 4, 5, 6, 7, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63); - if (idx % 4 == 1) - return __builtin_shufflevector(tmp_1024, a, 32, 33, 34, 35, 36, 37, 38, 39, - 0, 1, 2, 3, 4, 5, 6, 7, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63); - if (idx % 4 == 2) - return __builtin_shufflevector(tmp_1024, a, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 0, 1, 2, 3, - 4, 5, 6, 7, 56, 57, 58, 59, 60, 61, 62, 63); - else - return __builtin_shufflevector(tmp_1024, a, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 0, 1, 2, 3, 4, 5, 6, 7); -} - -INTRINSIC(v32acc64) insert_ACC1024_ACC2048(v32acc64 a, int idx, v16acc64 b) { - v32acc64 tmp = __builtin_shufflevector( - b, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); - if (idx % 2 == 0) - return __builtin_shufflevector(tmp, a, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63); - - // insert into upper half - return __builtin_shufflevector(a, tmp, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47); -} - -INTRINSIC(v32acc64) insert_ACC512_ACC2048(v32acc64 a, int idx, v8acc64 b) { - v16acc64 tmp_1024 = __builtin_shufflevector(b, b, 0, 1, 2, 3, 4, 5, 6, 7, -1, - -1, -1, -1, -1, -1, -1, -1); - v32acc64 tmp_2048 = __builtin_shufflevector( - tmp_1024, tmp_1024, 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); - if (idx % 4 == 0) - return __builtin_shufflevector(tmp_2048, a, 0, 1, 2, 3, 4, 5, 6, 7, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63); - if (idx % 4 == 1) - return __builtin_shufflevector(a, tmp_2048, 0, 1, 2, 3, 4, 5, 6, 7, 32, 33, - 34, 35, 36, 37, 38, 39, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); - if (idx % 4 == 2) - return __builtin_shufflevector(a, tmp_2048, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 32, 33, 34, 35, 36, - 37, 38, 39, 24, 25, 26, 27, 28, 29, 30, 31); - else - return __builtin_shufflevector(a, tmp_2048, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 32, 33, 34, 35, 36, 37, 38, 39); -} - -// Generic set primitives -INTRINSIC(v16int32) set_256_512(int idx, v8int32 b) { - v8int32 tmp; - if (idx % 2 == 0) - return __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - else - return __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); -} - -INTRINSIC(v32int32) set_512_1024(int idx, v16int32 b) { - v16int32 tmp; - if (idx % 2 == 0) - return __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31); - else - return __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31); -} - -INTRINSIC(v32int32) set_256_1024(int idx, v8int32 b) { - v8int32 tmp; - v16int32 tmp2; - v16int32 tmp3; - if (idx % 4 == 0) { - tmp2 = __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - return __builtin_shufflevector(tmp2, tmp3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); - } - if (idx % 4 == 1) { - tmp2 = __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - return __builtin_shufflevector(tmp2, tmp3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); - } - if (idx % 4 == 2) { - tmp2 = __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - return __builtin_shufflevector(tmp3, tmp2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); - } else { - tmp2 = __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - return __builtin_shufflevector(tmp3, tmp2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); - } -} - -INTRINSIC(v32acc64) set_ACC1024_ACC2048(int idx, v16acc64 b) { - if (idx % 2 == 0) - return __builtin_shufflevector(b, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1); - else - return __builtin_shufflevector(b, b, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15); -} - -INTRINSIC(v32acc64) set_ACC512_ACC2048(int idx, v8acc64 b) { - v16acc64 tmp = __builtin_shufflevector(b, b, 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, - -1, -1, -1, -1, -1, -1); - - if (idx % 4 == 0) - return __builtin_shufflevector(tmp, tmp, 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); - if (idx % 4 == 1) - return __builtin_shufflevector(tmp, tmp, -1, -1, -1, -1, -1, -1, -1, -1, 0, - 1, 2, 3, 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); - if (idx % 4 == 2) - return __builtin_shufflevector(tmp, tmp, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, - 6, 7, -1, -1, -1, -1, -1, -1, -1, -1); - else - return __builtin_shufflevector(tmp, tmp, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7); -} - -// Generic concat primitives -INTRINSIC(v16int32) concat_256_512(v8int32 a0, v8int32 a1) { - return __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); -} - -INTRINSIC(v32int32) concat_512_1024(v16int32 a0, v16int32 a1) { - return __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31); -} - -INTRINSIC(v32int32) -concat_256_1024(v8int32 a0, v8int32 a1, v8int32 a2, v8int32 a3) { - v16int32 res_hi; - v16int32 res_lo; - res_hi = __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - res_lo = __builtin_shufflevector(a2, a3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - return __builtin_shufflevector(res_hi, res_lo, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); -} - -INTRINSIC(v32acc64) concat_ACC1024_ACC2048(v16acc64 a0, v16acc64 a1) { - return __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31); -} - -INTRINSIC(v32acc64) -concat_ACC512_ACC2048(v8acc64 a0, v8acc64 a1, v8acc64 a2, v8acc64 a3) { - v16acc64 res_hi; - v16acc64 res_lo; - res_lo = __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - res_hi = __builtin_shufflevector(a2, a3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - return __builtin_shufflevector(res_lo, res_hi, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); -} +// Macro-free primitives shared with aie2ps (u64 dispatchers + generic +// 256/512/1024-bit shuffle helpers). The type wrappers below depend on +// these. +#include "../aie_upd_ext_primitives.h" // Conversions @@ -1401,525 +1108,15 @@ INTRINSIC(v32acc64) concat(v16acc64 a0, v16acc64 a1) { return concat_ACC1024_ACC2048(a0, a1); } -// Generic 128-bit extract primitives -INTRINSIC(v4int32) extract_128_256(v8int32 a, int idx) { - if (idx % 2 == 0) - return __builtin_shufflevector(a, a, 0, 1, 2, 3); - else - return __builtin_shufflevector(a, a, 4, 5, 6, 7); -} - -INTRINSIC(v4int32) extract_128_512(v16int32 a, int idx) { - if (idx % 4 == 0) - return __builtin_shufflevector(a, a, 0, 1, 2, 3); - if (idx % 4 == 1) - return __builtin_shufflevector(a, a, 4, 5, 6, 7); - if (idx % 4 == 2) - return __builtin_shufflevector(a, a, 8, 9, 10, 11); - else - return __builtin_shufflevector(a, a, 12, 13, 14, 15); -} - -// Generic 128-bit insert primitives -INTRINSIC(v8int32) insert_128_256(v8int32 a, int idx, v4int32 b) { - v4int32 undef; - v8int32 tmp = __builtin_shufflevector(b, undef, 0, 1, 2, 3, 4, 5, 6, 7); - if (idx % 2 == 0) - return __builtin_shufflevector(tmp, a, 0, 1, 2, 3, 12, 13, 14, 15); - else - return __builtin_shufflevector(a, tmp, 0, 1, 2, 3, 8, 9, 10, 11); -} - -INTRINSIC(v16int32) insert_128_512(v16int32 a, int idx, v4int32 b) { - v4int32 undef_128; - v8int32 undef_256; - v8int32 tmp_256 = - __builtin_shufflevector(b, undef_128, 0, 1, 2, 3, 4, 5, 6, 7); - v16int32 tmp_512 = __builtin_shufflevector( - tmp_256, undef_256, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); - if (idx % 4 == 0) - return __builtin_shufflevector(tmp_512, a, 0, 1, 2, 3, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31); - if (idx % 4 == 1) - return __builtin_shufflevector(tmp_512, a, 16, 17, 18, 19, 0, 1, 2, 3, 24, - 25, 26, 27, 28, 29, 30, 31); - if (idx % 4 == 2) - return __builtin_shufflevector(tmp_512, a, 16, 17, 18, 19, 20, 21, 22, 23, - 0, 1, 2, 3, 28, 29, 30, 31); - else - return __builtin_shufflevector(tmp_512, a, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 0, 1, 2, 3); -} - -// Generic 128-bit set primitives -INTRINSIC(v8int32) set_128_256(int idx, v4int32 b) { - v4int32 tmp; - if (idx % 2 == 0) - return __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7); - else - return __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7); -} - -INTRINSIC(v16int32) set_128_512(int idx, v4int32 b) { - v4int32 tmp; - v8int32 tmp2; - v8int32 tmp3; - if (idx % 4 == 0) { - tmp2 = __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7); - return __builtin_shufflevector(tmp2, tmp3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15); - } - if (idx % 4 == 1) { - tmp2 = __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7); - return __builtin_shufflevector(tmp2, tmp3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15); - } - if (idx % 4 == 2) { - tmp2 = __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7); - return __builtin_shufflevector(tmp3, tmp2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15); - } else { - tmp2 = __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7); - return __builtin_shufflevector(tmp3, tmp2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15); - } -} -// Generic 128-bit concat primitives -INTRINSIC(v8int32) concat_128_256(v4int32 a0, v4int32 a1) { - return __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7); -} -INTRINSIC(v16int32) -concat_128_512(v4int32 a0, v4int32 a1, v4int32 a2, v4int32 a3) { - v8int32 res_hi; - v8int32 res_lo; - res_hi = __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7); - res_lo = __builtin_shufflevector(a2, a3, 0, 1, 2, 3, 4, 5, 6, 7); - return __builtin_shufflevector(res_hi, res_lo, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15); -} - -#define DIAGNOSE_EXTRACT_IDX(MAX) \ - __attribute__((diagnose_if(idx < 0 || idx > MAX, \ - "index out of range [0," #MAX "]", "error"))) - -INTRINSIC(v32uint4) -extract_v32uint4(v128uint4 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v32int4) -extract_v32int4(v128int4 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v16uint8) -extract_v16uint8(v64uint8 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v16int8) extract_v16int8(v64int8 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v8uint16) -extract_v8uint16(v32uint16 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v8int16) -extract_v8int16(v32int16 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v4uint32) -extract_v4uint32(v16uint32 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v4int32) -extract_v4int32(v16int32 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v8bfloat16) -extract_v8bfloat16(v32bfloat16 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v4float) -extract_v4float(v16float a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v128uint4) -set_v128uint4(int idx, v32uint4 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v128int4) set_v128int4(int idx, v32int4 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v64uint8) set_v64uint8(int idx, v16uint8 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v64int8) set_v64int8(int idx, v16int8 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v32uint16) -set_v32uint16(int idx, v8uint16 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v32int16) set_v32int16(int idx, v8int16 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v16uint32) -set_v16uint32(int idx, v4uint32 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v16int32) set_v16int32(int idx, v4int32 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v32bfloat16) -set_v32bfloat16(int idx, v8bfloat16 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v16float) set_v16float(int idx, v4float a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v32uint4) -extract_v32uint4(v64uint4 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v32int4) extract_v32int4(v64int4 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v16uint8) -extract_v16uint8(v32uint8 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v16int8) extract_v16int8(v32int8 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v8uint16) -extract_v8uint16(v16uint16 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v8int16) -extract_v8int16(v16int16 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v4uint32) -extract_v4uint32(v8uint32 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v4int32) extract_v4int32(v8int32 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v8bfloat16) -extract_v8bfloat16(v16bfloat16 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v4float) extract_v4float(v8float a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v64uint4) set_v64uint4(int idx, v32uint4 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v64int4) set_v64int4(int idx, v32int4 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v32uint8) set_v32uint8(int idx, v16uint8 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v32int8) set_v32int8(int idx, v16int8 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v16uint16) -set_v16uint16(int idx, v8uint16 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v16int16) set_v16int16(int idx, v8int16 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v8uint32) set_v8uint32(int idx, v4uint32 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v8int32) set_v8int32(int idx, v4int32 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v16bfloat16) -set_v16bfloat16(int idx, v8bfloat16 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v8float) set_v8float(int idx, v4float a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} - -INTRINSIC(v128uint4) -insert(v128uint4 v, int idx, v32uint4 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v128int4) -insert(v128int4 v, int idx, v32int4 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v64uint8) -insert(v64uint8 v, int idx, v16uint8 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v64int8) -insert(v64int8 v, int idx, v16int8 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v32uint16) -insert(v32uint16 v, int idx, v8uint16 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v32int16) -insert(v32int16 v, int idx, v8int16 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v16uint32) -insert(v16uint32 v, int idx, v4uint32 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v16int32) -insert(v16int32 v, int idx, v4int32 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v32bfloat16) -insert(v32bfloat16 v, int idx, v8bfloat16 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v16float) -insert(v16float v, int idx, v4float b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} - -INTRINSIC(v64uint4) -insert(v64uint4 a, int idx, v32uint4 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v64int4) -insert(v64int4 a, int idx, v32int4 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v32uint8) -insert(v32uint8 a, int idx, v16uint8 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v32int8) -insert(v32int8 a, int idx, v16int8 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v16uint16) -insert(v16uint16 a, int idx, v8uint16 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v16int16) -insert(v16int16 a, int idx, v8int16 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v8uint32) -insert(v8uint32 a, int idx, v4uint32 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v8int32) -insert(v8int32 a, int idx, v4int32 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v16bfloat16) -insert(v16bfloat16 a, int idx, v8bfloat16 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v8float) -insert(v8float a, int idx, v4float b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} - -INTRINSIC(v128uint4) -concat(v32uint4 v0, v32uint4 v1, v32uint4 v2, v32uint4 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v128int4) concat(v32int4 v0, v32int4 v1, v32int4 v2, v32int4 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v64uint8) concat(v16uint8 v0, v16uint8 v1, v16uint8 v2, v16uint8 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v64int8) concat(v16int8 v0, v16int8 v1, v16int8 v2, v16int8 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v32uint16) -concat(v8uint16 v0, v8uint16 v1, v8uint16 v2, v8uint16 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v32int16) concat(v8int16 v0, v8int16 v1, v8int16 v2, v8int16 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v16uint32) -concat(v4uint32 v0, v4uint32 v1, v4uint32 v2, v4uint32 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v16int32) concat(v4int32 v0, v4int32 v1, v4int32 v2, v4int32 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v32bfloat16) -concat(v8bfloat16 v0, v8bfloat16 v1, v8bfloat16 v2, v8bfloat16 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v16float) concat(v4float v0, v4float v1, v4float v2, v4float v3) { - return concat_128_512(v0, v1, v2, v3); -} - -INTRINSIC(v64uint4) concat(v32uint4 v0, v32uint4 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v64int4) concat(v32int4 v0, v32int4 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v32uint8) concat(v16uint8 v0, v16uint8 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v32int8) concat(v16int8 v0, v16int8 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v16uint16) concat(v8uint16 v0, v8uint16 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v16int16) concat(v8int16 v0, v8int16 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v8uint32) concat(v4uint32 v0, v4uint32 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v8int32) concat(v4int32 v0, v4int32 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v16bfloat16) concat(v8bfloat16 v0, v8bfloat16 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v8float) concat(v4float v0, v4float v1) { - return concat_128_256(v0, v1); -} - -// Conversions -// v8accfloat -INTRINSIC(v8accfloat) extract_v8accfloat(v16accfloat a, int idx) { - return (v8accfloat)extract_v8int32((v16int32)a, idx); -} - -INTRINSIC(v16accfloat) insert(v16accfloat a, int idx, v8accfloat b) { - return (v16accfloat)insert((v16int32)a, idx, (v8int32)b); -} - -INTRINSIC(v16accfloat) set_v16accfloat(int idx, v8accfloat b) { - return (v16accfloat)set_v16int32(idx, (v8int32)b); -} - -INTRINSIC(v16accfloat) concat(v8accfloat a, v8accfloat b) { - return (v16accfloat)concat((v8int32)a, (v8int32)b); -} -// v8acc32 -INTRINSIC(v8acc32) extract_v8acc32(v16acc32 a, int idx) { - return (v8acc32)extract_v8int32((v16int32)a, idx); -} - -INTRINSIC(v16acc32) insert(v16acc32 a, int idx, v8acc32 b) { - return (v16acc32)insert((v16int32)a, idx, (v8int32)b); -} - -INTRINSIC(v16acc32) set_v16acc32(int idx, v8acc32 b) { - return (v16acc32)set_v16int32(idx, (v8int32)b); -} - -INTRINSIC(v16acc32) concat(v8acc32 a, v8acc32 b) { - return (v16acc32)concat((v8int32)a, (v8int32)b); -} -// v4acc64 -INTRINSIC(v4acc64) extract_v4acc64(v8acc64 a, int idx) { - return (v4acc64)extract_v8int32((v16int32)a, idx); -} - -INTRINSIC(v8acc64) insert(v8acc64 a, int idx, v4acc64 b) { - return (v8acc64)insert((v16int32)a, idx, (v8int32)b); -} - -INTRINSIC(v8acc64) set_v8acc64(int idx, v4acc64 b) { - return (v8acc64)set_v16int32(idx, (v8int32)b); -} - -INTRINSIC(v8acc64) concat(v4acc64 a, v4acc64 b) { - return (v8acc64)concat((v8int32)a, (v8int32)b); -} -// v8accfloat -INTRINSIC(v8accfloat) extract_v8accfloat(v32accfloat a, int idx) { - return (v8accfloat)extract_v8int32((v32int32)a, idx); -} - -INTRINSIC(v32accfloat) insert(v32accfloat a, int idx, v8accfloat b) { - return (v32accfloat)insert((v32int32)a, idx, (v8int32)b); -} - -INTRINSIC(v32accfloat) set_v32accfloat(int idx, v8accfloat b) { - return (v32accfloat)set_v32int32(idx, (v8int32)b); -} - -INTRINSIC(v32accfloat) -concat(v8accfloat a, v8accfloat b, v8accfloat c, v8accfloat d) { - return (v32accfloat)concat((v8int32)a, (v8int32)b, (v8int32)c, (v8int32)d); -} -// v8acc32 -INTRINSIC(v8acc32) extract_v8acc32(v32acc32 a, int idx) { - return (v8acc32)extract_v8int32((v32int32)a, idx); -} - -INTRINSIC(v32acc32) insert(v32acc32 a, int idx, v8acc32 b) { - return (v32acc32)insert((v32int32)a, idx, (v8int32)b); -} - -INTRINSIC(v32acc32) set_v32acc32(int idx, v8acc32 b) { - return (v32acc32)set_v32int32(idx, (v8int32)b); -} - -INTRINSIC(v32acc32) concat(v8acc32 a, v8acc32 b, v8acc32 c, v8acc32 d) { - return (v32acc32)concat((v8int32)a, (v8int32)b, (v8int32)c, (v8int32)d); -} -// v4acc64 -INTRINSIC(v4acc64) extract_v4acc64(v16acc64 a, int idx) { - return (v4acc64)extract_v8int32((v32int32)a, idx); -} - -INTRINSIC(v16acc64) insert(v16acc64 a, int idx, v4acc64 b) { - return (v16acc64)insert((v32int32)a, idx, (v8int32)b); -} - -INTRINSIC(v16acc64) set_v16acc64(int idx, v4acc64 b) { - return (v16acc64)set_v32int32(idx, (v8int32)b); -} - -INTRINSIC(v16acc64) concat(v4acc64 a, v4acc64 b, v4acc64 c, v4acc64 d) { - return (v16acc64)concat((v8int32)a, (v8int32)b, (v8int32)c, (v8int32)d); -} +// 128-bit extract/insert/set/concat helpers + type wrappers + Conversions +// section live in aie_upd_ext_common.h. This is included AFTER the +// per-arch type wrappers above because the Conversions block in common +// references those (e.g. extract_v8int32). extract_128_512 needs the +// per-arch VEXTBCST.128 builtin, so define the macro before #include. +#define AIE_VEXTRACT_BROADCAST128_I512(v, idx) \ + __builtin_aie2p_vextract_broadcast128_I512((v), (idx)) +#include "../aie_upd_ext_common.h" +#undef AIE_VEXTRACT_BROADCAST128_I512 INTRINSIC(v64bfp16ebs16) insert(v64bfp16ebs16 v, v64int8 m) { return {m, v.exponent}; @@ -1960,11 +1157,15 @@ INTRINSIC(v64bfp16ebs8) insert(v64bfp16ebs8 v, int idx, int exp32) { return {v.mantissa, exp64}; } -INTRINSIC(v32int8) extract_v32int8(v64bfp16ebs16 v, int idx) { +// Returns mantissa bytes only — the corresponding exponent is not +// included in the result. Branchiness is handled by extract_256_512. +INTRINSIC(v32int8) +extract_v32int8(v64bfp16ebs16 v, int idx) DIAGNOSE_EXTRACT_IDX(1) { return extract_256_512(v.mantissa, idx); } -INTRINSIC(v32int8) extract_v32int8(v64bfp16ebs8 v, int idx) { +INTRINSIC(v32int8) +extract_v32int8(v64bfp16ebs8 v, int idx) DIAGNOSE_EXTRACT_IDX(1) { return extract_256_512(v.mantissa, idx); } @@ -1984,19 +1185,42 @@ INTRINSIC(v128bfp16ebs8) concat(v64bfp16ebs8 v1, v64bfp16ebs8 v2) { return {v1.mantissa, v2.mantissa, v1.exponent, v2.exponent}; } +// Per-field selects (instead of a single struct-level if/else) so the +// merge block has 0 phi nodes. SimplifyCFG's `foldTwoEntryPHINode` has a +// hard `NumPhis > 2` cap that rejects the entire fold when a struct-typed +// ternary creates one phi per field; the per-field form sidesteps it and +// the four scalar ternaries each lower to a single `select` directly. INTRINSIC(v128bfp16ebs8) insert(v128bfp16ebs8 v, int idx, v64bfp16ebs8 vsub) { - if (idx == 0) - return {vsub.mantissa, v.mantissaX1, vsub.exponent, v.exponentE1}; - return {v.mantissaX0, vsub.mantissa, v.exponentE0, vsub.exponent}; + bool sel_hi = (idx != 0); + return {sel_hi ? v.mantissaX0 : vsub.mantissa, + sel_hi ? vsub.mantissa : v.mantissaX1, + sel_hi ? v.exponentE0 : vsub.exponent, + sel_hi ? vsub.exponent : v.exponentE1}; } INTRINSIC(v128bfp16ebs8) set_v128bfp16ebs8(int idx, v64bfp16ebs8 vsub) { - v64bfp16ebs8 undefValue; - if (idx == 0) - return {vsub.mantissa, undefValue.mantissa, vsub.exponent, - undefValue.exponent}; - return {undefValue.mantissa, vsub.mantissa, undefValue.exponent, - vsub.exponent}; + // Initialize the placeholder fields via shufflevector with an all -1 + // mask: the C-level idiom that emits a poison value (rather than the + // older-style uninitialised-vector value) for the unused select arm. + // Letting clang see poison here also enables a follow-on InstCombine + // fold that collapses `select cond, poison, X` to `X`, so both halves + // of the result get the valid `vsub` data and the runtime case lowers + // to a few `mov`/`vmov` in the ret delay slots instead of a `vsel.32` + // chain. The unused half is still unspecified per the API contract. + v64int8 zm = {}; + v8int8 ze = {}; + v64int8 placeholder_m = __builtin_shufflevector( + zm, zm, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + v8int8 placeholder_e = + __builtin_shufflevector(ze, ze, -1, -1, -1, -1, -1, -1, -1, -1); + bool sel_hi = (idx != 0); + return {sel_hi ? placeholder_m : vsub.mantissa, + sel_hi ? vsub.mantissa : placeholder_m, + sel_hi ? placeholder_e : vsub.exponent, + sel_hi ? vsub.exponent : placeholder_e}; } INTRINSIC(v128bfp16ebs8) insert(v128bfp16ebs8 v, int idx, int exp) { @@ -2008,15 +1232,9 @@ INTRINSIC(v128bfp16ebs8) insert(v128bfp16ebs8 v, int idx, int exp) { } INTRINSIC(int) extract_exponent(v128bfp16ebs8 v, int idx) { - v8int8 exp0 = v.exponentE0; - v8int8 exp1 = v.exponentE1; - if (idx == 0) - return (int)__builtin_shufflevector(exp0, exp0, 0, 1, 2, 3); - else if (idx == 1) - return (int)__builtin_shufflevector(exp0, exp0, 4, 5, 6, 7); - else if (idx == 2) - return (int)__builtin_shufflevector(exp1, exp1, 0, 1, 2, 3); - return (int)__builtin_shufflevector(exp1, exp1, 4, 5, 6, 7); + // idx ∈ [0..3]: bit 1 picks E0 vs E1, bit 0 picks the 32-bit lane. + v8int8 exp = (idx & 2) ? v.exponentE1 : v.exponentE0; + return ((v2int32)exp)[idx & 1]; } INTRINSIC(v64int8) extract_v64int8(v128bfp16ebs16 v, int idx) { @@ -2035,20 +1253,33 @@ INTRINSIC(v128bfp16ebs16) concat(v64bfp16ebs16 v1, v64bfp16ebs16 v2) { return {v1.mantissa, v2.mantissa, v1.exponent, v2.exponent}; } +// Per-field selects — see comment on the v128bfp16ebs8 sibling above. INTRINSIC(v128bfp16ebs16) insert(v128bfp16ebs16 v, int idx, v64bfp16ebs16 vsub) { - if (idx == 0) - return {vsub.mantissa, v.mantissaX1, vsub.exponent, v.exponentE1}; - return {v.mantissaX0, vsub.mantissa, v.exponentE0, vsub.exponent}; + bool sel_hi = (idx != 0); + return {sel_hi ? v.mantissaX0 : vsub.mantissa, + sel_hi ? vsub.mantissa : v.mantissaX1, + sel_hi ? v.exponentE0 : vsub.exponent, + sel_hi ? vsub.exponent : v.exponentE1}; } INTRINSIC(v128bfp16ebs16) set_v128bfp16ebs16(int idx, v64bfp16ebs16 vsub) { - v64bfp16ebs16 undefValue; - if (idx == 0) - return {vsub.mantissa, undefValue.mantissa, vsub.exponent, - undefValue.exponent}; - return {undefValue.mantissa, vsub.mantissa, undefValue.exponent, - vsub.exponent}; + // Poison-init the placeholder fields. See the set_v128bfp16ebs8 sibling + // above for the full rationale. + v64int8 zm = {}; + v8int8 ze = {}; + v64int8 placeholder_m = __builtin_shufflevector( + zm, zm, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + v8int8 placeholder_e = + __builtin_shufflevector(ze, ze, -1, -1, -1, -1, -1, -1, -1, -1); + bool sel_hi = (idx != 0); + return {sel_hi ? placeholder_m : vsub.mantissa, + sel_hi ? vsub.mantissa : placeholder_m, + sel_hi ? placeholder_e : vsub.exponent, + sel_hi ? vsub.exponent : placeholder_e}; } INTRINSIC(v128bfp16ebs16) insert(v128bfp16ebs16 v, int idx, int exp) { @@ -2060,15 +1291,9 @@ INTRINSIC(v128bfp16ebs16) insert(v128bfp16ebs16 v, int idx, int exp) { } INTRINSIC(int) extract_exponent(v128bfp16ebs16 v, int idx) { - v8int8 exp0 = v.exponentE0; - v8int8 exp1 = v.exponentE1; - if (idx == 0) - return (int)__builtin_shufflevector(exp0, exp0, 0, 1, 2, 3); - else if (idx == 1) - return (int)__builtin_shufflevector(exp0, exp0, 4, 5, 6, 7); - else if (idx == 2) - return (int)__builtin_shufflevector(exp1, exp1, 0, 1, 2, 3); - return (int)__builtin_shufflevector(exp1, exp1, 4, 5, 6, 7); + // idx ∈ [0..3]: bit 1 picks E0 vs E1, bit 0 picks the 32-bit lane. + v8int8 exp = (idx & 2) ? v.exponentE1 : v.exponentE0; + return ((v2int32)exp)[idx & 1]; } INTRINSIC(v64bfp16ebs16) extract_v64bfp16ebs16(v128bfp16ebs16 m, int idx) { diff --git a/clang/lib/Headers/aie2ps/aie2ps_upd_ext.h b/clang/lib/Headers/aie2ps/aie2ps_upd_ext.h index dd2222a30234..a65b67b19ad1 100644 --- a/clang/lib/Headers/aie2ps/aie2ps_upd_ext.h +++ b/clang/lib/Headers/aie2ps/aie2ps_upd_ext.h @@ -394,299 +394,10 @@ INTRINSIC(unsigned int) extract_elem(v2uint32 v, int idx) { */ -//! @name Scalar updates and extracts -INTRINSIC(unsigned long long) -insert(unsigned long long a, int idx, unsigned int b) { - v2uint32 temp = (v2uint32)a; - temp[idx] = b; - return (unsigned long long)temp; -} -INTRINSIC(unsigned long long) set_uint64(int idx, unsigned int b) { - v2uint32 temp; - temp[idx] = b; - return (unsigned long long)temp; -} -INTRINSIC(unsigned int) extract_uint32(unsigned long long a, int idx) { - v2uint32 temp = (v2uint32)a; - return temp[idx]; -} -INTRINSIC(unsigned long long) concat(unsigned int a, unsigned int b) { - return insert(set_uint64(a, 0), 1, b); -} - -// Generic extract primitives -INTRINSIC(v8int32) extract_256_512(v16int32 a, int idx) { - if (idx % 2 == 0) - return __builtin_shufflevector(a, a, 0, 1, 2, 3, 4, 5, 6, 7); - else - return __builtin_shufflevector(a, a, 8, 9, 10, 11, 12, 13, 14, 15); -} - -INTRINSIC(v16int32) extract_512_1024(v32int32 a, int idx) { - if (idx % 2 == 0) - return __builtin_shufflevector(a, a, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - else - return __builtin_shufflevector(a, a, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31); -} - -INTRINSIC(v8int32) extract_256_1024(v32int32 a, int idx) { - if (idx % 4 == 0) - return __builtin_shufflevector(a, a, 0, 1, 2, 3, 4, 5, 6, 7); - if (idx % 4 == 1) - return __builtin_shufflevector(a, a, 8, 9, 10, 11, 12, 13, 14, 15); - if (idx % 4 == 2) - return __builtin_shufflevector(a, a, 16, 17, 18, 19, 20, 21, 22, 23); - else - return __builtin_shufflevector(a, a, 24, 25, 26, 27, 28, 29, 30, 31); -} - -INTRINSIC(v16acc64) extract_ACC1024_ACC2048(v32acc64 a, int idx) { - if (idx % 2 == 0) - return __builtin_shufflevector(a, a, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - else - return __builtin_shufflevector(a, a, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31); -} - -INTRINSIC(v8acc64) extract_ACC512_ACC2048(v32acc64 a, int idx) { - if (idx % 4 == 0) - return __builtin_shufflevector(a, a, 0, 1, 2, 3, 4, 5, 6, 7); - if (idx % 4 == 1) - return __builtin_shufflevector(a, a, 8, 9, 10, 11, 12, 13, 14, 15); - if (idx % 4 == 2) - return __builtin_shufflevector(a, a, 16, 17, 18, 19, 20, 21, 22, 23); - else - return __builtin_shufflevector(a, a, 24, 25, 26, 27, 28, 29, 30, 31); -} - -// Generic insert primitives -INTRINSIC(v16int32) insert_256_512(v16int32 a, int idx, v8int32 b) { - v8int32 undef; - v16int32 tmp = __builtin_shufflevector(b, undef, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15); - if (idx % 2 == 0) - return __builtin_shufflevector(tmp, a, 0, 1, 2, 3, 4, 5, 6, 7, 24, 25, 26, - 27, 28, 29, 30, 31); - // insert into upper half - return __builtin_shufflevector(a, tmp, 0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, - 20, 21, 22, 23); -} - -INTRINSIC(v32int32) insert_512_1024(v32int32 a, int idx, v16int32 b) { - v16int32 undef; - v32int32 tmp = __builtin_shufflevector( - b, undef, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); - if (idx % 2 == 0) - return __builtin_shufflevector(tmp, a, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63); - // insert into upper half - return __builtin_shufflevector(a, tmp, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47); -} - -INTRINSIC(v32int32) insert_256_1024(v32int32 a, int idx, v8int32 b) { - v8int32 undef_256; - v16int32 undef_512; - v16int32 tmp_512 = __builtin_shufflevector(b, undef_256, 0, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15); - v32int32 tmp_1024 = __builtin_shufflevector( - tmp_512, undef_512, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); - if (idx % 4 == 0) - return __builtin_shufflevector(tmp_1024, a, 0, 1, 2, 3, 4, 5, 6, 7, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63); - if (idx % 4 == 1) - return __builtin_shufflevector(tmp_1024, a, 32, 33, 34, 35, 36, 37, 38, 39, - 0, 1, 2, 3, 4, 5, 6, 7, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63); - if (idx % 4 == 2) - return __builtin_shufflevector(tmp_1024, a, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 0, 1, 2, 3, - 4, 5, 6, 7, 56, 57, 58, 59, 60, 61, 62, 63); - else - return __builtin_shufflevector(tmp_1024, a, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 0, 1, 2, 3, 4, 5, 6, 7); -} - -INTRINSIC(v32acc64) insert_ACC1024_ACC2048(v32acc64 a, int idx, v16acc64 b) { - v32acc64 tmp = __builtin_shufflevector( - b, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); - if (idx % 2 == 0) - return __builtin_shufflevector(tmp, a, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63); - - // insert into upper half - return __builtin_shufflevector(a, tmp, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47); -} - -INTRINSIC(v32acc64) insert_ACC512_ACC2048(v32acc64 a, int idx, v8acc64 b) { - v16acc64 tmp_1024 = __builtin_shufflevector(b, b, 0, 1, 2, 3, 4, 5, 6, 7, -1, - -1, -1, -1, -1, -1, -1, -1); - v32acc64 tmp_2048 = __builtin_shufflevector( - tmp_1024, tmp_1024, 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); - if (idx % 4 == 0) - return __builtin_shufflevector(tmp_2048, a, 0, 1, 2, 3, 4, 5, 6, 7, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63); - if (idx % 4 == 1) - return __builtin_shufflevector(a, tmp_2048, 0, 1, 2, 3, 4, 5, 6, 7, 32, 33, - 34, 35, 36, 37, 38, 39, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); - if (idx % 4 == 2) - return __builtin_shufflevector(a, tmp_2048, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 32, 33, 34, 35, 36, - 37, 38, 39, 24, 25, 26, 27, 28, 29, 30, 31); - else - return __builtin_shufflevector(a, tmp_2048, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 32, 33, 34, 35, 36, 37, 38, 39); -} - -// Generic set primitives -INTRINSIC(v16int32) set_256_512(int idx, v8int32 b) { - v8int32 tmp; - if (idx % 2 == 0) - return __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - else - return __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); -} - -INTRINSIC(v32int32) set_512_1024(int idx, v16int32 b) { - v16int32 tmp; - if (idx % 2 == 0) - return __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31); - else - return __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31); -} - -INTRINSIC(v32int32) set_256_1024(int idx, v8int32 b) { - v8int32 tmp; - v16int32 tmp2; - v16int32 tmp3; - if (idx % 4 == 0) { - tmp2 = __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - return __builtin_shufflevector(tmp2, tmp3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); - } - if (idx % 4 == 1) { - tmp2 = __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - return __builtin_shufflevector(tmp2, tmp3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); - } - if (idx % 4 == 2) { - tmp2 = __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - return __builtin_shufflevector(tmp3, tmp2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); - } else { - tmp2 = __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - return __builtin_shufflevector(tmp3, tmp2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); - } -} - -INTRINSIC(v32acc64) set_ACC1024_ACC2048(int idx, v16acc64 b) { - if (idx % 2 == 0) - return __builtin_shufflevector(b, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1); - else - return __builtin_shufflevector(b, b, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15); -} - -INTRINSIC(v32acc64) set_ACC512_ACC2048(int idx, v8acc64 b) { - v16acc64 tmp = __builtin_shufflevector(b, b, 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, - -1, -1, -1, -1, -1, -1); - - if (idx % 4 == 0) - return __builtin_shufflevector(tmp, tmp, 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); - if (idx % 4 == 1) - return __builtin_shufflevector(tmp, tmp, -1, -1, -1, -1, -1, -1, -1, -1, 0, - 1, 2, 3, 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); - if (idx % 4 == 2) - return __builtin_shufflevector(tmp, tmp, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, - 6, 7, -1, -1, -1, -1, -1, -1, -1, -1); - else - return __builtin_shufflevector(tmp, tmp, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7); -} - -// Generic concat primitives -INTRINSIC(v16int32) concat_256_512(v8int32 a0, v8int32 a1) { - return __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); -} - -INTRINSIC(v32int32) concat_512_1024(v16int32 a0, v16int32 a1) { - return __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31); -} - -INTRINSIC(v32int32) -concat_256_1024(v8int32 a0, v8int32 a1, v8int32 a2, v8int32 a3) { - v16int32 res_hi; - v16int32 res_lo; - res_hi = __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - res_lo = __builtin_shufflevector(a2, a3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - return __builtin_shufflevector(res_hi, res_lo, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); -} - -INTRINSIC(v32acc64) concat_ACC1024_ACC2048(v16acc64 a0, v16acc64 a1) { - return __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31); -} - -INTRINSIC(v32acc64) -concat_ACC512_ACC2048(v8acc64 a0, v8acc64 a1, v8acc64 a2, v8acc64 a3) { - v16acc64 res_hi; - v16acc64 res_lo; - res_lo = __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - res_hi = __builtin_shufflevector(a2, a3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15); - return __builtin_shufflevector(res_lo, res_hi, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); -} +// Macro-free primitives shared with aie2p (u64 dispatchers + generic +// 256/512/1024-bit shuffle helpers). The type wrappers below depend on +// these. +#include "../aie_upd_ext_primitives.h" // Conversions @@ -1398,525 +1109,15 @@ INTRINSIC(v32acc64) concat(v16acc64 a0, v16acc64 a1) { return concat_ACC1024_ACC2048(a0, a1); } -// Generic 128-bit extract primitives -INTRINSIC(v4int32) extract_128_256(v8int32 a, int idx) { - if (idx % 2 == 0) - return __builtin_shufflevector(a, a, 0, 1, 2, 3); - else - return __builtin_shufflevector(a, a, 4, 5, 6, 7); -} - -INTRINSIC(v4int32) extract_128_512(v16int32 a, int idx) { - if (idx % 4 == 0) - return __builtin_shufflevector(a, a, 0, 1, 2, 3); - if (idx % 4 == 1) - return __builtin_shufflevector(a, a, 4, 5, 6, 7); - if (idx % 4 == 2) - return __builtin_shufflevector(a, a, 8, 9, 10, 11); - else - return __builtin_shufflevector(a, a, 12, 13, 14, 15); -} - -// Generic 128-bit insert primitives -INTRINSIC(v8int32) insert_128_256(v8int32 a, int idx, v4int32 b) { - v4int32 undef; - v8int32 tmp = __builtin_shufflevector(b, undef, 0, 1, 2, 3, 4, 5, 6, 7); - if (idx % 2 == 0) - return __builtin_shufflevector(tmp, a, 0, 1, 2, 3, 12, 13, 14, 15); - else - return __builtin_shufflevector(a, tmp, 0, 1, 2, 3, 8, 9, 10, 11); -} - -INTRINSIC(v16int32) insert_128_512(v16int32 a, int idx, v4int32 b) { - v4int32 undef_128; - v8int32 undef_256; - v8int32 tmp_256 = - __builtin_shufflevector(b, undef_128, 0, 1, 2, 3, 4, 5, 6, 7); - v16int32 tmp_512 = __builtin_shufflevector( - tmp_256, undef_256, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); - if (idx % 4 == 0) - return __builtin_shufflevector(tmp_512, a, 0, 1, 2, 3, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31); - if (idx % 4 == 1) - return __builtin_shufflevector(tmp_512, a, 16, 17, 18, 19, 0, 1, 2, 3, 24, - 25, 26, 27, 28, 29, 30, 31); - if (idx % 4 == 2) - return __builtin_shufflevector(tmp_512, a, 16, 17, 18, 19, 20, 21, 22, 23, - 0, 1, 2, 3, 28, 29, 30, 31); - else - return __builtin_shufflevector(tmp_512, a, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 0, 1, 2, 3); -} - -// Generic 128-bit set primitives -INTRINSIC(v8int32) set_128_256(int idx, v4int32 b) { - v4int32 tmp; - if (idx % 2 == 0) - return __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7); - else - return __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7); -} - -INTRINSIC(v16int32) set_128_512(int idx, v4int32 b) { - v4int32 tmp; - v8int32 tmp2; - v8int32 tmp3; - if (idx % 4 == 0) { - tmp2 = __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7); - return __builtin_shufflevector(tmp2, tmp3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15); - } - if (idx % 4 == 1) { - tmp2 = __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7); - return __builtin_shufflevector(tmp2, tmp3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15); - } - if (idx % 4 == 2) { - tmp2 = __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7); - return __builtin_shufflevector(tmp3, tmp2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15); - } else { - tmp2 = __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7); - return __builtin_shufflevector(tmp3, tmp2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15); - } -} -// Generic 128-bit concat primitives -INTRINSIC(v8int32) concat_128_256(v4int32 a0, v4int32 a1) { - return __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7); -} -INTRINSIC(v16int32) -concat_128_512(v4int32 a0, v4int32 a1, v4int32 a2, v4int32 a3) { - v8int32 res_hi; - v8int32 res_lo; - res_hi = __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7); - res_lo = __builtin_shufflevector(a2, a3, 0, 1, 2, 3, 4, 5, 6, 7); - return __builtin_shufflevector(res_hi, res_lo, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15); -} - -#define DIAGNOSE_EXTRACT_IDX(MAX) \ - __attribute__((diagnose_if(idx < 0 || idx > MAX, \ - "index out of range [0," #MAX "]", "error"))) - -INTRINSIC(v32uint4) -extract_v32uint4(v128uint4 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v32int4) -extract_v32int4(v128int4 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v16uint8) -extract_v16uint8(v64uint8 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v16int8) extract_v16int8(v64int8 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v8uint16) -extract_v8uint16(v32uint16 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v8int16) -extract_v8int16(v32int16 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v4uint32) -extract_v4uint32(v16uint32 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v4int32) -extract_v4int32(v16int32 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v8bfloat16) -extract_v8bfloat16(v32bfloat16 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v4float) -extract_v4float(v16float a, int idx) DIAGNOSE_EXTRACT_IDX(3) { - return extract_128_512(a, idx); -} - -INTRINSIC(v128uint4) -set_v128uint4(int idx, v32uint4 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v128int4) set_v128int4(int idx, v32int4 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v64uint8) set_v64uint8(int idx, v16uint8 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v64int8) set_v64int8(int idx, v16int8 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v32uint16) -set_v32uint16(int idx, v8uint16 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v32int16) set_v32int16(int idx, v8int16 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v16uint32) -set_v16uint32(int idx, v4uint32 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v16int32) set_v16int32(int idx, v4int32 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v32bfloat16) -set_v32bfloat16(int idx, v8bfloat16 a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v16float) set_v16float(int idx, v4float a) DIAGNOSE_EXTRACT_IDX(3) { - return set_128_512(idx, a); -} - -INTRINSIC(v32uint4) -extract_v32uint4(v64uint4 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v32int4) extract_v32int4(v64int4 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v16uint8) -extract_v16uint8(v32uint8 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v16int8) extract_v16int8(v32int8 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v8uint16) -extract_v8uint16(v16uint16 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v8int16) -extract_v8int16(v16int16 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v4uint32) -extract_v4uint32(v8uint32 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v4int32) extract_v4int32(v8int32 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v8bfloat16) -extract_v8bfloat16(v16bfloat16 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v4float) extract_v4float(v8float a, int idx) DIAGNOSE_EXTRACT_IDX(1) { - return extract_128_256(a, idx); -} - -INTRINSIC(v64uint4) set_v64uint4(int idx, v32uint4 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v64int4) set_v64int4(int idx, v32int4 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v32uint8) set_v32uint8(int idx, v16uint8 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v32int8) set_v32int8(int idx, v16int8 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v16uint16) -set_v16uint16(int idx, v8uint16 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v16int16) set_v16int16(int idx, v8int16 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v8uint32) set_v8uint32(int idx, v4uint32 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v8int32) set_v8int32(int idx, v4int32 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v16bfloat16) -set_v16bfloat16(int idx, v8bfloat16 a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} -INTRINSIC(v8float) set_v8float(int idx, v4float a) DIAGNOSE_EXTRACT_IDX(1) { - return set_128_256(idx, a); -} - -INTRINSIC(v128uint4) -insert(v128uint4 v, int idx, v32uint4 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v128int4) -insert(v128int4 v, int idx, v32int4 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v64uint8) -insert(v64uint8 v, int idx, v16uint8 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v64int8) -insert(v64int8 v, int idx, v16int8 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v32uint16) -insert(v32uint16 v, int idx, v8uint16 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v32int16) -insert(v32int16 v, int idx, v8int16 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v16uint32) -insert(v16uint32 v, int idx, v4uint32 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v16int32) -insert(v16int32 v, int idx, v4int32 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v32bfloat16) -insert(v32bfloat16 v, int idx, v8bfloat16 b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} -INTRINSIC(v16float) -insert(v16float v, int idx, v4float b) DIAGNOSE_EXTRACT_IDX(3) { - return insert_128_512(v, idx, b); -} - -INTRINSIC(v64uint4) -insert(v64uint4 a, int idx, v32uint4 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v64int4) -insert(v64int4 a, int idx, v32int4 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v32uint8) -insert(v32uint8 a, int idx, v16uint8 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v32int8) -insert(v32int8 a, int idx, v16int8 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v16uint16) -insert(v16uint16 a, int idx, v8uint16 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v16int16) -insert(v16int16 a, int idx, v8int16 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v8uint32) -insert(v8uint32 a, int idx, v4uint32 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v8int32) -insert(v8int32 a, int idx, v4int32 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v16bfloat16) -insert(v16bfloat16 a, int idx, v8bfloat16 b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} -INTRINSIC(v8float) -insert(v8float a, int idx, v4float b) DIAGNOSE_EXTRACT_IDX(1) { - return insert_128_256(a, idx, b); -} - -INTRINSIC(v128uint4) -concat(v32uint4 v0, v32uint4 v1, v32uint4 v2, v32uint4 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v128int4) concat(v32int4 v0, v32int4 v1, v32int4 v2, v32int4 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v64uint8) concat(v16uint8 v0, v16uint8 v1, v16uint8 v2, v16uint8 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v64int8) concat(v16int8 v0, v16int8 v1, v16int8 v2, v16int8 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v32uint16) -concat(v8uint16 v0, v8uint16 v1, v8uint16 v2, v8uint16 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v32int16) concat(v8int16 v0, v8int16 v1, v8int16 v2, v8int16 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v16uint32) -concat(v4uint32 v0, v4uint32 v1, v4uint32 v2, v4uint32 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v16int32) concat(v4int32 v0, v4int32 v1, v4int32 v2, v4int32 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v32bfloat16) -concat(v8bfloat16 v0, v8bfloat16 v1, v8bfloat16 v2, v8bfloat16 v3) { - return concat_128_512(v0, v1, v2, v3); -} -INTRINSIC(v16float) concat(v4float v0, v4float v1, v4float v2, v4float v3) { - return concat_128_512(v0, v1, v2, v3); -} - -INTRINSIC(v64uint4) concat(v32uint4 v0, v32uint4 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v64int4) concat(v32int4 v0, v32int4 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v32uint8) concat(v16uint8 v0, v16uint8 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v32int8) concat(v16int8 v0, v16int8 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v16uint16) concat(v8uint16 v0, v8uint16 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v16int16) concat(v8int16 v0, v8int16 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v8uint32) concat(v4uint32 v0, v4uint32 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v8int32) concat(v4int32 v0, v4int32 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v16bfloat16) concat(v8bfloat16 v0, v8bfloat16 v1) { - return concat_128_256(v0, v1); -} -INTRINSIC(v8float) concat(v4float v0, v4float v1) { - return concat_128_256(v0, v1); -} - -// Conversions -// v8accfloat -INTRINSIC(v8accfloat) extract_v8accfloat(v16accfloat a, int idx) { - return (v8accfloat)extract_v8int32((v16int32)a, idx); -} - -INTRINSIC(v16accfloat) insert(v16accfloat a, int idx, v8accfloat b) { - return (v16accfloat)insert((v16int32)a, idx, (v8int32)b); -} - -INTRINSIC(v16accfloat) set_v16accfloat(int idx, v8accfloat b) { - return (v16accfloat)set_v16int32(idx, (v8int32)b); -} - -INTRINSIC(v16accfloat) concat(v8accfloat a, v8accfloat b) { - return (v16accfloat)concat((v8int32)a, (v8int32)b); -} -// v8acc32 -INTRINSIC(v8acc32) extract_v8acc32(v16acc32 a, int idx) { - return (v8acc32)extract_v8int32((v16int32)a, idx); -} - -INTRINSIC(v16acc32) insert(v16acc32 a, int idx, v8acc32 b) { - return (v16acc32)insert((v16int32)a, idx, (v8int32)b); -} - -INTRINSIC(v16acc32) set_v16acc32(int idx, v8acc32 b) { - return (v16acc32)set_v16int32(idx, (v8int32)b); -} - -INTRINSIC(v16acc32) concat(v8acc32 a, v8acc32 b) { - return (v16acc32)concat((v8int32)a, (v8int32)b); -} -// v4acc64 -INTRINSIC(v4acc64) extract_v4acc64(v8acc64 a, int idx) { - return (v4acc64)extract_v8int32((v16int32)a, idx); -} - -INTRINSIC(v8acc64) insert(v8acc64 a, int idx, v4acc64 b) { - return (v8acc64)insert((v16int32)a, idx, (v8int32)b); -} - -INTRINSIC(v8acc64) set_v8acc64(int idx, v4acc64 b) { - return (v8acc64)set_v16int32(idx, (v8int32)b); -} - -INTRINSIC(v8acc64) concat(v4acc64 a, v4acc64 b) { - return (v8acc64)concat((v8int32)a, (v8int32)b); -} -// v8accfloat -INTRINSIC(v8accfloat) extract_v8accfloat(v32accfloat a, int idx) { - return (v8accfloat)extract_v8int32((v32int32)a, idx); -} - -INTRINSIC(v32accfloat) insert(v32accfloat a, int idx, v8accfloat b) { - return (v32accfloat)insert((v32int32)a, idx, (v8int32)b); -} - -INTRINSIC(v32accfloat) set_v32accfloat(int idx, v8accfloat b) { - return (v32accfloat)set_v32int32(idx, (v8int32)b); -} - -INTRINSIC(v32accfloat) -concat(v8accfloat a, v8accfloat b, v8accfloat c, v8accfloat d) { - return (v32accfloat)concat((v8int32)a, (v8int32)b, (v8int32)c, (v8int32)d); -} -// v8acc32 -INTRINSIC(v8acc32) extract_v8acc32(v32acc32 a, int idx) { - return (v8acc32)extract_v8int32((v32int32)a, idx); -} - -INTRINSIC(v32acc32) insert(v32acc32 a, int idx, v8acc32 b) { - return (v32acc32)insert((v32int32)a, idx, (v8int32)b); -} - -INTRINSIC(v32acc32) set_v32acc32(int idx, v8acc32 b) { - return (v32acc32)set_v32int32(idx, (v8int32)b); -} - -INTRINSIC(v32acc32) concat(v8acc32 a, v8acc32 b, v8acc32 c, v8acc32 d) { - return (v32acc32)concat((v8int32)a, (v8int32)b, (v8int32)c, (v8int32)d); -} -// v4acc64 -INTRINSIC(v4acc64) extract_v4acc64(v16acc64 a, int idx) { - return (v4acc64)extract_v8int32((v32int32)a, idx); -} - -INTRINSIC(v16acc64) insert(v16acc64 a, int idx, v4acc64 b) { - return (v16acc64)insert((v32int32)a, idx, (v8int32)b); -} - -INTRINSIC(v16acc64) set_v16acc64(int idx, v4acc64 b) { - return (v16acc64)set_v32int32(idx, (v8int32)b); -} - -INTRINSIC(v16acc64) concat(v4acc64 a, v4acc64 b, v4acc64 c, v4acc64 d) { - return (v16acc64)concat((v8int32)a, (v8int32)b, (v8int32)c, (v8int32)d); -} +// 128-bit extract/insert/set/concat helpers + type wrappers + Conversions +// section live in aie_upd_ext_common.h. This is included AFTER the +// per-arch type wrappers above because the Conversions block in common +// references those (e.g. extract_v8int32). extract_128_512 needs the +// per-arch VEXTBCST.128 builtin, so define the macro before #include. +#define AIE_VEXTRACT_BROADCAST128_I512(v, idx) \ + __builtin_aie2ps_vextract_broadcast128_I512((v), (idx)) +#include "../aie_upd_ext_common.h" +#undef AIE_VEXTRACT_BROADCAST128_I512 // v64bfloat8 diff --git a/clang/lib/Headers/aie_upd_ext_common.h b/clang/lib/Headers/aie_upd_ext_common.h new file mode 100644 index 000000000000..b008a2ff7880 --- /dev/null +++ b/clang/lib/Headers/aie_upd_ext_common.h @@ -0,0 +1,550 @@ +//===- aie_upd_ext_common.h ------------------------------------*- C++ -*-===// +// +// This file is licensed under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// (c) Copyright 2026 Advanced Micro Devices, Inc. or its affiliates +// +//===----------------------------------------------------------------------===// +// +// Generic 128-bit extract / insert / set / concat primitives shared by the +// AIE2P and AIE2PS upd_ext headers. Including translation units must have +// the INTRINSIC macro and the AIE vector typedefs in scope (provided by the +// per-arch top-level intrin header before this file is included). +// +//===----------------------------------------------------------------------===// + +// extract_128_512 in this file uses AIE_VEXTRACT_BROADCAST128_I512(v, idx); +// the per-arch upd_ext header must define that macro before including this +// file (the per-arch header removes the macro definition after the include). + +#ifndef AIE_VEXTRACT_BROADCAST128_I512 +#error \ + "Define AIE_VEXTRACT_BROADCAST128_I512(v, idx) before including this file" +#endif +#ifndef __AIE_UPD_EXT_COMMON_H__ +#define __AIE_UPD_EXT_COMMON_H__ + +// Generic 128-bit extract primitives +INTRINSIC(v4int32) extract_128_256(v8int32 a, int idx) { + if (idx % 2 == 0) + return __builtin_shufflevector(a, a, 0, 1, 2, 3); + else + return __builtin_shufflevector(a, a, 4, 5, 6, 7); +} + +// Lower runtime-idx 128-bit extract via the per-arch VEXTBCST.128 +// instruction (a single op that extracts the chosen 128-bit lane and +// broadcasts it into a 512-bit vector). The shufflevector then keeps the +// low 128 bits, which the broadcast guarantees equal to the chosen lane. +// This avoids the 4-way switch+shufflevector+phi shape that the previous +// if-chain produced for runtime indices, which blocked HW-loop formation. +INTRINSIC(v4int32) extract_128_512(v16int32 a, int idx) { + v16int32 bcst = AIE_VEXTRACT_BROADCAST128_I512(a, idx); + return __builtin_shufflevector(bcst, bcst, 0, 1, 2, 3); +} + +// Generic 128-bit insert primitives +INTRINSIC(v8int32) insert_128_256(v8int32 a, int idx, v4int32 b) { + v4int32 unused; + v8int32 tmp = __builtin_shufflevector(b, unused, 0, 1, 2, 3, 4, 5, 6, 7); + if (idx % 2 == 0) + return __builtin_shufflevector(tmp, a, 0, 1, 2, 3, 12, 13, 14, 15); + else + return __builtin_shufflevector(a, tmp, 0, 1, 2, 3, 8, 9, 10, 11); +} + +INTRINSIC(v16int32) insert_128_512(v16int32 a, int idx, v4int32 b) { + v4int32 unused_128; + v8int32 unused_256; + v8int32 tmp_256 = + __builtin_shufflevector(b, unused_128, 0, 1, 2, 3, 4, 5, 6, 7); + v16int32 tmp_512 = + __builtin_shufflevector(tmp_256, unused_256, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15); + if (idx % 4 == 0) + return __builtin_shufflevector(tmp_512, a, 0, 1, 2, 3, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31); + if (idx % 4 == 1) + return __builtin_shufflevector(tmp_512, a, 16, 17, 18, 19, 0, 1, 2, 3, 24, + 25, 26, 27, 28, 29, 30, 31); + if (idx % 4 == 2) + return __builtin_shufflevector(tmp_512, a, 16, 17, 18, 19, 20, 21, 22, 23, + 0, 1, 2, 3, 28, 29, 30, 31); + else + return __builtin_shufflevector(tmp_512, a, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 0, 1, 2, 3); +} + +// Generic 128-bit set primitives +INTRINSIC(v8int32) set_128_256(int idx, v4int32 b) { + v4int32 tmp; + if (idx % 2 == 0) + return __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7); + else + return __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7); +} + +INTRINSIC(v16int32) set_128_512(int idx, v4int32 b) { + v4int32 tmp; + v8int32 tmp2; + v8int32 tmp3; + if (idx % 4 == 0) { + tmp2 = __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7); + return __builtin_shufflevector(tmp2, tmp3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15); + } + if (idx % 4 == 1) { + tmp2 = __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7); + return __builtin_shufflevector(tmp2, tmp3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15); + } + if (idx % 4 == 2) { + tmp2 = __builtin_shufflevector(b, tmp, 0, 1, 2, 3, 4, 5, 6, 7); + return __builtin_shufflevector(tmp3, tmp2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15); + } else { + tmp2 = __builtin_shufflevector(tmp, b, 0, 1, 2, 3, 4, 5, 6, 7); + return __builtin_shufflevector(tmp3, tmp2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15); + } +} +// Generic 128-bit concat primitives +INTRINSIC(v8int32) concat_128_256(v4int32 a0, v4int32 a1) { + return __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7); +} +INTRINSIC(v16int32) +concat_128_512(v4int32 a0, v4int32 a1, v4int32 a2, v4int32 a3) { + v8int32 res_hi; + v8int32 res_lo; + res_hi = __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7); + res_lo = __builtin_shufflevector(a2, a3, 0, 1, 2, 3, 4, 5, 6, 7); + return __builtin_shufflevector(res_hi, res_lo, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15); +} + +#define DIAGNOSE_EXTRACT_IDX(MAX) \ + __attribute__((diagnose_if(idx < 0 || idx > MAX, \ + "index out of range [0," #MAX "]", "error"))) + +INTRINSIC(v32uint4) +extract_v32uint4(v128uint4 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { + return extract_128_512(a, idx); +} + +INTRINSIC(v32int4) +extract_v32int4(v128int4 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { + return extract_128_512(a, idx); +} + +INTRINSIC(v16uint8) +extract_v16uint8(v64uint8 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { + return extract_128_512(a, idx); +} + +INTRINSIC(v16int8) extract_v16int8(v64int8 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { + return extract_128_512(a, idx); +} + +INTRINSIC(v8uint16) +extract_v8uint16(v32uint16 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { + return extract_128_512(a, idx); +} + +INTRINSIC(v8int16) +extract_v8int16(v32int16 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { + return extract_128_512(a, idx); +} + +INTRINSIC(v4uint32) +extract_v4uint32(v16uint32 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { + return extract_128_512(a, idx); +} + +INTRINSIC(v4int32) +extract_v4int32(v16int32 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { + return extract_128_512(a, idx); +} + +INTRINSIC(v8bfloat16) +extract_v8bfloat16(v32bfloat16 a, int idx) DIAGNOSE_EXTRACT_IDX(3) { + return extract_128_512(a, idx); +} + +INTRINSIC(v4float) +extract_v4float(v16float a, int idx) DIAGNOSE_EXTRACT_IDX(3) { + return extract_128_512(a, idx); +} + +INTRINSIC(v128uint4) +set_v128uint4(int idx, v32uint4 a) DIAGNOSE_EXTRACT_IDX(3) { + return set_128_512(idx, a); +} + +INTRINSIC(v128int4) set_v128int4(int idx, v32int4 a) DIAGNOSE_EXTRACT_IDX(3) { + return set_128_512(idx, a); +} + +INTRINSIC(v64uint8) set_v64uint8(int idx, v16uint8 a) DIAGNOSE_EXTRACT_IDX(3) { + return set_128_512(idx, a); +} + +INTRINSIC(v64int8) set_v64int8(int idx, v16int8 a) DIAGNOSE_EXTRACT_IDX(3) { + return set_128_512(idx, a); +} + +INTRINSIC(v32uint16) +set_v32uint16(int idx, v8uint16 a) DIAGNOSE_EXTRACT_IDX(3) { + return set_128_512(idx, a); +} + +INTRINSIC(v32int16) set_v32int16(int idx, v8int16 a) DIAGNOSE_EXTRACT_IDX(3) { + return set_128_512(idx, a); +} + +INTRINSIC(v16uint32) +set_v16uint32(int idx, v4uint32 a) DIAGNOSE_EXTRACT_IDX(3) { + return set_128_512(idx, a); +} + +INTRINSIC(v16int32) set_v16int32(int idx, v4int32 a) DIAGNOSE_EXTRACT_IDX(3) { + return set_128_512(idx, a); +} + +INTRINSIC(v32bfloat16) +set_v32bfloat16(int idx, v8bfloat16 a) DIAGNOSE_EXTRACT_IDX(3) { + return set_128_512(idx, a); +} + +INTRINSIC(v16float) set_v16float(int idx, v4float a) DIAGNOSE_EXTRACT_IDX(3) { + return set_128_512(idx, a); +} + +INTRINSIC(v32uint4) +extract_v32uint4(v64uint4 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { + return extract_128_256(a, idx); +} + +INTRINSIC(v32int4) extract_v32int4(v64int4 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { + return extract_128_256(a, idx); +} + +INTRINSIC(v16uint8) +extract_v16uint8(v32uint8 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { + return extract_128_256(a, idx); +} + +INTRINSIC(v16int8) extract_v16int8(v32int8 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { + return extract_128_256(a, idx); +} + +INTRINSIC(v8uint16) +extract_v8uint16(v16uint16 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { + return extract_128_256(a, idx); +} + +INTRINSIC(v8int16) +extract_v8int16(v16int16 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { + return extract_128_256(a, idx); +} + +INTRINSIC(v4uint32) +extract_v4uint32(v8uint32 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { + return extract_128_256(a, idx); +} + +INTRINSIC(v4int32) extract_v4int32(v8int32 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { + return extract_128_256(a, idx); +} + +INTRINSIC(v8bfloat16) +extract_v8bfloat16(v16bfloat16 a, int idx) DIAGNOSE_EXTRACT_IDX(1) { + return extract_128_256(a, idx); +} + +INTRINSIC(v4float) extract_v4float(v8float a, int idx) DIAGNOSE_EXTRACT_IDX(1) { + return extract_128_256(a, idx); +} + +INTRINSIC(v64uint4) set_v64uint4(int idx, v32uint4 a) DIAGNOSE_EXTRACT_IDX(1) { + return set_128_256(idx, a); +} +INTRINSIC(v64int4) set_v64int4(int idx, v32int4 a) DIAGNOSE_EXTRACT_IDX(1) { + return set_128_256(idx, a); +} +INTRINSIC(v32uint8) set_v32uint8(int idx, v16uint8 a) DIAGNOSE_EXTRACT_IDX(1) { + return set_128_256(idx, a); +} +INTRINSIC(v32int8) set_v32int8(int idx, v16int8 a) DIAGNOSE_EXTRACT_IDX(1) { + return set_128_256(idx, a); +} +INTRINSIC(v16uint16) +set_v16uint16(int idx, v8uint16 a) DIAGNOSE_EXTRACT_IDX(1) { + return set_128_256(idx, a); +} +INTRINSIC(v16int16) set_v16int16(int idx, v8int16 a) DIAGNOSE_EXTRACT_IDX(1) { + return set_128_256(idx, a); +} +INTRINSIC(v8uint32) set_v8uint32(int idx, v4uint32 a) DIAGNOSE_EXTRACT_IDX(1) { + return set_128_256(idx, a); +} +INTRINSIC(v8int32) set_v8int32(int idx, v4int32 a) DIAGNOSE_EXTRACT_IDX(1) { + return set_128_256(idx, a); +} +INTRINSIC(v16bfloat16) +set_v16bfloat16(int idx, v8bfloat16 a) DIAGNOSE_EXTRACT_IDX(1) { + return set_128_256(idx, a); +} +INTRINSIC(v8float) set_v8float(int idx, v4float a) DIAGNOSE_EXTRACT_IDX(1) { + return set_128_256(idx, a); +} + +INTRINSIC(v128uint4) +insert(v128uint4 v, int idx, v32uint4 b) DIAGNOSE_EXTRACT_IDX(3) { + return insert_128_512(v, idx, b); +} +INTRINSIC(v128int4) +insert(v128int4 v, int idx, v32int4 b) DIAGNOSE_EXTRACT_IDX(3) { + return insert_128_512(v, idx, b); +} +INTRINSIC(v64uint8) +insert(v64uint8 v, int idx, v16uint8 b) DIAGNOSE_EXTRACT_IDX(3) { + return insert_128_512(v, idx, b); +} +INTRINSIC(v64int8) +insert(v64int8 v, int idx, v16int8 b) DIAGNOSE_EXTRACT_IDX(3) { + return insert_128_512(v, idx, b); +} +INTRINSIC(v32uint16) +insert(v32uint16 v, int idx, v8uint16 b) DIAGNOSE_EXTRACT_IDX(3) { + return insert_128_512(v, idx, b); +} +INTRINSIC(v32int16) +insert(v32int16 v, int idx, v8int16 b) DIAGNOSE_EXTRACT_IDX(3) { + return insert_128_512(v, idx, b); +} +INTRINSIC(v16uint32) +insert(v16uint32 v, int idx, v4uint32 b) DIAGNOSE_EXTRACT_IDX(3) { + return insert_128_512(v, idx, b); +} +INTRINSIC(v16int32) +insert(v16int32 v, int idx, v4int32 b) DIAGNOSE_EXTRACT_IDX(3) { + return insert_128_512(v, idx, b); +} +INTRINSIC(v32bfloat16) +insert(v32bfloat16 v, int idx, v8bfloat16 b) DIAGNOSE_EXTRACT_IDX(3) { + return insert_128_512(v, idx, b); +} +INTRINSIC(v16float) +insert(v16float v, int idx, v4float b) DIAGNOSE_EXTRACT_IDX(3) { + return insert_128_512(v, idx, b); +} + +INTRINSIC(v64uint4) +insert(v64uint4 a, int idx, v32uint4 b) DIAGNOSE_EXTRACT_IDX(1) { + return insert_128_256(a, idx, b); +} +INTRINSIC(v64int4) +insert(v64int4 a, int idx, v32int4 b) DIAGNOSE_EXTRACT_IDX(1) { + return insert_128_256(a, idx, b); +} +INTRINSIC(v32uint8) +insert(v32uint8 a, int idx, v16uint8 b) DIAGNOSE_EXTRACT_IDX(1) { + return insert_128_256(a, idx, b); +} +INTRINSIC(v32int8) +insert(v32int8 a, int idx, v16int8 b) DIAGNOSE_EXTRACT_IDX(1) { + return insert_128_256(a, idx, b); +} +INTRINSIC(v16uint16) +insert(v16uint16 a, int idx, v8uint16 b) DIAGNOSE_EXTRACT_IDX(1) { + return insert_128_256(a, idx, b); +} +INTRINSIC(v16int16) +insert(v16int16 a, int idx, v8int16 b) DIAGNOSE_EXTRACT_IDX(1) { + return insert_128_256(a, idx, b); +} +INTRINSIC(v8uint32) +insert(v8uint32 a, int idx, v4uint32 b) DIAGNOSE_EXTRACT_IDX(1) { + return insert_128_256(a, idx, b); +} +INTRINSIC(v8int32) +insert(v8int32 a, int idx, v4int32 b) DIAGNOSE_EXTRACT_IDX(1) { + return insert_128_256(a, idx, b); +} +INTRINSIC(v16bfloat16) +insert(v16bfloat16 a, int idx, v8bfloat16 b) DIAGNOSE_EXTRACT_IDX(1) { + return insert_128_256(a, idx, b); +} +INTRINSIC(v8float) +insert(v8float a, int idx, v4float b) DIAGNOSE_EXTRACT_IDX(1) { + return insert_128_256(a, idx, b); +} + +INTRINSIC(v128uint4) +concat(v32uint4 v0, v32uint4 v1, v32uint4 v2, v32uint4 v3) { + return concat_128_512(v0, v1, v2, v3); +} +INTRINSIC(v128int4) concat(v32int4 v0, v32int4 v1, v32int4 v2, v32int4 v3) { + return concat_128_512(v0, v1, v2, v3); +} +INTRINSIC(v64uint8) concat(v16uint8 v0, v16uint8 v1, v16uint8 v2, v16uint8 v3) { + return concat_128_512(v0, v1, v2, v3); +} +INTRINSIC(v64int8) concat(v16int8 v0, v16int8 v1, v16int8 v2, v16int8 v3) { + return concat_128_512(v0, v1, v2, v3); +} +INTRINSIC(v32uint16) +concat(v8uint16 v0, v8uint16 v1, v8uint16 v2, v8uint16 v3) { + return concat_128_512(v0, v1, v2, v3); +} +INTRINSIC(v32int16) concat(v8int16 v0, v8int16 v1, v8int16 v2, v8int16 v3) { + return concat_128_512(v0, v1, v2, v3); +} +INTRINSIC(v16uint32) +concat(v4uint32 v0, v4uint32 v1, v4uint32 v2, v4uint32 v3) { + return concat_128_512(v0, v1, v2, v3); +} +INTRINSIC(v16int32) concat(v4int32 v0, v4int32 v1, v4int32 v2, v4int32 v3) { + return concat_128_512(v0, v1, v2, v3); +} +INTRINSIC(v32bfloat16) +concat(v8bfloat16 v0, v8bfloat16 v1, v8bfloat16 v2, v8bfloat16 v3) { + return concat_128_512(v0, v1, v2, v3); +} +INTRINSIC(v16float) concat(v4float v0, v4float v1, v4float v2, v4float v3) { + return concat_128_512(v0, v1, v2, v3); +} + +INTRINSIC(v64uint4) concat(v32uint4 v0, v32uint4 v1) { + return concat_128_256(v0, v1); +} +INTRINSIC(v64int4) concat(v32int4 v0, v32int4 v1) { + return concat_128_256(v0, v1); +} +INTRINSIC(v32uint8) concat(v16uint8 v0, v16uint8 v1) { + return concat_128_256(v0, v1); +} +INTRINSIC(v32int8) concat(v16int8 v0, v16int8 v1) { + return concat_128_256(v0, v1); +} +INTRINSIC(v16uint16) concat(v8uint16 v0, v8uint16 v1) { + return concat_128_256(v0, v1); +} +INTRINSIC(v16int16) concat(v8int16 v0, v8int16 v1) { + return concat_128_256(v0, v1); +} +INTRINSIC(v8uint32) concat(v4uint32 v0, v4uint32 v1) { + return concat_128_256(v0, v1); +} +INTRINSIC(v8int32) concat(v4int32 v0, v4int32 v1) { + return concat_128_256(v0, v1); +} +INTRINSIC(v16bfloat16) concat(v8bfloat16 v0, v8bfloat16 v1) { + return concat_128_256(v0, v1); +} +INTRINSIC(v8float) concat(v4float v0, v4float v1) { + return concat_128_256(v0, v1); +} + +// Conversions +// v8accfloat +INTRINSIC(v8accfloat) extract_v8accfloat(v16accfloat a, int idx) { + return (v8accfloat)extract_v8int32((v16int32)a, idx); +} + +INTRINSIC(v16accfloat) insert(v16accfloat a, int idx, v8accfloat b) { + return (v16accfloat)insert((v16int32)a, idx, (v8int32)b); +} + +INTRINSIC(v16accfloat) set_v16accfloat(int idx, v8accfloat b) { + return (v16accfloat)set_v16int32(idx, (v8int32)b); +} + +INTRINSIC(v16accfloat) concat(v8accfloat a, v8accfloat b) { + return (v16accfloat)concat((v8int32)a, (v8int32)b); +} +// v8acc32 +INTRINSIC(v8acc32) extract_v8acc32(v16acc32 a, int idx) { + return (v8acc32)extract_v8int32((v16int32)a, idx); +} + +INTRINSIC(v16acc32) insert(v16acc32 a, int idx, v8acc32 b) { + return (v16acc32)insert((v16int32)a, idx, (v8int32)b); +} + +INTRINSIC(v16acc32) set_v16acc32(int idx, v8acc32 b) { + return (v16acc32)set_v16int32(idx, (v8int32)b); +} + +INTRINSIC(v16acc32) concat(v8acc32 a, v8acc32 b) { + return (v16acc32)concat((v8int32)a, (v8int32)b); +} +// v4acc64 +INTRINSIC(v4acc64) extract_v4acc64(v8acc64 a, int idx) { + return (v4acc64)extract_v8int32((v16int32)a, idx); +} + +INTRINSIC(v8acc64) insert(v8acc64 a, int idx, v4acc64 b) { + return (v8acc64)insert((v16int32)a, idx, (v8int32)b); +} + +INTRINSIC(v8acc64) set_v8acc64(int idx, v4acc64 b) { + return (v8acc64)set_v16int32(idx, (v8int32)b); +} + +INTRINSIC(v8acc64) concat(v4acc64 a, v4acc64 b) { + return (v8acc64)concat((v8int32)a, (v8int32)b); +} +// v8accfloat +INTRINSIC(v8accfloat) extract_v8accfloat(v32accfloat a, int idx) { + return (v8accfloat)extract_v8int32((v32int32)a, idx); +} + +INTRINSIC(v32accfloat) insert(v32accfloat a, int idx, v8accfloat b) { + return (v32accfloat)insert((v32int32)a, idx, (v8int32)b); +} + +INTRINSIC(v32accfloat) set_v32accfloat(int idx, v8accfloat b) { + return (v32accfloat)set_v32int32(idx, (v8int32)b); +} + +INTRINSIC(v32accfloat) +concat(v8accfloat a, v8accfloat b, v8accfloat c, v8accfloat d) { + return (v32accfloat)concat((v8int32)a, (v8int32)b, (v8int32)c, (v8int32)d); +} +// v8acc32 +INTRINSIC(v8acc32) extract_v8acc32(v32acc32 a, int idx) { + return (v8acc32)extract_v8int32((v32int32)a, idx); +} + +INTRINSIC(v32acc32) insert(v32acc32 a, int idx, v8acc32 b) { + return (v32acc32)insert((v32int32)a, idx, (v8int32)b); +} + +INTRINSIC(v32acc32) set_v32acc32(int idx, v8acc32 b) { + return (v32acc32)set_v32int32(idx, (v8int32)b); +} + +INTRINSIC(v32acc32) concat(v8acc32 a, v8acc32 b, v8acc32 c, v8acc32 d) { + return (v32acc32)concat((v8int32)a, (v8int32)b, (v8int32)c, (v8int32)d); +} +// v4acc64 +INTRINSIC(v4acc64) extract_v4acc64(v16acc64 a, int idx) { + return (v4acc64)extract_v8int32((v32int32)a, idx); +} + +INTRINSIC(v16acc64) insert(v16acc64 a, int idx, v4acc64 b) { + return (v16acc64)insert((v32int32)a, idx, (v8int32)b); +} + +INTRINSIC(v16acc64) set_v16acc64(int idx, v4acc64 b) { + return (v16acc64)set_v32int32(idx, (v8int32)b); +} + +INTRINSIC(v16acc64) concat(v4acc64 a, v4acc64 b, v4acc64 c, v4acc64 d) { + return (v16acc64)concat((v8int32)a, (v8int32)b, (v8int32)c, (v8int32)d); +} + +#endif // __AIE_UPD_EXT_COMMON_H__ diff --git a/clang/lib/Headers/aie_upd_ext_primitives.h b/clang/lib/Headers/aie_upd_ext_primitives.h new file mode 100644 index 000000000000..3ccb5bc8b8d0 --- /dev/null +++ b/clang/lib/Headers/aie_upd_ext_primitives.h @@ -0,0 +1,329 @@ +//===- aie_upd_ext_primitives.h ----------------------------------*- C++ -*-===// +// +// This file is licensed under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// (c) Copyright 2026 Advanced Micro Devices, Inc. or its affiliates +// +//===----------------------------------------------------------------------===// +// +// Macro-free primitives shared by AIE2P and AIE2PS upd_ext headers. +// Includes: +// - 64-bit scalar update/extract dispatchers (insert/set_uint64/...). +// - Generic 256/512/1024-bit shuffle primitives (extract_*, insert_*, +// set_*, concat_*). +// Each helper is branchless: a single `vsel` for runtime idx and a +// constant-folded single `mov`/`vmov`/`shufflevector` for compile-time +// idx. The per-arch upd_ext header includes this early so its later +// type wrappers can reference the primitives. The 128-bit +// extract/insert/set/concat helpers and type wrappers live in +// aie_upd_ext_common.h, which is included after the type wrappers +// because its `// Conversions` block references per-arch type wrappers +// like `extract_v8int32`. +// +//===----------------------------------------------------------------------===// + +#ifndef __AIE_UPD_EXT_PRIMITIVES_H__ +#define __AIE_UPD_EXT_PRIMITIVES_H__ + +// Scalar 64-bit updates and extracts. +// Branchless across both arches: a single vsel (runtime) or a single mov +// (constant idx). Replaces a per-arch if/else dispatch over an +// immediate-only intrinsic that previously failed ISel for runtime idx +// on AIE2P. +INTRINSIC(unsigned long long) +insert(unsigned long long a, int idx, unsigned int b) { + v2uint32 temp = (v2uint32)a; + temp[idx] = b; + return (unsigned long long)temp; +} +INTRINSIC(unsigned long long) set_uint64(int idx, unsigned int b) { + // Initialize the placeholder vector via a shufflevector with an all -1 + // mask: the C-level idiom that emits a poison value for the unwritten + // lane (asm-equivalent to leaving the lane uninitialized; codegen DCEs + // the unwritten lane either way). + v2uint32 zero = {0, 0}; + v2uint32 temp = __builtin_shufflevector(zero, zero, -1, -1); + temp[idx] = b; + return (unsigned long long)temp; +} +INTRINSIC(unsigned int) extract_uint32(unsigned long long a, int idx) { + v2uint32 temp = (v2uint32)a; + return temp[idx]; +} +INTRINSIC(unsigned long long) concat(unsigned int a, unsigned int b) { + return insert(set_uint64(a, 0), 1, b); +} + +// Generic 256-bit / 512-bit / 1024-bit extract / insert / set / concat +// primitives. Each helper precomputes the alternatives once and uses a +// vector `select` on bits of `idx`, instead of a runtime if/else cascade +// over distinct shufflevectors. For runtime idx this collapses to a single +// `vsel`/`sel.nez` (often in the delay slots of `ret`); for constant idx +// the speculative shufflevectors fold away leaving a single `mov` / +// `vmov`. + +// Extract primitives +INTRINSIC(v8int32) extract_256_512(v16int32 a, int idx) { + v8int32 lo = __builtin_shufflevector(a, a, 0, 1, 2, 3, 4, 5, 6, 7); + v8int32 hi = + __builtin_shufflevector(a, a, 8, 9, 10, 11, 12, 13, 14, 15); + return (idx & 1) ? hi : lo; +} + +INTRINSIC(v16int32) extract_512_1024(v32int32 a, int idx) { + v16int32 lo = __builtin_shufflevector(a, a, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15); + v16int32 hi = + __builtin_shufflevector(a, a, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31); + return (idx & 1) ? hi : lo; +} + +INTRINSIC(v8int32) extract_256_1024(v32int32 a, int idx) { + v8int32 q0 = __builtin_shufflevector(a, a, 0, 1, 2, 3, 4, 5, 6, 7); + v8int32 q1 = + __builtin_shufflevector(a, a, 8, 9, 10, 11, 12, 13, 14, 15); + v8int32 q2 = + __builtin_shufflevector(a, a, 16, 17, 18, 19, 20, 21, 22, 23); + v8int32 q3 = + __builtin_shufflevector(a, a, 24, 25, 26, 27, 28, 29, 30, 31); + v8int32 lo = (idx & 1) ? q1 : q0; + v8int32 hi = (idx & 1) ? q3 : q2; + return (idx & 2) ? hi : lo; +} + +INTRINSIC(v16acc64) extract_ACC1024_ACC2048(v32acc64 a, int idx) { + v16acc64 lo = __builtin_shufflevector(a, a, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15); + v16acc64 hi = + __builtin_shufflevector(a, a, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31); + return (idx & 1) ? hi : lo; +} + +INTRINSIC(v8acc64) extract_ACC512_ACC2048(v32acc64 a, int idx) { + v8acc64 q0 = __builtin_shufflevector(a, a, 0, 1, 2, 3, 4, 5, 6, 7); + v8acc64 q1 = + __builtin_shufflevector(a, a, 8, 9, 10, 11, 12, 13, 14, 15); + v8acc64 q2 = + __builtin_shufflevector(a, a, 16, 17, 18, 19, 20, 21, 22, 23); + v8acc64 q3 = + __builtin_shufflevector(a, a, 24, 25, 26, 27, 28, 29, 30, 31); + v8acc64 lo = (idx & 1) ? q1 : q0; + v8acc64 hi = (idx & 1) ? q3 : q2; + return (idx & 2) ? hi : lo; +} + +// Insert primitives +INTRINSIC(v16int32) insert_256_512(v16int32 a, int idx, v8int32 b) { + v16int32 b_w = __builtin_shufflevector(b, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15); + v16int32 lo_inserted = + __builtin_shufflevector(b_w, a, 0, 1, 2, 3, 4, 5, 6, 7, 24, 25, 26, + 27, 28, 29, 30, 31); + v16int32 hi_inserted = __builtin_shufflevector( + a, b_w, 0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 23); + return (idx & 1) ? hi_inserted : lo_inserted; +} + +INTRINSIC(v32int32) insert_512_1024(v32int32 a, int idx, v16int32 b) { + v32int32 b_w = __builtin_shufflevector( + b, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); + v32int32 lo_inserted = __builtin_shufflevector( + b_w, a, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63); + v32int32 hi_inserted = __builtin_shufflevector( + a, b_w, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47); + return (idx & 1) ? hi_inserted : lo_inserted; +} + +INTRINSIC(v32int32) insert_256_1024(v32int32 a, int idx, v8int32 b) { + // Widen b once into each of the 4 quadrants of a v32int32. + v32int32 b_q0 = __builtin_shufflevector( + b, b, 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + v32int32 b_q1 = __builtin_shufflevector( + b, b, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + v32int32 b_q2 = __builtin_shufflevector( + b, b, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1); + v32int32 b_q3 = __builtin_shufflevector( + b, b, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7); + v32int32 q0_inserted = __builtin_shufflevector( + b_q0, a, 0, 1, 2, 3, 4, 5, 6, 7, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63); + v32int32 q1_inserted = __builtin_shufflevector( + b_q1, a, 32, 33, 34, 35, 36, 37, 38, 39, 8, 9, 10, 11, 12, 13, 14, 15, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63); + v32int32 q2_inserted = __builtin_shufflevector( + b_q2, a, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 16, 17, 18, 19, 20, 21, 22, 23, 56, 57, 58, 59, 60, 61, 62, 63); + v32int32 q3_inserted = __builtin_shufflevector( + b_q3, a, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 24, 25, 26, 27, 28, 29, 30, 31); + v32int32 lo = (idx & 1) ? q1_inserted : q0_inserted; + v32int32 hi = (idx & 1) ? q3_inserted : q2_inserted; + return (idx & 2) ? hi : lo; +} + +INTRINSIC(v32acc64) insert_ACC1024_ACC2048(v32acc64 a, int idx, + v16acc64 b) { + v32acc64 b_w = __builtin_shufflevector( + b, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + v32acc64 lo_inserted = __builtin_shufflevector( + b_w, a, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63); + v32acc64 hi_inserted = __builtin_shufflevector( + a, b_w, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47); + return (idx & 1) ? hi_inserted : lo_inserted; +} + +INTRINSIC(v32acc64) insert_ACC512_ACC2048(v32acc64 a, int idx, v8acc64 b) { + // Widen b into each quadrant of a v32acc64. + v32acc64 b_q0 = __builtin_shufflevector( + b, b, 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + v32acc64 b_q1 = __builtin_shufflevector( + b, b, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + v32acc64 b_q2 = __builtin_shufflevector( + b, b, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1); + v32acc64 b_q3 = __builtin_shufflevector( + b, b, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7); + v32acc64 q0_inserted = __builtin_shufflevector( + b_q0, a, 0, 1, 2, 3, 4, 5, 6, 7, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63); + v32acc64 q1_inserted = __builtin_shufflevector( + a, b_q1, 0, 1, 2, 3, 4, 5, 6, 7, 40, 41, 42, 43, 44, 45, 46, 47, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); + v32acc64 q2_inserted = __builtin_shufflevector( + a, b_q2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 48, 49, + 50, 51, 52, 53, 54, 55, 24, 25, 26, 27, 28, 29, 30, 31); + v32acc64 q3_inserted = __builtin_shufflevector( + a, b_q3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 56, 57, 58, 59, 60, 61, 62, 63); + v32acc64 lo = (idx & 1) ? q1_inserted : q0_inserted; + v32acc64 hi = (idx & 1) ? q3_inserted : q2_inserted; + return (idx & 2) ? hi : lo; +} + +// Set primitives — same shape as insert_* but with poison in the +// non-target lanes (caller commits a follow-up insert to populate the +// other lanes). +INTRINSIC(v16int32) set_256_512(int idx, v8int32 b) { + v16int32 lo = __builtin_shufflevector(b, b, 0, 1, 2, 3, 4, 5, 6, 7, -1, + -1, -1, -1, -1, -1, -1, -1); + v16int32 hi = __builtin_shufflevector(b, b, -1, -1, -1, -1, -1, -1, -1, + -1, 0, 1, 2, 3, 4, 5, 6, 7); + return (idx & 1) ? hi : lo; +} + +INTRINSIC(v32int32) set_512_1024(int idx, v16int32 b) { + v32int32 lo = __builtin_shufflevector( + b, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + v32int32 hi = __builtin_shufflevector( + b, b, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); + return (idx & 1) ? hi : lo; +} + +INTRINSIC(v32int32) set_256_1024(int idx, v8int32 b) { + v32int32 q0 = __builtin_shufflevector( + b, b, 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + v32int32 q1 = __builtin_shufflevector( + b, b, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + v32int32 q2 = __builtin_shufflevector( + b, b, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1); + v32int32 q3 = __builtin_shufflevector( + b, b, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7); + v32int32 lo = (idx & 1) ? q1 : q0; + v32int32 hi = (idx & 1) ? q3 : q2; + return (idx & 2) ? hi : lo; +} + +INTRINSIC(v32acc64) set_ACC1024_ACC2048(int idx, v16acc64 b) { + v32acc64 lo = __builtin_shufflevector( + b, b, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + v32acc64 hi = __builtin_shufflevector( + b, b, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); + return (idx & 1) ? hi : lo; +} + +INTRINSIC(v32acc64) set_ACC512_ACC2048(int idx, v8acc64 b) { + v32acc64 q0 = __builtin_shufflevector( + b, b, 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + v32acc64 q1 = __builtin_shufflevector( + b, b, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + v32acc64 q2 = __builtin_shufflevector( + b, b, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1); + v32acc64 q3 = __builtin_shufflevector( + b, b, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7); + v32acc64 lo = (idx & 1) ? q1 : q0; + v32acc64 hi = (idx & 1) ? q3 : q2; + return (idx & 2) ? hi : lo; +} + +// Concat primitives — already branchless (single shufflevector). +INTRINSIC(v16int32) concat_256_512(v8int32 a0, v8int32 a1) { + return __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15); +} + +INTRINSIC(v32int32) concat_512_1024(v16int32 a0, v16int32 a1) { + return __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); +} + +INTRINSIC(v32int32) +concat_256_1024(v8int32 a0, v8int32 a1, v8int32 a2, v8int32 a3) { + v16int32 res_hi = __builtin_shufflevector( + a0, a1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); + v16int32 res_lo = __builtin_shufflevector( + a2, a3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); + return __builtin_shufflevector(res_hi, res_lo, 0, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31); +} + +INTRINSIC(v32acc64) concat_ACC1024_ACC2048(v16acc64 a0, v16acc64 a1) { + return __builtin_shufflevector(a0, a1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); +} + +INTRINSIC(v32acc64) +concat_ACC512_ACC2048(v8acc64 a0, v8acc64 a1, v8acc64 a2, v8acc64 a3) { + v16acc64 res_lo = __builtin_shufflevector( + a0, a1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); + v16acc64 res_hi = __builtin_shufflevector( + a2, a3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); + return __builtin_shufflevector(res_lo, res_hi, 0, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31); +} + +#endif // __AIE_UPD_EXT_PRIMITIVES_H__ diff --git a/clang/test/CodeGen/aie/aie2p/aie2p-upd-ext-intrinsic.cpp b/clang/test/CodeGen/aie/aie2p/aie2p-upd-ext-intrinsic.cpp index 5f9b222c48d3..6d140f2d8bb7 100644 --- a/clang/test/CodeGen/aie/aie2p/aie2p-upd-ext-intrinsic.cpp +++ b/clang/test/CodeGen/aie/aie2p/aie2p-upd-ext-intrinsic.cpp @@ -5,7 +5,7 @@ // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -// (c) Copyright 2024-2025 Advanced Micro Devices, Inc. or its affiliates +// (c) Copyright 2024-2026 Advanced Micro Devices, Inc. or its affiliates // //===----------------------------------------------------------------------===// @@ -1153,7 +1153,6 @@ v16int4 test_insert(v16int4 v, int idx, int val) { return insert(v, idx, val); } -// // CHECK-LABEL: define dso_local noundef <2 x i8> @_Z11test_insertDv2_aii( // CHECK-SAME: <2 x i8> noundef [[V:%.*]], i32 noundef [[IDX:%.*]], i32 noundef [[VAL:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: @@ -1176,6 +1175,7 @@ v2int8 test_insert(v2int8 v, int idx, int val) return insert(v, idx, val); } +// // CHECK-LABEL: define dso_local noundef <4 x i8> @_Z11test_insertDv4_aii( // CHECK-SAME: <4 x i8> noundef [[V:%.*]], i32 noundef [[IDX:%.*]], i32 noundef [[VAL:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: @@ -1793,88 +1793,103 @@ unsigned int test_extract_elem(v2uint32 v, int idx) //! @name Scalar updates and extracts // CHECK-LABEL: define dso_local noundef i64 @_Z11test_insertyij( -// CHECK-SAME: i64 noundef [[A:%.*]], i32 noundef [[IDX:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] { +// CHECK-SAME: i64 noundef [[A:%.*]], i32 noundef [[IDX:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[IDX]], 0 // CHECK-NEXT: [[TMP0:%.*]] = bitcast i64 [[A]] to <2 x i32> -// CHECK-NEXT: br i1 [[CMP_I]], label [[IF_THEN_I:%.*]], label [[IF_ELSE_I:%.*]] -// CHECK: if.then.i: -// CHECK-NEXT: [[TMP1:%.*]] = tail call <2 x i32> @llvm.aie2p.upd.I64.I32(<2 x i32> [[TMP0]], i32 [[B]], i32 0) -// CHECK-NEXT: br label [[_ZL6INSERTYIJ_EXIT:%.*]] -// CHECK: if.else.i: -// CHECK-NEXT: [[TMP2:%.*]] = tail call <2 x i32> @llvm.aie2p.upd.I64.I32(<2 x i32> [[TMP0]], i32 [[B]], i32 1) -// CHECK-NEXT: br label [[_ZL6INSERTYIJ_EXIT]] -// CHECK: _ZL6insertyij.exit: -// CHECK-NEXT: [[RETVAL_0_IN_I:%.*]] = phi <2 x i32> [ [[TMP1]], [[IF_THEN_I]] ], [ [[TMP2]], [[IF_ELSE_I]] ] -// CHECK-NEXT: [[RETVAL_0_I:%.*]] = bitcast <2 x i32> [[RETVAL_0_IN_I]] to i64 -// CHECK-NEXT: ret i64 [[RETVAL_0_I]] +// CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <2 x i32> [[TMP0]], i32 [[B]], i32 [[IDX]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i32> [[VECINS_I]] to i64 +// CHECK-NEXT: ret i64 [[TMP1]] // unsigned long long test_insert(unsigned long long a, int idx, unsigned int b) { return insert(a, idx, b); } // CHECK-LABEL: define dso_local noundef i64 @_Z15test_set_uint64ij( -// CHECK-SAME: i32 noundef [[IDX:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR1]] { +// CHECK-SAME: i32 noundef [[IDX:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[IDX]], 0 -// CHECK-NEXT: br i1 [[CMP_I]], label [[IF_THEN_I:%.*]], label [[IF_ELSE_I:%.*]] -// CHECK: if.then.i: -// CHECK-NEXT: [[TMP0:%.*]] = tail call <2 x i32> @llvm.aie2p.set.I64.I32(i32 [[B]], i32 0) -// CHECK-NEXT: br label [[_ZL10SET_UINT64IJ_EXIT:%.*]] -// CHECK: if.else.i: -// CHECK-NEXT: [[TMP1:%.*]] = tail call <2 x i32> @llvm.aie2p.set.I64.I32(i32 [[B]], i32 1) -// CHECK-NEXT: br label [[_ZL10SET_UINT64IJ_EXIT]] -// CHECK: _ZL10set_uint64ij.exit: -// CHECK-NEXT: [[RETVAL_0_IN_I:%.*]] = phi <2 x i32> [ [[TMP0]], [[IF_THEN_I]] ], [ [[TMP1]], [[IF_ELSE_I]] ] -// CHECK-NEXT: [[RETVAL_0_I:%.*]] = bitcast <2 x i32> [[RETVAL_0_IN_I]] to i64 -// CHECK-NEXT: ret i64 [[RETVAL_0_I]] +// CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <2 x i32> poison, i32 [[B]], i32 [[IDX]] +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i32> [[VECINS_I]] to i64 +// CHECK-NEXT: ret i64 [[TMP0]] // unsigned long long test_set_uint64(int idx, unsigned int b) { return set_uint64(idx, b); } // CHECK-LABEL: define dso_local noundef i32 @_Z19test_extract_uint32yi( -// CHECK-SAME: i64 noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR1]] { +// CHECK-SAME: i64 noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[IDX]], 0 // CHECK-NEXT: [[TMP0:%.*]] = bitcast i64 [[A]] to <2 x i32> -// CHECK-NEXT: br i1 [[CMP_I]], label [[IF_THEN_I:%.*]], label [[IF_ELSE_I:%.*]] -// CHECK: if.then.i: -// CHECK-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.aie2p.ext.I32.I64(<2 x i32> [[TMP0]], i32 0) -// CHECK-NEXT: br label [[_ZL14EXTRACT_UINT32YI_EXIT:%.*]] -// CHECK: if.else.i: -// CHECK-NEXT: [[TMP2:%.*]] = tail call i32 @llvm.aie2p.ext.I32.I64(<2 x i32> [[TMP0]], i32 1) -// CHECK-NEXT: br label [[_ZL14EXTRACT_UINT32YI_EXIT]] -// CHECK: _ZL14extract_uint32yi.exit: -// CHECK-NEXT: [[RETVAL_0_I:%.*]] = phi i32 [ [[TMP1]], [[IF_THEN_I]] ], [ [[TMP2]], [[IF_ELSE_I]] ] -// CHECK-NEXT: ret i32 [[RETVAL_0_I]] +// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x i32> [[TMP0]], i32 [[IDX]] +// CHECK-NEXT: ret i32 [[VECEXT_I]] // unsigned int test_extract_uint32(unsigned long long a, int idx) { return extract_uint32(a, idx); } // CHECK-LABEL: define dso_local noundef i64 @_Z11test_concatjj( -// CHECK-SAME: i32 noundef [[A:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR1]] { +// CHECK-SAME: i32 noundef [[A:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[A]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[TMP0:%.*]] = tail call <2 x i32> @llvm.aie2p.set.I64.I32(i32 0, i32 0) -// CHECK-NEXT: br label [[_ZL6CONCATJJ_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[TMP1:%.*]] = tail call <2 x i32> @llvm.aie2p.set.I64.I32(i32 0, i32 1) -// CHECK-NEXT: br label [[_ZL6CONCATJJ_EXIT]] -// CHECK: _ZL6concatjj.exit: -// CHECK-NEXT: [[RETVAL_0_IN_I_I:%.*]] = phi <2 x i32> [ [[TMP0]], [[IF_THEN_I_I]] ], [ [[TMP1]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = tail call <2 x i32> @llvm.aie2p.upd.I64.I32(<2 x i32> [[RETVAL_0_IN_I_I]], i32 [[B]], i32 1) -// CHECK-NEXT: [[RETVAL_0_I4_I:%.*]] = bitcast <2 x i32> [[TMP2]] to i64 -// CHECK-NEXT: ret i64 [[RETVAL_0_I4_I]] +// CHECK-NEXT: [[VECINS_I_I:%.*]] = insertelement <2 x i32> poison, i32 0, i32 [[A]] +// CHECK-NEXT: [[VECINS_I2_I:%.*]] = insertelement <2 x i32> [[VECINS_I_I]], i32 [[B]], i64 1 +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i32> [[VECINS_I2_I]] to i64 +// CHECK-NEXT: ret i64 [[TMP0]] // unsigned long long test_concat(unsigned int a, unsigned int b) { return concat(a,b); } +// Constant-idx companions: verify each helper folds to a single op. +// CHECK-LABEL: define dso_local noundef i64 @_Z20test_insert_u64_idx0yj( +// CHECK-SAME: i64 noundef [[A:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = bitcast i64 [[A]] to <2 x i32> +// CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <2 x i32> [[TMP0]], i32 [[B]], i64 0 +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i32> [[VECINS_I]] to i64 +// CHECK-NEXT: ret i64 [[TMP1]] +// +unsigned long long test_insert_u64_idx0(unsigned long long a, unsigned int b) { return insert(a, 0, b); } +// CHECK-LABEL: define dso_local noundef i64 @_Z20test_insert_u64_idx1yj( +// CHECK-SAME: i64 noundef [[A:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = bitcast i64 [[A]] to <2 x i32> +// CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <2 x i32> [[TMP0]], i32 [[B]], i64 1 +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i32> [[VECINS_I]] to i64 +// CHECK-NEXT: ret i64 [[TMP1]] +// +unsigned long long test_insert_u64_idx1(unsigned long long a, unsigned int b) { return insert(a, 1, b); } +// CHECK-LABEL: define dso_local noundef i64 @_Z20test_set_uint64_idx0j( +// CHECK-SAME: i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <2 x i32> poison, i32 [[B]], i64 0 +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i32> [[VECINS_I]] to i64 +// CHECK-NEXT: ret i64 [[TMP0]] +// +unsigned long long test_set_uint64_idx0(unsigned int b) { return set_uint64(0, b); } +// CHECK-LABEL: define dso_local noundef i64 @_Z20test_set_uint64_idx1j( +// CHECK-SAME: i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <2 x i32> poison, i32 [[B]], i64 1 +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i32> [[VECINS_I]] to i64 +// CHECK-NEXT: ret i64 [[TMP0]] +// +unsigned long long test_set_uint64_idx1(unsigned int b) { return set_uint64(1, b); } +// CHECK-LABEL: define dso_local noundef i32 @_Z24test_extract_uint32_idx0y( +// CHECK-SAME: i64 noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECEXT_I:%.*]] = trunc i64 [[A]] to i32 +// CHECK-NEXT: ret i32 [[VECEXT_I]] +// +unsigned int test_extract_uint32_idx0(unsigned long long a) { return extract_uint32(a, 0); } +// CHECK-LABEL: define dso_local noundef i32 @_Z24test_extract_uint32_idx1y( +// CHECK-SAME: i64 noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = bitcast i64 [[A]] to <2 x i32> +// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x i32> [[TMP0]], i64 1 +// CHECK-NEXT: ret i32 [[VECEXT_I]] +// +unsigned int test_extract_uint32_idx1(unsigned long long a) { return extract_uint32(a, 1); } + // Conversions @@ -1884,19 +1899,13 @@ unsigned long long test_concat(unsigned int a, unsigned int b) // CHECK-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V64UINT4DV64_DU8_I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V64UINT4DV64_DU8_I_EXIT]] -// CHECK: _ZL16extract_v64uint4Dv64_DU8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> -// CHECK-NEXT: ret <32 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <32 x i8> +// CHECK-NEXT: ret <32 x i8> [[TMP1]] // v64uint4 test_extract_v64uint4 (v128uint4 a, int idx) { @@ -1908,20 +1917,14 @@ v64uint4 test_extract_v64uint4 (v128uint4 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_DU8_IDV32_S__EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_DU8_IDV32_S__EXIT]] -// CHECK: _ZL6insertDv64_DU8_iDv32_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP2]] // v128uint4 test_insert (v128uint4 a, int idx, v64uint4 b) { @@ -1932,19 +1935,13 @@ v128uint4 test_insert (v128uint4 a, int idx, v64uint4 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V128UINT4IDV32_DU8__EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V128UINT4IDV32_DU8__EXIT]] -// CHECK: _ZL13set_v128uint4iDv32_DU8_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP1]] // v128uint4 test_set_v128uint4 (int idx, v64uint4 b) { @@ -1971,19 +1968,13 @@ v128uint4 test_concat (v64uint4 a0, v64uint4 a1) // CHECK-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V64INT4DV64_DB8_I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V64INT4DV64_DB8_I_EXIT]] -// CHECK: _ZL15extract_v64int4Dv64_DB8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> -// CHECK-NEXT: ret <32 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <32 x i8> +// CHECK-NEXT: ret <32 x i8> [[TMP1]] // v64int4 test_extract_v64int4 (v128int4 a, int idx) { @@ -1995,20 +1986,14 @@ v64int4 test_extract_v64int4 (v128int4 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_DB8_IDV32_S__EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_DB8_IDV32_S__EXIT]] -// CHECK: _ZL6insertDv64_DB8_iDv32_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP2]] // v128int4 test_insert (v128int4 a, int idx, v64int4 b) { @@ -2019,19 +2004,13 @@ v128int4 test_insert (v128int4 a, int idx, v64int4 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V128INT4IDV32_DB8__EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V128INT4IDV32_DB8__EXIT]] -// CHECK: _ZL12set_v128int4iDv32_DB8_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP1]] // v128int4 test_set_v128int4 (int idx, v64int4 b) { @@ -2058,19 +2037,13 @@ v128int4 test_concat (v64int4 a0, v64int4 a1) // CHECK-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT8DV64_HI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT8DV64_HI_EXIT]] -// CHECK: _ZL16extract_v32uint8Dv64_hi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> -// CHECK-NEXT: ret <32 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <32 x i8> +// CHECK-NEXT: ret <32 x i8> [[TMP1]] // v32uint8 test_extract_v32uint8 (v64uint8 a, int idx) { @@ -2082,20 +2055,14 @@ v32uint8 test_extract_v32uint8 (v64uint8 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_HIDV32_H_EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_HIDV32_H_EXIT]] -// CHECK: _ZL6insertDv64_hiDv32_h.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP2]] // v64uint8 test_insert (v64uint8 a, int idx, v32uint8 b) { @@ -2106,19 +2073,13 @@ v64uint8 test_insert (v64uint8 a, int idx, v32uint8 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64UINT8IDV32_H_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64UINT8IDV32_H_EXIT]] -// CHECK: _ZL12set_v64uint8iDv32_h.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP1]] // v64uint8 test_set_v64uint8 (int idx, v32uint8 b) { @@ -2145,19 +2106,13 @@ v64uint8 test_concat (v32uint8 a0, v32uint8 a1) // CHECK-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT8DV64_AI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT8DV64_AI_EXIT]] -// CHECK: _ZL15extract_v32int8Dv64_ai.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> -// CHECK-NEXT: ret <32 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <32 x i8> +// CHECK-NEXT: ret <32 x i8> [[TMP1]] // v32int8 test_extract_v32int8 (v64int8 a, int idx) { @@ -2169,20 +2124,14 @@ v32int8 test_extract_v32int8 (v64int8 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_AIDV32_A_EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_AIDV32_A_EXIT]] -// CHECK: _ZL6insertDv64_aiDv32_a.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP2]] // v64int8 test_insert (v64int8 a, int idx, v32int8 b) { @@ -2193,19 +2142,13 @@ v64int8 test_insert (v64int8 a, int idx, v32int8 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V64INT8IDV32_A_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V64INT8IDV32_A_EXIT]] -// CHECK: _ZL11set_v64int8iDv32_a.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP1]] // v64int8 test_set_v64int8 (int idx, v32int8 b) { @@ -2232,19 +2175,13 @@ v64int8 test_concat (v32int8 a0, v32int8 a1) // CHECK-SAME: <32 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16UINT16DV32_TI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16UINT16DV32_TI_EXIT]] -// CHECK: _ZL17extract_v16uint16Dv32_ti.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x i16> -// CHECK-NEXT: ret <16 x i16> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <16 x i16> +// CHECK-NEXT: ret <16 x i16> [[TMP1]] // v16uint16 test_extract_v16uint16 (v32uint16 a, int idx) { @@ -2256,20 +2193,14 @@ v16uint16 test_extract_v16uint16 (v32uint16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i16> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_TIDV16_T_EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_TIDV16_T_EXIT]] -// CHECK: _ZL6insertDv32_tiDv16_t.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x i16> -// CHECK-NEXT: ret <32 x i16> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x i16> +// CHECK-NEXT: ret <32 x i16> [[TMP2]] // v32uint16 test_insert (v32uint16 a, int idx, v16uint16 b) { @@ -2280,19 +2211,13 @@ v32uint16 test_insert (v32uint16 a, int idx, v16uint16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i16> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i16> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32UINT16IDV16_T_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32UINT16IDV16_T_EXIT]] -// CHECK: _ZL13set_v32uint16iDv16_t.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x i16> -// CHECK-NEXT: ret <32 x i16> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x i16> +// CHECK-NEXT: ret <32 x i16> [[TMP1]] // v32uint16 test_set_v32uint16 (int idx, v16uint16 b) { @@ -2319,19 +2244,13 @@ v32uint16 test_concat (v16uint16 a0, v16uint16 a1) // CHECK-SAME: <32 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16INT16DV32_SI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16INT16DV32_SI_EXIT]] -// CHECK: _ZL16extract_v16int16Dv32_si.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x i16> -// CHECK-NEXT: ret <16 x i16> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <16 x i16> +// CHECK-NEXT: ret <16 x i16> [[TMP1]] // v16int16 test_extract_v16int16 (v32int16 a, int idx) { @@ -2343,20 +2262,14 @@ v16int16 test_extract_v16int16 (v32int16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i16> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_SIDV16_S_EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_SIDV16_S_EXIT]] -// CHECK: _ZL6insertDv32_siDv16_s.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x i16> -// CHECK-NEXT: ret <32 x i16> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x i16> +// CHECK-NEXT: ret <32 x i16> [[TMP2]] // v32int16 test_insert (v32int16 a, int idx, v16int16 b) { @@ -2367,19 +2280,13 @@ v32int16 test_insert (v32int16 a, int idx, v16int16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i16> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i16> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32INT16IDV16_S_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32INT16IDV16_S_EXIT]] -// CHECK: _ZL12set_v32int16iDv16_s.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x i16> -// CHECK-NEXT: ret <32 x i16> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x i16> +// CHECK-NEXT: ret <32 x i16> [[TMP1]] // v32int16 test_set_v32int16 (int idx, v16int16 b) { @@ -2405,18 +2312,12 @@ v32int16 test_concat (v16int16 a0, v16int16 a1) // CHECK-LABEL: define dso_local noundef <8 x i32> @_Z21test_extract_v8uint32Dv16_ji( // CHECK-SAME: <16 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT32DV16_JI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT32DV16_JI_EXIT]] -// CHECK: _ZL16extract_v8uint32Dv16_ji.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <8 x i32> [[COND_I_I]] // v8uint32 test_extract_v8uint32 (v16uint32 a, int idx) { @@ -2426,19 +2327,13 @@ v8uint32 test_extract_v8uint32 (v16uint32 a, int idx) // CHECK-LABEL: define dso_local noundef <16 x i32> @_Z11test_insertDv16_jiDv8_j( // CHECK-SAME: <16 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <8 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[A]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_JIDV8_J_EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_JIDV8_J_EXIT]] -// CHECK: _ZL6insertDv16_jiDv8_j.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I]] // v16uint32 test_insert (v16uint32 a, int idx, v8uint32 b) { @@ -2448,18 +2343,12 @@ v16uint32 test_insert (v16uint32 a, int idx, v8uint32 b) // CHECK-LABEL: define dso_local noundef <16 x i32> @_Z18test_set_v16uint32iDv8_j( // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V16UINT32IDV8_J_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V16UINT32IDV8_J_EXIT]] -// CHECK: _ZL13set_v16uint32iDv8_j.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I]] // v16uint32 test_set_v16uint32 (int idx, v8uint32 b) { @@ -2482,18 +2371,12 @@ v16uint32 test_concat (v8uint32 a0, v8uint32 a1) // CHECK-LABEL: define dso_local noundef <8 x i32> @_Z20test_extract_v8int32Dv16_ii( // CHECK-SAME: <16 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT32DV16_II_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT32DV16_II_EXIT]] -// CHECK: _ZL15extract_v8int32Dv16_ii.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <8 x i32> [[COND_I_I]] // v8int32 test_extract_v8int32 (v16int32 a, int idx) { @@ -2503,19 +2386,13 @@ v8int32 test_extract_v8int32 (v16int32 a, int idx) // CHECK-LABEL: define dso_local noundef <16 x i32> @_Z11test_insertDv16_iiDv8_i( // CHECK-SAME: <16 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <8 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[A]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_IIDV8_I_EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_IIDV8_I_EXIT]] -// CHECK: _ZL6insertDv16_iiDv8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I]] // v16int32 test_insert (v16int32 a, int idx, v8int32 b) { @@ -2525,18 +2402,12 @@ v16int32 test_insert (v16int32 a, int idx, v8int32 b) // CHECK-LABEL: define dso_local noundef <16 x i32> @_Z17test_set_v16int32iDv8_i( // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16INT32IDV8_I_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16INT32IDV8_I_EXIT]] -// CHECK: _ZL12set_v16int32iDv8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I]] // v16int32 test_set_v16int32 (int idx, v8int32 b) { @@ -2560,19 +2431,13 @@ v16int32 test_concat (v8int32 a0, v8int32 a1) // CHECK-SAME: <32 x bfloat> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x bfloat> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16BFLOAT16DV32_8BFLOAT16I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16BFLOAT16DV32_8BFLOAT16I_EXIT]] -// CHECK: _ZL19extract_v16bfloat16Dv32_8bfloat16i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x bfloat> -// CHECK-NEXT: ret <16 x bfloat> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <16 x bfloat> +// CHECK-NEXT: ret <16 x bfloat> [[TMP1]] // v16bfloat16 test_extract_v16bfloat16 (v32bfloat16 a, int idx) { @@ -2584,20 +2449,14 @@ v16bfloat16 test_extract_v16bfloat16 (v32bfloat16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x bfloat> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x bfloat> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_8BFLOAT16IDV16_S__EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_8BFLOAT16IDV16_S__EXIT]] -// CHECK: _ZL6insertDv32_8bfloat16iDv16_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x bfloat> -// CHECK-NEXT: ret <32 x bfloat> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x bfloat> +// CHECK-NEXT: ret <32 x bfloat> [[TMP2]] // v32bfloat16 test_insert (v32bfloat16 a, int idx, v16bfloat16 b) { @@ -2608,19 +2467,13 @@ v32bfloat16 test_insert (v32bfloat16 a, int idx, v16bfloat16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x bfloat> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x bfloat> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V32BFLOAT16IDV16_8BFLOAT16_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V32BFLOAT16IDV16_8BFLOAT16_EXIT]] -// CHECK: _ZL15set_v32bfloat16iDv16_8bfloat16.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x bfloat> -// CHECK-NEXT: ret <32 x bfloat> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x bfloat> +// CHECK-NEXT: ret <32 x bfloat> [[TMP1]] // v32bfloat16 test_set_v32bfloat16 (int idx, v16bfloat16 b) { @@ -2647,19 +2500,13 @@ v32bfloat16 test_concat (v16bfloat16 a0, v16bfloat16 a1) // CHECK-SAME: <16 x float> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8FLOATDV16_FI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8FLOATDV16_FI_EXIT]] -// CHECK: _ZL15extract_v8floatDv16_fi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <8 x float> -// CHECK-NEXT: ret <8 x float> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <8 x float> +// CHECK-NEXT: ret <8 x float> [[TMP1]] // v8float test_extract_v8float (v16float a, int idx) { @@ -2671,20 +2518,14 @@ v8float test_extract_v8float (v16float a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x float> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_FIDV8_F_EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_FIDV8_F_EXIT]] -// CHECK: _ZL6insertDv16_fiDv8_f.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <16 x float> -// CHECK-NEXT: ret <16 x float> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <16 x float> +// CHECK-NEXT: ret <16 x float> [[TMP2]] // v16float test_insert (v16float a, int idx, v8float b) { @@ -2695,19 +2536,13 @@ v16float test_insert (v16float a, int idx, v8float b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x float> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x float> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16FLOATIDV8_F_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16FLOATIDV8_F_EXIT]] -// CHECK: _ZL12set_v16floatiDv8_f.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <16 x float> -// CHECK-NEXT: ret <16 x float> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <16 x float> +// CHECK-NEXT: ret <16 x float> [[TMP1]] // v16float test_set_v16float (int idx, v8float b) { @@ -2731,27 +2566,18 @@ v16float test_concat (v8float a0, v8float a1) // CHECK-SAME: <128 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V64UINT4DV128_DU8_I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V64UINT4DV128_DU8_I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V64UINT4DV128_DU8_I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V64UINT4DV128_DU8_I_EXIT]] -// CHECK: _ZL16extract_v64uint4Dv128_DU8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP1]] // v64uint4 test_extract_v64uint4 (v256uint4 a, int idx) @@ -2764,29 +2590,22 @@ v64uint4 test_extract_v64uint4 (v256uint4 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DU8_IDV32_S__EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DU8_IDV32_S__EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DU8_IDV32_S__EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DU8_IDV32_S__EXIT]] -// CHECK: _ZL6insertDv128_DU8_iDv32_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <128 x i8> // CHECK-NEXT: ret <128 x i8> [[TMP2]] // v256uint4 test_insert (v256uint4 a, int idx, v64uint4 b) @@ -2798,31 +2617,18 @@ v256uint4 test_insert (v256uint4 a, int idx, v64uint4 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V256UINT4IDV32_DU8__EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V256UINT4IDV32_DU8__EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V256UINT4IDV32_DU8__EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V256UINT4IDV32_DU8__EXIT]] -// CHECK: _ZL13set_v256uint4iDv32_DU8_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <128 x i8> // CHECK-NEXT: ret <128 x i8> [[TMP1]] // v256uint4 test_set_v256uint4 (int idx, v64uint4 b) @@ -2854,19 +2660,13 @@ v256uint4 test_concat (v64uint4 a0, v64uint4 a1, v64uint4 a2, v64uint4 a3) // CHECK-SAME: <128 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V128UINT4DV128_DU8_I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V128UINT4DV128_DU8_I_EXIT]] -// CHECK: _ZL17extract_v128uint4Dv128_DU8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP1]] // v128uint4 test_extract_v128uint4 (v256uint4 a, int idx) { @@ -2878,20 +2678,14 @@ v128uint4 test_extract_v128uint4 (v256uint4 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DU8_IDV64_S__EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DU8_IDV64_S__EXIT]] -// CHECK: _ZL6insertDv128_DU8_iDv64_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: ret <128 x i8> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: ret <128 x i8> [[TMP2]] // v256uint4 test_insert (v256uint4 a, int idx, v128uint4 b) { @@ -2902,19 +2696,13 @@ v256uint4 test_insert (v256uint4 a, int idx, v128uint4 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <64 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V256UINT4IDV64_DU8__EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V256UINT4IDV64_DU8__EXIT]] -// CHECK: _ZL13set_v256uint4iDv64_DU8_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: ret <128 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: ret <128 x i8> [[TMP1]] // v256uint4 test_set_v256uint4 (int idx, v128uint4 b) { @@ -2941,27 +2729,18 @@ v256uint4 test_concat (v128uint4 a0, v128uint4 a1) // CHECK-SAME: <128 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V64INT4DV128_DB8_I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V64INT4DV128_DB8_I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V64INT4DV128_DB8_I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V64INT4DV128_DB8_I_EXIT]] -// CHECK: _ZL15extract_v64int4Dv128_DB8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP1]] // v64int4 test_extract_v64int4 (v256int4 a, int idx) @@ -2974,29 +2753,22 @@ v64int4 test_extract_v64int4 (v256int4 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DB8_IDV32_S__EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DB8_IDV32_S__EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DB8_IDV32_S__EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DB8_IDV32_S__EXIT]] -// CHECK: _ZL6insertDv128_DB8_iDv32_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <128 x i8> // CHECK-NEXT: ret <128 x i8> [[TMP2]] // v256int4 test_insert (v256int4 a, int idx, v64int4 b) @@ -3008,31 +2780,18 @@ v256int4 test_insert (v256int4 a, int idx, v64int4 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V256INT4IDV32_DB8__EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V256INT4IDV32_DB8__EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V256INT4IDV32_DB8__EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V256INT4IDV32_DB8__EXIT]] -// CHECK: _ZL12set_v256int4iDv32_DB8_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <128 x i8> // CHECK-NEXT: ret <128 x i8> [[TMP1]] // v256int4 test_set_v256int4 (int idx, v64int4 b) @@ -3064,19 +2823,13 @@ v256int4 test_concat (v64int4 a0, v64int4 a1, v64int4 a2, v64int4 a3) // CHECK-SAME: <128 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V128INT4DV128_DB8_I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V128INT4DV128_DB8_I_EXIT]] -// CHECK: _ZL16extract_v128int4Dv128_DB8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP1]] // v128int4 test_extract_v128int4 (v256int4 a, int idx) { @@ -3088,20 +2841,14 @@ v128int4 test_extract_v128int4 (v256int4 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DB8_IDV64_S__EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DB8_IDV64_S__EXIT]] -// CHECK: _ZL6insertDv128_DB8_iDv64_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: ret <128 x i8> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: ret <128 x i8> [[TMP2]] // v256int4 test_insert (v256int4 a, int idx, v128int4 b) { @@ -3112,19 +2859,13 @@ v256int4 test_insert (v256int4 a, int idx, v128int4 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <64 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V256INT4IDV64_DB8__EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V256INT4IDV64_DB8__EXIT]] -// CHECK: _ZL12set_v256int4iDv64_DB8_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: ret <128 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: ret <128 x i8> [[TMP1]] // v256int4 test_set_v256int4 (int idx, v128int4 b) { @@ -3151,27 +2892,18 @@ v256int4 test_concat (v128int4 a0, v128int4 a1) // CHECK-SAME: <128 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT8DV128_HI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT8DV128_HI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT8DV128_HI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT8DV128_HI_EXIT]] -// CHECK: _ZL16extract_v32uint8Dv128_hi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP1]] // v32uint8 test_extract_v32uint8 (v128uint8 a, int idx) @@ -3184,29 +2916,22 @@ v32uint8 test_extract_v32uint8 (v128uint8 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_HIDV32_H_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_HIDV32_H_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_HIDV32_H_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_HIDV32_H_EXIT]] -// CHECK: _ZL6insertDv128_hiDv32_h.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <128 x i8> // CHECK-NEXT: ret <128 x i8> [[TMP2]] // v128uint8 test_insert (v128uint8 a, int idx, v32uint8 b) @@ -3218,31 +2943,18 @@ v128uint8 test_insert (v128uint8 a, int idx, v32uint8 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V128UINT8IDV32_H_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V128UINT8IDV32_H_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V128UINT8IDV32_H_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V128UINT8IDV32_H_EXIT]] -// CHECK: _ZL13set_v128uint8iDv32_h.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <128 x i8> // CHECK-NEXT: ret <128 x i8> [[TMP1]] // v128uint8 test_set_v128uint8 (int idx, v32uint8 b) @@ -3274,19 +2986,13 @@ v128uint8 test_concat (v32uint8 a0, v32uint8 a1, v32uint8 a2, v32uint8 a3) // CHECK-SAME: <128 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V64UINT8DV128_HI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V64UINT8DV128_HI_EXIT]] -// CHECK: _ZL16extract_v64uint8Dv128_hi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP1]] // v64uint8 test_extract_v64uint8 (v128uint8 a, int idx) { @@ -3298,20 +3004,14 @@ v64uint8 test_extract_v64uint8 (v128uint8 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_HIDV64_H_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_HIDV64_H_EXIT]] -// CHECK: _ZL6insertDv128_hiDv64_h.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: ret <128 x i8> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: ret <128 x i8> [[TMP2]] // v128uint8 test_insert (v128uint8 a, int idx, v64uint8 b) { @@ -3322,19 +3022,13 @@ v128uint8 test_insert (v128uint8 a, int idx, v64uint8 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <64 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V128UINT8IDV64_H_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V128UINT8IDV64_H_EXIT]] -// CHECK: _ZL13set_v128uint8iDv64_h.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: ret <128 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: ret <128 x i8> [[TMP1]] // v128uint8 test_set_v128uint8 (int idx, v64uint8 b) { @@ -3361,27 +3055,18 @@ v128uint8 test_concat (v64uint8 a0, v64uint8 a1) // CHECK-SAME: <128 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT8DV128_AI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT8DV128_AI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT8DV128_AI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT8DV128_AI_EXIT]] -// CHECK: _ZL15extract_v32int8Dv128_ai.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP1]] // v32int8 test_extract_v32int8 (v128int8 a, int idx) @@ -3394,29 +3079,22 @@ v32int8 test_extract_v32int8 (v128int8 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_AIDV32_A_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_AIDV32_A_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_AIDV32_A_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_AIDV32_A_EXIT]] -// CHECK: _ZL6insertDv128_aiDv32_a.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <128 x i8> // CHECK-NEXT: ret <128 x i8> [[TMP2]] // v128int8 test_insert (v128int8 a, int idx, v32int8 b) @@ -3428,31 +3106,18 @@ v128int8 test_insert (v128int8 a, int idx, v32int8 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V128INT8IDV32_A_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V128INT8IDV32_A_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V128INT8IDV32_A_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V128INT8IDV32_A_EXIT]] -// CHECK: _ZL12set_v128int8iDv32_a.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <128 x i8> // CHECK-NEXT: ret <128 x i8> [[TMP1]] // v128int8 test_set_v128int8 (int idx, v32int8 b) @@ -3484,19 +3149,13 @@ v128int8 test_concat (v32int8 a0, v32int8 a1, v32int8 a2, v32int8 a3) // CHECK-SAME: <128 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V64INT8DV128_AI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V64INT8DV128_AI_EXIT]] -// CHECK: _ZL15extract_v64int8Dv128_ai.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP1]] // v64int8 test_extract_v64int8 (v128int8 a, int idx) { @@ -3508,20 +3167,14 @@ v64int8 test_extract_v64int8 (v128int8 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_AIDV64_A_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_AIDV64_A_EXIT]] -// CHECK: _ZL6insertDv128_aiDv64_a.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: ret <128 x i8> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: ret <128 x i8> [[TMP2]] // v128int8 test_insert (v128int8 a, int idx, v64int8 b) { @@ -3532,19 +3185,13 @@ v128int8 test_insert (v128int8 a, int idx, v64int8 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <64 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V128INT8IDV64_A_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V128INT8IDV64_A_EXIT]] -// CHECK: _ZL12set_v128int8iDv64_a.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: ret <128 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: ret <128 x i8> [[TMP1]] // v128int8 test_set_v128int8 (int idx, v64int8 b) { @@ -3571,27 +3218,18 @@ v128int8 test_concat (v64int8 a0, v64int8 a1) // CHECK-SAME: <64 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i16> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16UINT16DV64_TI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16UINT16DV64_TI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16UINT16DV64_TI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16UINT16DV64_TI_EXIT]] -// CHECK: _ZL17extract_v16uint16Dv64_ti.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x i16> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <16 x i16> // CHECK-NEXT: ret <16 x i16> [[TMP1]] // v16uint16 test_extract_v16uint16 (v64uint16 a, int idx) @@ -3604,29 +3242,22 @@ v16uint16 test_extract_v16uint16 (v64uint16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i16> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i16> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_TIDV16_T_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_TIDV16_T_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_TIDV16_T_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_TIDV16_T_EXIT]] -// CHECK: _ZL6insertDv64_tiDv16_t.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x i16> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <64 x i16> // CHECK-NEXT: ret <64 x i16> [[TMP2]] // v64uint16 test_insert (v64uint16 a, int idx, v16uint16 b) @@ -3638,31 +3269,18 @@ v64uint16 test_insert (v64uint16 a, int idx, v16uint16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i16> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i16> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V64UINT16IDV16_T_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V64UINT16IDV16_T_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V64UINT16IDV16_T_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V64UINT16IDV16_T_EXIT]] -// CHECK: _ZL13set_v64uint16iDv16_t.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x i16> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <64 x i16> // CHECK-NEXT: ret <64 x i16> [[TMP1]] // v64uint16 test_set_v64uint16 (int idx, v16uint16 b) @@ -3694,19 +3312,13 @@ v64uint16 test_concat (v16uint16 a0, v16uint16 a1, v16uint16 a2, v16uint16 a3) // CHECK-SAME: <64 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i16> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V32UINT16DV64_TI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V32UINT16DV64_TI_EXIT]] -// CHECK: _ZL17extract_v32uint16Dv64_ti.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x i16> -// CHECK-NEXT: ret <32 x i16> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x i16> +// CHECK-NEXT: ret <32 x i16> [[TMP1]] // v32uint16 test_extract_v32uint16 (v64uint16 a, int idx) { @@ -3718,20 +3330,14 @@ v32uint16 test_extract_v32uint16 (v64uint16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i16> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i16> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_TIDV32_T_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_TIDV32_T_EXIT]] -// CHECK: _ZL6insertDv64_tiDv32_t.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x i16> -// CHECK-NEXT: ret <64 x i16> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <64 x i16> +// CHECK-NEXT: ret <64 x i16> [[TMP2]] // v64uint16 test_insert (v64uint16 a, int idx, v32uint16 b) { @@ -3742,19 +3348,13 @@ v64uint16 test_insert (v64uint16 a, int idx, v32uint16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i16> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V64UINT16IDV32_T_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V64UINT16IDV32_T_EXIT]] -// CHECK: _ZL13set_v64uint16iDv32_t.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x i16> -// CHECK-NEXT: ret <64 x i16> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <64 x i16> +// CHECK-NEXT: ret <64 x i16> [[TMP1]] // v64uint16 test_set_v64uint16 (int idx, v32uint16 b) { @@ -3781,27 +3381,18 @@ v64uint16 test_concat (v32uint16 a0, v32uint16 a1) // CHECK-SAME: <64 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i16> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16INT16DV64_SI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16INT16DV64_SI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16INT16DV64_SI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16INT16DV64_SI_EXIT]] -// CHECK: _ZL16extract_v16int16Dv64_si.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x i16> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <16 x i16> // CHECK-NEXT: ret <16 x i16> [[TMP1]] // v16int16 test_extract_v16int16 (v64int16 a, int idx) @@ -3814,29 +3405,22 @@ v16int16 test_extract_v16int16 (v64int16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i16> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i16> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_SIDV16_S_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_SIDV16_S_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_SIDV16_S_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_SIDV16_S_EXIT]] -// CHECK: _ZL6insertDv64_siDv16_s.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x i16> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <64 x i16> // CHECK-NEXT: ret <64 x i16> [[TMP2]] // v64int16 test_insert (v64int16 a, int idx, v16int16 b) @@ -3848,31 +3432,18 @@ v64int16 test_insert (v64int16 a, int idx, v16int16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i16> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i16> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64INT16IDV16_S_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64INT16IDV16_S_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64INT16IDV16_S_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64INT16IDV16_S_EXIT]] -// CHECK: _ZL12set_v64int16iDv16_s.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x i16> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <64 x i16> // CHECK-NEXT: ret <64 x i16> [[TMP1]] // v64int16 test_set_v64int16 (int idx, v16int16 b) @@ -3904,19 +3475,13 @@ v64int16 test_concat (v16int16 a0, v16int16 a1, v16int16 a2, v16int16 a3) // CHECK-SAME: <64 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i16> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32INT16DV64_SI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32INT16DV64_SI_EXIT]] -// CHECK: _ZL16extract_v32int16Dv64_si.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x i16> -// CHECK-NEXT: ret <32 x i16> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x i16> +// CHECK-NEXT: ret <32 x i16> [[TMP1]] // v32int16 test_extract_v32int16 (v64int16 a, int idx) { @@ -3928,20 +3493,14 @@ v32int16 test_extract_v32int16 (v64int16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i16> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i16> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_SIDV32_S_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_SIDV32_S_EXIT]] -// CHECK: _ZL6insertDv64_siDv32_s.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x i16> -// CHECK-NEXT: ret <64 x i16> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <64 x i16> +// CHECK-NEXT: ret <64 x i16> [[TMP2]] // v64int16 test_insert (v64int16 a, int idx, v32int16 b) { @@ -3952,19 +3511,13 @@ v64int16 test_insert (v64int16 a, int idx, v32int16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i16> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64INT16IDV32_S_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64INT16IDV32_S_EXIT]] -// CHECK: _ZL12set_v64int16iDv32_s.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x i16> -// CHECK-NEXT: ret <64 x i16> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <64 x i16> +// CHECK-NEXT: ret <64 x i16> [[TMP1]] // v64int16 test_set_v64int16 (int idx, v32int16 b) { @@ -3990,27 +3543,18 @@ v64int16 test_concat (v32int16 a0, v32int16 a1) // CHECK-LABEL: define dso_local noundef <8 x i32> @_Z21test_extract_v8uint32Dv32_ji( // CHECK-SAME: <32 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT32DV32_JI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT32DV32_JI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT32DV32_JI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT32DV32_JI_EXIT]] -// CHECK: _ZL16extract_v8uint32Dv32_ji.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: ret <8 x i32> [[COND15_I_I]] // v8uint32 test_extract_v8uint32 (v32uint32 a, int idx) { @@ -4020,29 +3564,22 @@ v8uint32 test_extract_v8uint32 (v32uint32 a, int idx) // CHECK-LABEL: define dso_local noundef <32 x i32> @_Z11test_insertDv32_jiDv8_j( // CHECK-SAME: <32 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <8 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_JIDV8_J_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_JIDV8_J_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_JIDV8_J_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_JIDV8_J_EXIT]] -// CHECK: _ZL6insertDv32_jiDv8_j.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[A]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND19_I_I]] // v32uint32 test_insert (v32uint32 a, int idx, v8uint32 b) { @@ -4052,31 +3589,18 @@ v32uint32 test_insert (v32uint32 a, int idx, v8uint32 b) // CHECK-LABEL: define dso_local noundef <32 x i32> @_Z18test_set_v32uint32iDv8_j( // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32UINT32IDV8_J_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32UINT32IDV8_J_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32UINT32IDV8_J_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32UINT32IDV8_J_EXIT]] -// CHECK: _ZL13set_v32uint32iDv8_j.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND15_I_I]] // v32uint32 test_set_v32uint32 (int idx, v8uint32 b) { @@ -4101,18 +3625,12 @@ v32uint32 test_concat (v8uint32 a0, v8uint32 a1, v8uint32 a2, v8uint32 a3) // CHECK-LABEL: define dso_local noundef <16 x i32> @_Z22test_extract_v16uint32Dv32_ji( // CHECK-SAME: <32 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16UINT32DV32_JI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16UINT32DV32_JI_EXIT]] -// CHECK: _ZL17extract_v16uint32Dv32_ji.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I]] // v16uint32 test_extract_v16uint32 (v32uint32 a, int idx) { @@ -4122,19 +3640,13 @@ v16uint32 test_extract_v16uint32 (v32uint32 a, int idx) // CHECK-LABEL: define dso_local noundef <32 x i32> @_Z11test_insertDv32_jiDv16_j( // CHECK-SAME: <32 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <16 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_JIDV16_J_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_JIDV16_J_EXIT]] -// CHECK: _ZL6insertDv32_jiDv16_j.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[A]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND_I_I]] // v32uint32 test_insert (v32uint32 a, int idx, v16uint32 b) { @@ -4144,18 +3656,12 @@ v32uint32 test_insert (v32uint32 a, int idx, v16uint32 b) // CHECK-LABEL: define dso_local noundef <32 x i32> @_Z18test_set_v32uint32iDv16_j( // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32UINT32IDV16_J_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32UINT32IDV16_J_EXIT]] -// CHECK: _ZL13set_v32uint32iDv16_j.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND_I_I]] // v32uint32 test_set_v32uint32 (int idx, v16uint32 b) { @@ -4178,27 +3684,18 @@ v32uint32 test_concat (v16uint32 a0, v16uint32 a1) // CHECK-LABEL: define dso_local noundef <8 x i32> @_Z20test_extract_v8int32Dv32_ii( // CHECK-SAME: <32 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT32DV32_II_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT32DV32_II_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT32DV32_II_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT32DV32_II_EXIT]] -// CHECK: _ZL15extract_v8int32Dv32_ii.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: ret <8 x i32> [[COND15_I_I]] // v8int32 test_extract_v8int32 (v32int32 a, int idx) { @@ -4208,29 +3705,22 @@ v8int32 test_extract_v8int32 (v32int32 a, int idx) // CHECK-LABEL: define dso_local noundef <32 x i32> @_Z11test_insertDv32_iiDv8_i( // CHECK-SAME: <32 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <8 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_IIDV8_I_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_IIDV8_I_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_IIDV8_I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_IIDV8_I_EXIT]] -// CHECK: _ZL6insertDv32_iiDv8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[A]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND19_I_I]] // v32int32 test_insert (v32int32 a, int idx, v8int32 b) { @@ -4240,31 +3730,18 @@ v32int32 test_insert (v32int32 a, int idx, v8int32 b) // CHECK-LABEL: define dso_local noundef <32 x i32> @_Z17test_set_v32int32iDv8_i( // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32INT32IDV8_I_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32INT32IDV8_I_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32INT32IDV8_I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32INT32IDV8_I_EXIT]] -// CHECK: _ZL12set_v32int32iDv8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND15_I_I]] // v32int32 test_set_v32int32 (int idx, v8int32 b) { @@ -4289,18 +3766,12 @@ v32int32 test_concat (v8int32 a0, v8int32 a1, v8int32 a2, v8int32 a3) // CHECK-LABEL: define dso_local noundef <16 x i32> @_Z21test_extract_v16int32Dv32_ii( // CHECK-SAME: <32 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16INT32DV32_II_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16INT32DV32_II_EXIT]] -// CHECK: _ZL16extract_v16int32Dv32_ii.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I]] // v16int32 test_extract_v16int32 (v32int32 a, int idx) { @@ -4310,19 +3781,13 @@ v16int32 test_extract_v16int32 (v32int32 a, int idx) // CHECK-LABEL: define dso_local noundef <32 x i32> @_Z11test_insertDv32_iiDv16_i( // CHECK-SAME: <32 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <16 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_IIDV16_I_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_IIDV16_I_EXIT]] -// CHECK: _ZL6insertDv32_iiDv16_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[A]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND_I_I]] // v32int32 test_insert (v32int32 a, int idx, v16int32 b) { @@ -4332,18 +3797,12 @@ v32int32 test_insert (v32int32 a, int idx, v16int32 b) // CHECK-LABEL: define dso_local noundef <32 x i32> @_Z17test_set_v32int32iDv16_i( // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32INT32IDV16_I_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32INT32IDV16_I_EXIT]] -// CHECK: _ZL12set_v32int32iDv16_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND_I_I]] // v32int32 test_set_v32int32 (int idx, v16int32 b) { @@ -4367,27 +3826,18 @@ v32int32 test_concat (v16int32 a0, v16int32 a1) // CHECK-SAME: <64 x bfloat> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x bfloat> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16BFLOAT16DV64_8BFLOAT16I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16BFLOAT16DV64_8BFLOAT16I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16BFLOAT16DV64_8BFLOAT16I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16BFLOAT16DV64_8BFLOAT16I_EXIT]] -// CHECK: _ZL19extract_v16bfloat16Dv64_8bfloat16i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x bfloat> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <16 x bfloat> // CHECK-NEXT: ret <16 x bfloat> [[TMP1]] // v16bfloat16 test_extract_v16bfloat16 (v64bfloat16 a, int idx) @@ -4400,29 +3850,22 @@ v16bfloat16 test_extract_v16bfloat16 (v64bfloat16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x bfloat> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x bfloat> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_8BFLOAT16IDV16_S__EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_8BFLOAT16IDV16_S__EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_8BFLOAT16IDV16_S__EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_8BFLOAT16IDV16_S__EXIT]] -// CHECK: _ZL6insertDv64_8bfloat16iDv16_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x bfloat> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <64 x bfloat> // CHECK-NEXT: ret <64 x bfloat> [[TMP2]] // v64bfloat16 test_insert (v64bfloat16 a, int idx, v16bfloat16 b) @@ -4434,31 +3877,18 @@ v64bfloat16 test_insert (v64bfloat16 a, int idx, v16bfloat16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x bfloat> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x bfloat> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64BFLOAT16IDV16_8BFLOAT16_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64BFLOAT16IDV16_8BFLOAT16_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64BFLOAT16IDV16_8BFLOAT16_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64BFLOAT16IDV16_8BFLOAT16_EXIT]] -// CHECK: _ZL15set_v64bfloat16iDv16_8bfloat16.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x bfloat> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <64 x bfloat> // CHECK-NEXT: ret <64 x bfloat> [[TMP1]] // v64bfloat16 test_set_v64bfloat16 (int idx, v16bfloat16 b) @@ -4490,19 +3920,13 @@ v64bfloat16 test_concat (v16bfloat16 a0, v16bfloat16 a1, v16bfloat16 a2, v16bflo // CHECK-SAME: <64 x bfloat> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x bfloat> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V32BFLOAT16DV64_8BFLOAT16I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V32BFLOAT16DV64_8BFLOAT16I_EXIT]] -// CHECK: _ZL19extract_v32bfloat16Dv64_8bfloat16i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x bfloat> -// CHECK-NEXT: ret <32 x bfloat> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x bfloat> +// CHECK-NEXT: ret <32 x bfloat> [[TMP1]] // v32bfloat16 test_extract_v32bfloat16 (v64bfloat16 a, int idx) { @@ -4514,20 +3938,14 @@ v32bfloat16 test_extract_v32bfloat16 (v64bfloat16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x bfloat> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x bfloat> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_8BFLOAT16IDV32_S__EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_8BFLOAT16IDV32_S__EXIT]] -// CHECK: _ZL6insertDv64_8bfloat16iDv32_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x bfloat> -// CHECK-NEXT: ret <64 x bfloat> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <64 x bfloat> +// CHECK-NEXT: ret <64 x bfloat> [[TMP2]] // v64bfloat16 test_insert (v64bfloat16 a, int idx, v32bfloat16 b) { @@ -4538,19 +3956,13 @@ v64bfloat16 test_insert (v64bfloat16 a, int idx, v32bfloat16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x bfloat> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x bfloat> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64BFLOAT16IDV32_8BFLOAT16_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64BFLOAT16IDV32_8BFLOAT16_EXIT]] -// CHECK: _ZL15set_v64bfloat16iDv32_8bfloat16.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x bfloat> -// CHECK-NEXT: ret <64 x bfloat> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <64 x bfloat> +// CHECK-NEXT: ret <64 x bfloat> [[TMP1]] // v64bfloat16 test_set_v64bfloat16 (int idx, v32bfloat16 b) { @@ -4577,19 +3989,13 @@ v64bfloat16 test_concat (v32bfloat16 a0, v32bfloat16 a1) // CHECK-SAME: <32 x float> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16ACCFLOATDV32_U10__ACCFLOATI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16ACCFLOATDV32_U10__ACCFLOATI_EXIT]] -// CHECK: _ZL19extract_v16accfloatDv32_u10__accfloati.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <16 x float> -// CHECK-NEXT: ret <16 x float> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <16 x float> +// CHECK-NEXT: ret <16 x float> [[TMP1]] // v16accfloat test_extract_v16accfloat (v32accfloat a, int idx) { @@ -4601,20 +4007,14 @@ v16accfloat test_extract_v16accfloat (v32accfloat a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x float> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U10__ACCFLOATIDV16_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U10__ACCFLOATIDV16_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL6insertDv32_u10__accfloatiDv16_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <32 x float> -// CHECK-NEXT: ret <32 x float> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <32 x float> +// CHECK-NEXT: ret <32 x float> [[TMP2]] // v32accfloat test_insert (v32accfloat a, int idx, v16accfloat b) { @@ -4625,19 +4025,13 @@ v32accfloat test_insert (v32accfloat a, int idx, v16accfloat b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x float> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V32ACCFLOATIDV16_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V32ACCFLOATIDV16_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL15set_v32accfloatiDv16_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <32 x float> -// CHECK-NEXT: ret <32 x float> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <32 x float> +// CHECK-NEXT: ret <32 x float> [[TMP1]] // v32accfloat test_set_v32accfloat (int idx, v16accfloat b) { @@ -4661,27 +4055,18 @@ v32accfloat test_concat (v16accfloat a0, v16accfloat a1) // CHECK-SAME: <32 x float> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8FLOATDV32_FI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8FLOATDV32_FI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8FLOATDV32_FI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8FLOATDV32_FI_EXIT]] -// CHECK: _ZL15extract_v8floatDv32_fi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <8 x float> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <8 x float> // CHECK-NEXT: ret <8 x float> [[TMP1]] // v8float test_extract_v8float (v32float a, int idx) @@ -4694,29 +4079,22 @@ v8float test_extract_v8float (v32float a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x float> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_FIDV8_F_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_FIDV8_F_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_FIDV8_F_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_FIDV8_F_EXIT]] -// CHECK: _ZL6insertDv32_fiDv8_f.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <32 x float> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <32 x float> // CHECK-NEXT: ret <32 x float> [[TMP2]] // v32float test_insert (v32float a, int idx, v8float b) @@ -4728,31 +4106,18 @@ v32float test_insert (v32float a, int idx, v8float b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x float> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x float> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32FLOATIDV8_F_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32FLOATIDV8_F_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32FLOATIDV8_F_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32FLOATIDV8_F_EXIT]] -// CHECK: _ZL12set_v32floatiDv8_f.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <32 x float> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <32 x float> // CHECK-NEXT: ret <32 x float> [[TMP1]] // v32float test_set_v32float (int idx, v8float b) @@ -4779,19 +4144,13 @@ v32float test_concat (v8float a0, v8float a1, v8float a2, v8float a3) // CHECK-SAME: <32 x float> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16FLOATDV32_FI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16FLOATDV32_FI_EXIT]] -// CHECK: _ZL16extract_v16floatDv32_fi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <16 x float> -// CHECK-NEXT: ret <16 x float> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <16 x float> +// CHECK-NEXT: ret <16 x float> [[TMP1]] // v16float test_extract_v16float (v32float a, int idx) { @@ -4803,20 +4162,14 @@ v16float test_extract_v16float (v32float a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x float> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_FIDV16_F_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_FIDV16_F_EXIT]] -// CHECK: _ZL6insertDv32_fiDv16_f.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <32 x float> -// CHECK-NEXT: ret <32 x float> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <32 x float> +// CHECK-NEXT: ret <32 x float> [[TMP2]] // v32float test_insert (v32float a, int idx, v16float b) { @@ -4827,19 +4180,13 @@ v32float test_insert (v32float a, int idx, v16float b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x float> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32FLOATIDV16_F_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32FLOATIDV16_F_EXIT]] -// CHECK: _ZL12set_v32floatiDv16_f.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <32 x float> -// CHECK-NEXT: ret <32 x float> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <32 x float> +// CHECK-NEXT: ret <32 x float> [[TMP1]] // v32float test_set_v32float (int idx, v16float b) { @@ -4862,18 +4209,12 @@ v32float test_concat (v16float a0, v16float a1) // CHECK-LABEL: define dso_local inreg noundef <16 x i32> @_Z21test_extract_v16acc32Dv32_u7__acc32i( // CHECK-SAME: <32 x i32> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16ACC32DV32_U7__ACC32I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16ACC32DV32_U7__ACC32I_EXIT]] -// CHECK: _ZL16extract_v16acc32Dv32_u7__acc32i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I]] // v16acc32 test_extract_v16acc32 (v32acc32 a, int idx) { @@ -4883,19 +4224,13 @@ v16acc32 test_extract_v16acc32 (v32acc32 a, int idx) // CHECK-LABEL: define dso_local inreg noundef <32 x i32> @_Z11test_insertDv32_u7__acc32iDv16_u7__acc32( // CHECK-SAME: <32 x i32> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <16 x i32> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC32IDV16_U7__ACC32_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC32IDV16_U7__ACC32_EXIT]] -// CHECK: _ZL6insertDv32_u7__acc32iDv16_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[A]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND_I_I]] // v32acc32 test_insert (v32acc32 a, int idx, v16acc32 b) { @@ -4905,18 +4240,12 @@ v32acc32 test_insert (v32acc32 a, int idx, v16acc32 b) // CHECK-LABEL: define dso_local inreg noundef <32 x i32> @_Z17test_set_v32acc32iDv16_u7__acc32( // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i32> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC32IDV16_U7__ACC32_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC32IDV16_U7__ACC32_EXIT]] -// CHECK: _ZL12set_v32acc32iDv16_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND_I_I]] // v32acc32 test_set_v32acc32 (int idx, v16acc32 b) { @@ -4940,19 +4269,13 @@ v32acc32 test_concat (v16acc32 a0, v16acc32 a1) // CHECK-SAME: <16 x i64> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i64> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC64DV16_U7__ACC64I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC64DV16_U7__ACC64I_EXIT]] -// CHECK: _ZL15extract_v8acc64Dv16_u7__acc64i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <8 x i64> -// CHECK-NEXT: ret <8 x i64> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <8 x i64> +// CHECK-NEXT: ret <8 x i64> [[TMP1]] // v8acc64 test_extract_v8acc64 (v16acc64 a, int idx) { @@ -4964,20 +4287,14 @@ v8acc64 test_extract_v8acc64 (v16acc64 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i64> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i64> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U7__ACC64IDV8_U7__ACC64_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U7__ACC64IDV8_U7__ACC64_EXIT]] -// CHECK: _ZL6insertDv16_u7__acc64iDv8_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <16 x i64> -// CHECK-NEXT: ret <16 x i64> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <16 x i64> +// CHECK-NEXT: ret <16 x i64> [[TMP2]] // v16acc64 test_insert (v16acc64 a, int idx, v8acc64 b) { @@ -4988,19 +4305,13 @@ v16acc64 test_insert (v16acc64 a, int idx, v8acc64 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x i64> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i64> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16ACC64IDV8_U7__ACC64_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16ACC64IDV8_U7__ACC64_EXIT]] -// CHECK: _ZL12set_v16acc64iDv8_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <16 x i64> -// CHECK-NEXT: ret <16 x i64> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <16 x i64> +// CHECK-NEXT: ret <16 x i64> [[TMP1]] // v16acc64 test_set_v16acc64 (int idx, v8acc64 b) { @@ -5024,27 +4335,18 @@ v16acc64 test_concat (v8acc64 a0, v8acc64 a1) // CHECK-SAME: <64 x float> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x float> [[A]] to <32 x i64> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16ACCFLOATDV64_U10__ACCFLOATI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16ACCFLOATDV64_U10__ACCFLOATI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16ACCFLOATDV64_U10__ACCFLOATI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16ACCFLOATDV64_U10__ACCFLOATI_EXIT]] -// CHECK: _ZL19extract_v16accfloatDv64_u10__accfloati.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i64> [[RETVAL_0_I_I]] to <16 x float> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i64> [[SHUFFLE_I_I]], <8 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i64> [[SHUFFLE2_I_I]], <8 x i64> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i64> [[COND_I_I]], <8 x i64> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i64> [[COND15_I_I]] to <16 x float> // CHECK-NEXT: ret <16 x float> [[TMP1]] // v16accfloat test_extract_v16accfloat (v64accfloat a, int idx) @@ -5057,28 +4359,22 @@ v16accfloat test_extract_v16accfloat (v64accfloat a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x float> [[A]] to <32 x i64> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x float> [[B]] to <8 x i64> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE1_I_I]], <32 x i64> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U10__ACCFLOATIDV16_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U10__ACCFLOATIDV16_U10__ACCFLOAT_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U10__ACCFLOATIDV16_U10__ACCFLOAT_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U10__ACCFLOATIDV16_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL6insertDv64_u10__accfloatiDv16_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i64> [[RETVAL_0_I_I]] to <64 x float> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE4_I_I]], <32 x i64> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE6_I_I]], <32 x i64> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i64> [[COND_I_I]], <32 x i64> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i64> [[COND19_I_I]] to <64 x float> // CHECK-NEXT: ret <64 x float> [[TMP2]] // v64accfloat test_insert (v64accfloat a, int idx, v16accfloat b) @@ -5090,27 +4386,18 @@ v64accfloat test_insert (v64accfloat a, int idx, v16accfloat b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x float> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[B]] to <8 x i64> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN9_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64ACCFLOATIDV16_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64ACCFLOATIDV16_U10__ACCFLOAT_EXIT]] -// CHECK: if.then9.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64ACCFLOATIDV16_U10__ACCFLOAT_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64ACCFLOATIDV16_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL15set_v64accfloatiDv16_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE5_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_THEN9_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i64> [[RETVAL_0_I_I]] to <64 x float> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE2_I_I]], <32 x i64> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i64> [[COND_I_I]], <32 x i64> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i64> [[COND15_I_I]] to <64 x float> // CHECK-NEXT: ret <64 x float> [[TMP1]] // v64accfloat test_set_v64accfloat (int idx, v16accfloat b) @@ -5142,19 +4429,13 @@ v64accfloat test_concat (v16accfloat a0, v16accfloat a1, v16accfloat a2, v16accf // CHECK-SAME: <64 x float> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x float> [[A]] to <32 x i64> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V32ACCFLOATDV64_U10__ACCFLOATI_EXIT:%.*]] -// CHECK: if.else.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V32ACCFLOATDV64_U10__ACCFLOATI_EXIT]] -// CHECK: _ZL19extract_v32accfloatDv64_u10__accfloati.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i64> [[RETVAL_0_I_I]] to <32 x float> -// CHECK-NEXT: ret <32 x float> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <16 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i64> [[SHUFFLE_I_I]], <16 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i64> [[COND_I_I]] to <32 x float> +// CHECK-NEXT: ret <32 x float> [[TMP1]] // v32accfloat test_extract_v32accfloat (v64accfloat a, int idx) { @@ -5167,19 +4448,13 @@ v32accfloat test_extract_v32accfloat (v64accfloat a, int idx) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x float> [[A]] to <32 x i64> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x float> [[B]] to <16 x i64> // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[TMP1]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U10__ACCFLOATIDV32_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U10__ACCFLOATIDV32_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL6insertDv64_u10__accfloatiDv32_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i64> [[RETVAL_0_I_I]] to <64 x float> -// CHECK-NEXT: ret <64 x float> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i64> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i64> [[COND_I_I]] to <64 x float> +// CHECK-NEXT: ret <64 x float> [[TMP2]] // v64accfloat test_insert (v64accfloat a, int idx, v32accfloat b) { @@ -5190,19 +4465,13 @@ v64accfloat test_insert (v64accfloat a, int idx, v32accfloat b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x float> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[B]] to <16 x i64> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[TMP0]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64ACCFLOATIDV32_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.else.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i64> [[TMP0]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64ACCFLOATIDV32_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL15set_v64accfloatiDv32_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i64> [[RETVAL_0_I_I]] to <64 x float> -// CHECK-NEXT: ret <64 x float> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[TMP0]], <16 x i64> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i64> [[COND_I_I]] to <64 x float> +// CHECK-NEXT: ret <64 x float> [[TMP1]] // v64accfloat test_set_v64accfloat (int idx, v32accfloat b) { @@ -5229,27 +4498,18 @@ v64accfloat test_concat (v32accfloat a0, v32accfloat a1) // CHECK-SAME: <64 x i32> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i32> [[A]] to <32 x i64> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16ACC32DV64_U7__ACC32I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16ACC32DV64_U7__ACC32I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16ACC32DV64_U7__ACC32I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16ACC32DV64_U7__ACC32I_EXIT]] -// CHECK: _ZL16extract_v16acc32Dv64_u7__acc32i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i64> [[RETVAL_0_I_I]] to <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i64> [[SHUFFLE_I_I]], <8 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i64> [[SHUFFLE2_I_I]], <8 x i64> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i64> [[COND_I_I]], <8 x i64> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i64> [[COND15_I_I]] to <16 x i32> // CHECK-NEXT: ret <16 x i32> [[TMP1]] // v16acc32 test_extract_v16acc32 (v64acc32 a, int idx) @@ -5262,28 +4522,22 @@ v16acc32 test_extract_v16acc32 (v64acc32 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i32> [[A]] to <32 x i64> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[B]] to <8 x i64> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE1_I_I]], <32 x i64> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U7__ACC32IDV16_U7__ACC32_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U7__ACC32IDV16_U7__ACC32_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U7__ACC32IDV16_U7__ACC32_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U7__ACC32IDV16_U7__ACC32_EXIT]] -// CHECK: _ZL6insertDv64_u7__acc32iDv16_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i64> [[RETVAL_0_I_I]] to <64 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE4_I_I]], <32 x i64> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE6_I_I]], <32 x i64> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i64> [[COND_I_I]], <32 x i64> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i64> [[COND19_I_I]] to <64 x i32> // CHECK-NEXT: ret <64 x i32> [[TMP2]] // v64acc32 test_insert (v64acc32 a, int idx, v16acc32 b) @@ -5295,27 +4549,18 @@ v64acc32 test_insert (v64acc32 a, int idx, v16acc32 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i32> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i32> [[B]] to <8 x i64> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN9_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64ACC32IDV16_U7__ACC32_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64ACC32IDV16_U7__ACC32_EXIT]] -// CHECK: if.then9.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64ACC32IDV16_U7__ACC32_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64ACC32IDV16_U7__ACC32_EXIT]] -// CHECK: _ZL12set_v64acc32iDv16_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE5_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_THEN9_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i64> [[RETVAL_0_I_I]] to <64 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE2_I_I]], <32 x i64> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i64> [[COND_I_I]], <32 x i64> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i64> [[COND15_I_I]] to <64 x i32> // CHECK-NEXT: ret <64 x i32> [[TMP1]] // v64acc32 test_set_v64acc32 (int idx, v16acc32 b) @@ -5347,19 +4592,13 @@ v64acc32 test_concat (v16acc32 a0, v16acc32 a1, v16acc32 a2, v16acc32 a3) // CHECK-SAME: <64 x i32> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i32> [[A]] to <32 x i64> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32ACC32DV64_U7__ACC32I_EXIT:%.*]] -// CHECK: if.else.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32ACC32DV64_U7__ACC32I_EXIT]] -// CHECK: _ZL16extract_v32acc32Dv64_u7__acc32i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i64> [[RETVAL_0_I_I]] to <32 x i32> -// CHECK-NEXT: ret <32 x i32> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <16 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i64> [[SHUFFLE_I_I]], <16 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i64> [[COND_I_I]] to <32 x i32> +// CHECK-NEXT: ret <32 x i32> [[TMP1]] // v32acc32 test_extract_v32acc32 (v64acc32 a, int idx) { @@ -5372,19 +4611,13 @@ v32acc32 test_extract_v32acc32 (v64acc32 a, int idx) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i32> [[A]] to <32 x i64> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[B]] to <16 x i64> // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[TMP1]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U7__ACC32IDV32_U7__ACC32_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U7__ACC32IDV32_U7__ACC32_EXIT]] -// CHECK: _ZL6insertDv64_u7__acc32iDv32_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i64> [[RETVAL_0_I_I]] to <64 x i32> -// CHECK-NEXT: ret <64 x i32> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i64> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i64> [[COND_I_I]] to <64 x i32> +// CHECK-NEXT: ret <64 x i32> [[TMP2]] // v64acc32 test_insert (v64acc32 a, int idx, v32acc32 b) { @@ -5395,19 +4628,13 @@ v64acc32 test_insert (v64acc32 a, int idx, v32acc32 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i32> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i32> [[B]] to <16 x i64> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[TMP0]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64ACC32IDV32_U7__ACC32_EXIT:%.*]] -// CHECK: if.else.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i64> [[TMP0]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64ACC32IDV32_U7__ACC32_EXIT]] -// CHECK: _ZL12set_v64acc32iDv32_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i64> [[RETVAL_0_I_I]] to <64 x i32> -// CHECK-NEXT: ret <64 x i32> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[TMP0]], <16 x i64> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i64> [[COND_I_I]] to <64 x i32> +// CHECK-NEXT: ret <64 x i32> [[TMP1]] // v64acc32 test_set_v64acc32 (int idx, v32acc32 b) { @@ -5433,27 +4660,18 @@ v64acc32 test_concat (v32acc32 a0, v32acc32 a1) // CHECK-LABEL: define dso_local inreg noundef <8 x i64> @_Z20test_extract_v8acc64Dv32_u7__acc64i( // CHECK-SAME: <32 x i64> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC64DV32_U7__ACC64I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC64DV32_U7__ACC64I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC64DV32_U7__ACC64I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC64DV32_U7__ACC64I_EXIT]] -// CHECK: _ZL15extract_v8acc64Dv32_u7__acc64i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <8 x i64> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i64> [[SHUFFLE_I_I]], <8 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i64> [[SHUFFLE2_I_I]], <8 x i64> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i64> [[COND_I_I]], <8 x i64> [[COND9_I_I]] +// CHECK-NEXT: ret <8 x i64> [[COND15_I_I]] // v8acc64 test_extract_v8acc64 (v32acc64 a, int idx) { @@ -5463,28 +4681,22 @@ v8acc64 test_extract_v8acc64 (v32acc64 a, int idx) // CHECK-LABEL: define dso_local inreg noundef <32 x i64> @_Z11test_insertDv32_u7__acc64iDv8_u7__acc64( // CHECK-SAME: <32 x i64> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <8 x i64> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE1_I_I]], <32 x i64> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC64IDV8_U7__ACC64_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC64IDV8_U7__ACC64_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC64IDV8_U7__ACC64_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC64IDV8_U7__ACC64_EXIT]] -// CHECK: _ZL6insertDv32_u7__acc64iDv8_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i64> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[A]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE4_I_I]], <32 x i64> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE6_I_I]], <32 x i64> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i64> [[COND_I_I]], <32 x i64> [[COND13_I_I]] +// CHECK-NEXT: ret <32 x i64> [[COND19_I_I]] // v32acc64 test_insert (v32acc64 a, int idx, v8acc64 b) { @@ -5494,27 +4706,18 @@ v32acc64 test_insert (v32acc64 a, int idx, v8acc64 b) // CHECK-LABEL: define dso_local inreg noundef <32 x i64> @_Z17test_set_v32acc64iDv8_u7__acc64( // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x i64> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN9_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC64IDV8_U7__ACC64_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC64IDV8_U7__ACC64_EXIT]] -// CHECK: if.then9.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC64IDV8_U7__ACC64_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC64IDV8_U7__ACC64_EXIT]] -// CHECK: _ZL12set_v32acc64iDv8_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE5_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_THEN9_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i64> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE2_I_I]], <32 x i64> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i64> [[COND_I_I]], <32 x i64> [[COND9_I_I]] +// CHECK-NEXT: ret <32 x i64> [[COND15_I_I]] // v32acc64 test_set_v32acc64 (int idx, v8acc64 b) { @@ -5539,18 +4742,12 @@ v32acc64 test_concat (v8acc64 a0, v8acc64 a1, v8acc64 a2, v8acc64 a3) // CHECK-LABEL: define dso_local inreg noundef <16 x i64> @_Z21test_extract_v16acc64Dv32_u7__acc64i( // CHECK-SAME: <32 x i64> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16ACC64DV32_U7__ACC64I_EXIT:%.*]] -// CHECK: if.else.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16ACC64DV32_U7__ACC64I_EXIT]] -// CHECK: _ZL16extract_v16acc64Dv32_u7__acc64i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <16 x i64> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <16 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i64> [[SHUFFLE_I_I]], <16 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <16 x i64> [[COND_I_I]] // v16acc64 test_extract_v16acc64 (v32acc64 a, int idx) { @@ -5561,18 +4758,12 @@ v16acc64 test_extract_v16acc64 (v32acc64 a, int idx) // CHECK-SAME: <32 x i64> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <16 x i64> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[B]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC64IDV16_U7__ACC64_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC64IDV16_U7__ACC64_EXIT]] -// CHECK: _ZL6insertDv32_u7__acc64iDv16_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: ret <32 x i64> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[A]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i64> [[SHUFFLE2_I_I]] +// CHECK-NEXT: ret <32 x i64> [[COND_I_I]] // v32acc64 test_insert (v32acc64 a, int idx, v16acc64 b) { @@ -5582,18 +4773,12 @@ v32acc64 test_insert (v32acc64 a, int idx, v16acc64 b) // CHECK-LABEL: define dso_local inreg noundef <32 x i64> @_Z17test_set_v32acc64iDv16_u7__acc64( // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i64> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[B]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC64IDV16_U7__ACC64_EXIT:%.*]] -// CHECK: if.else.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i64> [[B]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC64IDV16_U7__ACC64_EXIT]] -// CHECK: _ZL12set_v32acc64iDv16_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i64> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[B]], <16 x i64> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <32 x i64> [[COND_I_I]] // v32acc64 test_set_v32acc64 (int idx, v16acc64 b) { @@ -5618,28 +4803,10 @@ v32acc64 test_concat (v16acc64 a0, v16acc64 a1) // CHECK-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT4DV64_DU8_I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT4DV64_DU8_I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT4DV64_DU8_I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT4DV64_DU8_I_EXIT]] -// CHECK: _ZL16extract_v32uint4Dv64_DU8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> -// CHECK-NEXT: ret <16 x i8> [[TMP1]] +// CHECK-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <16 x i8> +// CHECK-NEXT: ret <16 x i8> [[TMP2]] // v32uint4 test_extract_v32uint4 ( v128uint4 a, int idx ) { @@ -5651,28 +4818,10 @@ v32uint4 test_extract_v32uint4 ( v128uint4 a, int idx ) // CHECK-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT4DV64_DB8_I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT4DV64_DB8_I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT4DV64_DB8_I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT4DV64_DB8_I_EXIT]] -// CHECK: _ZL15extract_v32int4Dv64_DB8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> -// CHECK-NEXT: ret <16 x i8> [[TMP1]] +// CHECK-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <16 x i8> +// CHECK-NEXT: ret <16 x i8> [[TMP2]] // v32int4 test_extract_v32int4 ( v128int4 a, int idx ) { @@ -5684,28 +4833,10 @@ v32int4 test_extract_v32int4 ( v128int4 a, int idx ) // CHECK-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16UINT8DV64_HI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16UINT8DV64_HI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16UINT8DV64_HI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16UINT8DV64_HI_EXIT]] -// CHECK: _ZL16extract_v16uint8Dv64_hi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> -// CHECK-NEXT: ret <16 x i8> [[TMP1]] +// CHECK-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <16 x i8> +// CHECK-NEXT: ret <16 x i8> [[TMP2]] // v16uint8 test_extract_v16uint8 ( v64uint8 a, int idx ) { @@ -5717,28 +4848,10 @@ v16uint8 test_extract_v16uint8 ( v64uint8 a, int idx ) // CHECK-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V16INT8DV64_AI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V16INT8DV64_AI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V16INT8DV64_AI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V16INT8DV64_AI_EXIT]] -// CHECK: _ZL15extract_v16int8Dv64_ai.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> -// CHECK-NEXT: ret <16 x i8> [[TMP1]] +// CHECK-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <16 x i8> +// CHECK-NEXT: ret <16 x i8> [[TMP2]] // v16int8 test_extract_v16int8 ( v64int8 a, int idx ) { @@ -5749,29 +4862,11 @@ v16int8 test_extract_v16int8 ( v64int8 a, int idx ) // CHECK-LABEL: define dso_local noundef <8 x i16> @_Z21test_extract_v8uint16Dv32_ti( // CHECK-SAME: <32 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT16DV32_TI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT16DV32_TI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT16DV32_TI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT16DV32_TI_EXIT]] -// CHECK: _ZL16extract_v8uint16Dv32_ti.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <8 x i16> -// CHECK-NEXT: ret <8 x i16> [[TMP1]] +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> +// CHECK-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <8 x i16> +// CHECK-NEXT: ret <8 x i16> [[TMP2]] // v8uint16 test_extract_v8uint16 ( v32uint16 a, int idx ) { @@ -5783,28 +4878,10 @@ v8uint16 test_extract_v8uint16 ( v32uint16 a, int idx ) // CHECK-SAME: <32 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT16DV32_SI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT16DV32_SI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT16DV32_SI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT16DV32_SI_EXIT]] -// CHECK: _ZL15extract_v8int16Dv32_si.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <8 x i16> -// CHECK-NEXT: ret <8 x i16> [[TMP1]] +// CHECK-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <8 x i16> +// CHECK-NEXT: ret <8 x i16> [[TMP2]] // v8int16 test_extract_v8int16 ( v32int16 a, int idx ) { @@ -5815,27 +4892,9 @@ v8int16 test_extract_v8int16 ( v32int16 a, int idx ) // CHECK-LABEL: define dso_local noundef <4 x i32> @_Z21test_extract_v4uint32Dv16_ji( // CHECK-SAME: <16 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V4UINT32DV16_JI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V4UINT32DV16_JI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V4UINT32DV16_JI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V4UINT32DV16_JI_EXIT]] -// CHECK: _ZL16extract_v4uint32Dv16_ji.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <4 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[TMP0:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[A]], i32 [[IDX]]) +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> +// CHECK-NEXT: ret <4 x i32> [[SHUFFLE_I_I]] // v4uint32 test_extract_v4uint32 ( v16uint32 a, int idx ) { @@ -5846,27 +4905,9 @@ v4uint32 test_extract_v4uint32 ( v16uint32 a, int idx ) // CHECK-LABEL: define dso_local noundef <4 x i32> @_Z20test_extract_v4int32Dv16_ii( // CHECK-SAME: <16 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4INT32DV16_II_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4INT32DV16_II_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4INT32DV16_II_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4INT32DV16_II_EXIT]] -// CHECK: _ZL15extract_v4int32Dv16_ii.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <4 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[TMP0:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[A]], i32 [[IDX]]) +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> +// CHECK-NEXT: ret <4 x i32> [[SHUFFLE_I_I]] // v4int32 test_extract_v4int32 ( v16int32 a, int idx ) { @@ -5878,28 +4919,10 @@ v4int32 test_extract_v4int32 ( v16int32 a, int idx ) // CHECK-SAME: <32 x bfloat> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x bfloat> [[A]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8BFLOAT16DV32_8BFLOAT16I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8BFLOAT16DV32_8BFLOAT16I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8BFLOAT16DV32_8BFLOAT16I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8BFLOAT16DV32_8BFLOAT16I_EXIT]] -// CHECK: _ZL18extract_v8bfloat16Dv32_8bfloat16i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <8 x bfloat> -// CHECK-NEXT: ret <8 x bfloat> [[TMP1]] +// CHECK-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <8 x bfloat> +// CHECK-NEXT: ret <8 x bfloat> [[TMP2]] // v8bfloat16 test_extract_v8bfloat16 ( v32bfloat16 a, int idx ) { @@ -5911,28 +4934,10 @@ v8bfloat16 test_extract_v8bfloat16 ( v32bfloat16 a, int idx ) // CHECK-SAME: <16 x float> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[A]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4FLOATDV16_FI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4FLOATDV16_FI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4FLOATDV16_FI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4FLOATDV16_FI_EXIT]] -// CHECK: _ZL15extract_v4floatDv16_fi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <4 x float> -// CHECK-NEXT: ret <4 x float> [[TMP1]] +// CHECK-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[TMP1]] to <16 x float> +// CHECK-NEXT: [[TMP3:%.*]] = shufflevector <16 x float> [[TMP2]], <16 x float> poison, <4 x i32> +// CHECK-NEXT: ret <4 x float> [[TMP3]] // v4float test_extract_v4float ( v16float a, int idx ) { @@ -6313,15 +5318,9 @@ v16float test_set_v16float ( int idx, v4float a ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[A]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT4DV32_DU8_I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT4DV32_DU8_I_EXIT]] -// CHECK: _ZL16extract_v32uint4Dv32_DU8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> // CHECK-NEXT: ret <16 x i8> [[TMP2]] // @@ -6336,15 +5335,9 @@ v32uint4 test_extract_v32uint4 ( v64uint4 a, int idx ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[A]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT4DV32_DB8_I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT4DV32_DB8_I_EXIT]] -// CHECK: _ZL15extract_v32int4Dv32_DB8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> // CHECK-NEXT: ret <16 x i8> [[TMP2]] // @@ -6359,15 +5352,9 @@ v32int4 test_extract_v32int4 ( v64int4 a, int idx ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[A]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16UINT8DV32_HI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16UINT8DV32_HI_EXIT]] -// CHECK: _ZL16extract_v16uint8Dv32_hi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> // CHECK-NEXT: ret <16 x i8> [[TMP2]] // @@ -6382,15 +5369,9 @@ v16uint8 test_extract_v16uint8 ( v32uint8 a, int idx ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[A]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V16INT8DV32_AI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V16INT8DV32_AI_EXIT]] -// CHECK: _ZL15extract_v16int8Dv32_ai.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> // CHECK-NEXT: ret <16 x i8> [[TMP2]] // @@ -6405,15 +5386,9 @@ v16int8 test_extract_v16int8 ( v32int8 a, int idx ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i16> [[A]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT16DV16_TI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT16DV16_TI_EXIT]] -// CHECK: _ZL16extract_v8uint16Dv16_ti.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <8 x i16> // CHECK-NEXT: ret <8 x i16> [[TMP2]] // @@ -6428,15 +5403,9 @@ v8uint16 test_extract_v8uint16 ( v16uint16 a, int idx ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i16> [[A]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT16DV16_SI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT16DV16_SI_EXIT]] -// CHECK: _ZL15extract_v8int16Dv16_si.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <8 x i16> // CHECK-NEXT: ret <8 x i16> [[TMP2]] // @@ -6450,15 +5419,9 @@ v8int16 test_extract_v8int16 ( v16int16 a, int idx ) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V4UINT32DV8_JI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V4UINT32DV8_JI_EXIT]] -// CHECK: _ZL16extract_v4uint32Dv8_ji.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: ret <4 x i32> [[RETVAL_0_I_I]] // v4uint32 test_extract_v4uint32 ( v8uint32 a, int idx ) @@ -6471,15 +5434,9 @@ v4uint32 test_extract_v4uint32 ( v8uint32 a, int idx ) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4INT32DV8_II_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4INT32DV8_II_EXIT]] -// CHECK: _ZL15extract_v4int32Dv8_ii.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: ret <4 x i32> [[RETVAL_0_I_I]] // v4int32 test_extract_v4int32 ( v8int32 a, int idx ) @@ -6493,15 +5450,9 @@ v4int32 test_extract_v4int32 ( v8int32 a, int idx ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x bfloat> [[A]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8BFLOAT16DV16_8BFLOAT16I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8BFLOAT16DV16_8BFLOAT16I_EXIT]] -// CHECK: _ZL18extract_v8bfloat16Dv16_8bfloat16i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <8 x bfloat> // CHECK-NEXT: ret <8 x bfloat> [[TMP2]] // @@ -6516,15 +5467,9 @@ v8bfloat16 test_extract_v8bfloat16 ( v16bfloat16 a, int idx ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x float> [[A]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4FLOATDV8_FI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4FLOATDV8_FI_EXIT]] -// CHECK: _ZL15extract_v4floatDv8_fi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <4 x float> // CHECK-NEXT: ret <4 x float> [[TMP2]] // @@ -6540,15 +5485,9 @@ v4float test_extract_v4float ( v8float a, int idx ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[A]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64UINT4IDV16_DU8__EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64UINT4IDV16_DU8__EXIT]] -// CHECK: _ZL12set_v64uint4iDv16_DU8_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP2]] // @@ -6562,15 +5501,9 @@ v64uint4 test_set_v64uint4 (int idx, v32uint4 a ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[A]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V64INT4IDV16_DB8__EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V64INT4IDV16_DB8__EXIT]] -// CHECK: _ZL11set_v64int4iDv16_DB8_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP2]] // @@ -6584,15 +5517,9 @@ v64int4 test_set_v64int4 (int idx, v32int4 a ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[A]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32UINT8IDV16_H_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32UINT8IDV16_H_EXIT]] -// CHECK: _ZL12set_v32uint8iDv16_h.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP2]] // @@ -6606,15 +5533,9 @@ v32uint8 test_set_v32uint8 (int idx, v16uint8 a ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[A]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V32INT8IDV16_A_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V32INT8IDV16_A_EXIT]] -// CHECK: _ZL11set_v32int8iDv16_a.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP2]] // @@ -6628,15 +5549,9 @@ v32int8 test_set_v32int8 (int idx, v16int8 a ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[A]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V16UINT16IDV8_T_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V16UINT16IDV8_T_EXIT]] -// CHECK: _ZL13set_v16uint16iDv8_t.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x i16> // CHECK-NEXT: ret <16 x i16> [[TMP2]] // @@ -6650,15 +5565,9 @@ v16uint16 test_set_v16uint16 (int idx, v8uint16 a ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[A]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16INT16IDV8_S_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16INT16IDV8_S_EXIT]] -// CHECK: _ZL12set_v16int16iDv8_s.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x i16> // CHECK-NEXT: ret <16 x i16> [[TMP2]] // @@ -6671,15 +5580,9 @@ v16int16 test_set_v16int16 (int idx, v8int16 a ) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V8UINT32IDV4_J_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V8UINT32IDV4_J_EXIT]] -// CHECK: _ZL12set_v8uint32iDv4_j.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I]] // v8uint32 test_set_v8uint32 (int idx, v4uint32 a ) @@ -6691,15 +5594,9 @@ v8uint32 test_set_v8uint32 (int idx, v4uint32 a ) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V8INT32IDV4_I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V8INT32IDV4_I_EXIT]] -// CHECK: _ZL11set_v8int32iDv4_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I]] // v8int32 test_set_v8int32 (int idx, v4int32 a ) @@ -6712,15 +5609,9 @@ v8int32 test_set_v8int32 (int idx, v4int32 a ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x bfloat> [[A]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V16BFLOAT16IDV8_8BFLOAT16_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V16BFLOAT16IDV8_8BFLOAT16_EXIT]] -// CHECK: _ZL15set_v16bfloat16iDv8_8bfloat16.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x bfloat> // CHECK-NEXT: ret <16 x bfloat> [[TMP2]] // @@ -6734,15 +5625,9 @@ v16bfloat16 test_set_v16bfloat16 (int idx, v8bfloat16 a ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x float> [[A]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V8FLOATIDV4_F_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V8FLOATIDV4_F_EXIT]] -// CHECK: _ZL11set_v8floatiDv4_f.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <8 x float> // CHECK-NEXT: ret <8 x float> [[TMP2]] // @@ -7095,15 +5980,9 @@ v16float test_insert (v16float v, int idx, v4float b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_DU8_IDV16_S__EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_DU8_IDV16_S__EXIT]] -// CHECK: _ZL6insertDv32_DU8_iDv16_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP3]] // @@ -7119,15 +5998,9 @@ v64uint4 test_insert (v64uint4 a, int idx, v32uint4 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_DB8_IDV16_S__EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_DB8_IDV16_S__EXIT]] -// CHECK: _ZL6insertDv32_DB8_iDv16_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP3]] // @@ -7143,15 +6016,9 @@ v64int4 test_insert (v64int4 a, int idx, v32int4 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_HIDV16_H_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_HIDV16_H_EXIT]] -// CHECK: _ZL6insertDv32_hiDv16_h.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP3]] // @@ -7167,15 +6034,9 @@ v32uint8 test_insert (v32uint8 a, int idx, v16uint8 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_AIDV16_A_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_AIDV16_A_EXIT]] -// CHECK: _ZL6insertDv32_aiDv16_a.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP3]] // @@ -7191,15 +6052,9 @@ v32int8 test_insert (v32int8 a, int idx, v16int8 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_TIDV8_T_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_TIDV8_T_EXIT]] -// CHECK: _ZL6insertDv16_tiDv8_t.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x i16> // CHECK-NEXT: ret <16 x i16> [[TMP3]] // @@ -7215,15 +6070,9 @@ v16uint16 test_insert (v16uint16 a, int idx, v8uint16 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_SIDV8_S_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_SIDV8_S_EXIT]] -// CHECK: _ZL6insertDv16_siDv8_s.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x i16> // CHECK-NEXT: ret <16 x i16> [[TMP3]] // @@ -7237,15 +6086,9 @@ v16int16 test_insert (v16int16 a, int idx, v8int16 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[A]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV8_JIDV4_J_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV8_JIDV4_J_EXIT]] -// CHECK: _ZL6insertDv8_jiDv4_j.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I]] // v8uint32 test_insert (v8uint32 a, int idx, v4uint32 b ) @@ -7258,15 +6101,9 @@ v8uint32 test_insert (v8uint32 a, int idx, v4uint32 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[A]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV8_IIDV4_I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV8_IIDV4_I_EXIT]] -// CHECK: _ZL6insertDv8_iiDv4_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I]] // v8int32 test_insert (v8int32 a, int idx, v4int32 b ) @@ -7281,15 +6118,9 @@ v8int32 test_insert (v8int32 a, int idx, v4int32 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_8BFLOAT16IDV8_S__EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_8BFLOAT16IDV8_S__EXIT]] -// CHECK: _ZL6insertDv16_8bfloat16iDv8_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x bfloat> // CHECK-NEXT: ret <16 x bfloat> [[TMP3]] // @@ -7305,15 +6136,9 @@ v16bfloat16 test_insert (v16bfloat16 a, int idx, v8bfloat16 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV8_FIDV4_F_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV8_FIDV4_F_EXIT]] -// CHECK: _ZL6insertDv8_fiDv4_f.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <8 x float> // CHECK-NEXT: ret <8 x float> [[TMP3]] // @@ -7608,19 +6433,13 @@ v8float test_concat (v4float v0, v4float v1 ) // CHECK-SAME: <16 x float> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_ELSE_I_I_I:%.*]] -// CHECK: if.then.i.i.i: // CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8ACCFLOATDV16_U10__ACCFLOATI_EXIT:%.*]] -// CHECK: if.else.i.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8ACCFLOATDV16_U10__ACCFLOATI_EXIT]] -// CHECK: _ZL18extract_v8accfloatDv16_u10__accfloati.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE1_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I_I]] to <8 x float> -// CHECK-NEXT: ret <8 x float> [[TMP2]] +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE_I_I_I]], <8 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I_I]] to <8 x float> +// CHECK-NEXT: ret <8 x float> [[TMP1]] // v8accfloat test_extract_v8accfloat (v16accfloat a, int idx) { @@ -7632,20 +6451,14 @@ v8accfloat test_extract_v8accfloat (v16accfloat a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x float> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_END_I_I_I:%.*]] -// CHECK: if.then.i.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U10__ACCFLOATIDV8_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.end.i.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U10__ACCFLOATIDV8_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL6insertDv16_u10__accfloatiDv8_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE2_I_I_I]], [[IF_END_I_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I_I]] to <16 x float> -// CHECK-NEXT: ret <16 x float> [[TMP3]] +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <16 x i32> [[SHUFFLE1_I_I_I]], <16 x i32> [[SHUFFLE2_I_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I_I]] to <16 x float> +// CHECK-NEXT: ret <16 x float> [[TMP2]] // v16accfloat test_insert (v16accfloat a, int idx, v8accfloat b) { @@ -7656,19 +6469,13 @@ v16accfloat test_insert (v16accfloat a, int idx, v8accfloat b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x float> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x float> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_ELSE_I_I_I:%.*]] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V16ACCFLOATIDV8_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V16ACCFLOATIDV8_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL15set_v16accfloatiDv8_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE1_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I_I]] to <16 x float> -// CHECK-NEXT: ret <16 x float> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I_I]] to <16 x float> +// CHECK-NEXT: ret <16 x float> [[TMP1]] // v16accfloat test_set_v16accfloat (int idx, v8accfloat b) { @@ -7689,18 +6496,12 @@ v16accfloat test_concat (v8accfloat a, v8accfloat b) // CHECK-LABEL: define dso_local inreg noundef <8 x i32> @_Z20test_extract_v8acc32Dv16_u7__acc32i( // CHECK-SAME: <16 x i32> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_ELSE_I_I_I:%.*]] -// CHECK: if.then.i.i.i: // CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC32DV16_U7__ACC32I_EXIT:%.*]] -// CHECK: if.else.i.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC32DV16_U7__ACC32I_EXIT]] -// CHECK: _ZL15extract_v8acc32Dv16_u7__acc32i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE1_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I_I]] +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE_I_I_I]], <8 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: ret <8 x i32> [[COND_I_I_I]] // v8acc32 test_extract_v8acc32 (v16acc32 a, int idx) { @@ -7710,19 +6511,13 @@ v8acc32 test_extract_v8acc32 (v16acc32 a, int idx) // CHECK-LABEL: define dso_local inreg noundef <16 x i32> @_Z11test_insertDv16_u7__acc32iDv8_u7__acc32( // CHECK-SAME: <16 x i32> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <8 x i32> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_END_I_I_I:%.*]] -// CHECK: if.then.i.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> [[A]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U7__ACC32IDV8_U7__ACC32_EXIT:%.*]] -// CHECK: if.end.i.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U7__ACC32IDV8_U7__ACC32_EXIT]] -// CHECK: _ZL6insertDv16_u7__acc32iDv8_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE2_I_I_I]], [[IF_END_I_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I_I]] +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <16 x i32> [[SHUFFLE1_I_I_I]], <16 x i32> [[SHUFFLE2_I_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I_I]] // v16acc32 test_insert (v16acc32 a, int idx, v8acc32 b) { @@ -7732,18 +6527,12 @@ v16acc32 test_insert (v16acc32 a, int idx, v8acc32 b) // CHECK-LABEL: define dso_local inreg noundef <16 x i32> @_Z17test_set_v16acc32iDv8_u7__acc32( // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x i32> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_ELSE_I_I_I:%.*]] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16ACC32IDV8_U7__ACC32_EXIT:%.*]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16ACC32IDV8_U7__ACC32_EXIT]] -// CHECK: _ZL12set_v16acc32iDv8_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE1_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I_I]] +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I_I]] // v16acc32 test_set_v16acc32 (int idx, v8acc32 b) { @@ -7765,19 +6554,13 @@ v16acc32 test_concat (v8acc32 a, v8acc32 b) // CHECK-SAME: <8 x i64> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i64> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_ELSE_I_I_I:%.*]] -// CHECK: if.then.i.i.i: // CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4ACC64DV8_U7__ACC64I_EXIT:%.*]] -// CHECK: if.else.i.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4ACC64DV8_U7__ACC64I_EXIT]] -// CHECK: _ZL15extract_v4acc64Dv8_u7__acc64i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE1_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I_I]] to <4 x i64> -// CHECK-NEXT: ret <4 x i64> [[TMP2]] +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE_I_I_I]], <8 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I_I]] to <4 x i64> +// CHECK-NEXT: ret <4 x i64> [[TMP1]] // v4acc64 test_extract_v4acc64 (v8acc64 a, int idx) { @@ -7789,20 +6572,14 @@ v4acc64 test_extract_v4acc64 (v8acc64 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i64> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i64> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_END_I_I_I:%.*]] -// CHECK: if.then.i.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV8_U7__ACC64IDV4_U7__ACC64_EXIT:%.*]] -// CHECK: if.end.i.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV8_U7__ACC64IDV4_U7__ACC64_EXIT]] -// CHECK: _ZL6insertDv8_u7__acc64iDv4_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE2_I_I_I]], [[IF_END_I_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I_I]] to <8 x i64> -// CHECK-NEXT: ret <8 x i64> [[TMP3]] +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <16 x i32> [[SHUFFLE1_I_I_I]], <16 x i32> [[SHUFFLE2_I_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I_I]] to <8 x i64> +// CHECK-NEXT: ret <8 x i64> [[TMP2]] // v8acc64 test_insert (v8acc64 a, int idx, v4acc64 b) { @@ -7813,19 +6590,13 @@ v8acc64 test_insert (v8acc64 a, int idx, v4acc64 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <4 x i64> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i64> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_ELSE_I_I_I:%.*]] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V8ACC64IDV4_U7__ACC64_EXIT:%.*]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V8ACC64IDV4_U7__ACC64_EXIT]] -// CHECK: _ZL11set_v8acc64iDv4_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE1_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I_I]] to <8 x i64> -// CHECK-NEXT: ret <8 x i64> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I_I]] to <8 x i64> +// CHECK-NEXT: ret <8 x i64> [[TMP1]] // v8acc64 test_set_v8acc64 (int idx, v4acc64 b) { @@ -7847,27 +6618,18 @@ v8acc64 test_concat (v4acc64 a, v4acc64 b) // CHECK-SAME: <32 x float> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: // CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8ACCFLOATDV32_U10__ACCFLOATI_EXIT:%.*]] -// CHECK: if.then3.i.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8ACCFLOATDV32_U10__ACCFLOATI_EXIT]] -// CHECK: if.then8.i.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8ACCFLOATDV32_U10__ACCFLOATI_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8ACCFLOATDV32_U10__ACCFLOATI_EXIT]] -// CHECK: _ZL18extract_v8accfloatDv32_u10__accfloati.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE4_I_I_I]], [[IF_THEN3_I_I_I]] ], [ [[SHUFFLE9_I_I_I]], [[IF_THEN8_I_I_I]] ], [ [[SHUFFLE10_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I_I]] to <8 x float> +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE_I_I_I]], <8 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[COND9_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE2_I_I_I]], <8 x i32> [[SHUFFLE3_I_I_I]] +// CHECK-NEXT: [[AND10_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I_I:%.*]] = icmp eq i32 [[AND10_I_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I_I]], <8 x i32> [[COND_I_I_I]], <8 x i32> [[COND9_I_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I_I]] to <8 x float> // CHECK-NEXT: ret <8 x float> [[TMP1]] // v8accfloat test_extract_v8accfloat (v32accfloat a, int idx) @@ -7880,29 +6642,22 @@ v8accfloat test_extract_v8accfloat (v32accfloat a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x float> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U10__ACCFLOATIDV8_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.then5.i.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U10__ACCFLOATIDV8_U10__ACCFLOAT_EXIT]] -// CHECK: if.then10.i.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U10__ACCFLOATIDV8_U10__ACCFLOAT_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U10__ACCFLOATIDV8_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL6insertDv32_u10__accfloatiDv8_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE6_I_I_I]], [[IF_THEN5_I_I_I]] ], [ [[SHUFFLE11_I_I_I]], [[IF_THEN10_I_I_I]] ], [ [[SHUFFLE12_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I_I]] to <32 x float> +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE4_I_I_I]], <32 x i32> [[SHUFFLE5_I_I_I]] +// CHECK-NEXT: [[COND13_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE6_I_I_I]], <32 x i32> [[SHUFFLE7_I_I_I]] +// CHECK-NEXT: [[AND14_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I_I:%.*]] = icmp eq i32 [[AND14_I_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I_I]], <32 x i32> [[COND_I_I_I]], <32 x i32> [[COND13_I_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I_I]] to <32 x float> // CHECK-NEXT: ret <32 x float> [[TMP2]] // v32accfloat test_insert (v32accfloat a, int idx, v8accfloat b) @@ -7914,31 +6669,18 @@ v32accfloat test_insert (v32accfloat a, int idx, v8accfloat b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x float> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x float> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V32ACCFLOATIDV8_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.then4.i.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V32ACCFLOATIDV8_U10__ACCFLOAT_EXIT]] -// CHECK: if.then10.i.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V32ACCFLOATIDV8_U10__ACCFLOAT_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V32ACCFLOATIDV8_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL15set_v32accfloatiDv8_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE6_I_I_I]], [[IF_THEN4_I_I_I]] ], [ [[SHUFFLE12_I_I_I]], [[IF_THEN10_I_I_I]] ], [ [[SHUFFLE14_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I_I]] to <32 x float> +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE_I_I_I]], <32 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[COND9_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE2_I_I_I]], <32 x i32> [[SHUFFLE3_I_I_I]] +// CHECK-NEXT: [[AND10_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I_I:%.*]] = icmp eq i32 [[AND10_I_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I_I]], <32 x i32> [[COND_I_I_I]], <32 x i32> [[COND9_I_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I_I]] to <32 x float> // CHECK-NEXT: ret <32 x float> [[TMP1]] // v32accfloat test_set_v32accfloat (int idx, v8accfloat b) @@ -7962,27 +6704,18 @@ v32accfloat test_concat (v8accfloat a, v8accfloat b, v8accfloat c, v8accfloat d) // CHECK-LABEL: define dso_local inreg noundef <8 x i32> @_Z20test_extract_v8acc32Dv32_u7__acc32i( // CHECK-SAME: <32 x i32> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: // CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC32DV32_U7__ACC32I_EXIT:%.*]] -// CHECK: if.then3.i.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC32DV32_U7__ACC32I_EXIT]] -// CHECK: if.then8.i.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC32DV32_U7__ACC32I_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC32DV32_U7__ACC32I_EXIT]] -// CHECK: _ZL15extract_v8acc32Dv32_u7__acc32i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE4_I_I_I]], [[IF_THEN3_I_I_I]] ], [ [[SHUFFLE9_I_I_I]], [[IF_THEN8_I_I_I]] ], [ [[SHUFFLE10_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I_I]] +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE_I_I_I]], <8 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[COND9_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE2_I_I_I]], <8 x i32> [[SHUFFLE3_I_I_I]] +// CHECK-NEXT: [[AND10_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I_I:%.*]] = icmp eq i32 [[AND10_I_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I_I]], <8 x i32> [[COND_I_I_I]], <8 x i32> [[COND9_I_I_I]] +// CHECK-NEXT: ret <8 x i32> [[COND15_I_I_I]] // v8acc32 test_extract_v8acc32 (v32acc32 a, int idx) { @@ -7992,29 +6725,22 @@ v8acc32 test_extract_v8acc32 (v32acc32 a, int idx) // CHECK-LABEL: define dso_local inreg noundef <32 x i32> @_Z11test_insertDv32_u7__acc32iDv8_u7__acc32( // CHECK-SAME: <32 x i32> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <8 x i32> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC32IDV8_U7__ACC32_EXIT:%.*]] -// CHECK: if.then5.i.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC32IDV8_U7__ACC32_EXIT]] -// CHECK: if.then10.i.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC32IDV8_U7__ACC32_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC32IDV8_U7__ACC32_EXIT]] -// CHECK: _ZL6insertDv32_u7__acc32iDv8_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE6_I_I_I]], [[IF_THEN5_I_I_I]] ], [ [[SHUFFLE11_I_I_I]], [[IF_THEN10_I_I_I]] ], [ [[SHUFFLE12_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I_I]] +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE2_I_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE3_I_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I_I]], <32 x i32> [[A]], <32 x i32> +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE4_I_I_I]], <32 x i32> [[SHUFFLE5_I_I_I]] +// CHECK-NEXT: [[COND13_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE6_I_I_I]], <32 x i32> [[SHUFFLE7_I_I_I]] +// CHECK-NEXT: [[AND14_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I_I:%.*]] = icmp eq i32 [[AND14_I_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I_I]], <32 x i32> [[COND_I_I_I]], <32 x i32> [[COND13_I_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND19_I_I_I]] // v32acc32 test_insert (v32acc32 a, int idx, v8acc32 b) { @@ -8024,31 +6750,18 @@ v32acc32 test_insert (v32acc32 a, int idx, v8acc32 b) // CHECK-LABEL: define dso_local inreg noundef <32 x i32> @_Z17test_set_v32acc32iDv8_u7__acc32( // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x i32> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC32IDV8_U7__ACC32_EXIT:%.*]] -// CHECK: if.then4.i.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC32IDV8_U7__ACC32_EXIT]] -// CHECK: if.then10.i.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC32IDV8_U7__ACC32_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC32IDV8_U7__ACC32_EXIT]] -// CHECK: _ZL12set_v32acc32iDv8_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE6_I_I_I]], [[IF_THEN4_I_I_I]] ], [ [[SHUFFLE12_I_I_I]], [[IF_THEN10_I_I_I]] ], [ [[SHUFFLE14_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I_I]] +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE_I_I_I]], <32 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[COND9_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE2_I_I_I]], <32 x i32> [[SHUFFLE3_I_I_I]] +// CHECK-NEXT: [[AND10_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I_I:%.*]] = icmp eq i32 [[AND10_I_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I_I]], <32 x i32> [[COND_I_I_I]], <32 x i32> [[COND9_I_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND15_I_I_I]] // v32acc32 test_set_v32acc32 (int idx, v8acc32 b) { @@ -8072,27 +6785,18 @@ v32acc32 test_concat (v8acc32 a, v8acc32 b, v8acc32 c, v8acc32 d) // CHECK-SAME: <16 x i64> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i64> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: // CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4ACC64DV16_U7__ACC64I_EXIT:%.*]] -// CHECK: if.then3.i.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4ACC64DV16_U7__ACC64I_EXIT]] -// CHECK: if.then8.i.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4ACC64DV16_U7__ACC64I_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4ACC64DV16_U7__ACC64I_EXIT]] -// CHECK: _ZL15extract_v4acc64Dv16_u7__acc64i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE4_I_I_I]], [[IF_THEN3_I_I_I]] ], [ [[SHUFFLE9_I_I_I]], [[IF_THEN8_I_I_I]] ], [ [[SHUFFLE10_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I_I]] to <4 x i64> +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE_I_I_I]], <8 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[COND9_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE2_I_I_I]], <8 x i32> [[SHUFFLE3_I_I_I]] +// CHECK-NEXT: [[AND10_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I_I:%.*]] = icmp eq i32 [[AND10_I_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I_I]], <8 x i32> [[COND_I_I_I]], <8 x i32> [[COND9_I_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I_I]] to <4 x i64> // CHECK-NEXT: ret <4 x i64> [[TMP1]] // v4acc64 test_extract_v4acc64 (v16acc64 a, int idx) @@ -8105,29 +6809,22 @@ v4acc64 test_extract_v4acc64 (v16acc64 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i64> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i64> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U7__ACC64IDV4_U7__ACC64_EXIT:%.*]] -// CHECK: if.then5.i.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U7__ACC64IDV4_U7__ACC64_EXIT]] -// CHECK: if.then10.i.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U7__ACC64IDV4_U7__ACC64_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U7__ACC64IDV4_U7__ACC64_EXIT]] -// CHECK: _ZL6insertDv16_u7__acc64iDv4_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE6_I_I_I]], [[IF_THEN5_I_I_I]] ], [ [[SHUFFLE11_I_I_I]], [[IF_THEN10_I_I_I]] ], [ [[SHUFFLE12_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I_I]] to <16 x i64> +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE4_I_I_I]], <32 x i32> [[SHUFFLE5_I_I_I]] +// CHECK-NEXT: [[COND13_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE6_I_I_I]], <32 x i32> [[SHUFFLE7_I_I_I]] +// CHECK-NEXT: [[AND14_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I_I:%.*]] = icmp eq i32 [[AND14_I_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I_I]], <32 x i32> [[COND_I_I_I]], <32 x i32> [[COND13_I_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I_I]] to <16 x i64> // CHECK-NEXT: ret <16 x i64> [[TMP2]] // v16acc64 test_insert (v16acc64 a, int idx, v4acc64 b) @@ -8139,31 +6836,18 @@ v16acc64 test_insert (v16acc64 a, int idx, v4acc64 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <4 x i64> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i64> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16ACC64IDV4_U7__ACC64_EXIT:%.*]] -// CHECK: if.then4.i.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16ACC64IDV4_U7__ACC64_EXIT]] -// CHECK: if.then10.i.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16ACC64IDV4_U7__ACC64_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16ACC64IDV4_U7__ACC64_EXIT]] -// CHECK: _ZL12set_v16acc64iDv4_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE6_I_I_I]], [[IF_THEN4_I_I_I]] ], [ [[SHUFFLE12_I_I_I]], [[IF_THEN10_I_I_I]] ], [ [[SHUFFLE14_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I_I]] to <16 x i64> +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE_I_I_I]], <32 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[COND9_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE2_I_I_I]], <32 x i32> [[SHUFFLE3_I_I_I]] +// CHECK-NEXT: [[AND10_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I_I:%.*]] = icmp eq i32 [[AND10_I_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I_I]], <32 x i32> [[COND_I_I_I]], <32 x i32> [[COND9_I_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I_I]] to <16 x i64> // CHECK-NEXT: ret <16 x i64> [[TMP1]] // v16acc64 test_set_v16acc64 (int idx, v4acc64 b) @@ -8291,19 +6975,13 @@ int test_extract_exponent(v64bfp16ebs8 v, int idx) {return extract_exponent(v,id // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64BFP16EBS16]] [[V_COERCE]], 0 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[TMP0]] to <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT813V64BFP16EBS16I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT813V64BFP16EBS16I_EXIT]] -// CHECK: _ZL15extract_v32int813v64bfp16ebs16i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> -// CHECK-NEXT: ret <32 x i8> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <32 x i8> +// CHECK-NEXT: ret <32 x i8> [[TMP2]] // v32int8 test_extract_v32int8(v64bfp16ebs16 v, int idx ) {return extract_v32int8(v,idx);} @@ -8312,19 +6990,13 @@ v32int8 test_extract_v32int8(v64bfp16ebs16 v, int idx ) {return extract_v32int8( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64BFP16EBS8]] [[V_COERCE]], 0 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[TMP0]] to <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT812V64BFP16EBS8I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT812V64BFP16EBS8I_EXIT]] -// CHECK: _ZL15extract_v32int812v64bfp16ebs8i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> -// CHECK-NEXT: ret <32 x i8> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <32 x i8> +// CHECK-NEXT: ret <32 x i8> [[TMP2]] // v32int8 test_extract_v32int8(v64bfp16ebs8 v, int idx) {return extract_v32int8(v, idx);} @@ -8375,27 +7047,21 @@ v128bfp16ebs8 test_concat(v64bfp16ebs8 v1, v64bfp16ebs8 v2) {return concat(v1,v2 // CHECK-LABEL: define dso_local %struct.v128bfp16ebs8 @_Z11test_insert13v128bfp16ebs8i12v64bfp16ebs8( // CHECK-SAME: [[STRUCT_V128BFP16EBS8:%.*]] [[V_COERCE:%.*]], i32 noundef [[IDX:%.*]], [[STRUCT_V64BFP16EBS8:%.*]] [[VSUB_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64BFP16EBS8]] [[VSUB_COERCE]], 0 -// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V64BFP16EBS8]] [[VSUB_COERCE]], 1 -// CHECK-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[IDX]], 0 -// CHECK-NEXT: br i1 [[CMP_I]], label [[IF_THEN_I:%.*]], label [[IF_END_I:%.*]] -// CHECK: if.then.i: -// CHECK-NEXT: [[TMP2:%.*]] = extractvalue [[STRUCT_V128BFP16EBS8]] [[V_COERCE]], 3 -// CHECK-NEXT: [[TMP3:%.*]] = extractvalue [[STRUCT_V128BFP16EBS8]] [[V_COERCE]], 1 -// CHECK-NEXT: br label [[_ZL6INSERT13V128BFP16EBS8I12V64BFP16EBS8_EXIT:%.*]] -// CHECK: if.end.i: -// CHECK-NEXT: [[TMP4:%.*]] = extractvalue [[STRUCT_V128BFP16EBS8]] [[V_COERCE]], 2 -// CHECK-NEXT: [[TMP5:%.*]] = extractvalue [[STRUCT_V128BFP16EBS8]] [[V_COERCE]], 0 -// CHECK-NEXT: br label [[_ZL6INSERT13V128BFP16EBS8I12V64BFP16EBS8_EXIT]] -// CHECK: _ZL6insert13v128bfp16ebs8i12v64bfp16ebs8.exit: -// CHECK-NEXT: [[RETVAL_SROA_0_0_I:%.*]] = phi <64 x i8> [ [[TMP0]], [[IF_THEN_I]] ], [ [[TMP5]], [[IF_END_I]] ] -// CHECK-NEXT: [[RETVAL_SROA_3_0_I:%.*]] = phi <64 x i8> [ [[TMP3]], [[IF_THEN_I]] ], [ [[TMP0]], [[IF_END_I]] ] -// CHECK-NEXT: [[RETVAL_SROA_6_0_I:%.*]] = phi <8 x i8> [ [[TMP1]], [[IF_THEN_I]] ], [ [[TMP4]], [[IF_END_I]] ] -// CHECK-NEXT: [[RETVAL_SROA_9_0_I:%.*]] = phi <8 x i8> [ [[TMP2]], [[IF_THEN_I]] ], [ [[TMP1]], [[IF_END_I]] ] -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS8]] poison, <64 x i8> [[RETVAL_SROA_0_0_I]], 0 -// CHECK-NEXT: [[DOTFCA_1_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS8]] [[DOTFCA_0_INSERT_I]], <64 x i8> [[RETVAL_SROA_3_0_I]], 1 -// CHECK-NEXT: [[DOTFCA_2_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS8]] [[DOTFCA_1_INSERT_I]], <8 x i8> [[RETVAL_SROA_6_0_I]], 2 -// CHECK-NEXT: [[DOTFCA_3_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS8]] [[DOTFCA_2_INSERT_I]], <8 x i8> [[RETVAL_SROA_9_0_I]], 3 +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFP16EBS8]] [[V_COERCE]], 1 +// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V64BFP16EBS8]] [[VSUB_COERCE]], 0 +// CHECK-NEXT: [[CMP_NOT_I:%.*]] = icmp eq i32 [[IDX]], 0 +// CHECK-NEXT: [[TMP2:%.*]] = extractvalue [[STRUCT_V128BFP16EBS8]] [[V_COERCE]], 0 +// CHECK-NEXT: [[COND_I:%.*]] = select i1 [[CMP_NOT_I]], <64 x i8> [[TMP1]], <64 x i8> [[TMP2]] +// CHECK-NEXT: [[COND8_I:%.*]] = select i1 [[CMP_NOT_I]], <64 x i8> [[TMP0]], <64 x i8> [[TMP1]] +// CHECK-NEXT: [[TMP3:%.*]] = extractvalue [[STRUCT_V64BFP16EBS8]] [[VSUB_COERCE]], 1 +// CHECK-NEXT: [[TMP4:%.*]] = extractvalue [[STRUCT_V128BFP16EBS8]] [[V_COERCE]], 3 +// CHECK-NEXT: [[TMP5:%.*]] = extractvalue [[STRUCT_V128BFP16EBS8]] [[V_COERCE]], 2 +// CHECK-NEXT: [[COND14_I:%.*]] = select i1 [[CMP_NOT_I]], <8 x i8> [[TMP3]], <8 x i8> [[TMP5]] +// CHECK-NEXT: [[COND21_I:%.*]] = select i1 [[CMP_NOT_I]], <8 x i8> [[TMP4]], <8 x i8> [[TMP3]] +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS8]] poison, <64 x i8> [[COND_I]], 0 +// CHECK-NEXT: [[DOTFCA_1_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS8]] [[DOTFCA_0_INSERT_I]], <64 x i8> [[COND8_I]], 1 +// CHECK-NEXT: [[DOTFCA_2_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS8]] [[DOTFCA_1_INSERT_I]], <8 x i8> [[COND14_I]], 2 +// CHECK-NEXT: [[DOTFCA_3_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS8]] [[DOTFCA_2_INSERT_I]], <8 x i8> [[COND21_I]], 3 // CHECK-NEXT: ret [[STRUCT_V128BFP16EBS8]] [[DOTFCA_3_INSERT_I]] // v128bfp16ebs8 test_insert(v128bfp16ebs8 v , int idx, v64bfp16ebs8 vsub) { return insert(v,idx,vsub);} @@ -8403,17 +7069,12 @@ v128bfp16ebs8 test_insert(v128bfp16ebs8 v , int idx, v64bfp16ebs8 vsub) { return // CHECK-LABEL: define dso_local %struct.v128bfp16ebs8 @_Z22test_set_v128bfp16ebs8i12v64bfp16ebs8( // CHECK-SAME: i32 noundef [[IDX:%.*]], [[STRUCT_V64BFP16EBS8:%.*]] [[VSUB_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64BFP16EBS8]] [[VSUB_COERCE]], 0 -// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V64BFP16EBS8]] [[VSUB_COERCE]], 1 -// CHECK-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[IDX]], 0 -// CHECK-NEXT: [[DOT_I:%.*]] = select i1 [[CMP_I]], <64 x i8> [[TMP0]], <64 x i8> undef -// CHECK-NEXT: [[DOT15_I:%.*]] = select i1 [[CMP_I]], <64 x i8> undef, <64 x i8> [[TMP0]] -// CHECK-NEXT: [[DOT16_I:%.*]] = select i1 [[CMP_I]], <8 x i8> [[TMP1]], <8 x i8> undef -// CHECK-NEXT: [[DOT17_I:%.*]] = select i1 [[CMP_I]], <8 x i8> undef, <8 x i8> [[TMP1]] -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS8:%.*]] poison, <64 x i8> [[DOT_I]], 0 -// CHECK-NEXT: [[DOTFCA_1_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS8]] [[DOTFCA_0_INSERT_I]], <64 x i8> [[DOT15_I]], 1 -// CHECK-NEXT: [[DOTFCA_2_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS8]] [[DOTFCA_1_INSERT_I]], <8 x i8> [[DOT16_I]], 2 -// CHECK-NEXT: [[DOTFCA_3_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS8]] [[DOTFCA_2_INSERT_I]], <8 x i8> [[DOT17_I]], 3 +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64BFP16EBS8]] [[VSUB_COERCE]], 1 +// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V64BFP16EBS8]] [[VSUB_COERCE]], 0 +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS8:%.*]] poison, <64 x i8> [[TMP1]], 0 +// CHECK-NEXT: [[DOTFCA_1_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS8]] [[DOTFCA_0_INSERT_I]], <64 x i8> [[TMP1]], 1 +// CHECK-NEXT: [[DOTFCA_2_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS8]] [[DOTFCA_1_INSERT_I]], <8 x i8> [[TMP0]], 2 +// CHECK-NEXT: [[DOTFCA_3_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS8]] [[DOTFCA_2_INSERT_I]], <8 x i8> [[TMP0]], 3 // CHECK-NEXT: ret [[STRUCT_V128BFP16EBS8]] [[DOTFCA_3_INSERT_I]] // v128bfp16ebs8 test_set_v128bfp16ebs8(int idx, v64bfp16ebs8 vsub) {return set_v128bfp16ebs8(idx, vsub);} @@ -8444,23 +7105,13 @@ v128bfp16ebs8 test_insert(v128bfp16ebs8 v , int idx , int exp ) {return insert(v // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFP16EBS8]] [[V_COERCE]], 2 // CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V128BFP16EBS8]] [[V_COERCE]], 3 -// CHECK-NEXT: switch i32 [[IDX]], label [[IF_END9_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[_ZL16EXTRACT_EXPONENT13V128BFP16EBS8I_EXIT:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN2_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN6_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then2.i: -// CHECK-NEXT: br label [[_ZL16EXTRACT_EXPONENT13V128BFP16EBS8I_EXIT]] -// CHECK: if.then6.i: -// CHECK-NEXT: br label [[_ZL16EXTRACT_EXPONENT13V128BFP16EBS8I_EXIT]] -// CHECK: if.end9.i: -// CHECK-NEXT: br label [[_ZL16EXTRACT_EXPONENT13V128BFP16EBS8I_EXIT]] -// CHECK: _ZL16extract_exponent13v128bfp16ebs8i.exit: -// CHECK-NEXT: [[DOTSINK20_I:%.*]] = phi <8 x i8> [ [[TMP1]], [[IF_END9_I]] ], [ [[TMP1]], [[IF_THEN6_I]] ], [ [[TMP0]], [[IF_THEN2_I]] ], [ [[TMP0]], [[ENTRY:%.*]] ] -// CHECK-NEXT: [[DOTSINK_I:%.*]] = phi i64 [ 1, [[IF_END9_I]] ], [ 0, [[IF_THEN6_I]] ], [ 1, [[IF_THEN2_I]] ], [ 0, [[ENTRY]] ] -// CHECK-NEXT: [[SHUFFLE10_BC_I:%.*]] = bitcast <8 x i8> [[DOTSINK20_I]] to <2 x i32> -// CHECK-NEXT: [[SHUFFLE10_EXTRACT_I:%.*]] = extractelement <2 x i32> [[SHUFFLE10_BC_I]], i64 [[DOTSINK_I]] -// CHECK-NEXT: ret i32 [[SHUFFLE10_EXTRACT_I]] +// CHECK-NEXT: [[AND_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL_NOT_I:%.*]] = icmp eq i32 [[AND_I]], 0 +// CHECK-NEXT: [[COND_I:%.*]] = select i1 [[TOBOOL_NOT_I]], <8 x i8> [[TMP0]], <8 x i8> [[TMP1]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i8> [[COND_I]] to <2 x i32> +// CHECK-NEXT: [[AND1_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x i32> [[TMP2]], i32 [[AND1_I]] +// CHECK-NEXT: ret i32 [[VECEXT_I]] // int test_extract_exponent(v128bfp16ebs8 v, int idx) {return extract_exponent(v,idx);} @@ -8511,27 +7162,21 @@ v128bfp16ebs16 test_concat(v64bfp16ebs16 v1, v64bfp16ebs16 v2) { return concat(v // CHECK-LABEL: define dso_local %struct.v128bfp16ebs16 @_Z11test_insert14v128bfp16ebs16i13v64bfp16ebs16( // CHECK-SAME: [[STRUCT_V128BFP16EBS16:%.*]] [[V_COERCE:%.*]], i32 noundef [[IDX:%.*]], [[STRUCT_V64BFP16EBS16:%.*]] [[VSUB_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64BFP16EBS16]] [[VSUB_COERCE]], 0 -// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V64BFP16EBS16]] [[VSUB_COERCE]], 1 -// CHECK-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[IDX]], 0 -// CHECK-NEXT: br i1 [[CMP_I]], label [[IF_THEN_I:%.*]], label [[IF_END_I:%.*]] -// CHECK: if.then.i: -// CHECK-NEXT: [[TMP2:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 3 -// CHECK-NEXT: [[TMP3:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 1 -// CHECK-NEXT: br label [[_ZL6INSERT14V128BFP16EBS16I13V64BFP16EBS16_EXIT:%.*]] -// CHECK: if.end.i: -// CHECK-NEXT: [[TMP4:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 2 -// CHECK-NEXT: [[TMP5:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 0 -// CHECK-NEXT: br label [[_ZL6INSERT14V128BFP16EBS16I13V64BFP16EBS16_EXIT]] -// CHECK: _ZL6insert14v128bfp16ebs16i13v64bfp16ebs16.exit: -// CHECK-NEXT: [[RETVAL_SROA_0_0_I:%.*]] = phi <64 x i8> [ [[TMP0]], [[IF_THEN_I]] ], [ [[TMP5]], [[IF_END_I]] ] -// CHECK-NEXT: [[RETVAL_SROA_3_0_I:%.*]] = phi <64 x i8> [ [[TMP3]], [[IF_THEN_I]] ], [ [[TMP0]], [[IF_END_I]] ] -// CHECK-NEXT: [[RETVAL_SROA_6_0_I:%.*]] = phi <8 x i8> [ [[TMP1]], [[IF_THEN_I]] ], [ [[TMP4]], [[IF_END_I]] ] -// CHECK-NEXT: [[RETVAL_SROA_9_0_I:%.*]] = phi <8 x i8> [ [[TMP2]], [[IF_THEN_I]] ], [ [[TMP1]], [[IF_END_I]] ] -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] poison, <64 x i8> [[RETVAL_SROA_0_0_I]], 0 -// CHECK-NEXT: [[DOTFCA_1_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_0_INSERT_I]], <64 x i8> [[RETVAL_SROA_3_0_I]], 1 -// CHECK-NEXT: [[DOTFCA_2_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_1_INSERT_I]], <8 x i8> [[RETVAL_SROA_6_0_I]], 2 -// CHECK-NEXT: [[DOTFCA_3_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_2_INSERT_I]], <8 x i8> [[RETVAL_SROA_9_0_I]], 3 +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 1 +// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V64BFP16EBS16]] [[VSUB_COERCE]], 0 +// CHECK-NEXT: [[CMP_NOT_I:%.*]] = icmp eq i32 [[IDX]], 0 +// CHECK-NEXT: [[TMP2:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 0 +// CHECK-NEXT: [[COND_I:%.*]] = select i1 [[CMP_NOT_I]], <64 x i8> [[TMP1]], <64 x i8> [[TMP2]] +// CHECK-NEXT: [[COND8_I:%.*]] = select i1 [[CMP_NOT_I]], <64 x i8> [[TMP0]], <64 x i8> [[TMP1]] +// CHECK-NEXT: [[TMP3:%.*]] = extractvalue [[STRUCT_V64BFP16EBS16]] [[VSUB_COERCE]], 1 +// CHECK-NEXT: [[TMP4:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 3 +// CHECK-NEXT: [[TMP5:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 2 +// CHECK-NEXT: [[COND14_I:%.*]] = select i1 [[CMP_NOT_I]], <8 x i8> [[TMP3]], <8 x i8> [[TMP5]] +// CHECK-NEXT: [[COND21_I:%.*]] = select i1 [[CMP_NOT_I]], <8 x i8> [[TMP4]], <8 x i8> [[TMP3]] +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] poison, <64 x i8> [[COND_I]], 0 +// CHECK-NEXT: [[DOTFCA_1_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_0_INSERT_I]], <64 x i8> [[COND8_I]], 1 +// CHECK-NEXT: [[DOTFCA_2_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_1_INSERT_I]], <8 x i8> [[COND14_I]], 2 +// CHECK-NEXT: [[DOTFCA_3_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_2_INSERT_I]], <8 x i8> [[COND21_I]], 3 // CHECK-NEXT: ret [[STRUCT_V128BFP16EBS16]] [[DOTFCA_3_INSERT_I]] // v128bfp16ebs16 test_insert(v128bfp16ebs16 v, int idx, v64bfp16ebs16 vsub) {return insert(v,idx,vsub);} @@ -8539,17 +7184,12 @@ v128bfp16ebs16 test_insert(v128bfp16ebs16 v, int idx, v64bfp16ebs16 vsub) {retur // CHECK-LABEL: define dso_local %struct.v128bfp16ebs16 @_Z23test_set_v128bfp16ebs16i13v64bfp16ebs16( // CHECK-SAME: i32 noundef [[IDX:%.*]], [[STRUCT_V64BFP16EBS16:%.*]] [[VSUB_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64BFP16EBS16]] [[VSUB_COERCE]], 0 -// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V64BFP16EBS16]] [[VSUB_COERCE]], 1 -// CHECK-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[IDX]], 0 -// CHECK-NEXT: [[DOT_I:%.*]] = select i1 [[CMP_I]], <64 x i8> [[TMP0]], <64 x i8> undef -// CHECK-NEXT: [[DOT15_I:%.*]] = select i1 [[CMP_I]], <64 x i8> undef, <64 x i8> [[TMP0]] -// CHECK-NEXT: [[DOT16_I:%.*]] = select i1 [[CMP_I]], <8 x i8> [[TMP1]], <8 x i8> undef -// CHECK-NEXT: [[DOT17_I:%.*]] = select i1 [[CMP_I]], <8 x i8> undef, <8 x i8> [[TMP1]] -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16:%.*]] poison, <64 x i8> [[DOT_I]], 0 -// CHECK-NEXT: [[DOTFCA_1_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_0_INSERT_I]], <64 x i8> [[DOT15_I]], 1 -// CHECK-NEXT: [[DOTFCA_2_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_1_INSERT_I]], <8 x i8> [[DOT16_I]], 2 -// CHECK-NEXT: [[DOTFCA_3_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_2_INSERT_I]], <8 x i8> [[DOT17_I]], 3 +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64BFP16EBS16]] [[VSUB_COERCE]], 1 +// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V64BFP16EBS16]] [[VSUB_COERCE]], 0 +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16:%.*]] poison, <64 x i8> [[TMP1]], 0 +// CHECK-NEXT: [[DOTFCA_1_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_0_INSERT_I]], <64 x i8> [[TMP1]], 1 +// CHECK-NEXT: [[DOTFCA_2_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_1_INSERT_I]], <8 x i8> [[TMP0]], 2 +// CHECK-NEXT: [[DOTFCA_3_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_2_INSERT_I]], <8 x i8> [[TMP0]], 3 // CHECK-NEXT: ret [[STRUCT_V128BFP16EBS16]] [[DOTFCA_3_INSERT_I]] // v128bfp16ebs16 test_set_v128bfp16ebs16(int idx, v64bfp16ebs16 vsub) {return set_v128bfp16ebs16(idx, vsub);} @@ -8580,23 +7220,13 @@ v128bfp16ebs16 test_insert(v128bfp16ebs16 v , int idx, int exp) {return insert(v // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 2 // CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 3 -// CHECK-NEXT: switch i32 [[IDX]], label [[IF_END9_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[_ZL16EXTRACT_EXPONENT14V128BFP16EBS16I_EXIT:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN2_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN6_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then2.i: -// CHECK-NEXT: br label [[_ZL16EXTRACT_EXPONENT14V128BFP16EBS16I_EXIT]] -// CHECK: if.then6.i: -// CHECK-NEXT: br label [[_ZL16EXTRACT_EXPONENT14V128BFP16EBS16I_EXIT]] -// CHECK: if.end9.i: -// CHECK-NEXT: br label [[_ZL16EXTRACT_EXPONENT14V128BFP16EBS16I_EXIT]] -// CHECK: _ZL16extract_exponent14v128bfp16ebs16i.exit: -// CHECK-NEXT: [[DOTSINK20_I:%.*]] = phi <8 x i8> [ [[TMP1]], [[IF_END9_I]] ], [ [[TMP1]], [[IF_THEN6_I]] ], [ [[TMP0]], [[IF_THEN2_I]] ], [ [[TMP0]], [[ENTRY:%.*]] ] -// CHECK-NEXT: [[DOTSINK_I:%.*]] = phi i64 [ 1, [[IF_END9_I]] ], [ 0, [[IF_THEN6_I]] ], [ 1, [[IF_THEN2_I]] ], [ 0, [[ENTRY]] ] -// CHECK-NEXT: [[SHUFFLE10_BC_I:%.*]] = bitcast <8 x i8> [[DOTSINK20_I]] to <2 x i32> -// CHECK-NEXT: [[SHUFFLE10_EXTRACT_I:%.*]] = extractelement <2 x i32> [[SHUFFLE10_BC_I]], i64 [[DOTSINK_I]] -// CHECK-NEXT: ret i32 [[SHUFFLE10_EXTRACT_I]] +// CHECK-NEXT: [[AND_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL_NOT_I:%.*]] = icmp eq i32 [[AND_I]], 0 +// CHECK-NEXT: [[COND_I:%.*]] = select i1 [[TOBOOL_NOT_I]], <8 x i8> [[TMP0]], <8 x i8> [[TMP1]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i8> [[COND_I]] to <2 x i32> +// CHECK-NEXT: [[AND1_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x i32> [[TMP2]], i32 [[AND1_I]] +// CHECK-NEXT: ret i32 [[VECEXT_I]] // int test_extract_exponent(v128bfp16ebs16 v, int idx) {return extract_exponent(v,idx);} @@ -8636,3 +7266,162 @@ v64bfp16ebs16 test_extract_v64bfp16ebs16(v128bfp16ebs16 m, int idx) { v64bfp16ebs8 test_extract_v64bfp16ebs8(v128bfp16ebs8 m, int idx) { return extract_v64bfp16ebs8(m, idx); } + +// Constant-idx companions for the bfp16ebs* helpers — verify each +// folds to a single op (rewritten extract_exponent included). +// CHECK-LABEL: define dso_local noundef <32 x i8> @_Z25test_extract_v32int8_idx013v64bfp16ebs16( +// CHECK-SAME: [[STRUCT_V64BFP16EBS16:%.*]] [[V_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64BFP16EBS16]] [[V_COERCE]], 0 +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[TMP0]] to <16 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <8 x i32> +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[SHUFFLE_I_I]] to <32 x i8> +// CHECK-NEXT: ret <32 x i8> [[TMP2]] +// +v32int8 test_extract_v32int8_idx0(v64bfp16ebs16 v) { return extract_v32int8(v, 0); } +// CHECK-LABEL: define dso_local noundef <32 x i8> @_Z25test_extract_v32int8_idx113v64bfp16ebs16( +// CHECK-SAME: [[STRUCT_V64BFP16EBS16:%.*]] [[V_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64BFP16EBS16]] [[V_COERCE]], 0 +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[TMP0]] to <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <8 x i32> +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[SHUFFLE1_I_I]] to <32 x i8> +// CHECK-NEXT: ret <32 x i8> [[TMP2]] +// +v32int8 test_extract_v32int8_idx1(v64bfp16ebs16 v) { return extract_v32int8(v, 1); } +// CHECK-LABEL: define dso_local noundef <64 x i8> @_Z40test_extract_v64int8_v128bfp16ebs16_idx014v128bfp16ebs16( +// CHECK-SAME: [[STRUCT_V128BFP16EBS16:%.*]] [[V_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 0 +// CHECK-NEXT: ret <64 x i8> [[TMP0]] +// +v64int8 test_extract_v64int8_v128bfp16ebs16_idx0(v128bfp16ebs16 v) { return extract_v64int8(v, 0); } +// CHECK-LABEL: define dso_local noundef <64 x i8> @_Z40test_extract_v64int8_v128bfp16ebs16_idx114v128bfp16ebs16( +// CHECK-SAME: [[STRUCT_V128BFP16EBS16:%.*]] [[V_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 1 +// CHECK-NEXT: ret <64 x i8> [[TMP0]] +// +v64int8 test_extract_v64int8_v128bfp16ebs16_idx1(v128bfp16ebs16 v) { return extract_v64int8(v, 1); } +// CHECK-LABEL: define dso_local %struct.v128bfp16ebs16 @_Z39test_insert_v128bfp16ebs16_v64int8_idx014v128bfp16ebs16Dv64_a( +// CHECK-SAME: [[STRUCT_V128BFP16EBS16:%.*]] [[V_COERCE:%.*]], <64 x i8> noundef [[M:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 1 +// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 3 +// CHECK-NEXT: [[TMP2:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 2 +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] poison, <64 x i8> [[M]], 0 +// CHECK-NEXT: [[DOTFCA_1_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_0_INSERT_I]], <64 x i8> [[TMP0]], 1 +// CHECK-NEXT: [[DOTFCA_2_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_1_INSERT_I]], <8 x i8> [[TMP2]], 2 +// CHECK-NEXT: [[DOTFCA_3_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_2_INSERT_I]], <8 x i8> [[TMP1]], 3 +// CHECK-NEXT: ret [[STRUCT_V128BFP16EBS16]] [[DOTFCA_3_INSERT_I]] +// +v128bfp16ebs16 test_insert_v128bfp16ebs16_v64int8_idx0(v128bfp16ebs16 v, v64int8 m) { return insert(v, 0, m); } +// CHECK-LABEL: define dso_local %struct.v128bfp16ebs16 @_Z39test_insert_v128bfp16ebs16_v64int8_idx114v128bfp16ebs16Dv64_a( +// CHECK-SAME: [[STRUCT_V128BFP16EBS16:%.*]] [[V_COERCE:%.*]], <64 x i8> noundef [[M:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 3 +// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 2 +// CHECK-NEXT: [[DOTFCA_1_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], <64 x i8> [[M]], 1 +// CHECK-NEXT: [[DOTFCA_2_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_1_INSERT_I]], <8 x i8> [[TMP1]], 2 +// CHECK-NEXT: [[DOTFCA_3_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_2_INSERT_I]], <8 x i8> [[TMP0]], 3 +// CHECK-NEXT: ret [[STRUCT_V128BFP16EBS16]] [[DOTFCA_3_INSERT_I]] +// +v128bfp16ebs16 test_insert_v128bfp16ebs16_v64int8_idx1(v128bfp16ebs16 v, v64int8 m) { return insert(v, 1, m); } +// CHECK-LABEL: define dso_local %struct.v128bfp16ebs16 @_Z28test_set_v128bfp16ebs16_idx013v64bfp16ebs16( +// CHECK-SAME: [[STRUCT_V64BFP16EBS16:%.*]] [[VSUB_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64BFP16EBS16]] [[VSUB_COERCE]], 1 +// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V64BFP16EBS16]] [[VSUB_COERCE]], 0 +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16:%.*]] poison, <64 x i8> [[TMP1]], 0 +// CHECK-NEXT: [[DOTFCA_1_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_0_INSERT_I]], <64 x i8> [[TMP1]], 1 +// CHECK-NEXT: [[DOTFCA_2_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_1_INSERT_I]], <8 x i8> [[TMP0]], 2 +// CHECK-NEXT: [[DOTFCA_3_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_2_INSERT_I]], <8 x i8> [[TMP0]], 3 +// CHECK-NEXT: ret [[STRUCT_V128BFP16EBS16]] [[DOTFCA_3_INSERT_I]] +// +v128bfp16ebs16 test_set_v128bfp16ebs16_idx0(v64bfp16ebs16 vsub) { return set_v128bfp16ebs16(0, vsub); } +// CHECK-LABEL: define dso_local %struct.v128bfp16ebs16 @_Z28test_set_v128bfp16ebs16_idx113v64bfp16ebs16( +// CHECK-SAME: [[STRUCT_V64BFP16EBS16:%.*]] [[VSUB_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64BFP16EBS16]] [[VSUB_COERCE]], 1 +// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V64BFP16EBS16]] [[VSUB_COERCE]], 0 +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16:%.*]] poison, <64 x i8> [[TMP1]], 0 +// CHECK-NEXT: [[DOTFCA_1_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_0_INSERT_I]], <64 x i8> [[TMP1]], 1 +// CHECK-NEXT: [[DOTFCA_2_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_1_INSERT_I]], <8 x i8> [[TMP0]], 2 +// CHECK-NEXT: [[DOTFCA_3_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFP16EBS16]] [[DOTFCA_2_INSERT_I]], <8 x i8> [[TMP0]], 3 +// CHECK-NEXT: ret [[STRUCT_V128BFP16EBS16]] [[DOTFCA_3_INSERT_I]] +// +v128bfp16ebs16 test_set_v128bfp16ebs16_idx1(v64bfp16ebs16 vsub) { return set_v128bfp16ebs16(1, vsub); } +// CHECK-LABEL: define dso_local %struct.v64bfp16ebs16 @_Z31test_extract_v64bfp16ebs16_idx014v128bfp16ebs16( +// CHECK-SAME: [[STRUCT_V128BFP16EBS16:%.*]] [[M_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[M_COERCE]], 2 +// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[M_COERCE]], 0 +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V64BFP16EBS16:%.*]] poison, <64 x i8> [[TMP1]], 0 +// CHECK-NEXT: [[DOTFCA_1_INSERT_I:%.*]] = insertvalue [[STRUCT_V64BFP16EBS16]] [[DOTFCA_0_INSERT_I]], <8 x i8> [[TMP0]], 1 +// CHECK-NEXT: ret [[STRUCT_V64BFP16EBS16]] [[DOTFCA_1_INSERT_I]] +// +v64bfp16ebs16 test_extract_v64bfp16ebs16_idx0(v128bfp16ebs16 m) { return extract_v64bfp16ebs16(m, 0); } +// CHECK-LABEL: define dso_local %struct.v64bfp16ebs16 @_Z31test_extract_v64bfp16ebs16_idx114v128bfp16ebs16( +// CHECK-SAME: [[STRUCT_V128BFP16EBS16:%.*]] [[M_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[M_COERCE]], 3 +// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[M_COERCE]], 1 +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V64BFP16EBS16:%.*]] poison, <64 x i8> [[TMP1]], 0 +// CHECK-NEXT: [[DOTFCA_1_INSERT_I:%.*]] = insertvalue [[STRUCT_V64BFP16EBS16]] [[DOTFCA_0_INSERT_I]], <8 x i8> [[TMP0]], 1 +// CHECK-NEXT: ret [[STRUCT_V64BFP16EBS16]] [[DOTFCA_1_INSERT_I]] +// +v64bfp16ebs16 test_extract_v64bfp16ebs16_idx1(v128bfp16ebs16 m) { return extract_v64bfp16ebs16(m, 1); } +// CHECK-LABEL: define dso_local noundef i32 @_Z41test_extract_exponent_v128bfp16ebs16_idx014v128bfp16ebs16( +// CHECK-SAME: [[STRUCT_V128BFP16EBS16:%.*]] [[V_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 2 +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32> +// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x i32> [[TMP1]], i64 0 +// CHECK-NEXT: ret i32 [[VECEXT_I]] +// +int test_extract_exponent_v128bfp16ebs16_idx0(v128bfp16ebs16 v) { return extract_exponent(v, 0); } +// CHECK-LABEL: define dso_local noundef i32 @_Z41test_extract_exponent_v128bfp16ebs16_idx114v128bfp16ebs16( +// CHECK-SAME: [[STRUCT_V128BFP16EBS16:%.*]] [[V_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 2 +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32> +// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x i32> [[TMP1]], i64 1 +// CHECK-NEXT: ret i32 [[VECEXT_I]] +// +int test_extract_exponent_v128bfp16ebs16_idx1(v128bfp16ebs16 v) { return extract_exponent(v, 1); } +// CHECK-LABEL: define dso_local noundef i32 @_Z41test_extract_exponent_v128bfp16ebs16_idx214v128bfp16ebs16( +// CHECK-SAME: [[STRUCT_V128BFP16EBS16:%.*]] [[V_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 3 +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32> +// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x i32> [[TMP1]], i64 0 +// CHECK-NEXT: ret i32 [[VECEXT_I]] +// +int test_extract_exponent_v128bfp16ebs16_idx2(v128bfp16ebs16 v) { return extract_exponent(v, 2); } +// CHECK-LABEL: define dso_local noundef i32 @_Z41test_extract_exponent_v128bfp16ebs16_idx314v128bfp16ebs16( +// CHECK-SAME: [[STRUCT_V128BFP16EBS16:%.*]] [[V_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFP16EBS16]] [[V_COERCE]], 3 +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32> +// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x i32> [[TMP1]], i64 1 +// CHECK-NEXT: ret i32 [[VECEXT_I]] +// +int test_extract_exponent_v128bfp16ebs16_idx3(v128bfp16ebs16 v) { return extract_exponent(v, 3); } +// CHECK-LABEL: define dso_local noundef i32 @_Z40test_extract_exponent_v128bfp16ebs8_idx013v128bfp16ebs8( +// CHECK-SAME: [[STRUCT_V128BFP16EBS8:%.*]] [[V_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFP16EBS8]] [[V_COERCE]], 2 +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32> +// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x i32> [[TMP1]], i64 0 +// CHECK-NEXT: ret i32 [[VECEXT_I]] +// +int test_extract_exponent_v128bfp16ebs8_idx0(v128bfp16ebs8 v) { return extract_exponent(v, 0); } +// CHECK-LABEL: define dso_local noundef i32 @_Z40test_extract_exponent_v128bfp16ebs8_idx313v128bfp16ebs8( +// CHECK-SAME: [[STRUCT_V128BFP16EBS8:%.*]] [[V_COERCE:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFP16EBS8]] [[V_COERCE]], 3 +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32> +// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x i32> [[TMP1]], i64 1 +// CHECK-NEXT: ret i32 [[VECEXT_I]] +// +int test_extract_exponent_v128bfp16ebs8_idx3(v128bfp16ebs8 v) { return extract_exponent(v, 3); } diff --git a/clang/test/CodeGen/aie/aie2ps/aie2ps-nlf-intrinsic.cpp b/clang/test/CodeGen/aie/aie2ps/aie2ps-nlf-intrinsic.cpp index 7f75496e8040..e85c26651569 100644 --- a/clang/test/CodeGen/aie/aie2ps/aie2ps-nlf-intrinsic.cpp +++ b/clang/test/CodeGen/aie/aie2ps/aie2ps-nlf-intrinsic.cpp @@ -20,24 +20,24 @@ // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i64> [[SHUFFLE_I_I_I]] to <16 x float> // CHECK-NEXT: [[TMP3:%.*]] = tail call <16 x bfloat> @llvm.aie2ps.exp2(<16 x float> [[TMP2]]) // CHECK-NEXT: [[TMP4:%.*]] = bitcast <16 x bfloat> [[TMP3]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE4_I_I_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: [[TMP5:%.*]] = bitcast <8 x i64> [[SHUFFLE4_I_I_I]] to <16 x float> +// CHECK-NEXT: [[SHUFFLE1_I_I26_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[TMP5:%.*]] = bitcast <8 x i64> [[SHUFFLE1_I_I26_I]] to <16 x float> // CHECK-NEXT: [[TMP6:%.*]] = tail call <16 x bfloat> @llvm.aie2ps.exp2(<16 x float> [[TMP5]]) // CHECK-NEXT: [[TMP7:%.*]] = bitcast <16 x bfloat> [[TMP6]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP7]], <8 x i32> [[TMP4]], <32 x i32> -// CHECK-NEXT: [[SHUFFLE9_I_I_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: [[TMP8:%.*]] = bitcast <8 x i64> [[SHUFFLE9_I_I_I]] to <16 x float> +// CHECK-NEXT: [[SHUFFLE5_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP4]], <8 x i32> [[TMP7]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I36_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[TMP8:%.*]] = bitcast <8 x i64> [[SHUFFLE2_I_I36_I]] to <16 x float> // CHECK-NEXT: [[TMP9:%.*]] = tail call <16 x bfloat> @llvm.aie2ps.exp2(<16 x float> [[TMP8]]) // CHECK-NEXT: [[TMP10:%.*]] = bitcast <16 x bfloat> [[TMP9]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I26_I:%.*]] = shufflevector <8 x i32> [[TMP10]], <8 x i32> poison, <32 x i32> -// CHECK-NEXT: [[SHUFFLE11_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I26_I]], <32 x i32> [[SHUFFLE6_I_I_I]], <32 x i32> -// CHECK-NEXT: [[SHUFFLE10_I_I_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: [[TMP11:%.*]] = bitcast <8 x i64> [[SHUFFLE10_I_I_I]] to <16 x float> +// CHECK-NEXT: [[SHUFFLE2_I_I42_I:%.*]] = shufflevector <8 x i32> [[TMP10]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I43_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE5_I_I_I]], <32 x i32> [[SHUFFLE2_I_I42_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I47_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[TMP11:%.*]] = bitcast <8 x i64> [[SHUFFLE3_I_I47_I]] to <16 x float> // CHECK-NEXT: [[TMP12:%.*]] = tail call <16 x bfloat> @llvm.aie2ps.exp2(<16 x float> [[TMP11]]) // CHECK-NEXT: [[TMP13:%.*]] = bitcast <16 x bfloat> [[TMP12]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I28_I:%.*]] = shufflevector <8 x i32> [[TMP13]], <8 x i32> poison, <32 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I28_I]], <32 x i32> [[SHUFFLE11_I_I_I]], <32 x i32> -// CHECK-NEXT: [[TMP14:%.*]] = bitcast <32 x i32> [[SHUFFLE12_I_I_I]] to <64 x bfloat> +// CHECK-NEXT: [[SHUFFLE3_I_I50_I:%.*]] = shufflevector <8 x i32> [[TMP13]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I51_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE6_I_I43_I]], <32 x i32> [[SHUFFLE3_I_I50_I]], <32 x i32> +// CHECK-NEXT: [[TMP14:%.*]] = bitcast <32 x i32> [[SHUFFLE7_I_I51_I]] to <64 x bfloat> // CHECK-NEXT: ret <64 x bfloat> [[TMP14]] // v64bfloat16 test_exp2(v64accfloat a) { @@ -52,24 +52,24 @@ v64bfloat16 test_exp2(v64accfloat a) { // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i64> [[SHUFFLE_I_I_I]] to <16 x float> // CHECK-NEXT: [[TMP3:%.*]] = tail call <16 x bfloat> @llvm.aie2ps.exp2(<16 x float> [[TMP2]]) // CHECK-NEXT: [[TMP4:%.*]] = bitcast <16 x bfloat> [[TMP3]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE4_I_I_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: [[TMP5:%.*]] = bitcast <8 x i64> [[SHUFFLE4_I_I_I]] to <16 x float> +// CHECK-NEXT: [[SHUFFLE1_I_I26_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[TMP5:%.*]] = bitcast <8 x i64> [[SHUFFLE1_I_I26_I]] to <16 x float> // CHECK-NEXT: [[TMP6:%.*]] = tail call <16 x bfloat> @llvm.aie2ps.exp2(<16 x float> [[TMP5]]) // CHECK-NEXT: [[TMP7:%.*]] = bitcast <16 x bfloat> [[TMP6]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP7]], <8 x i32> [[TMP4]], <32 x i32> -// CHECK-NEXT: [[SHUFFLE9_I_I_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: [[TMP8:%.*]] = bitcast <8 x i64> [[SHUFFLE9_I_I_I]] to <16 x float> +// CHECK-NEXT: [[SHUFFLE5_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP4]], <8 x i32> [[TMP7]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I36_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[TMP8:%.*]] = bitcast <8 x i64> [[SHUFFLE2_I_I36_I]] to <16 x float> // CHECK-NEXT: [[TMP9:%.*]] = tail call <16 x bfloat> @llvm.aie2ps.exp2(<16 x float> [[TMP8]]) // CHECK-NEXT: [[TMP10:%.*]] = bitcast <16 x bfloat> [[TMP9]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I26_I:%.*]] = shufflevector <8 x i32> [[TMP10]], <8 x i32> poison, <32 x i32> -// CHECK-NEXT: [[SHUFFLE11_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I26_I]], <32 x i32> [[SHUFFLE6_I_I_I]], <32 x i32> -// CHECK-NEXT: [[SHUFFLE10_I_I_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: [[TMP11:%.*]] = bitcast <8 x i64> [[SHUFFLE10_I_I_I]] to <16 x float> +// CHECK-NEXT: [[SHUFFLE2_I_I42_I:%.*]] = shufflevector <8 x i32> [[TMP10]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I43_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE5_I_I_I]], <32 x i32> [[SHUFFLE2_I_I42_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I47_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[TMP11:%.*]] = bitcast <8 x i64> [[SHUFFLE3_I_I47_I]] to <16 x float> // CHECK-NEXT: [[TMP12:%.*]] = tail call <16 x bfloat> @llvm.aie2ps.exp2(<16 x float> [[TMP11]]) // CHECK-NEXT: [[TMP13:%.*]] = bitcast <16 x bfloat> [[TMP12]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I28_I:%.*]] = shufflevector <8 x i32> [[TMP13]], <8 x i32> poison, <32 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I28_I]], <32 x i32> [[SHUFFLE11_I_I_I]], <32 x i32> -// CHECK-NEXT: [[TMP14:%.*]] = bitcast <32 x i32> [[SHUFFLE12_I_I_I]] to <64 x bfloat> +// CHECK-NEXT: [[SHUFFLE3_I_I50_I:%.*]] = shufflevector <8 x i32> [[TMP13]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I51_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE6_I_I43_I]], <32 x i32> [[SHUFFLE3_I_I50_I]], <32 x i32> +// CHECK-NEXT: [[TMP14:%.*]] = bitcast <32 x i32> [[SHUFFLE7_I_I51_I]] to <64 x bfloat> // CHECK-NEXT: ret <64 x bfloat> [[TMP14]] // v64bfloat16 test_exp2(v64float a) { @@ -77,9 +77,9 @@ v64bfloat16 test_exp2(v64float a) { } // CHECK-LABEL: define dso_local inreg noundef <16 x float> @_Z14test_exp2_bf20Dv16_u10__accfloat( -// CHECK-SAME: <16 x float> inreg noundef [[A:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] { +// CHECK-SAME: <16 x float> inreg noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <16 x float> [[A]], <16 x float> undef, <32 x i32> +// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <16 x float> [[A]], <16 x float> poison, <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = tail call noundef <32 x float> @llvm.aie2ps.ACC1024.accfloat.add.conf(<32 x float> [[TMP0]], <32 x float> , i32 60) // CHECK-NEXT: [[TMP2:%.*]] = shufflevector <32 x float> [[TMP1]], <32 x float> poison, <16 x i32> // CHECK-NEXT: [[TMP3:%.*]] = tail call noundef <16 x float> @llvm.aie2ps.exp2.bf20(<16 x float> [[TMP2]]) @@ -88,10 +88,11 @@ v64bfloat16 test_exp2(v64float a) { v16accfloat test_exp2_bf20(v16accfloat a) { return exp2_bf20(a); } +// // CHECK-LABEL: define dso_local inreg noundef <16 x float> @_Z14test_exp2_bf20Dv16_f( -// CHECK-SAME: <16 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR1]] { +// CHECK-SAME: <16 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <16 x float> [[A]], <16 x float> undef, <32 x i32> +// CHECK-NEXT: [[TMP0:%.*]] = shufflevector <16 x float> [[A]], <16 x float> poison, <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = tail call noundef <32 x float> @llvm.aie2ps.ACC1024.accfloat.add.conf(<32 x float> [[TMP0]], <32 x float> , i32 60) // CHECK-NEXT: [[TMP2:%.*]] = shufflevector <32 x float> [[TMP1]], <32 x float> poison, <16 x i32> // CHECK-NEXT: [[TMP3:%.*]] = tail call noundef <16 x float> @llvm.aie2ps.exp2.bf20(<16 x float> [[TMP2]]) @@ -101,7 +102,7 @@ v16accfloat test_exp2_bf20(v16float a) { return exp2_bf20(a); } // CHECK-LABEL: define dso_local inreg noundef <32 x float> @_Z14test_exp2_bf20Dv32_u10__accfloat( -// CHECK-SAME: <32 x float> inreg noundef [[A:%.*]]) local_unnamed_addr #[[ATTR1]] { +// CHECK-SAME: <32 x float> inreg noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = tail call noundef <32 x float> @llvm.aie2ps.ACC1024.accfloat.add.conf(<32 x float> [[A]], <32 x float> splat (float 0x408BF80200000000), i32 60) // CHECK-NEXT: [[TMP1:%.*]] = shufflevector <32 x float> [[TMP0]], <32 x float> poison, <16 x i32> @@ -115,7 +116,7 @@ v32accfloat test_exp2_bf20(v32accfloat a) { return exp2_bf20(a); } // CHECK-LABEL: define dso_local inreg noundef <32 x float> @_Z14test_exp2_bf20Dv32_f( -// CHECK-SAME: <32 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR1]] { +// CHECK-SAME: <32 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = tail call noundef <32 x float> @llvm.aie2ps.ACC1024.accfloat.add.conf(<32 x float> [[A]], <32 x float> splat (float 0x408BF80200000000), i32 60) // CHECK-NEXT: [[TMP1:%.*]] = shufflevector <32 x float> [[TMP0]], <32 x float> poison, <16 x i32> @@ -129,7 +130,7 @@ v32accfloat test_exp2_bf20(v32float a) { return exp2_bf20(a); } // CHECK-LABEL: define dso_local inreg noundef <64 x float> @_Z14test_exp2_bf20Dv64_u10__accfloat( -// CHECK-SAME: <64 x float> inreg noundef [[A:%.*]]) local_unnamed_addr #[[ATTR1]] { +// CHECK-SAME: <64 x float> inreg noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = tail call noundef <64 x float> @llvm.aie2ps.ACC2048.accfloat.add.conf(<64 x float> [[A]], <64 x float> splat (float 0x408BF80200000000), i32 60) // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x float> [[TMP0]] to <32 x i64> @@ -137,31 +138,31 @@ v32accfloat test_exp2_bf20(v32float a) { // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i64> [[SHUFFLE_I_I_I]] to <16 x float> // CHECK-NEXT: [[TMP3:%.*]] = tail call <16 x float> @llvm.aie2ps.exp2.bf20(<16 x float> [[TMP2]]) // CHECK-NEXT: [[TMP4:%.*]] = bitcast <16 x float> [[TMP3]] to <8 x i64> -// CHECK-NEXT: [[SHUFFLE4_I_I_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: [[TMP5:%.*]] = bitcast <8 x i64> [[SHUFFLE4_I_I_I]] to <16 x float> +// CHECK-NEXT: [[SHUFFLE1_I_I26_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[TMP5:%.*]] = bitcast <8 x i64> [[SHUFFLE1_I_I26_I]] to <16 x float> // CHECK-NEXT: [[TMP6:%.*]] = tail call <16 x float> @llvm.aie2ps.exp2.bf20(<16 x float> [[TMP5]]) // CHECK-NEXT: [[TMP7:%.*]] = bitcast <16 x float> [[TMP6]] to <8 x i64> -// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <8 x i64> [[TMP4]], <8 x i64> [[TMP7]], <32 x i32> -// CHECK-NEXT: [[SHUFFLE9_I_I_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: [[TMP8:%.*]] = bitcast <8 x i64> [[SHUFFLE9_I_I_I]] to <16 x float> +// CHECK-NEXT: [[SHUFFLE5_I_I_I:%.*]] = shufflevector <8 x i64> [[TMP4]], <8 x i64> [[TMP7]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I36_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[TMP8:%.*]] = bitcast <8 x i64> [[SHUFFLE2_I_I36_I]] to <16 x float> // CHECK-NEXT: [[TMP9:%.*]] = tail call <16 x float> @llvm.aie2ps.exp2.bf20(<16 x float> [[TMP8]]) // CHECK-NEXT: [[TMP10:%.*]] = bitcast <16 x float> [[TMP9]] to <8 x i64> -// CHECK-NEXT: [[SHUFFLE1_I_I23_I:%.*]] = shufflevector <8 x i64> [[TMP10]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: [[SHUFFLE11_I_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE6_I_I_I]], <32 x i64> [[SHUFFLE1_I_I23_I]], <32 x i32> -// CHECK-NEXT: [[SHUFFLE10_I_I_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: [[TMP11:%.*]] = bitcast <8 x i64> [[SHUFFLE10_I_I_I]] to <16 x float> +// CHECK-NEXT: [[SHUFFLE2_I_I42_I:%.*]] = shufflevector <8 x i64> [[TMP10]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I43_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE5_I_I_I]], <32 x i64> [[SHUFFLE2_I_I42_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I47_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[TMP11:%.*]] = bitcast <8 x i64> [[SHUFFLE3_I_I47_I]] to <16 x float> // CHECK-NEXT: [[TMP12:%.*]] = tail call <16 x float> @llvm.aie2ps.exp2.bf20(<16 x float> [[TMP11]]) // CHECK-NEXT: [[TMP13:%.*]] = bitcast <16 x float> [[TMP12]] to <8 x i64> -// CHECK-NEXT: [[SHUFFLE1_I_I24_I:%.*]] = shufflevector <8 x i64> [[TMP13]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE11_I_I_I]], <32 x i64> [[SHUFFLE1_I_I24_I]], <32 x i32> -// CHECK-NEXT: [[TMP14:%.*]] = bitcast <32 x i64> [[SHUFFLE12_I_I_I]] to <64 x float> +// CHECK-NEXT: [[SHUFFLE3_I_I50_I:%.*]] = shufflevector <8 x i64> [[TMP13]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I51_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE6_I_I43_I]], <32 x i64> [[SHUFFLE3_I_I50_I]], <32 x i32> +// CHECK-NEXT: [[TMP14:%.*]] = bitcast <32 x i64> [[SHUFFLE7_I_I51_I]] to <64 x float> // CHECK-NEXT: ret <64 x float> [[TMP14]] // v64accfloat test_exp2_bf20(v64accfloat a) { return exp2_bf20(a); } // CHECK-LABEL: define dso_local inreg noundef <64 x float> @_Z14test_exp2_bf20Dv64_f( -// CHECK-SAME: <64 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR1]] { +// CHECK-SAME: <64 x float> noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = tail call noundef <64 x float> @llvm.aie2ps.ACC2048.accfloat.add.conf(<64 x float> [[A]], <64 x float> splat (float 0x408BF80200000000), i32 60) // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x float> [[TMP0]] to <32 x i64> @@ -169,24 +170,24 @@ v64accfloat test_exp2_bf20(v64accfloat a) { // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i64> [[SHUFFLE_I_I_I]] to <16 x float> // CHECK-NEXT: [[TMP3:%.*]] = tail call <16 x float> @llvm.aie2ps.exp2.bf20(<16 x float> [[TMP2]]) // CHECK-NEXT: [[TMP4:%.*]] = bitcast <16 x float> [[TMP3]] to <8 x i64> -// CHECK-NEXT: [[SHUFFLE4_I_I_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: [[TMP5:%.*]] = bitcast <8 x i64> [[SHUFFLE4_I_I_I]] to <16 x float> +// CHECK-NEXT: [[SHUFFLE1_I_I26_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[TMP5:%.*]] = bitcast <8 x i64> [[SHUFFLE1_I_I26_I]] to <16 x float> // CHECK-NEXT: [[TMP6:%.*]] = tail call <16 x float> @llvm.aie2ps.exp2.bf20(<16 x float> [[TMP5]]) // CHECK-NEXT: [[TMP7:%.*]] = bitcast <16 x float> [[TMP6]] to <8 x i64> -// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <8 x i64> [[TMP4]], <8 x i64> [[TMP7]], <32 x i32> -// CHECK-NEXT: [[SHUFFLE9_I_I_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: [[TMP8:%.*]] = bitcast <8 x i64> [[SHUFFLE9_I_I_I]] to <16 x float> +// CHECK-NEXT: [[SHUFFLE5_I_I_I:%.*]] = shufflevector <8 x i64> [[TMP4]], <8 x i64> [[TMP7]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I36_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[TMP8:%.*]] = bitcast <8 x i64> [[SHUFFLE2_I_I36_I]] to <16 x float> // CHECK-NEXT: [[TMP9:%.*]] = tail call <16 x float> @llvm.aie2ps.exp2.bf20(<16 x float> [[TMP8]]) // CHECK-NEXT: [[TMP10:%.*]] = bitcast <16 x float> [[TMP9]] to <8 x i64> -// CHECK-NEXT: [[SHUFFLE1_I_I23_I:%.*]] = shufflevector <8 x i64> [[TMP10]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: [[SHUFFLE11_I_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE6_I_I_I]], <32 x i64> [[SHUFFLE1_I_I23_I]], <32 x i32> -// CHECK-NEXT: [[SHUFFLE10_I_I_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: [[TMP11:%.*]] = bitcast <8 x i64> [[SHUFFLE10_I_I_I]] to <16 x float> +// CHECK-NEXT: [[SHUFFLE2_I_I42_I:%.*]] = shufflevector <8 x i64> [[TMP10]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I43_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE5_I_I_I]], <32 x i64> [[SHUFFLE2_I_I42_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I47_I:%.*]] = shufflevector <32 x i64> [[TMP1]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[TMP11:%.*]] = bitcast <8 x i64> [[SHUFFLE3_I_I47_I]] to <16 x float> // CHECK-NEXT: [[TMP12:%.*]] = tail call <16 x float> @llvm.aie2ps.exp2.bf20(<16 x float> [[TMP11]]) // CHECK-NEXT: [[TMP13:%.*]] = bitcast <16 x float> [[TMP12]] to <8 x i64> -// CHECK-NEXT: [[SHUFFLE1_I_I24_I:%.*]] = shufflevector <8 x i64> [[TMP13]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE11_I_I_I]], <32 x i64> [[SHUFFLE1_I_I24_I]], <32 x i32> -// CHECK-NEXT: [[TMP14:%.*]] = bitcast <32 x i64> [[SHUFFLE12_I_I_I]] to <64 x float> +// CHECK-NEXT: [[SHUFFLE3_I_I50_I:%.*]] = shufflevector <8 x i64> [[TMP13]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I51_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE6_I_I43_I]], <32 x i64> [[SHUFFLE3_I_I50_I]], <32 x i32> +// CHECK-NEXT: [[TMP14:%.*]] = bitcast <32 x i64> [[SHUFFLE7_I_I51_I]] to <64 x float> // CHECK-NEXT: ret <64 x float> [[TMP14]] // v64accfloat test_exp2_bf20(v64float a) { diff --git a/clang/test/CodeGen/aie/aie2ps/aie2ps-upd-ext-intrinsic.cpp b/clang/test/CodeGen/aie/aie2ps/aie2ps-upd-ext-intrinsic.cpp index 8ce8ed2c9ab3..65412559aa4d 100644 --- a/clang/test/CodeGen/aie/aie2ps/aie2ps-upd-ext-intrinsic.cpp +++ b/clang/test/CodeGen/aie/aie2ps/aie2ps-upd-ext-intrinsic.cpp @@ -13,57 +13,39 @@ // CHECK-LABEL: @_Z23test_extract_v16float16Dv32_7float16i( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x half> [[A:%.*]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V16FLOAT16DV32_7FLOAT16I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V16FLOAT16DV32_7FLOAT16I_EXIT]] -// CHECK: _ZL18extract_v16float16Dv32_7float16i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x half> -// CHECK-NEXT: ret <16 x half> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <16 x half> +// CHECK-NEXT: ret <16 x half> [[TMP1]] // v16float16 test_extract_v16float16 (v32float16 a, int idx) { return extract_v16float16(a, idx); } // CHECK-LABEL: @_Z11test_insertDv32_7float16iDv16_S_( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x half> [[A:%.*]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x half> [[B:%.*]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_7FLOAT16IDV16_S__EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_7FLOAT16IDV16_S__EXIT]] -// CHECK: _ZL6insertDv32_7float16iDv16_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x half> -// CHECK-NEXT: ret <32 x half> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x half> +// CHECK-NEXT: ret <32 x half> [[TMP2]] // v32float16 test_insert (v32float16 a, int idx, v16float16 b) { return insert(a, idx, b); } // CHECK-LABEL: @_Z19test_set_v32float16iDv16_7float16( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x half> [[B:%.*]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V32FLOAT16IDV16_7FLOAT16_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V32FLOAT16IDV16_7FLOAT16_EXIT]] -// CHECK: _ZL14set_v32float16iDv16_7float16.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x half> -// CHECK-NEXT: ret <32 x half> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x half> +// CHECK-NEXT: ret <32 x half> [[TMP1]] // v32float16 test_set_v32float16 (int idx, v16float16 b) { return set_v32float16(idx, b); } // CHECK-LABEL: @_Z11test_concatDv16_7float16S0_( @@ -79,19 +61,13 @@ v32float16 test_concat (v16float16 a0, v16float16 a1) { return concat(a0, a1); } // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64BFLOAT8:%.*]] [[A_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[TMP0]] to <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V32BFLOAT810V64BFLOAT8I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V32BFLOAT810V64BFLOAT8I_EXIT]] -// CHECK: _ZL18extract_v32bfloat810v64bfloat8i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V32BFLOAT8:%.*]] poison, <32 x i8> [[TMP3]], 0 +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <32 x i8> +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V32BFLOAT8:%.*]] poison, <32 x i8> [[TMP2]], 0 // CHECK-NEXT: ret [[STRUCT_V32BFLOAT8]] [[DOTFCA_0_INSERT_I]] // v32bfloat8 test_extract_v32bfloat8 (v64bfloat8 a, int idx) { return extract_v32bfloat8(a, idx); } @@ -101,20 +77,14 @@ v32bfloat8 test_extract_v32bfloat8 (v64bfloat8 a, int idx) { return extract_v32b // CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V32BFLOAT8:%.*]] [[B_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <64 x i8> [[TMP0]] to <16 x i32> // CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i8> [[TMP1]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP4:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP4]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP2]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT10V64BFLOAT8I10V32BFLOAT8_EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP2]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT10V64BFLOAT8I10V32BFLOAT8_EXIT]] -// CHECK: _ZL6insert10v64bfloat8i10v32bfloat8.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP5:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V64BFLOAT8]] poison, <64 x i8> [[TMP5]], 0 +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP4:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V64BFLOAT8]] poison, <64 x i8> [[TMP4]], 0 // CHECK-NEXT: ret [[STRUCT_V64BFLOAT8]] [[DOTFCA_0_INSERT_I]] // v64bfloat8 test_insert (v64bfloat8 a, int idx, v32bfloat8 b) { return insert(a, idx, b); } @@ -122,19 +92,13 @@ v64bfloat8 test_insert (v64bfloat8 a, int idx, v32bfloat8 b) { return insert(a, // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V32BFLOAT8:%.*]] [[B_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[TMP0]] to <8 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V64BFLOAT8I10V32BFLOAT8_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V64BFLOAT8I10V32BFLOAT8_EXIT]] -// CHECK: _ZL14set_v64bfloat8i10v32bfloat8.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V64BFLOAT8:%.*]] poison, <64 x i8> [[TMP3]], 0 +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V64BFLOAT8:%.*]] poison, <64 x i8> [[TMP2]], 0 // CHECK-NEXT: ret [[STRUCT_V64BFLOAT8]] [[DOTFCA_0_INSERT_I]] // v64bfloat8 test_set_v64bfloat8 (int idx, v32bfloat8 b) { return set_v64bfloat8(idx, b); } @@ -154,19 +118,13 @@ v64bfloat8 test_concat (v32bfloat8 a0, v32bfloat8 a1) { return concat(a0, a1); } // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64FLOAT8:%.*]] [[A_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[TMP0]] to <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V32FLOAT89V64FLOAT8I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V32FLOAT89V64FLOAT8I_EXIT]] -// CHECK: _ZL17extract_v32float89v64float8i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V32FLOAT8:%.*]] poison, <32 x i8> [[TMP3]], 0 +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <32 x i8> +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V32FLOAT8:%.*]] poison, <32 x i8> [[TMP2]], 0 // CHECK-NEXT: ret [[STRUCT_V32FLOAT8]] [[DOTFCA_0_INSERT_I]] // v32float8 test_extract_v32float8 (v64float8 a, int idx) { return extract_v32float8(a, idx); } @@ -176,20 +134,14 @@ v32float8 test_extract_v32float8 (v64float8 a, int idx) { return extract_v32floa // CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V32FLOAT8:%.*]] [[B_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <64 x i8> [[TMP0]] to <16 x i32> // CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i8> [[TMP1]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP4:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP4]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP2]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT9V64FLOAT8I9V32FLOAT8_EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP2]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT9V64FLOAT8I9V32FLOAT8_EXIT]] -// CHECK: _ZL6insert9v64float8i9v32float8.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP5:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V64FLOAT8]] poison, <64 x i8> [[TMP5]], 0 +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP4:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V64FLOAT8]] poison, <64 x i8> [[TMP4]], 0 // CHECK-NEXT: ret [[STRUCT_V64FLOAT8]] [[DOTFCA_0_INSERT_I]] // v64float8 test_insert (v64float8 a, int idx, v32float8 b) { return insert(a, idx, b); } @@ -197,23 +149,16 @@ v64float8 test_insert (v64float8 a, int idx, v32float8 b) { return insert(a, idx // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V32FLOAT8:%.*]] [[B_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[TMP0]] to <8 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V64FLOAT8I9V32FLOAT8_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V64FLOAT8I9V32FLOAT8_EXIT]] -// CHECK: _ZL13set_v64float8i9v32float8.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V64FLOAT8:%.*]] poison, <64 x i8> [[TMP3]], 0 +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V64FLOAT8:%.*]] poison, <64 x i8> [[TMP2]], 0 // CHECK-NEXT: ret [[STRUCT_V64FLOAT8]] [[DOTFCA_0_INSERT_I]] // v64float8 test_set_v64float8 (int idx, v32float8 b) { return set_v64float8(idx, b); } -// // CHECK-LABEL: @_Z11test_concat9v32float8S_( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V32FLOAT8:%.*]] [[A0_COERCE:%.*]], 0 @@ -229,27 +174,18 @@ v64float8 test_concat (v32float8 a0, v32float8 a1) { return concat(a0, a1); } // CHECK-LABEL: @_Z23test_extract_v16float16Dv64_7float16i( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x half> [[A:%.*]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX:%.*]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V16FLOAT16DV64_7FLOAT16I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V16FLOAT16DV64_7FLOAT16I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V16FLOAT16DV64_7FLOAT16I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V16FLOAT16DV64_7FLOAT16I_EXIT]] -// CHECK: _ZL18extract_v16float16Dv64_7float16i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x half> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <16 x half> // CHECK-NEXT: ret <16 x half> [[TMP1]] // v16float16 test_extract_v16float16 (v64float16 a, int idx) { return extract_v16float16(a, idx); } @@ -257,60 +193,40 @@ v16float16 test_extract_v16float16 (v64float16 a, int idx) { return extract_v16f // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x half> [[A:%.*]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x half> [[B:%.*]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX:%.*]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_7FLOAT16IDV16_S__EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_7FLOAT16IDV16_S__EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_7FLOAT16IDV16_S__EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_7FLOAT16IDV16_S__EXIT]] -// CHECK: _ZL6insertDv64_7float16iDv16_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x half> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <64 x half> // CHECK-NEXT: ret <64 x half> [[TMP2]] // v64float16 test_insert (v64float16 a, int idx, v16float16 b) { return insert(a, idx, b); } // CHECK-LABEL: @_Z19test_set_v64float16iDv16_7float16( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x half> [[B:%.*]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX:%.*]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V64FLOAT16IDV16_7FLOAT16_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V64FLOAT16IDV16_7FLOAT16_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V64FLOAT16IDV16_7FLOAT16_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V64FLOAT16IDV16_7FLOAT16_EXIT]] -// CHECK: _ZL14set_v64float16iDv16_7float16.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x half> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <64 x half> // CHECK-NEXT: ret <64 x half> [[TMP1]] // v64float16 test_set_v64float16 (int idx, v16float16 b) { return set_v64float16(idx, b); } @@ -330,57 +246,39 @@ v64float16 test_concat (v16float16 a0, v16float16 a1, v16float16 a2, v16float16 // CHECK-LABEL: @_Z23test_extract_v32float16Dv64_7float16i( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x half> [[A:%.*]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V32FLOAT16DV64_7FLOAT16I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V32FLOAT16DV64_7FLOAT16I_EXIT]] -// CHECK: _ZL18extract_v32float16Dv64_7float16i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x half> -// CHECK-NEXT: ret <32 x half> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x half> +// CHECK-NEXT: ret <32 x half> [[TMP1]] // v32float16 test_extract_v32float16 (v64float16 a, int idx) { return extract_v32float16(a, idx); } // CHECK-LABEL: @_Z11test_insertDv64_7float16iDv32_S_( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x half> [[A:%.*]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x half> [[B:%.*]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_7FLOAT16IDV32_S__EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_7FLOAT16IDV32_S__EXIT]] -// CHECK: _ZL6insertDv64_7float16iDv32_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x half> -// CHECK-NEXT: ret <64 x half> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <64 x half> +// CHECK-NEXT: ret <64 x half> [[TMP2]] // v64float16 test_insert (v64float16 a, int idx, v32float16 b) { return insert(a, idx, b); } // CHECK-LABEL: @_Z19test_set_v64float16iDv32_7float16( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x half> [[B:%.*]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V64FLOAT16IDV32_7FLOAT16_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V64FLOAT16IDV32_7FLOAT16_EXIT]] -// CHECK: _ZL14set_v64float16iDv32_7float16.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x half> -// CHECK-NEXT: ret <64 x half> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <64 x half> +// CHECK-NEXT: ret <64 x half> [[TMP1]] // v64float16 test_set_v64float16 (int idx, v32float16 b) { return set_v64float16(idx, b); } // CHECK-LABEL: @_Z11test_concatDv32_7float16S0_( @@ -397,27 +295,18 @@ v64float16 test_concat (v32float16 a0, v32float16 a1) { return concat(a0, a1); } // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFLOAT8:%.*]] [[A_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <128 x i8> [[TMP0]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX:%.*]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V32BFLOAT811V128BFLOAT8I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V32BFLOAT811V128BFLOAT8I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V32BFLOAT811V128BFLOAT8I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V32BFLOAT811V128BFLOAT8I_EXIT]] -// CHECK: _ZL18extract_v32bfloat811v128bfloat8i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <32 x i8> // CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V32BFLOAT8:%.*]] poison, <32 x i8> [[TMP2]], 0 // CHECK-NEXT: ret [[STRUCT_V32BFLOAT8]] [[DOTFCA_0_INSERT_I]] // @@ -428,29 +317,22 @@ v32bfloat8 test_extract_v32bfloat8 (v128bfloat8 a, int idx) { return extract_v32 // CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V32BFLOAT8:%.*]] [[B_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <128 x i8> [[TMP0]] to <32 x i32> // CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i8> [[TMP1]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX:%.*]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP2]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT11V128BFLOAT8I10V32BFLOAT8_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP2]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT11V128BFLOAT8I10V32BFLOAT8_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP2]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT11V128BFLOAT8I10V32BFLOAT8_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP2]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT11V128BFLOAT8I10V32BFLOAT8_EXIT]] -// CHECK: _ZL6insert11v128bfloat8i10v32bfloat8.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP4:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP2]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP2]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP2]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP2]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP4:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <128 x i8> // CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFLOAT8]] poison, <128 x i8> [[TMP4]], 0 // CHECK-NEXT: ret [[STRUCT_V128BFLOAT8]] [[DOTFCA_0_INSERT_I]] // @@ -459,31 +341,18 @@ v128bfloat8 test_insert (v128bfloat8 a, int idx, v32bfloat8 b) { return insert(a // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V32BFLOAT8:%.*]] [[B_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[TMP0]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX:%.*]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V128BFLOAT8I10V32BFLOAT8_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V128BFLOAT8I10V32BFLOAT8_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V128BFLOAT8I10V32BFLOAT8_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V128BFLOAT8I10V32BFLOAT8_EXIT]] -// CHECK: _ZL15set_v128bfloat8i10v32bfloat8.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <128 x i8> // CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFLOAT8:%.*]] poison, <128 x i8> [[TMP2]], 0 // CHECK-NEXT: ret [[STRUCT_V128BFLOAT8]] [[DOTFCA_0_INSERT_I]] // @@ -510,42 +379,31 @@ v128bfloat8 test_concat (v32bfloat8 a0, v32bfloat8 a1, v32bfloat8 a2, v32bfloat8 // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFLOAT8:%.*]] [[A_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <128 x i8> [[TMP0]] to <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V64BFLOAT811V128BFLOAT8I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V64BFLOAT811V128BFLOAT8I_EXIT]] -// CHECK: _ZL18extract_v64bfloat811v128bfloat8i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V64BFLOAT8:%.*]] poison, <64 x i8> [[TMP3]], 0 +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V64BFLOAT8:%.*]] poison, <64 x i8> [[TMP2]], 0 // CHECK-NEXT: ret [[STRUCT_V64BFLOAT8]] [[DOTFCA_0_INSERT_I]] // v64bfloat8 test_extract_v64bfloat8 (v128bfloat8 a, int idx) { return extract_v64bfloat8(a, idx); } +// // CHECK-LABEL: @_Z11test_insert11v128bfloat8i10v64bfloat8( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128BFLOAT8:%.*]] [[A_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V64BFLOAT8:%.*]] [[B_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <128 x i8> [[TMP0]] to <32 x i32> // CHECK-NEXT: [[TMP3:%.*]] = bitcast <64 x i8> [[TMP1]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP3]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP4:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP4]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP2]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT11V128BFLOAT8I10V64BFLOAT8_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP3]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP2]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT11V128BFLOAT8I10V64BFLOAT8_EXIT]] -// CHECK: _ZL6insert11v128bfloat8i10v64bfloat8.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP5:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFLOAT8]] poison, <128 x i8> [[TMP5]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP2]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP4:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFLOAT8]] poison, <128 x i8> [[TMP4]], 0 // CHECK-NEXT: ret [[STRUCT_V128BFLOAT8]] [[DOTFCA_0_INSERT_I]] // v128bfloat8 test_insert (v128bfloat8 a, int idx, v64bfloat8 b) { return insert(a, idx, b); } @@ -553,22 +411,17 @@ v128bfloat8 test_insert (v128bfloat8 a, int idx, v64bfloat8 b) { return insert(a // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64BFLOAT8:%.*]] [[B_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[TMP0]] to <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V128BFLOAT8I10V64BFLOAT8_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V128BFLOAT8I10V64BFLOAT8_EXIT]] -// CHECK: _ZL15set_v128bfloat8i10v64bfloat8.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFLOAT8:%.*]] poison, <128 x i8> [[TMP3]], 0 +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128BFLOAT8:%.*]] poison, <128 x i8> [[TMP2]], 0 // CHECK-NEXT: ret [[STRUCT_V128BFLOAT8]] [[DOTFCA_0_INSERT_I]] // v128bfloat8 test_set_v128bfloat8 (int idx, v64bfloat8 b) { return set_v128bfloat8(idx, b); } +// // CHECK-LABEL: @_Z11test_concat10v64bfloat8S_( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64BFLOAT8:%.*]] [[A0_COERCE:%.*]], 0 @@ -585,27 +438,18 @@ v128bfloat8 test_concat (v64bfloat8 a0, v64bfloat8 a1) { return concat(a0, a1); // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128FLOAT8:%.*]] [[A_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <128 x i8> [[TMP0]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX:%.*]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V32FLOAT810V128FLOAT8I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V32FLOAT810V128FLOAT8I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V32FLOAT810V128FLOAT8I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V32FLOAT810V128FLOAT8I_EXIT]] -// CHECK: _ZL17extract_v32float810v128float8i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <32 x i8> // CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V32FLOAT8:%.*]] poison, <32 x i8> [[TMP2]], 0 // CHECK-NEXT: ret [[STRUCT_V32FLOAT8]] [[DOTFCA_0_INSERT_I]] // @@ -616,29 +460,22 @@ v32float8 test_extract_v32float8 (v128float8 a, int idx) { return extract_v32flo // CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V32FLOAT8:%.*]] [[B_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <128 x i8> [[TMP0]] to <32 x i32> // CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i8> [[TMP1]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX:%.*]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP2]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT10V128FLOAT8I9V32FLOAT8_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP2]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT10V128FLOAT8I9V32FLOAT8_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP2]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT10V128FLOAT8I9V32FLOAT8_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP2]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT10V128FLOAT8I9V32FLOAT8_EXIT]] -// CHECK: _ZL6insert10v128float8i9v32float8.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP4:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP2]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP2]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP2]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP2]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP4:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <128 x i8> // CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128FLOAT8]] poison, <128 x i8> [[TMP4]], 0 // CHECK-NEXT: ret [[STRUCT_V128FLOAT8]] [[DOTFCA_0_INSERT_I]] // @@ -647,31 +484,18 @@ v128float8 test_insert (v128float8 a, int idx, v32float8 b) { return insert(a, i // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V32FLOAT8:%.*]] [[B_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[TMP0]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX:%.*]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V128FLOAT8I9V32FLOAT8_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V128FLOAT8I9V32FLOAT8_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V128FLOAT8I9V32FLOAT8_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V128FLOAT8I9V32FLOAT8_EXIT]] -// CHECK: _ZL14set_v128float8i9v32float8.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <128 x i8> // CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128FLOAT8:%.*]] poison, <128 x i8> [[TMP2]], 0 // CHECK-NEXT: ret [[STRUCT_V128FLOAT8]] [[DOTFCA_0_INSERT_I]] // @@ -698,19 +522,13 @@ v128float8 test_concat (v32float8 a0, v32float8 a1, v32float8 a2, v32float8 a3) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V128FLOAT8:%.*]] [[A_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <128 x i8> [[TMP0]] to <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V64FLOAT810V128FLOAT8I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP1]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V64FLOAT810V128FLOAT8I_EXIT]] -// CHECK: _ZL17extract_v64float810v128float8i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V64FLOAT8:%.*]] poison, <64 x i8> [[TMP3]], 0 +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V64FLOAT8:%.*]] poison, <64 x i8> [[TMP2]], 0 // CHECK-NEXT: ret [[STRUCT_V64FLOAT8]] [[DOTFCA_0_INSERT_I]] // v64float8 test_extract_v64float8 (v128float8 a, int idx) { return extract_v64float8(a, idx); } @@ -720,20 +538,14 @@ v64float8 test_extract_v64float8 (v128float8 a, int idx) { return extract_v64flo // CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V64FLOAT8:%.*]] [[B_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP2:%.*]] = bitcast <128 x i8> [[TMP0]] to <32 x i32> // CHECK-NEXT: [[TMP3:%.*]] = bitcast <64 x i8> [[TMP1]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP3]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP4:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP4]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP2]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT10V128FLOAT8I9V64FLOAT8_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP3]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP2]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT10V128FLOAT8I9V64FLOAT8_EXIT]] -// CHECK: _ZL6insert10v128float8i9v64float8.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP5:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128FLOAT8]] poison, <128 x i8> [[TMP5]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP2]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP4:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128FLOAT8]] poison, <128 x i8> [[TMP4]], 0 // CHECK-NEXT: ret [[STRUCT_V128FLOAT8]] [[DOTFCA_0_INSERT_I]] // v128float8 test_insert (v128float8 a, int idx, v64float8 b) { return insert(a, idx, b); } @@ -741,19 +553,13 @@ v128float8 test_insert (v128float8 a, int idx, v64float8 b) { return insert(a, i // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64FLOAT8:%.*]] [[B_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[TMP0]] to <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V128FLOAT8I9V64FLOAT8_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V128FLOAT8I9V64FLOAT8_EXIT]] -// CHECK: _ZL14set_v128float8i9v64float8.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128FLOAT8:%.*]] poison, <128 x i8> [[TMP3]], 0 +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V128FLOAT8:%.*]] poison, <128 x i8> [[TMP2]], 0 // CHECK-NEXT: ret [[STRUCT_V128FLOAT8]] [[DOTFCA_0_INSERT_I]] // v128float8 test_set_v128float8 (int idx, v64float8 b) { return set_v128float8(idx, b); } @@ -773,28 +579,10 @@ v128float8 test_concat (v64float8 a0, v64float8 a1) { return concat(a0, a1); } // CHECK-LABEL: @_Z22test_extract_v8float16Dv32_7float16i( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x half> [[A:%.*]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX:%.*]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V8FLOAT16DV32_7FLOAT16I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V8FLOAT16DV32_7FLOAT16I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V8FLOAT16DV32_7FLOAT16I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V8FLOAT16DV32_7FLOAT16I_EXIT]] -// CHECK: _ZL17extract_v8float16Dv32_7float16i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <8 x half> -// CHECK-NEXT: ret <8 x half> [[TMP1]] +// CHECK-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX:%.*]]) +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <8 x half> +// CHECK-NEXT: ret <8 x half> [[TMP2]] // v8float16 test_extract_v8float16 ( v32float16 a, int idx ) { return extract_v8float16(a, idx); } // CHECK-LABEL: @_Z19test_set_v32float16iDv8_7float16( @@ -833,15 +621,9 @@ v32float16 test_set_v32float16 ( int idx, v8float16 a ) { return set_v32float16( // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x half> [[A:%.*]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX:%.*]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V8FLOAT16DV16_7FLOAT16I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V8FLOAT16DV16_7FLOAT16I_EXIT]] -// CHECK: _ZL17extract_v8float16Dv16_7float16i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <8 x half> // CHECK-NEXT: ret <8 x half> [[TMP2]] // @@ -851,15 +633,9 @@ v8float16 test_extract_v8float16 ( v16float16 a, int idx ) { return extract_v8fl // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[A:%.*]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX:%.*]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V16FLOAT16IDV8_7FLOAT16_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V16FLOAT16IDV8_7FLOAT16_EXIT]] -// CHECK: _ZL14set_v16float16iDv8_7float16.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x half> // CHECK-NEXT: ret <16 x half> [[TMP2]] // @@ -894,6 +670,7 @@ v16float16 test_set_v16float16 (int idx, v8float16 a ) { return set_v16float16(i // CHECK-NEXT: ret <32 x half> [[TMP2]] // v32float16 test_insert (v32float16 v, int idx, v8float16 b ) { return insert(v, idx, b); } +// // CHECK-LABEL: @_Z11test_insertDv16_7float16iDv8_S_( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x half> [[A:%.*]] to <8 x i32> @@ -901,19 +678,14 @@ v32float16 test_insert (v32float16 v, int idx, v8float16 b ) { return insert(v, // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX:%.*]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_7FLOAT16IDV8_S__EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_7FLOAT16IDV8_S__EXIT]] -// CHECK: _ZL6insertDv16_7float16iDv8_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x half> // CHECK-NEXT: ret <16 x half> [[TMP3]] // v16float16 test_insert (v16float16 a, int idx, v8float16 b ) { return insert(a, idx, b); } +// // CHECK-LABEL: @_Z11test_concatDv8_7float16S0_( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[V0:%.*]] to <4 x i32> @@ -944,28 +716,10 @@ v32float16 test_concat (v8float16 v0, v8float16 v1, v8float16 v2, v8float16 v3 ) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64BFLOAT8:%.*]] [[A_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[TMP0]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX:%.*]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V16BFLOAT810V64BFLOAT8I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V16BFLOAT810V64BFLOAT8I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V16BFLOAT810V64BFLOAT8I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V16BFLOAT810V64BFLOAT8I_EXIT]] -// CHECK: _ZL18extract_v16bfloat810v64bfloat8i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V16BFLOAT8:%.*]] poison, <16 x i8> [[TMP2]], 0 +// CHECK-NEXT: [[TMP2:%.*]] = tail call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> [[TMP1]], i32 [[IDX:%.*]]) +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP2]], <16 x i32> poison, <4 x i32> +// CHECK-NEXT: [[TMP3:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <16 x i8> +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V16BFLOAT8:%.*]] poison, <16 x i8> [[TMP3]], 0 // CHECK-NEXT: ret [[STRUCT_V16BFLOAT8]] [[DOTFCA_0_INSERT_I]] // v16bfloat8 test_extract_v16bfloat8 ( v64bfloat8 a, int idx ) { return extract_v16bfloat8(a, idx); } @@ -973,28 +727,10 @@ v16bfloat8 test_extract_v16bfloat8 ( v64bfloat8 a, int idx ) { return extract_v1 // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64FLOAT8:%.*]] [[A_COERCE:%.*]], 0 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[TMP0]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX:%.*]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16FLOAT89V64FLOAT8I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16FLOAT89V64FLOAT8I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16FLOAT89V64FLOAT8I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16FLOAT89V64FLOAT8I_EXIT]] -// CHECK: _ZL17extract_v16float89v64float8i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> -// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V16FLOAT8:%.*]] poison, <16 x i8> [[TMP2]], 0 +// CHECK-NEXT: [[TMP2:%.*]] = tail call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> [[TMP1]], i32 [[IDX:%.*]]) +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP2]], <16 x i32> poison, <4 x i32> +// CHECK-NEXT: [[TMP3:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <16 x i8> +// CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V16FLOAT8:%.*]] poison, <16 x i8> [[TMP3]], 0 // CHECK-NEXT: ret [[STRUCT_V16FLOAT8]] [[DOTFCA_0_INSERT_I]] // v16float8 test_extract_v16float8 ( v64float8 a, int idx ) { return extract_v16float8(a, idx); } @@ -1071,15 +807,9 @@ v64float8 test_set_v64float8 ( int idx, v16float8 a ) { return set_v64float8(idx // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[TMP0]] to <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX:%.*]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V16BFLOAT810V32BFLOAT8I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V16BFLOAT810V32BFLOAT8I_EXIT]] -// CHECK: _ZL18extract_v16bfloat810v32bfloat8i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> // CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V16BFLOAT8:%.*]] poison, <16 x i8> [[TMP3]], 0 // CHECK-NEXT: ret [[STRUCT_V16BFLOAT8]] [[DOTFCA_0_INSERT_I]] @@ -1091,15 +821,9 @@ v16bfloat8 test_extract_v16bfloat8 ( v32bfloat8 a, int idx ) { return extract_v1 // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[TMP0]] to <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX:%.*]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16FLOAT89V32FLOAT8I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16FLOAT89V32FLOAT8I_EXIT]] -// CHECK: _ZL17extract_v16float89v32float8i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> // CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V16FLOAT8:%.*]] poison, <16 x i8> [[TMP3]], 0 // CHECK-NEXT: ret [[STRUCT_V16FLOAT8]] [[DOTFCA_0_INSERT_I]] @@ -1111,15 +835,9 @@ v16float8 test_extract_v16float8 ( v32float8 a, int idx ) { return extract_v16fl // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX:%.*]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V32BFLOAT8I10V16BFLOAT8_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL14SET_V32BFLOAT8I10V16BFLOAT8_EXIT]] -// CHECK: _ZL14set_v32bfloat8i10v16bfloat8.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V32BFLOAT8:%.*]] poison, <32 x i8> [[TMP3]], 0 // CHECK-NEXT: ret [[STRUCT_V32BFLOAT8]] [[DOTFCA_0_INSERT_I]] @@ -1131,15 +849,9 @@ v32bfloat8 test_set_v32bfloat8 (int idx, v16bfloat8 a ) { return set_v32bfloat8( // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX:%.*]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32FLOAT8I9V16FLOAT8_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32FLOAT8I9V16FLOAT8_EXIT]] -// CHECK: _ZL13set_v32float8i9v16float8.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V32FLOAT8:%.*]] poison, <32 x i8> [[TMP3]], 0 // CHECK-NEXT: ret [[STRUCT_V32FLOAT8]] [[DOTFCA_0_INSERT_I]] @@ -1224,15 +936,9 @@ v64float8 test_insert (v64float8 v, int idx, v16float8 b ) { return insert(v, id // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP4:%.*]] = and i32 [[IDX:%.*]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP4]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP2]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT10V32BFLOAT8I10V16BFLOAT8_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT10V32BFLOAT8I10V16BFLOAT8_EXIT]] -// CHECK: _ZL6insert10v32bfloat8i10v16bfloat8.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP5:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V32BFLOAT8]] poison, <32 x i8> [[TMP5]], 0 // CHECK-NEXT: ret [[STRUCT_V32BFLOAT8]] [[DOTFCA_0_INSERT_I]] @@ -1247,15 +953,9 @@ v32bfloat8 test_insert (v32bfloat8 a, int idx, v16bfloat8 b ) { return insert(a, // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP4:%.*]] = and i32 [[IDX:%.*]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP4]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP2]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT9V32FLOAT8I9V16FLOAT8_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERT9V32FLOAT8I9V16FLOAT8_EXIT]] -// CHECK: _ZL6insert9v32float8i9v16float8.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP5:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: [[DOTFCA_0_INSERT_I:%.*]] = insertvalue [[STRUCT_V32FLOAT8]] poison, <32 x i8> [[TMP5]], 0 // CHECK-NEXT: ret [[STRUCT_V32FLOAT8]] [[DOTFCA_0_INSERT_I]] @@ -1279,6 +979,7 @@ v32float8 test_insert (v32float8 a, int idx, v16float8 b ) { return insert(a, id // CHECK-NEXT: ret [[STRUCT_V64BFLOAT8]] [[DOTFCA_0_INSERT_I]] // v64bfloat8 test_concat (v16bfloat8 v0, v16bfloat8 v1, v16bfloat8 v2, v16bfloat8 v3 ) { return concat(v0, v1, v2, v3); } +// // CHECK-LABEL: @_Z11test_concat9v16float8S_S_S_( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V16FLOAT8:%.*]] [[V0_COERCE:%.*]], 0 @@ -1297,6 +998,7 @@ v64bfloat8 test_concat (v16bfloat8 v0, v16bfloat8 v1, v16bfloat8 v2, v16bfloat8 // CHECK-NEXT: ret [[STRUCT_V64FLOAT8]] [[DOTFCA_0_INSERT_I]] // v64float8 test_concat (v16float8 v0, v16float8 v1, v16float8 v2, v16float8 v3 ) { return concat(v0, v1, v2, v3); } +// // CHECK-LABEL: @_Z11test_concat10v16bfloat8S_( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V16BFLOAT8:%.*]] [[V0_COERCE:%.*]], 0 @@ -1359,19 +1061,13 @@ v4int8 test_extract_prime (v64mx9 m, int idx) { return extract_prime(m, idx); } // CHECK-LABEL: @_Z20test_extract_v32int86v64mx9i( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V64MX9:%.*]] [[M_COERCE:%.*]], 0 -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX:%.*]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT86V64MX9I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT86V64MX9I_EXIT]] -// CHECK: _ZL15extract_v32int86v64mx9i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> -// CHECK-NEXT: ret <32 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX:%.*]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <32 x i8> +// CHECK-NEXT: ret <32 x i8> [[TMP1]] // v32int8 test_extract_v32int8 (v64mx9 m, int idx) { return extract_v32int8(m, idx); } // CHECK-LABEL: @_Z20test_extract_v64int87v128mx9i( @@ -1512,7 +1208,6 @@ v128mx9 test_concat (v64mx9 v0, v64mx9 v1) { return concat(v0, v1); } // CHECK-NEXT: ret [[STRUCT_V128MX9]] [[CALL6_PN_I]] // v128mx9 test_insert (v128mx9 m, int idx, int exp) { return insert(m, idx, exp); } -// // CHECK-LABEL: @_Z11test_insert7v128mx9iDv4_a( // CHECK-NEXT: entry: // CHECK-NEXT: [[CMP_I:%.*]] = icmp slt i32 [[IDX:%.*]], 2 @@ -1634,6 +1329,7 @@ v128mx9 test_extract_v128mx9 (v256mx9 a, int idx) { return extract_v128mx9(a, id // CHECK-NEXT: ret [[STRUCT_V128MX9]] [[DOTPN_I_I]] // v128bfp16p test_extract_v128bfp16p (v256bfp16p a, int idx) { return extract_v128bfp16p(a, idx); } +// // CHECK-LABEL: @_Z11test_insert7v256mx9i6v64mx9( // CHECK-NEXT: entry: // CHECK-NEXT: unreachable @@ -1697,6 +1393,7 @@ int test_extract_expo (v64mx6 m, int idx) { return extract_expo(m, idx); } // CHECK-NEXT: ret [[STRUCT_V64MX6]] [[DOTFCA_3_INSERT_I]] // v64mx6 test_insert (v64mx6 m, int idx, int expo) { return insert(m, idx, expo); } +// // CHECK-LABEL: @_Z17test_extract_expo6v64mx4i( // CHECK-NEXT: entry: // CHECK-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[IDX:%.*]], 0 @@ -1718,6 +1415,7 @@ int test_extract_expo (v64mx4 m, int idx) { return extract_expo(m, idx); } // CHECK-NEXT: ret [[STRUCT_V64MX4]] [[DOTFCA_3_INSERT_I]] // v64mx4 test_insert (v64mx4 m, int idx, int expo) { return insert(m, idx, expo); } +// // CHECK-LABEL: @_Z25test_extract_msb_v16uint47v256mx6i( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V256MX6:%.*]] [[M_COERCE:%.*]], 5 @@ -1744,23 +1442,32 @@ v16uint4 test_extract_msb_v16uint4 (v256mx6 m, int idx) { return extract_msb_v16 // CHECK-LABEL: @_Z25test_extract_msb_v32uint47v256mx6i( // CHECK-NEXT: entry: // CHECK-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[IDX:%.*]], 0 -// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V256MX6:%.*]] [[M_COERCE:%.*]], 7 -// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V256MX6]] [[M_COERCE]], 6 -// CHECK-NEXT: [[TMP2:%.*]] = extractvalue [[STRUCT_V256MX6]] [[M_COERCE]], 5 -// CHECK-NEXT: [[TMP3:%.*]] = extractvalue [[STRUCT_V256MX6]] [[M_COERCE]], 4 -// CHECK-NEXT: [[DOTSINK63_I:%.*]] = select i1 [[CMP_I]], <2 x i32> [[TMP3]], <2 x i32> [[TMP1]] -// CHECK-NEXT: [[DOTSINK61_I:%.*]] = select i1 [[CMP_I]], <2 x i32> [[TMP2]], <2 x i32> [[TMP0]] -// CHECK-NEXT: [[TMP4:%.*]] = bitcast <2 x i32> [[DOTSINK63_I]] to <8 x i8> -// CHECK-NEXT: [[TMP5:%.*]] = shufflevector <8 x i8> [[TMP4]], <8 x i8> poison, <16 x i32> -// CHECK-NEXT: [[TMP6:%.*]] = shufflevector <8 x i8> [[TMP4]], <8 x i8> poison, <16 x i32> -// CHECK-NEXT: [[TMP7:%.*]] = bitcast <2 x i32> [[DOTSINK61_I]] to <8 x i8> -// CHECK-NEXT: [[TMP8:%.*]] = shufflevector <8 x i8> [[TMP7]], <8 x i8> poison, <16 x i32> -// CHECK-NEXT: [[TMP9:%.*]] = shufflevector <8 x i8> [[TMP7]], <8 x i8> poison, <16 x i32> -// CHECK-NEXT: [[TMP10:%.*]] = shufflevector <16 x i8> [[TMP5]], <16 x i8> , <16 x i32> -// CHECK-NEXT: [[TMP11:%.*]] = shufflevector <16 x i8> [[TMP10]], <16 x i8> [[TMP6]], <16 x i32> -// CHECK-NEXT: [[TMP12:%.*]] = shufflevector <16 x i8> [[TMP11]], <16 x i8> [[TMP8]], <16 x i32> -// CHECK-NEXT: [[VECINIT50_I:%.*]] = shufflevector <16 x i8> [[TMP12]], <16 x i8> [[TMP9]], <16 x i32> -// CHECK-NEXT: ret <16 x i8> [[VECINIT50_I]] +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V256MX6:%.*]] [[M_COERCE:%.*]], 5 +// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V256MX6]] [[M_COERCE]], 4 +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i32> [[TMP1]] to <8 x i8> +// CHECK-NEXT: [[TMP3:%.*]] = shufflevector <8 x i8> [[TMP2]], <8 x i8> poison, <16 x i32> +// CHECK-NEXT: [[TMP4:%.*]] = shufflevector <8 x i8> [[TMP2]], <8 x i8> poison, <16 x i32> +// CHECK-NEXT: [[TMP5:%.*]] = bitcast <2 x i32> [[TMP0]] to <8 x i8> +// CHECK-NEXT: [[TMP6:%.*]] = shufflevector <8 x i8> [[TMP5]], <8 x i8> poison, <16 x i32> +// CHECK-NEXT: [[TMP7:%.*]] = shufflevector <8 x i8> [[TMP5]], <8 x i8> poison, <16 x i32> +// CHECK-NEXT: [[TMP8:%.*]] = shufflevector <16 x i8> [[TMP3]], <16 x i8> , <16 x i32> +// CHECK-NEXT: [[TMP9:%.*]] = shufflevector <16 x i8> [[TMP8]], <16 x i8> [[TMP4]], <16 x i32> +// CHECK-NEXT: [[TMP10:%.*]] = shufflevector <16 x i8> [[TMP9]], <16 x i8> [[TMP6]], <16 x i32> +// CHECK-NEXT: [[VECINIT23_I:%.*]] = shufflevector <16 x i8> [[TMP10]], <16 x i8> [[TMP7]], <16 x i32> +// CHECK-NEXT: [[TMP11:%.*]] = extractvalue [[STRUCT_V256MX6]] [[M_COERCE]], 7 +// CHECK-NEXT: [[TMP12:%.*]] = extractvalue [[STRUCT_V256MX6]] [[M_COERCE]], 6 +// CHECK-NEXT: [[TMP13:%.*]] = bitcast <2 x i32> [[TMP12]] to <8 x i8> +// CHECK-NEXT: [[TMP14:%.*]] = shufflevector <8 x i8> [[TMP13]], <8 x i8> poison, <16 x i32> +// CHECK-NEXT: [[TMP15:%.*]] = shufflevector <8 x i8> [[TMP13]], <8 x i8> poison, <16 x i32> +// CHECK-NEXT: [[TMP16:%.*]] = bitcast <2 x i32> [[TMP11]] to <8 x i8> +// CHECK-NEXT: [[TMP17:%.*]] = shufflevector <8 x i8> [[TMP16]], <8 x i8> poison, <16 x i32> +// CHECK-NEXT: [[TMP18:%.*]] = shufflevector <8 x i8> [[TMP16]], <8 x i8> poison, <16 x i32> +// CHECK-NEXT: [[TMP19:%.*]] = shufflevector <16 x i8> [[TMP14]], <16 x i8> , <16 x i32> +// CHECK-NEXT: [[TMP20:%.*]] = shufflevector <16 x i8> [[TMP19]], <16 x i8> [[TMP15]], <16 x i32> +// CHECK-NEXT: [[TMP21:%.*]] = shufflevector <16 x i8> [[TMP20]], <16 x i8> [[TMP17]], <16 x i32> +// CHECK-NEXT: [[VECINIT50_I:%.*]] = shufflevector <16 x i8> [[TMP21]], <16 x i8> [[TMP18]], <16 x i32> +// CHECK-NEXT: [[RETVAL_0_I:%.*]] = select i1 [[CMP_I]], <16 x i8> [[VECINIT23_I]], <16 x i8> [[VECINIT50_I]] +// CHECK-NEXT: ret <16 x i8> [[RETVAL_0_I]] // v32uint4 test_extract_msb_v32uint4 (v256mx6 m, int idx) { return extract_msb_v32uint4(m, idx); } // CHECK-LABEL: @_Z11test_update7v256mx6iDv8_DU8_( @@ -1809,6 +1516,7 @@ v32uint4 test_extract_msb_v32uint4 (v256mx6 m, int idx) { return extract_msb_v32 // CHECK-NEXT: ret [[STRUCT_V256MX6]] [[DOTFCA_15_INSERT_I]] // v256mx6 test_update (v256mx6 s, int idx, v16uint4 m) { return update(s, idx, m); } +// // CHECK-LABEL: @_Z11test_update7v256mx6iDv16_DU8_( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[M:%.*]] to <4 x i32> @@ -2120,13 +1828,13 @@ v256mx6 test_update (v256mx6 s, int idx, v64uint4 m) { return update(s, idx, m); // CHECK-NEXT: [[TMP2:%.*]] = extractvalue [[STRUCT_V256MX6]] [[S_COERCE]], 3 // CHECK-NEXT: [[TMP3:%.*]] = bitcast <64 x i8> [[M:%.*]] to <16 x i32> // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP3]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP3]], <16 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE1_I28_I:%.*]] = shufflevector <16 x i32> [[TMP3]], <16 x i32> poison, <8 x i32> // CHECK-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[IDX:%.*]], 0 // CHECK-NEXT: [[TMP4:%.*]] = extractvalue [[STRUCT_V256MX6]] [[S_COERCE]], 0 // CHECK-NEXT: [[COND_I:%.*]] = select i1 [[CMP_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP4]] -// CHECK-NEXT: [[COND7_I:%.*]] = select i1 [[CMP_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[TMP0]] +// CHECK-NEXT: [[COND7_I:%.*]] = select i1 [[CMP_I]], <8 x i32> [[SHUFFLE1_I28_I]], <8 x i32> [[TMP0]] // CHECK-NEXT: [[COND13_I:%.*]] = select i1 [[CMP_I]], <8 x i32> [[TMP1]], <8 x i32> [[SHUFFLE_I_I]] -// CHECK-NEXT: [[COND19_I:%.*]] = select i1 [[CMP_I]], <8 x i32> [[TMP2]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND19_I:%.*]] = select i1 [[CMP_I]], <8 x i32> [[TMP2]], <8 x i32> [[SHUFFLE1_I28_I]] // CHECK-NEXT: [[TMP5:%.*]] = extractvalue [[STRUCT_V256MX6]] [[S_COERCE]], 15 // CHECK-NEXT: [[TMP6:%.*]] = extractvalue [[STRUCT_V256MX6]] [[S_COERCE]], 14 // CHECK-NEXT: [[TMP7:%.*]] = extractvalue [[STRUCT_V256MX6]] [[S_COERCE]], 13 @@ -2593,23 +2301,32 @@ v16uint4 test_extract_msb_v16uint4 (v256mx4 m, int idx) { return extract_msb_v16 // CHECK-LABEL: @_Z25test_extract_msb_v32uint47v256mx4i( // CHECK-NEXT: entry: // CHECK-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[IDX:%.*]], 0 -// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V256MX4:%.*]] [[M_COERCE:%.*]], 7 -// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V256MX4]] [[M_COERCE]], 6 -// CHECK-NEXT: [[TMP2:%.*]] = extractvalue [[STRUCT_V256MX4]] [[M_COERCE]], 5 -// CHECK-NEXT: [[TMP3:%.*]] = extractvalue [[STRUCT_V256MX4]] [[M_COERCE]], 4 -// CHECK-NEXT: [[DOTSINK63_I:%.*]] = select i1 [[CMP_I]], <2 x i32> [[TMP3]], <2 x i32> [[TMP1]] -// CHECK-NEXT: [[DOTSINK61_I:%.*]] = select i1 [[CMP_I]], <2 x i32> [[TMP2]], <2 x i32> [[TMP0]] -// CHECK-NEXT: [[TMP4:%.*]] = bitcast <2 x i32> [[DOTSINK63_I]] to <8 x i8> -// CHECK-NEXT: [[TMP5:%.*]] = shufflevector <8 x i8> [[TMP4]], <8 x i8> poison, <16 x i32> -// CHECK-NEXT: [[TMP6:%.*]] = shufflevector <8 x i8> [[TMP4]], <8 x i8> poison, <16 x i32> -// CHECK-NEXT: [[TMP7:%.*]] = bitcast <2 x i32> [[DOTSINK61_I]] to <8 x i8> -// CHECK-NEXT: [[TMP8:%.*]] = shufflevector <8 x i8> [[TMP7]], <8 x i8> poison, <16 x i32> -// CHECK-NEXT: [[TMP9:%.*]] = shufflevector <8 x i8> [[TMP7]], <8 x i8> poison, <16 x i32> -// CHECK-NEXT: [[TMP10:%.*]] = shufflevector <16 x i8> [[TMP5]], <16 x i8> , <16 x i32> -// CHECK-NEXT: [[TMP11:%.*]] = shufflevector <16 x i8> [[TMP10]], <16 x i8> [[TMP6]], <16 x i32> -// CHECK-NEXT: [[TMP12:%.*]] = shufflevector <16 x i8> [[TMP11]], <16 x i8> [[TMP8]], <16 x i32> -// CHECK-NEXT: [[VECINIT50_I:%.*]] = shufflevector <16 x i8> [[TMP12]], <16 x i8> [[TMP9]], <16 x i32> -// CHECK-NEXT: ret <16 x i8> [[VECINIT50_I]] +// CHECK-NEXT: [[TMP0:%.*]] = extractvalue [[STRUCT_V256MX4:%.*]] [[M_COERCE:%.*]], 5 +// CHECK-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_V256MX4]] [[M_COERCE]], 4 +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i32> [[TMP1]] to <8 x i8> +// CHECK-NEXT: [[TMP3:%.*]] = shufflevector <8 x i8> [[TMP2]], <8 x i8> poison, <16 x i32> +// CHECK-NEXT: [[TMP4:%.*]] = shufflevector <8 x i8> [[TMP2]], <8 x i8> poison, <16 x i32> +// CHECK-NEXT: [[TMP5:%.*]] = bitcast <2 x i32> [[TMP0]] to <8 x i8> +// CHECK-NEXT: [[TMP6:%.*]] = shufflevector <8 x i8> [[TMP5]], <8 x i8> poison, <16 x i32> +// CHECK-NEXT: [[TMP7:%.*]] = shufflevector <8 x i8> [[TMP5]], <8 x i8> poison, <16 x i32> +// CHECK-NEXT: [[TMP8:%.*]] = shufflevector <16 x i8> [[TMP3]], <16 x i8> , <16 x i32> +// CHECK-NEXT: [[TMP9:%.*]] = shufflevector <16 x i8> [[TMP8]], <16 x i8> [[TMP4]], <16 x i32> +// CHECK-NEXT: [[TMP10:%.*]] = shufflevector <16 x i8> [[TMP9]], <16 x i8> [[TMP6]], <16 x i32> +// CHECK-NEXT: [[VECINIT23_I:%.*]] = shufflevector <16 x i8> [[TMP10]], <16 x i8> [[TMP7]], <16 x i32> +// CHECK-NEXT: [[TMP11:%.*]] = extractvalue [[STRUCT_V256MX4]] [[M_COERCE]], 7 +// CHECK-NEXT: [[TMP12:%.*]] = extractvalue [[STRUCT_V256MX4]] [[M_COERCE]], 6 +// CHECK-NEXT: [[TMP13:%.*]] = bitcast <2 x i32> [[TMP12]] to <8 x i8> +// CHECK-NEXT: [[TMP14:%.*]] = shufflevector <8 x i8> [[TMP13]], <8 x i8> poison, <16 x i32> +// CHECK-NEXT: [[TMP15:%.*]] = shufflevector <8 x i8> [[TMP13]], <8 x i8> poison, <16 x i32> +// CHECK-NEXT: [[TMP16:%.*]] = bitcast <2 x i32> [[TMP11]] to <8 x i8> +// CHECK-NEXT: [[TMP17:%.*]] = shufflevector <8 x i8> [[TMP16]], <8 x i8> poison, <16 x i32> +// CHECK-NEXT: [[TMP18:%.*]] = shufflevector <8 x i8> [[TMP16]], <8 x i8> poison, <16 x i32> +// CHECK-NEXT: [[TMP19:%.*]] = shufflevector <16 x i8> [[TMP14]], <16 x i8> , <16 x i32> +// CHECK-NEXT: [[TMP20:%.*]] = shufflevector <16 x i8> [[TMP19]], <16 x i8> [[TMP15]], <16 x i32> +// CHECK-NEXT: [[TMP21:%.*]] = shufflevector <16 x i8> [[TMP20]], <16 x i8> [[TMP17]], <16 x i32> +// CHECK-NEXT: [[VECINIT50_I:%.*]] = shufflevector <16 x i8> [[TMP21]], <16 x i8> [[TMP18]], <16 x i32> +// CHECK-NEXT: [[RETVAL_0_I:%.*]] = select i1 [[CMP_I]], <16 x i8> [[VECINIT23_I]], <16 x i8> [[VECINIT50_I]] +// CHECK-NEXT: ret <16 x i8> [[RETVAL_0_I]] // v32uint4 test_extract_msb_v32uint4 (v256mx4 m, int idx) { return extract_msb_v32uint4(m, idx); } // CHECK-LABEL: @_Z11test_update7v256mx4iDv8_DU8_( @@ -2658,7 +2375,6 @@ v32uint4 test_extract_msb_v32uint4 (v256mx4 m, int idx) { return extract_msb_v32 // CHECK-NEXT: ret [[STRUCT_V256MX4]] [[DOTFCA_15_INSERT_I]] // v256mx4 test_update (v256mx4 s, int idx, v16uint4 m) { return update(s, idx, m); } -// // CHECK-LABEL: @_Z11test_update7v256mx4iDv16_DU8_( // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[M:%.*]] to <4 x i32> @@ -2970,13 +2686,13 @@ v256mx4 test_update (v256mx4 s, int idx, v64uint4 m) { return update(s, idx, m); // CHECK-NEXT: [[TMP2:%.*]] = extractvalue [[STRUCT_V256MX4]] [[S_COERCE]], 3 // CHECK-NEXT: [[TMP3:%.*]] = bitcast <64 x i8> [[M:%.*]] to <16 x i32> // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP3]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP3]], <16 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE1_I28_I:%.*]] = shufflevector <16 x i32> [[TMP3]], <16 x i32> poison, <8 x i32> // CHECK-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[IDX:%.*]], 0 // CHECK-NEXT: [[TMP4:%.*]] = extractvalue [[STRUCT_V256MX4]] [[S_COERCE]], 0 // CHECK-NEXT: [[COND_I:%.*]] = select i1 [[CMP_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP4]] -// CHECK-NEXT: [[COND7_I:%.*]] = select i1 [[CMP_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[TMP0]] +// CHECK-NEXT: [[COND7_I:%.*]] = select i1 [[CMP_I]], <8 x i32> [[SHUFFLE1_I28_I]], <8 x i32> [[TMP0]] // CHECK-NEXT: [[COND13_I:%.*]] = select i1 [[CMP_I]], <8 x i32> [[TMP1]], <8 x i32> [[SHUFFLE_I_I]] -// CHECK-NEXT: [[COND19_I:%.*]] = select i1 [[CMP_I]], <8 x i32> [[TMP2]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND19_I:%.*]] = select i1 [[CMP_I]], <8 x i32> [[TMP2]], <8 x i32> [[SHUFFLE1_I28_I]] // CHECK-NEXT: [[TMP5:%.*]] = extractvalue [[STRUCT_V256MX4]] [[S_COERCE]], 15 // CHECK-NEXT: [[TMP6:%.*]] = extractvalue [[STRUCT_V256MX4]] [[S_COERCE]], 14 // CHECK-NEXT: [[TMP7:%.*]] = extractvalue [[STRUCT_V256MX4]] [[S_COERCE]], 13 diff --git a/clang/test/CodeGen/aie/common-tests/aie-nlf-intrinsic.cpp b/clang/test/CodeGen/aie/common-tests/aie-nlf-intrinsic.cpp index 7543d4651e65..ad56de8235c2 100644 --- a/clang/test/CodeGen/aie/common-tests/aie-nlf-intrinsic.cpp +++ b/clang/test/CodeGen/aie/common-tests/aie-nlf-intrinsic.cpp @@ -19,8 +19,8 @@ // AIE2P-NEXT: [[TMP3:%.*]] = shufflevector <32 x float> [[A]], <32 x float> poison, <16 x i32> // AIE2P-NEXT: [[TMP4:%.*]] = tail call noundef <16 x bfloat> @llvm.aie2p.exp2(<16 x float> [[TMP3]]) // AIE2P-NEXT: [[TMP5:%.*]] = bitcast <16 x bfloat> [[TMP4]] to <8 x i32> -// AIE2P-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> [[TMP5]], <16 x i32> -// AIE2P-NEXT: [[TMP6:%.*]] = bitcast <16 x i32> [[SHUFFLE2_I_I_I]] to <32 x bfloat> +// AIE2P-NEXT: [[SHUFFLE2_I_I16_I:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> [[TMP5]], <16 x i32> +// AIE2P-NEXT: [[TMP6:%.*]] = bitcast <16 x i32> [[SHUFFLE2_I_I16_I]] to <32 x bfloat> // AIE2P-NEXT: ret <32 x bfloat> [[TMP6]] // // AIE2PS-LABEL: @_Z9test_exp2Dv32_u10__accfloat( @@ -32,8 +32,8 @@ // AIE2PS-NEXT: [[TMP4:%.*]] = shufflevector <32 x float> [[TMP0]], <32 x float> poison, <16 x i32> // AIE2PS-NEXT: [[TMP5:%.*]] = tail call <16 x bfloat> @llvm.aie2ps.exp2(<16 x float> [[TMP4]]) // AIE2PS-NEXT: [[TMP6:%.*]] = bitcast <16 x bfloat> [[TMP5]] to <8 x i32> -// AIE2PS-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> [[TMP6]], <16 x i32> -// AIE2PS-NEXT: [[TMP7:%.*]] = bitcast <16 x i32> [[SHUFFLE2_I_I_I]] to <32 x bfloat> +// AIE2PS-NEXT: [[SHUFFLE2_I_I18_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> [[TMP6]], <16 x i32> +// AIE2PS-NEXT: [[TMP7:%.*]] = bitcast <16 x i32> [[SHUFFLE2_I_I18_I]] to <32 x bfloat> // AIE2PS-NEXT: ret <32 x bfloat> [[TMP7]] // v32bfloat16 test_exp2(v32accfloat a) { @@ -46,7 +46,7 @@ v32bfloat16 test_exp2(v32accfloat a) { // // AIE2PS-LABEL: @_Z9test_exp2Dv16_u10__accfloat( // AIE2PS-NEXT: entry: -// AIE2PS-NEXT: [[TMP0:%.*]] = shufflevector <16 x float> [[A:%.*]], <16 x float> undef, <32 x i32> +// AIE2PS-NEXT: [[TMP0:%.*]] = shufflevector <16 x float> [[A:%.*]], <16 x float> poison, <32 x i32> // AIE2PS-NEXT: [[TMP1:%.*]] = tail call noundef <32 x float> @llvm.aie2ps.ACC1024.accfloat.add.conf(<32 x float> [[TMP0]], <32 x float> , i32 60) // AIE2PS-NEXT: [[TMP2:%.*]] = shufflevector <32 x float> [[TMP1]], <32 x float> poison, <16 x i32> // AIE2PS-NEXT: [[TMP3:%.*]] = tail call noundef <16 x bfloat> @llvm.aie2ps.exp2(<16 x float> [[TMP2]]) @@ -63,8 +63,8 @@ v16bfloat16 test_exp2(v16accfloat a) { // AIE2P-NEXT: [[TMP3:%.*]] = shufflevector <32 x float> [[A]], <32 x float> poison, <16 x i32> // AIE2P-NEXT: [[TMP4:%.*]] = tail call noundef <16 x bfloat> @llvm.aie2p.exp2(<16 x float> [[TMP3]]) // AIE2P-NEXT: [[TMP5:%.*]] = bitcast <16 x bfloat> [[TMP4]] to <8 x i32> -// AIE2P-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> [[TMP5]], <16 x i32> -// AIE2P-NEXT: [[TMP6:%.*]] = bitcast <16 x i32> [[SHUFFLE2_I_I_I]] to <32 x bfloat> +// AIE2P-NEXT: [[SHUFFLE2_I_I16_I:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> [[TMP5]], <16 x i32> +// AIE2P-NEXT: [[TMP6:%.*]] = bitcast <16 x i32> [[SHUFFLE2_I_I16_I]] to <32 x bfloat> // AIE2P-NEXT: ret <32 x bfloat> [[TMP6]] // // AIE2PS-LABEL: @_Z9test_exp2Dv32_f( @@ -76,8 +76,8 @@ v16bfloat16 test_exp2(v16accfloat a) { // AIE2PS-NEXT: [[TMP4:%.*]] = shufflevector <32 x float> [[TMP0]], <32 x float> poison, <16 x i32> // AIE2PS-NEXT: [[TMP5:%.*]] = tail call <16 x bfloat> @llvm.aie2ps.exp2(<16 x float> [[TMP4]]) // AIE2PS-NEXT: [[TMP6:%.*]] = bitcast <16 x bfloat> [[TMP5]] to <8 x i32> -// AIE2PS-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> [[TMP6]], <16 x i32> -// AIE2PS-NEXT: [[TMP7:%.*]] = bitcast <16 x i32> [[SHUFFLE2_I_I_I]] to <32 x bfloat> +// AIE2PS-NEXT: [[SHUFFLE2_I_I18_I:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> [[TMP6]], <16 x i32> +// AIE2PS-NEXT: [[TMP7:%.*]] = bitcast <16 x i32> [[SHUFFLE2_I_I18_I]] to <32 x bfloat> // AIE2PS-NEXT: ret <32 x bfloat> [[TMP7]] // v32bfloat16 test_exp2(v32float a) { @@ -90,7 +90,7 @@ v32bfloat16 test_exp2(v32float a) { // // AIE2PS-LABEL: @_Z9test_exp2Dv16_f( // AIE2PS-NEXT: entry: -// AIE2PS-NEXT: [[TMP0:%.*]] = shufflevector <16 x float> [[A:%.*]], <16 x float> undef, <32 x i32> +// AIE2PS-NEXT: [[TMP0:%.*]] = shufflevector <16 x float> [[A:%.*]], <16 x float> poison, <32 x i32> // AIE2PS-NEXT: [[TMP1:%.*]] = tail call noundef <32 x float> @llvm.aie2ps.ACC1024.accfloat.add.conf(<32 x float> [[TMP0]], <32 x float> , i32 60) // AIE2PS-NEXT: [[TMP2:%.*]] = shufflevector <32 x float> [[TMP1]], <32 x float> poison, <16 x i32> // AIE2PS-NEXT: [[TMP3:%.*]] = tail call noundef <16 x bfloat> @llvm.aie2ps.exp2(<16 x float> [[TMP2]]) @@ -107,8 +107,8 @@ v16bfloat16 test_exp2(v16float a) { // AIE2P-NEXT: [[TMP3:%.*]] = shufflevector <32 x float> [[A]], <32 x float> poison, <16 x i32> // AIE2P-NEXT: [[TMP4:%.*]] = tail call noundef <16 x bfloat> @llvm.aie2p.tanh(<16 x float> [[TMP3]]) // AIE2P-NEXT: [[TMP5:%.*]] = bitcast <16 x bfloat> [[TMP4]] to <8 x i32> -// AIE2P-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> [[TMP5]], <16 x i32> -// AIE2P-NEXT: [[TMP6:%.*]] = bitcast <16 x i32> [[SHUFFLE2_I_I_I]] to <32 x bfloat> +// AIE2P-NEXT: [[SHUFFLE2_I_I16_I:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> [[TMP5]], <16 x i32> +// AIE2P-NEXT: [[TMP6:%.*]] = bitcast <16 x i32> [[SHUFFLE2_I_I16_I]] to <32 x bfloat> // AIE2P-NEXT: ret <32 x bfloat> [[TMP6]] // // AIE2PS-LABEL: @_Z9test_tanhDv32_u10__accfloat( @@ -119,8 +119,8 @@ v16bfloat16 test_exp2(v16float a) { // AIE2PS-NEXT: [[TMP3:%.*]] = shufflevector <32 x float> [[A]], <32 x float> poison, <16 x i32> // AIE2PS-NEXT: [[TMP4:%.*]] = tail call noundef <16 x bfloat> @llvm.aie2ps.tanh(<16 x float> [[TMP3]]) // AIE2PS-NEXT: [[TMP5:%.*]] = bitcast <16 x bfloat> [[TMP4]] to <8 x i32> -// AIE2PS-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> [[TMP5]], <16 x i32> -// AIE2PS-NEXT: [[TMP6:%.*]] = bitcast <16 x i32> [[SHUFFLE2_I_I_I]] to <32 x bfloat> +// AIE2PS-NEXT: [[SHUFFLE2_I_I16_I:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> [[TMP5]], <16 x i32> +// AIE2PS-NEXT: [[TMP6:%.*]] = bitcast <16 x i32> [[SHUFFLE2_I_I16_I]] to <32 x bfloat> // AIE2PS-NEXT: ret <32 x bfloat> [[TMP6]] // v32bfloat16 test_tanh(v32accfloat a) { @@ -147,8 +147,8 @@ v16bfloat16 test_tanh(v16accfloat a) { // AIE2P-NEXT: [[TMP3:%.*]] = shufflevector <32 x float> [[A]], <32 x float> poison, <16 x i32> // AIE2P-NEXT: [[TMP4:%.*]] = tail call noundef <16 x bfloat> @llvm.aie2p.tanh(<16 x float> [[TMP3]]) // AIE2P-NEXT: [[TMP5:%.*]] = bitcast <16 x bfloat> [[TMP4]] to <8 x i32> -// AIE2P-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> [[TMP5]], <16 x i32> -// AIE2P-NEXT: [[TMP6:%.*]] = bitcast <16 x i32> [[SHUFFLE2_I_I_I]] to <32 x bfloat> +// AIE2P-NEXT: [[SHUFFLE2_I_I16_I:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> [[TMP5]], <16 x i32> +// AIE2P-NEXT: [[TMP6:%.*]] = bitcast <16 x i32> [[SHUFFLE2_I_I16_I]] to <32 x bfloat> // AIE2P-NEXT: ret <32 x bfloat> [[TMP6]] // // AIE2PS-LABEL: @_Z9test_tanhDv32_f( @@ -159,8 +159,8 @@ v16bfloat16 test_tanh(v16accfloat a) { // AIE2PS-NEXT: [[TMP3:%.*]] = shufflevector <32 x float> [[A]], <32 x float> poison, <16 x i32> // AIE2PS-NEXT: [[TMP4:%.*]] = tail call noundef <16 x bfloat> @llvm.aie2ps.tanh(<16 x float> [[TMP3]]) // AIE2PS-NEXT: [[TMP5:%.*]] = bitcast <16 x bfloat> [[TMP4]] to <8 x i32> -// AIE2PS-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> [[TMP5]], <16 x i32> -// AIE2PS-NEXT: [[TMP6:%.*]] = bitcast <16 x i32> [[SHUFFLE2_I_I_I]] to <32 x bfloat> +// AIE2PS-NEXT: [[SHUFFLE2_I_I16_I:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> [[TMP5]], <16 x i32> +// AIE2PS-NEXT: [[TMP6:%.*]] = bitcast <16 x i32> [[SHUFFLE2_I_I16_I]] to <32 x bfloat> // AIE2PS-NEXT: ret <32 x bfloat> [[TMP6]] // v32bfloat16 test_tanh(v32float a) { diff --git a/clang/test/CodeGen/aie/common-tests/aie-upd-ext-intrinsic.cpp b/clang/test/CodeGen/aie/common-tests/aie-upd-ext-intrinsic.cpp index 2f906f4dd2e5..211e57db8319 100644 --- a/clang/test/CodeGen/aie/common-tests/aie-upd-ext-intrinsic.cpp +++ b/clang/test/CodeGen/aie/common-tests/aie-upd-ext-intrinsic.cpp @@ -1154,7 +1154,6 @@ v16int4 test_insert(v16int4 v, int idx, int val) { return insert(v, idx, val); } -// // CHECK-LABEL: define dso_local noundef <2 x i8> @_Z11test_insertDv2_aii( // CHECK-SAME: <2 x i8> noundef [[V:%.*]], i32 noundef [[IDX:%.*]], i32 noundef [[VAL:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: @@ -1378,7 +1377,6 @@ v2uint8 test_insert(v2uint8 v, int idx, unsigned int val) { return insert(v, idx, val); } -// // CHECK-LABEL: define dso_local noundef <4 x i8> @_Z11test_insertDv4_hij( // CHECK-SAME: <4 x i8> noundef [[V:%.*]], i32 noundef [[IDX:%.*]], i32 noundef [[VAL:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: @@ -1794,120 +1792,104 @@ unsigned int test_extract_elem(v2uint32 v, int idx) //! @name Scalar updates and extracts -// CHECK-AIE2P-LABEL: define dso_local noundef i64 @_Z11test_insertyij( -// CHECK-AIE2P-SAME: i64 noundef [[A:%.*]], i32 noundef [[IDX:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] { -// CHECK-AIE2P-NEXT: entry: -// CHECK-AIE2P-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[IDX]], 0 -// CHECK-AIE2P-NEXT: [[TMP0:%.*]] = bitcast i64 [[A]] to <2 x i32> -// CHECK-AIE2P-NEXT: br i1 [[CMP_I]], label [[IF_THEN_I:%.*]], label [[IF_ELSE_I:%.*]] -// CHECK-AIE2P: if.then.i: -// CHECK-AIE2P-NEXT: [[TMP1:%.*]] = tail call <2 x i32> @llvm.aie2p.upd.I64.I32(<2 x i32> [[TMP0]], i32 [[B]], i32 0) -// CHECK-AIE2P-NEXT: br label [[_ZL6INSERTYIJ_EXIT:%.*]] -// CHECK-AIE2P: if.else.i: -// CHECK-AIE2P-NEXT: [[TMP2:%.*]] = tail call <2 x i32> @llvm.aie2p.upd.I64.I32(<2 x i32> [[TMP0]], i32 [[B]], i32 1) -// CHECK-AIE2P-NEXT: br label [[_ZL6INSERTYIJ_EXIT]] -// CHECK-AIE2P: _ZL6insertyij.exit: -// CHECK-AIE2P-NEXT: [[RETVAL_0_IN_I:%.*]] = phi <2 x i32> [ [[TMP1]], [[IF_THEN_I]] ], [ [[TMP2]], [[IF_ELSE_I]] ] -// CHECK-AIE2P-NEXT: [[RETVAL_0_I:%.*]] = bitcast <2 x i32> [[RETVAL_0_IN_I]] to i64 -// CHECK-AIE2P-NEXT: ret i64 [[RETVAL_0_I]] -// -// CHECK-AIE2PS-LABEL: define dso_local noundef i64 @_Z11test_insertyij( -// CHECK-AIE2PS-SAME: i64 noundef [[A:%.*]], i32 noundef [[IDX:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { -// CHECK-AIE2PS-NEXT: entry: -// CHECK-AIE2PS-NEXT: [[TMP0:%.*]] = bitcast i64 [[A]] to <2 x i32> -// CHECK-AIE2PS-NEXT: [[VECINS_I:%.*]] = insertelement <2 x i32> [[TMP0]], i32 [[B]], i32 [[IDX]] -// CHECK-AIE2PS-NEXT: [[TMP1:%.*]] = bitcast <2 x i32> [[VECINS_I]] to i64 -// CHECK-AIE2PS-NEXT: ret i64 [[TMP1]] +// CHECK-LABEL: define dso_local noundef i64 @_Z11test_insertyij( +// CHECK-SAME: i64 noundef [[A:%.*]], i32 noundef [[IDX:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = bitcast i64 [[A]] to <2 x i32> +// CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <2 x i32> [[TMP0]], i32 [[B]], i32 [[IDX]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i32> [[VECINS_I]] to i64 +// CHECK-NEXT: ret i64 [[TMP1]] // unsigned long long test_insert(unsigned long long a, int idx, unsigned int b) { return insert(a, idx, b); } -// CHECK-AIE2P-LABEL: define dso_local noundef i64 @_Z15test_set_uint64ij( -// CHECK-AIE2P-SAME: i32 noundef [[IDX:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR1]] { -// CHECK-AIE2P-NEXT: entry: -// CHECK-AIE2P-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[IDX]], 0 -// CHECK-AIE2P-NEXT: br i1 [[CMP_I]], label [[IF_THEN_I:%.*]], label [[IF_ELSE_I:%.*]] -// CHECK-AIE2P: if.then.i: -// CHECK-AIE2P-NEXT: [[TMP0:%.*]] = tail call <2 x i32> @llvm.aie2p.set.I64.I32(i32 [[B]], i32 0) -// CHECK-AIE2P-NEXT: br label [[_ZL10SET_UINT64IJ_EXIT:%.*]] -// CHECK-AIE2P: if.else.i: -// CHECK-AIE2P-NEXT: [[TMP1:%.*]] = tail call <2 x i32> @llvm.aie2p.set.I64.I32(i32 [[B]], i32 1) -// CHECK-AIE2P-NEXT: br label [[_ZL10SET_UINT64IJ_EXIT]] -// CHECK-AIE2P: _ZL10set_uint64ij.exit: -// CHECK-AIE2P-NEXT: [[RETVAL_0_IN_I:%.*]] = phi <2 x i32> [ [[TMP0]], [[IF_THEN_I]] ], [ [[TMP1]], [[IF_ELSE_I]] ] -// CHECK-AIE2P-NEXT: [[RETVAL_0_I:%.*]] = bitcast <2 x i32> [[RETVAL_0_IN_I]] to i64 -// CHECK-AIE2P-NEXT: ret i64 [[RETVAL_0_I]] -// -// CHECK-AIE2PS-LABEL: define dso_local noundef i64 @_Z15test_set_uint64ij( -// CHECK-AIE2PS-SAME: i32 noundef [[IDX:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { -// CHECK-AIE2PS-NEXT: entry: -// CHECK-AIE2PS-NEXT: [[VECINS_I:%.*]] = insertelement <2 x i32> undef, i32 [[B]], i32 [[IDX]] -// CHECK-AIE2PS-NEXT: [[TMP0:%.*]] = bitcast <2 x i32> [[VECINS_I]] to i64 -// CHECK-AIE2PS-NEXT: ret i64 [[TMP0]] +// CHECK-LABEL: define dso_local noundef i64 @_Z15test_set_uint64ij( +// CHECK-SAME: i32 noundef [[IDX:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <2 x i32> poison, i32 [[B]], i32 [[IDX]] +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i32> [[VECINS_I]] to i64 +// CHECK-NEXT: ret i64 [[TMP0]] // unsigned long long test_set_uint64(int idx, unsigned int b) { return set_uint64(idx, b); } -// CHECK-AIE2P-LABEL: define dso_local noundef i32 @_Z19test_extract_uint32yi( -// CHECK-AIE2P-SAME: i64 noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR1]] { -// CHECK-AIE2P-NEXT: entry: -// CHECK-AIE2P-NEXT: [[CMP_I:%.*]] = icmp eq i32 [[IDX]], 0 -// CHECK-AIE2P-NEXT: [[TMP0:%.*]] = bitcast i64 [[A]] to <2 x i32> -// CHECK-AIE2P-NEXT: br i1 [[CMP_I]], label [[IF_THEN_I:%.*]], label [[IF_ELSE_I:%.*]] -// CHECK-AIE2P: if.then.i: -// CHECK-AIE2P-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.aie2p.ext.I32.I64(<2 x i32> [[TMP0]], i32 0) -// CHECK-AIE2P-NEXT: br label [[_ZL14EXTRACT_UINT32YI_EXIT:%.*]] -// CHECK-AIE2P: if.else.i: -// CHECK-AIE2P-NEXT: [[TMP2:%.*]] = tail call i32 @llvm.aie2p.ext.I32.I64(<2 x i32> [[TMP0]], i32 1) -// CHECK-AIE2P-NEXT: br label [[_ZL14EXTRACT_UINT32YI_EXIT]] -// CHECK-AIE2P: _ZL14extract_uint32yi.exit: -// CHECK-AIE2P-NEXT: [[RETVAL_0_I:%.*]] = phi i32 [ [[TMP1]], [[IF_THEN_I]] ], [ [[TMP2]], [[IF_ELSE_I]] ] -// CHECK-AIE2P-NEXT: ret i32 [[RETVAL_0_I]] -// -// CHECK-AIE2PS-LABEL: define dso_local noundef i32 @_Z19test_extract_uint32yi( -// CHECK-AIE2PS-SAME: i64 noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { -// CHECK-AIE2PS-NEXT: entry: -// CHECK-AIE2PS-NEXT: [[TMP0:%.*]] = bitcast i64 [[A]] to <2 x i32> -// CHECK-AIE2PS-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x i32> [[TMP0]], i32 [[IDX]] -// CHECK-AIE2PS-NEXT: ret i32 [[VECEXT_I]] +// CHECK-LABEL: define dso_local noundef i32 @_Z19test_extract_uint32yi( +// CHECK-SAME: i64 noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = bitcast i64 [[A]] to <2 x i32> +// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x i32> [[TMP0]], i32 [[IDX]] +// CHECK-NEXT: ret i32 [[VECEXT_I]] // unsigned int test_extract_uint32(unsigned long long a, int idx) { return extract_uint32(a, idx); } -// -// CHECK-AIE2P-LABEL: define dso_local noundef i64 @_Z11test_concatjj( -// CHECK-AIE2P-SAME: i32 noundef [[A:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR1]] { -// CHECK-AIE2P-NEXT: entry: -// CHECK-AIE2P-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[A]], 0 -// CHECK-AIE2P-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK-AIE2P: if.then.i.i: -// CHECK-AIE2P-NEXT: [[TMP0:%.*]] = tail call <2 x i32> @llvm.aie2p.set.I64.I32(i32 0, i32 0) -// CHECK-AIE2P-NEXT: br label [[_ZL6CONCATJJ_EXIT:%.*]] -// CHECK-AIE2P: if.else.i.i: -// CHECK-AIE2P-NEXT: [[TMP1:%.*]] = tail call <2 x i32> @llvm.aie2p.set.I64.I32(i32 0, i32 1) -// CHECK-AIE2P-NEXT: br label [[_ZL6CONCATJJ_EXIT]] -// CHECK-AIE2P: _ZL6concatjj.exit: -// CHECK-AIE2P-NEXT: [[RETVAL_0_IN_I_I:%.*]] = phi <2 x i32> [ [[TMP0]], [[IF_THEN_I_I]] ], [ [[TMP1]], [[IF_ELSE_I_I]] ] -// CHECK-AIE2P-NEXT: [[TMP2:%.*]] = tail call <2 x i32> @llvm.aie2p.upd.I64.I32(<2 x i32> [[RETVAL_0_IN_I_I]], i32 [[B]], i32 1) -// CHECK-AIE2P-NEXT: [[RETVAL_0_I4_I:%.*]] = bitcast <2 x i32> [[TMP2]] to i64 -// CHECK-AIE2P-NEXT: ret i64 [[RETVAL_0_I4_I]] -// -// CHECK-AIE2PS-LABEL: define dso_local noundef i64 @_Z11test_concatjj( -// CHECK-AIE2PS-SAME: i32 noundef [[A:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { -// CHECK-AIE2PS-NEXT: entry: -// CHECK-AIE2PS-NEXT: [[VECINS_I_I:%.*]] = insertelement <2 x i32> , i32 0, i32 [[A]] -// CHECK-AIE2PS-NEXT: [[VECINS_I2_I:%.*]] = insertelement <2 x i32> [[VECINS_I_I]], i32 [[B]], i64 1 -// CHECK-AIE2PS-NEXT: [[TMP0:%.*]] = bitcast <2 x i32> [[VECINS_I2_I]] to i64 -// CHECK-AIE2PS-NEXT: ret i64 [[TMP0]] +// CHECK-LABEL: define dso_local noundef i64 @_Z11test_concatjj( +// CHECK-SAME: i32 noundef [[A:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECINS_I_I:%.*]] = insertelement <2 x i32> poison, i32 0, i32 [[A]] +// CHECK-NEXT: [[VECINS_I2_I:%.*]] = insertelement <2 x i32> [[VECINS_I_I]], i32 [[B]], i64 1 +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i32> [[VECINS_I2_I]] to i64 +// CHECK-NEXT: ret i64 [[TMP0]] // unsigned long long test_concat(unsigned int a, unsigned int b) { return concat(a,b); } +// Constant-idx companions: verify each helper folds to a single op. +// CHECK-LABEL: define dso_local noundef i64 @_Z20test_insert_u64_idx0yj( +// CHECK-SAME: i64 noundef [[A:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = bitcast i64 [[A]] to <2 x i32> +// CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <2 x i32> [[TMP0]], i32 [[B]], i64 0 +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i32> [[VECINS_I]] to i64 +// CHECK-NEXT: ret i64 [[TMP1]] +// +unsigned long long test_insert_u64_idx0(unsigned long long a, unsigned int b) { return insert(a, 0, b); } +// CHECK-LABEL: define dso_local noundef i64 @_Z20test_insert_u64_idx1yj( +// CHECK-SAME: i64 noundef [[A:%.*]], i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = bitcast i64 [[A]] to <2 x i32> +// CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <2 x i32> [[TMP0]], i32 [[B]], i64 1 +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i32> [[VECINS_I]] to i64 +// CHECK-NEXT: ret i64 [[TMP1]] +// +unsigned long long test_insert_u64_idx1(unsigned long long a, unsigned int b) { return insert(a, 1, b); } +// CHECK-LABEL: define dso_local noundef i64 @_Z20test_set_uint64_idx0j( +// CHECK-SAME: i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <2 x i32> poison, i32 [[B]], i64 0 +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i32> [[VECINS_I]] to i64 +// CHECK-NEXT: ret i64 [[TMP0]] +// +unsigned long long test_set_uint64_idx0(unsigned int b) { return set_uint64(0, b); } +// CHECK-LABEL: define dso_local noundef i64 @_Z20test_set_uint64_idx1j( +// CHECK-SAME: i32 noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECINS_I:%.*]] = insertelement <2 x i32> poison, i32 [[B]], i64 1 +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i32> [[VECINS_I]] to i64 +// CHECK-NEXT: ret i64 [[TMP0]] +// +unsigned long long test_set_uint64_idx1(unsigned int b) { return set_uint64(1, b); } +// CHECK-LABEL: define dso_local noundef i32 @_Z24test_extract_uint32_idx0y( +// CHECK-SAME: i64 noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VECEXT_I:%.*]] = trunc i64 [[A]] to i32 +// CHECK-NEXT: ret i32 [[VECEXT_I]] +// +unsigned int test_extract_uint32_idx0(unsigned long long a) { return extract_uint32(a, 0); } +// CHECK-LABEL: define dso_local noundef i32 @_Z24test_extract_uint32_idx1y( +// CHECK-SAME: i64 noundef [[A:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = bitcast i64 [[A]] to <2 x i32> +// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x i32> [[TMP0]], i64 1 +// CHECK-NEXT: ret i32 [[VECEXT_I]] +// +unsigned int test_extract_uint32_idx1(unsigned long long a) { return extract_uint32(a, 1); } + // Conversions @@ -1917,19 +1899,13 @@ unsigned long long test_concat(unsigned int a, unsigned int b) // CHECK-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V64UINT4DV64_DU8_I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V64UINT4DV64_DU8_I_EXIT]] -// CHECK: _ZL16extract_v64uint4Dv64_DU8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> -// CHECK-NEXT: ret <32 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <32 x i8> +// CHECK-NEXT: ret <32 x i8> [[TMP1]] // v64uint4 test_extract_v64uint4 (v128uint4 a, int idx) { @@ -1941,20 +1917,14 @@ v64uint4 test_extract_v64uint4 (v128uint4 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_DU8_IDV32_S__EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_DU8_IDV32_S__EXIT]] -// CHECK: _ZL6insertDv64_DU8_iDv32_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP2]] // v128uint4 test_insert (v128uint4 a, int idx, v64uint4 b) { @@ -1965,19 +1935,13 @@ v128uint4 test_insert (v128uint4 a, int idx, v64uint4 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V128UINT4IDV32_DU8__EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V128UINT4IDV32_DU8__EXIT]] -// CHECK: _ZL13set_v128uint4iDv32_DU8_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP1]] // v128uint4 test_set_v128uint4 (int idx, v64uint4 b) { @@ -2004,19 +1968,13 @@ v128uint4 test_concat (v64uint4 a0, v64uint4 a1) // CHECK-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V64INT4DV64_DB8_I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V64INT4DV64_DB8_I_EXIT]] -// CHECK: _ZL15extract_v64int4Dv64_DB8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> -// CHECK-NEXT: ret <32 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <32 x i8> +// CHECK-NEXT: ret <32 x i8> [[TMP1]] // v64int4 test_extract_v64int4 (v128int4 a, int idx) { @@ -2028,20 +1986,14 @@ v64int4 test_extract_v64int4 (v128int4 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_DB8_IDV32_S__EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_DB8_IDV32_S__EXIT]] -// CHECK: _ZL6insertDv64_DB8_iDv32_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP2]] // v128int4 test_insert (v128int4 a, int idx, v64int4 b) { @@ -2052,19 +2004,13 @@ v128int4 test_insert (v128int4 a, int idx, v64int4 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V128INT4IDV32_DB8__EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V128INT4IDV32_DB8__EXIT]] -// CHECK: _ZL12set_v128int4iDv32_DB8_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP1]] // v128int4 test_set_v128int4 (int idx, v64int4 b) { @@ -2091,19 +2037,13 @@ v128int4 test_concat (v64int4 a0, v64int4 a1) // CHECK-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT8DV64_HI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT8DV64_HI_EXIT]] -// CHECK: _ZL16extract_v32uint8Dv64_hi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> -// CHECK-NEXT: ret <32 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <32 x i8> +// CHECK-NEXT: ret <32 x i8> [[TMP1]] // v32uint8 test_extract_v32uint8 (v64uint8 a, int idx) { @@ -2115,20 +2055,14 @@ v32uint8 test_extract_v32uint8 (v64uint8 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_HIDV32_H_EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_HIDV32_H_EXIT]] -// CHECK: _ZL6insertDv64_hiDv32_h.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP2]] // v64uint8 test_insert (v64uint8 a, int idx, v32uint8 b) { @@ -2139,19 +2073,13 @@ v64uint8 test_insert (v64uint8 a, int idx, v32uint8 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64UINT8IDV32_H_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64UINT8IDV32_H_EXIT]] -// CHECK: _ZL12set_v64uint8iDv32_h.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP1]] // v64uint8 test_set_v64uint8 (int idx, v32uint8 b) { @@ -2178,19 +2106,13 @@ v64uint8 test_concat (v32uint8 a0, v32uint8 a1) // CHECK-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT8DV64_AI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT8DV64_AI_EXIT]] -// CHECK: _ZL15extract_v32int8Dv64_ai.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> -// CHECK-NEXT: ret <32 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <32 x i8> +// CHECK-NEXT: ret <32 x i8> [[TMP1]] // v32int8 test_extract_v32int8 (v64int8 a, int idx) { @@ -2202,20 +2124,14 @@ v32int8 test_extract_v32int8 (v64int8 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_AIDV32_A_EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_AIDV32_A_EXIT]] -// CHECK: _ZL6insertDv64_aiDv32_a.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP2]] // v64int8 test_insert (v64int8 a, int idx, v32int8 b) { @@ -2226,19 +2142,13 @@ v64int8 test_insert (v64int8 a, int idx, v32int8 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V64INT8IDV32_A_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V64INT8IDV32_A_EXIT]] -// CHECK: _ZL11set_v64int8iDv32_a.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP1]] // v64int8 test_set_v64int8 (int idx, v32int8 b) { @@ -2265,19 +2175,13 @@ v64int8 test_concat (v32int8 a0, v32int8 a1) // CHECK-SAME: <32 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16UINT16DV32_TI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16UINT16DV32_TI_EXIT]] -// CHECK: _ZL17extract_v16uint16Dv32_ti.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x i16> -// CHECK-NEXT: ret <16 x i16> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <16 x i16> +// CHECK-NEXT: ret <16 x i16> [[TMP1]] // v16uint16 test_extract_v16uint16 (v32uint16 a, int idx) { @@ -2289,20 +2193,14 @@ v16uint16 test_extract_v16uint16 (v32uint16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i16> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_TIDV16_T_EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_TIDV16_T_EXIT]] -// CHECK: _ZL6insertDv32_tiDv16_t.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x i16> -// CHECK-NEXT: ret <32 x i16> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x i16> +// CHECK-NEXT: ret <32 x i16> [[TMP2]] // v32uint16 test_insert (v32uint16 a, int idx, v16uint16 b) { @@ -2313,19 +2211,13 @@ v32uint16 test_insert (v32uint16 a, int idx, v16uint16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i16> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i16> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32UINT16IDV16_T_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32UINT16IDV16_T_EXIT]] -// CHECK: _ZL13set_v32uint16iDv16_t.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x i16> -// CHECK-NEXT: ret <32 x i16> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x i16> +// CHECK-NEXT: ret <32 x i16> [[TMP1]] // v32uint16 test_set_v32uint16 (int idx, v16uint16 b) { @@ -2352,19 +2244,13 @@ v32uint16 test_concat (v16uint16 a0, v16uint16 a1) // CHECK-SAME: <32 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16INT16DV32_SI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16INT16DV32_SI_EXIT]] -// CHECK: _ZL16extract_v16int16Dv32_si.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x i16> -// CHECK-NEXT: ret <16 x i16> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <16 x i16> +// CHECK-NEXT: ret <16 x i16> [[TMP1]] // v16int16 test_extract_v16int16 (v32int16 a, int idx) { @@ -2376,20 +2262,14 @@ v16int16 test_extract_v16int16 (v32int16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i16> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_SIDV16_S_EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_SIDV16_S_EXIT]] -// CHECK: _ZL6insertDv32_siDv16_s.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x i16> -// CHECK-NEXT: ret <32 x i16> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x i16> +// CHECK-NEXT: ret <32 x i16> [[TMP2]] // v32int16 test_insert (v32int16 a, int idx, v16int16 b) { @@ -2400,19 +2280,13 @@ v32int16 test_insert (v32int16 a, int idx, v16int16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i16> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i16> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32INT16IDV16_S_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32INT16IDV16_S_EXIT]] -// CHECK: _ZL12set_v32int16iDv16_s.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x i16> -// CHECK-NEXT: ret <32 x i16> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x i16> +// CHECK-NEXT: ret <32 x i16> [[TMP1]] // v32int16 test_set_v32int16 (int idx, v16int16 b) { @@ -2438,18 +2312,12 @@ v32int16 test_concat (v16int16 a0, v16int16 a1) // CHECK-LABEL: define dso_local noundef <8 x i32> @_Z21test_extract_v8uint32Dv16_ji( // CHECK-SAME: <16 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT32DV16_JI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT32DV16_JI_EXIT]] -// CHECK: _ZL16extract_v8uint32Dv16_ji.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <8 x i32> [[COND_I_I]] // v8uint32 test_extract_v8uint32 (v16uint32 a, int idx) { @@ -2459,19 +2327,13 @@ v8uint32 test_extract_v8uint32 (v16uint32 a, int idx) // CHECK-LABEL: define dso_local noundef <16 x i32> @_Z11test_insertDv16_jiDv8_j( // CHECK-SAME: <16 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <8 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[A]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_JIDV8_J_EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_JIDV8_J_EXIT]] -// CHECK: _ZL6insertDv16_jiDv8_j.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I]] // v16uint32 test_insert (v16uint32 a, int idx, v8uint32 b) { @@ -2481,18 +2343,12 @@ v16uint32 test_insert (v16uint32 a, int idx, v8uint32 b) // CHECK-LABEL: define dso_local noundef <16 x i32> @_Z18test_set_v16uint32iDv8_j( // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V16UINT32IDV8_J_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V16UINT32IDV8_J_EXIT]] -// CHECK: _ZL13set_v16uint32iDv8_j.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I]] // v16uint32 test_set_v16uint32 (int idx, v8uint32 b) { @@ -2515,18 +2371,12 @@ v16uint32 test_concat (v8uint32 a0, v8uint32 a1) // CHECK-LABEL: define dso_local noundef <8 x i32> @_Z20test_extract_v8int32Dv16_ii( // CHECK-SAME: <16 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT32DV16_II_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT32DV16_II_EXIT]] -// CHECK: _ZL15extract_v8int32Dv16_ii.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <8 x i32> [[COND_I_I]] // v8int32 test_extract_v8int32 (v16int32 a, int idx) { @@ -2536,19 +2386,13 @@ v8int32 test_extract_v8int32 (v16int32 a, int idx) // CHECK-LABEL: define dso_local noundef <16 x i32> @_Z11test_insertDv16_iiDv8_i( // CHECK-SAME: <16 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <8 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[A]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_IIDV8_I_EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_IIDV8_I_EXIT]] -// CHECK: _ZL6insertDv16_iiDv8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I]] // v16int32 test_insert (v16int32 a, int idx, v8int32 b) { @@ -2558,18 +2402,12 @@ v16int32 test_insert (v16int32 a, int idx, v8int32 b) // CHECK-LABEL: define dso_local noundef <16 x i32> @_Z17test_set_v16int32iDv8_i( // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16INT32IDV8_I_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16INT32IDV8_I_EXIT]] -// CHECK: _ZL12set_v16int32iDv8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I]] // v16int32 test_set_v16int32 (int idx, v8int32 b) { @@ -2593,19 +2431,13 @@ v16int32 test_concat (v8int32 a0, v8int32 a1) // CHECK-SAME: <32 x bfloat> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x bfloat> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16BFLOAT16DV32_8BFLOAT16I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16BFLOAT16DV32_8BFLOAT16I_EXIT]] -// CHECK: _ZL19extract_v16bfloat16Dv32_8bfloat16i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x bfloat> -// CHECK-NEXT: ret <16 x bfloat> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <16 x bfloat> +// CHECK-NEXT: ret <16 x bfloat> [[TMP1]] // v16bfloat16 test_extract_v16bfloat16 (v32bfloat16 a, int idx) { @@ -2617,20 +2449,14 @@ v16bfloat16 test_extract_v16bfloat16 (v32bfloat16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x bfloat> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x bfloat> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_8BFLOAT16IDV16_S__EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_8BFLOAT16IDV16_S__EXIT]] -// CHECK: _ZL6insertDv32_8bfloat16iDv16_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x bfloat> -// CHECK-NEXT: ret <32 x bfloat> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x bfloat> +// CHECK-NEXT: ret <32 x bfloat> [[TMP2]] // v32bfloat16 test_insert (v32bfloat16 a, int idx, v16bfloat16 b) { @@ -2641,19 +2467,13 @@ v32bfloat16 test_insert (v32bfloat16 a, int idx, v16bfloat16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x bfloat> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x bfloat> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V32BFLOAT16IDV16_8BFLOAT16_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V32BFLOAT16IDV16_8BFLOAT16_EXIT]] -// CHECK: _ZL15set_v32bfloat16iDv16_8bfloat16.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x bfloat> -// CHECK-NEXT: ret <32 x bfloat> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x bfloat> +// CHECK-NEXT: ret <32 x bfloat> [[TMP1]] // v32bfloat16 test_set_v32bfloat16 (int idx, v16bfloat16 b) { @@ -2680,19 +2500,13 @@ v32bfloat16 test_concat (v16bfloat16 a0, v16bfloat16 a1) // CHECK-SAME: <16 x float> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8FLOATDV16_FI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8FLOATDV16_FI_EXIT]] -// CHECK: _ZL15extract_v8floatDv16_fi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <8 x float> -// CHECK-NEXT: ret <8 x float> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I]] to <8 x float> +// CHECK-NEXT: ret <8 x float> [[TMP1]] // v8float test_extract_v8float (v16float a, int idx) { @@ -2704,20 +2518,14 @@ v8float test_extract_v8float (v16float a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x float> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_FIDV8_F_EXIT:%.*]] -// CHECK: if.end.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_FIDV8_F_EXIT]] -// CHECK: _ZL6insertDv16_fiDv8_f.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <16 x float> -// CHECK-NEXT: ret <16 x float> [[TMP3]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE1_I_I]], <16 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <16 x float> +// CHECK-NEXT: ret <16 x float> [[TMP2]] // v16float test_insert (v16float a, int idx, v8float b) { @@ -2728,19 +2536,13 @@ v16float test_insert (v16float a, int idx, v8float b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x float> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x float> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16FLOATIDV8_F_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16FLOATIDV8_F_EXIT]] -// CHECK: _ZL12set_v16floatiDv8_f.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <16 x float> -// CHECK-NEXT: ret <16 x float> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <16 x float> +// CHECK-NEXT: ret <16 x float> [[TMP1]] // v16float test_set_v16float (int idx, v8float b) { @@ -2764,27 +2566,18 @@ v16float test_concat (v8float a0, v8float a1) // CHECK-SAME: <128 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V64UINT4DV128_DU8_I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V64UINT4DV128_DU8_I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V64UINT4DV128_DU8_I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V64UINT4DV128_DU8_I_EXIT]] -// CHECK: _ZL16extract_v64uint4Dv128_DU8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP1]] // v64uint4 test_extract_v64uint4 (v256uint4 a, int idx) @@ -2797,29 +2590,22 @@ v64uint4 test_extract_v64uint4 (v256uint4 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DU8_IDV32_S__EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DU8_IDV32_S__EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DU8_IDV32_S__EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DU8_IDV32_S__EXIT]] -// CHECK: _ZL6insertDv128_DU8_iDv32_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <128 x i8> // CHECK-NEXT: ret <128 x i8> [[TMP2]] // v256uint4 test_insert (v256uint4 a, int idx, v64uint4 b) @@ -2831,31 +2617,18 @@ v256uint4 test_insert (v256uint4 a, int idx, v64uint4 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V256UINT4IDV32_DU8__EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V256UINT4IDV32_DU8__EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V256UINT4IDV32_DU8__EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V256UINT4IDV32_DU8__EXIT]] -// CHECK: _ZL13set_v256uint4iDv32_DU8_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <128 x i8> // CHECK-NEXT: ret <128 x i8> [[TMP1]] // v256uint4 test_set_v256uint4 (int idx, v64uint4 b) @@ -2887,19 +2660,13 @@ v256uint4 test_concat (v64uint4 a0, v64uint4 a1, v64uint4 a2, v64uint4 a3) // CHECK-SAME: <128 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V128UINT4DV128_DU8_I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V128UINT4DV128_DU8_I_EXIT]] -// CHECK: _ZL17extract_v128uint4Dv128_DU8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP1]] // v128uint4 test_extract_v128uint4 (v256uint4 a, int idx) { @@ -2911,20 +2678,14 @@ v128uint4 test_extract_v128uint4 (v256uint4 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DU8_IDV64_S__EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DU8_IDV64_S__EXIT]] -// CHECK: _ZL6insertDv128_DU8_iDv64_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: ret <128 x i8> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: ret <128 x i8> [[TMP2]] // v256uint4 test_insert (v256uint4 a, int idx, v128uint4 b) { @@ -2935,19 +2696,13 @@ v256uint4 test_insert (v256uint4 a, int idx, v128uint4 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <64 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V256UINT4IDV64_DU8__EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V256UINT4IDV64_DU8__EXIT]] -// CHECK: _ZL13set_v256uint4iDv64_DU8_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: ret <128 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: ret <128 x i8> [[TMP1]] // v256uint4 test_set_v256uint4 (int idx, v128uint4 b) { @@ -2974,27 +2729,18 @@ v256uint4 test_concat (v128uint4 a0, v128uint4 a1) // CHECK-SAME: <128 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V64INT4DV128_DB8_I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V64INT4DV128_DB8_I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V64INT4DV128_DB8_I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V64INT4DV128_DB8_I_EXIT]] -// CHECK: _ZL15extract_v64int4Dv128_DB8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP1]] // v64int4 test_extract_v64int4 (v256int4 a, int idx) @@ -3007,29 +2753,22 @@ v64int4 test_extract_v64int4 (v256int4 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DB8_IDV32_S__EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DB8_IDV32_S__EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DB8_IDV32_S__EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DB8_IDV32_S__EXIT]] -// CHECK: _ZL6insertDv128_DB8_iDv32_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <128 x i8> // CHECK-NEXT: ret <128 x i8> [[TMP2]] // v256int4 test_insert (v256int4 a, int idx, v64int4 b) @@ -3041,31 +2780,18 @@ v256int4 test_insert (v256int4 a, int idx, v64int4 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V256INT4IDV32_DB8__EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V256INT4IDV32_DB8__EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V256INT4IDV32_DB8__EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V256INT4IDV32_DB8__EXIT]] -// CHECK: _ZL12set_v256int4iDv32_DB8_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <128 x i8> // CHECK-NEXT: ret <128 x i8> [[TMP1]] // v256int4 test_set_v256int4 (int idx, v64int4 b) @@ -3097,19 +2823,13 @@ v256int4 test_concat (v64int4 a0, v64int4 a1, v64int4 a2, v64int4 a3) // CHECK-SAME: <128 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V128INT4DV128_DB8_I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V128INT4DV128_DB8_I_EXIT]] -// CHECK: _ZL16extract_v128int4Dv128_DB8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP1]] // v128int4 test_extract_v128int4 (v256int4 a, int idx) { @@ -3121,20 +2841,14 @@ v128int4 test_extract_v128int4 (v256int4 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DB8_IDV64_S__EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_DB8_IDV64_S__EXIT]] -// CHECK: _ZL6insertDv128_DB8_iDv64_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: ret <128 x i8> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: ret <128 x i8> [[TMP2]] // v256int4 test_insert (v256int4 a, int idx, v128int4 b) { @@ -3145,19 +2859,13 @@ v256int4 test_insert (v256int4 a, int idx, v128int4 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <64 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V256INT4IDV64_DB8__EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V256INT4IDV64_DB8__EXIT]] -// CHECK: _ZL12set_v256int4iDv64_DB8_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: ret <128 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: ret <128 x i8> [[TMP1]] // v256int4 test_set_v256int4 (int idx, v128int4 b) { @@ -3184,27 +2892,18 @@ v256int4 test_concat (v128int4 a0, v128int4 a1) // CHECK-SAME: <128 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT8DV128_HI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT8DV128_HI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT8DV128_HI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT8DV128_HI_EXIT]] -// CHECK: _ZL16extract_v32uint8Dv128_hi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP1]] // v32uint8 test_extract_v32uint8 (v128uint8 a, int idx) @@ -3217,29 +2916,22 @@ v32uint8 test_extract_v32uint8 (v128uint8 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_HIDV32_H_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_HIDV32_H_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_HIDV32_H_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_HIDV32_H_EXIT]] -// CHECK: _ZL6insertDv128_hiDv32_h.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <128 x i8> // CHECK-NEXT: ret <128 x i8> [[TMP2]] // v128uint8 test_insert (v128uint8 a, int idx, v32uint8 b) @@ -3251,31 +2943,18 @@ v128uint8 test_insert (v128uint8 a, int idx, v32uint8 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V128UINT8IDV32_H_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V128UINT8IDV32_H_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V128UINT8IDV32_H_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V128UINT8IDV32_H_EXIT]] -// CHECK: _ZL13set_v128uint8iDv32_h.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <128 x i8> // CHECK-NEXT: ret <128 x i8> [[TMP1]] // v128uint8 test_set_v128uint8 (int idx, v32uint8 b) @@ -3307,19 +2986,13 @@ v128uint8 test_concat (v32uint8 a0, v32uint8 a1, v32uint8 a2, v32uint8 a3) // CHECK-SAME: <128 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V64UINT8DV128_HI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V64UINT8DV128_HI_EXIT]] -// CHECK: _ZL16extract_v64uint8Dv128_hi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP1]] // v64uint8 test_extract_v64uint8 (v128uint8 a, int idx) { @@ -3331,20 +3004,14 @@ v64uint8 test_extract_v64uint8 (v128uint8 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_HIDV64_H_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_HIDV64_H_EXIT]] -// CHECK: _ZL6insertDv128_hiDv64_h.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: ret <128 x i8> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: ret <128 x i8> [[TMP2]] // v128uint8 test_insert (v128uint8 a, int idx, v64uint8 b) { @@ -3355,19 +3022,13 @@ v128uint8 test_insert (v128uint8 a, int idx, v64uint8 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <64 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V128UINT8IDV64_H_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V128UINT8IDV64_H_EXIT]] -// CHECK: _ZL13set_v128uint8iDv64_h.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: ret <128 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: ret <128 x i8> [[TMP1]] // v128uint8 test_set_v128uint8 (int idx, v64uint8 b) { @@ -3394,27 +3055,18 @@ v128uint8 test_concat (v64uint8 a0, v64uint8 a1) // CHECK-SAME: <128 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT8DV128_AI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT8DV128_AI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT8DV128_AI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT8DV128_AI_EXIT]] -// CHECK: _ZL15extract_v32int8Dv128_ai.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP1]] // v32int8 test_extract_v32int8 (v128int8 a, int idx) @@ -3427,29 +3079,22 @@ v32int8 test_extract_v32int8 (v128int8 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_AIDV32_A_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_AIDV32_A_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_AIDV32_A_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_AIDV32_A_EXIT]] -// CHECK: _ZL6insertDv128_aiDv32_a.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <128 x i8> // CHECK-NEXT: ret <128 x i8> [[TMP2]] // v128int8 test_insert (v128int8 a, int idx, v32int8 b) @@ -3461,31 +3106,18 @@ v128int8 test_insert (v128int8 a, int idx, v32int8 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V128INT8IDV32_A_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V128INT8IDV32_A_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V128INT8IDV32_A_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V128INT8IDV32_A_EXIT]] -// CHECK: _ZL12set_v128int8iDv32_a.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <128 x i8> // CHECK-NEXT: ret <128 x i8> [[TMP1]] // v128int8 test_set_v128int8 (int idx, v32int8 b) @@ -3517,19 +3149,13 @@ v128int8 test_concat (v32int8 a0, v32int8 a1, v32int8 a2, v32int8 a3) // CHECK-SAME: <128 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V64INT8DV128_AI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V64INT8DV128_AI_EXIT]] -// CHECK: _ZL15extract_v64int8Dv128_ai.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <64 x i8> -// CHECK-NEXT: ret <64 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <64 x i8> +// CHECK-NEXT: ret <64 x i8> [[TMP1]] // v64int8 test_extract_v64int8 (v128int8 a, int idx) { @@ -3541,20 +3167,14 @@ v64int8 test_extract_v64int8 (v128int8 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <128 x i8> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <64 x i8> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_AIDV64_A_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV128_AIDV64_A_EXIT]] -// CHECK: _ZL6insertDv128_aiDv64_a.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: ret <128 x i8> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: ret <128 x i8> [[TMP2]] // v128int8 test_insert (v128int8 a, int idx, v64int8 b) { @@ -3565,19 +3185,13 @@ v128int8 test_insert (v128int8 a, int idx, v64int8 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <64 x i8> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V128INT8IDV64_A_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V128INT8IDV64_A_EXIT]] -// CHECK: _ZL12set_v128int8iDv64_a.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <128 x i8> -// CHECK-NEXT: ret <128 x i8> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <128 x i8> +// CHECK-NEXT: ret <128 x i8> [[TMP1]] // v128int8 test_set_v128int8 (int idx, v64int8 b) { @@ -3604,27 +3218,18 @@ v128int8 test_concat (v64int8 a0, v64int8 a1) // CHECK-SAME: <64 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i16> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16UINT16DV64_TI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16UINT16DV64_TI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16UINT16DV64_TI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16UINT16DV64_TI_EXIT]] -// CHECK: _ZL17extract_v16uint16Dv64_ti.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x i16> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <16 x i16> // CHECK-NEXT: ret <16 x i16> [[TMP1]] // v16uint16 test_extract_v16uint16 (v64uint16 a, int idx) @@ -3637,29 +3242,22 @@ v16uint16 test_extract_v16uint16 (v64uint16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i16> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i16> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_TIDV16_T_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_TIDV16_T_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_TIDV16_T_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_TIDV16_T_EXIT]] -// CHECK: _ZL6insertDv64_tiDv16_t.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x i16> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <64 x i16> // CHECK-NEXT: ret <64 x i16> [[TMP2]] // v64uint16 test_insert (v64uint16 a, int idx, v16uint16 b) @@ -3671,31 +3269,18 @@ v64uint16 test_insert (v64uint16 a, int idx, v16uint16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i16> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i16> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V64UINT16IDV16_T_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V64UINT16IDV16_T_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V64UINT16IDV16_T_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V64UINT16IDV16_T_EXIT]] -// CHECK: _ZL13set_v64uint16iDv16_t.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x i16> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <64 x i16> // CHECK-NEXT: ret <64 x i16> [[TMP1]] // v64uint16 test_set_v64uint16 (int idx, v16uint16 b) @@ -3727,19 +3312,13 @@ v64uint16 test_concat (v16uint16 a0, v16uint16 a1, v16uint16 a2, v16uint16 a3) // CHECK-SAME: <64 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i16> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V32UINT16DV64_TI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V32UINT16DV64_TI_EXIT]] -// CHECK: _ZL17extract_v32uint16Dv64_ti.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x i16> -// CHECK-NEXT: ret <32 x i16> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x i16> +// CHECK-NEXT: ret <32 x i16> [[TMP1]] // v32uint16 test_extract_v32uint16 (v64uint16 a, int idx) { @@ -3751,20 +3330,14 @@ v32uint16 test_extract_v32uint16 (v64uint16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i16> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i16> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_TIDV32_T_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_TIDV32_T_EXIT]] -// CHECK: _ZL6insertDv64_tiDv32_t.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x i16> -// CHECK-NEXT: ret <64 x i16> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <64 x i16> +// CHECK-NEXT: ret <64 x i16> [[TMP2]] // v64uint16 test_insert (v64uint16 a, int idx, v32uint16 b) { @@ -3775,19 +3348,13 @@ v64uint16 test_insert (v64uint16 a, int idx, v32uint16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i16> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V64UINT16IDV32_T_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V64UINT16IDV32_T_EXIT]] -// CHECK: _ZL13set_v64uint16iDv32_t.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x i16> -// CHECK-NEXT: ret <64 x i16> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <64 x i16> +// CHECK-NEXT: ret <64 x i16> [[TMP1]] // v64uint16 test_set_v64uint16 (int idx, v32uint16 b) { @@ -3814,27 +3381,18 @@ v64uint16 test_concat (v32uint16 a0, v32uint16 a1) // CHECK-SAME: <64 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i16> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16INT16DV64_SI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16INT16DV64_SI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16INT16DV64_SI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16INT16DV64_SI_EXIT]] -// CHECK: _ZL16extract_v16int16Dv64_si.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x i16> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <16 x i16> // CHECK-NEXT: ret <16 x i16> [[TMP1]] // v16int16 test_extract_v16int16 (v64int16 a, int idx) @@ -3847,29 +3405,22 @@ v16int16 test_extract_v16int16 (v64int16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i16> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i16> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_SIDV16_S_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_SIDV16_S_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_SIDV16_S_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_SIDV16_S_EXIT]] -// CHECK: _ZL6insertDv64_siDv16_s.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x i16> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <64 x i16> // CHECK-NEXT: ret <64 x i16> [[TMP2]] // v64int16 test_insert (v64int16 a, int idx, v16int16 b) @@ -3881,31 +3432,18 @@ v64int16 test_insert (v64int16 a, int idx, v16int16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i16> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i16> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64INT16IDV16_S_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64INT16IDV16_S_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64INT16IDV16_S_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64INT16IDV16_S_EXIT]] -// CHECK: _ZL12set_v64int16iDv16_s.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x i16> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <64 x i16> // CHECK-NEXT: ret <64 x i16> [[TMP1]] // v64int16 test_set_v64int16 (int idx, v16int16 b) @@ -3937,19 +3475,13 @@ v64int16 test_concat (v16int16 a0, v16int16 a1, v16int16 a2, v16int16 a3) // CHECK-SAME: <64 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i16> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32INT16DV64_SI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32INT16DV64_SI_EXIT]] -// CHECK: _ZL16extract_v32int16Dv64_si.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x i16> -// CHECK-NEXT: ret <32 x i16> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x i16> +// CHECK-NEXT: ret <32 x i16> [[TMP1]] // v32int16 test_extract_v32int16 (v64int16 a, int idx) { @@ -3961,20 +3493,14 @@ v32int16 test_extract_v32int16 (v64int16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i16> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i16> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_SIDV32_S_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_SIDV32_S_EXIT]] -// CHECK: _ZL6insertDv64_siDv32_s.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x i16> -// CHECK-NEXT: ret <64 x i16> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <64 x i16> +// CHECK-NEXT: ret <64 x i16> [[TMP2]] // v64int16 test_insert (v64int16 a, int idx, v32int16 b) { @@ -3985,19 +3511,13 @@ v64int16 test_insert (v64int16 a, int idx, v32int16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i16> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64INT16IDV32_S_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64INT16IDV32_S_EXIT]] -// CHECK: _ZL12set_v64int16iDv32_s.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x i16> -// CHECK-NEXT: ret <64 x i16> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <64 x i16> +// CHECK-NEXT: ret <64 x i16> [[TMP1]] // v64int16 test_set_v64int16 (int idx, v32int16 b) { @@ -4023,27 +3543,18 @@ v64int16 test_concat (v32int16 a0, v32int16 a1) // CHECK-LABEL: define dso_local noundef <8 x i32> @_Z21test_extract_v8uint32Dv32_ji( // CHECK-SAME: <32 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT32DV32_JI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT32DV32_JI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT32DV32_JI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT32DV32_JI_EXIT]] -// CHECK: _ZL16extract_v8uint32Dv32_ji.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: ret <8 x i32> [[COND15_I_I]] // v8uint32 test_extract_v8uint32 (v32uint32 a, int idx) { @@ -4053,29 +3564,22 @@ v8uint32 test_extract_v8uint32 (v32uint32 a, int idx) // CHECK-LABEL: define dso_local noundef <32 x i32> @_Z11test_insertDv32_jiDv8_j( // CHECK-SAME: <32 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <8 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_JIDV8_J_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_JIDV8_J_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_JIDV8_J_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_JIDV8_J_EXIT]] -// CHECK: _ZL6insertDv32_jiDv8_j.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[A]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND19_I_I]] // v32uint32 test_insert (v32uint32 a, int idx, v8uint32 b) { @@ -4085,31 +3589,18 @@ v32uint32 test_insert (v32uint32 a, int idx, v8uint32 b) // CHECK-LABEL: define dso_local noundef <32 x i32> @_Z18test_set_v32uint32iDv8_j( // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32UINT32IDV8_J_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32UINT32IDV8_J_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32UINT32IDV8_J_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32UINT32IDV8_J_EXIT]] -// CHECK: _ZL13set_v32uint32iDv8_j.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND15_I_I]] // v32uint32 test_set_v32uint32 (int idx, v8uint32 b) { @@ -4134,18 +3625,12 @@ v32uint32 test_concat (v8uint32 a0, v8uint32 a1, v8uint32 a2, v8uint32 a3) // CHECK-LABEL: define dso_local noundef <16 x i32> @_Z22test_extract_v16uint32Dv32_ji( // CHECK-SAME: <32 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16UINT32DV32_JI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL17EXTRACT_V16UINT32DV32_JI_EXIT]] -// CHECK: _ZL17extract_v16uint32Dv32_ji.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I]] // v16uint32 test_extract_v16uint32 (v32uint32 a, int idx) { @@ -4155,19 +3640,13 @@ v16uint32 test_extract_v16uint32 (v32uint32 a, int idx) // CHECK-LABEL: define dso_local noundef <32 x i32> @_Z11test_insertDv32_jiDv16_j( // CHECK-SAME: <32 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <16 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_JIDV16_J_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_JIDV16_J_EXIT]] -// CHECK: _ZL6insertDv32_jiDv16_j.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[A]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND_I_I]] // v32uint32 test_insert (v32uint32 a, int idx, v16uint32 b) { @@ -4177,18 +3656,12 @@ v32uint32 test_insert (v32uint32 a, int idx, v16uint32 b) // CHECK-LABEL: define dso_local noundef <32 x i32> @_Z18test_set_v32uint32iDv16_j( // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32UINT32IDV16_J_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V32UINT32IDV16_J_EXIT]] -// CHECK: _ZL13set_v32uint32iDv16_j.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND_I_I]] // v32uint32 test_set_v32uint32 (int idx, v16uint32 b) { @@ -4211,27 +3684,18 @@ v32uint32 test_concat (v16uint32 a0, v16uint32 a1) // CHECK-LABEL: define dso_local noundef <8 x i32> @_Z20test_extract_v8int32Dv32_ii( // CHECK-SAME: <32 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT32DV32_II_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT32DV32_II_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT32DV32_II_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT32DV32_II_EXIT]] -// CHECK: _ZL15extract_v8int32Dv32_ii.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: ret <8 x i32> [[COND15_I_I]] // v8int32 test_extract_v8int32 (v32int32 a, int idx) { @@ -4241,29 +3705,22 @@ v8int32 test_extract_v8int32 (v32int32 a, int idx) // CHECK-LABEL: define dso_local noundef <32 x i32> @_Z11test_insertDv32_iiDv8_i( // CHECK-SAME: <32 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <8 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_IIDV8_I_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_IIDV8_I_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_IIDV8_I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_IIDV8_I_EXIT]] -// CHECK: _ZL6insertDv32_iiDv8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[A]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND19_I_I]] // v32int32 test_insert (v32int32 a, int idx, v8int32 b) { @@ -4273,31 +3730,18 @@ v32int32 test_insert (v32int32 a, int idx, v8int32 b) // CHECK-LABEL: define dso_local noundef <32 x i32> @_Z17test_set_v32int32iDv8_i( // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32INT32IDV8_I_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32INT32IDV8_I_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32INT32IDV8_I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32INT32IDV8_I_EXIT]] -// CHECK: _ZL12set_v32int32iDv8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND15_I_I]] // v32int32 test_set_v32int32 (int idx, v8int32 b) { @@ -4322,18 +3766,12 @@ v32int32 test_concat (v8int32 a0, v8int32 a1, v8int32 a2, v8int32 a3) // CHECK-LABEL: define dso_local noundef <16 x i32> @_Z21test_extract_v16int32Dv32_ii( // CHECK-SAME: <32 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16INT32DV32_II_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16INT32DV32_II_EXIT]] -// CHECK: _ZL16extract_v16int32Dv32_ii.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I]] // v16int32 test_extract_v16int32 (v32int32 a, int idx) { @@ -4343,19 +3781,13 @@ v16int32 test_extract_v16int32 (v32int32 a, int idx) // CHECK-LABEL: define dso_local noundef <32 x i32> @_Z11test_insertDv32_iiDv16_i( // CHECK-SAME: <32 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <16 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_IIDV16_I_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_IIDV16_I_EXIT]] -// CHECK: _ZL6insertDv32_iiDv16_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[A]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND_I_I]] // v32int32 test_insert (v32int32 a, int idx, v16int32 b) { @@ -4365,18 +3797,12 @@ v32int32 test_insert (v32int32 a, int idx, v16int32 b) // CHECK-LABEL: define dso_local noundef <32 x i32> @_Z17test_set_v32int32iDv16_i( // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i32> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32INT32IDV16_I_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32INT32IDV16_I_EXIT]] -// CHECK: _ZL12set_v32int32iDv16_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND_I_I]] // v32int32 test_set_v32int32 (int idx, v16int32 b) { @@ -4400,27 +3826,18 @@ v32int32 test_concat (v16int32 a0, v16int32 a1) // CHECK-SAME: <64 x bfloat> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x bfloat> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16BFLOAT16DV64_8BFLOAT16I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16BFLOAT16DV64_8BFLOAT16I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16BFLOAT16DV64_8BFLOAT16I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16BFLOAT16DV64_8BFLOAT16I_EXIT]] -// CHECK: _ZL19extract_v16bfloat16Dv64_8bfloat16i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x bfloat> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <16 x bfloat> // CHECK-NEXT: ret <16 x bfloat> [[TMP1]] // v16bfloat16 test_extract_v16bfloat16 (v64bfloat16 a, int idx) @@ -4430,32 +3847,25 @@ v16bfloat16 test_extract_v16bfloat16 (v64bfloat16 a, int idx) // CHECK-LABEL: define dso_local noundef <64 x bfloat> @_Z11test_insertDv64_8bfloat16iDv16_S_( // CHECK-SAME: <64 x bfloat> noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <16 x bfloat> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { -// CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x bfloat> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x bfloat> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_8BFLOAT16IDV16_S__EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_8BFLOAT16IDV16_S__EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_8BFLOAT16IDV16_S__EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_8BFLOAT16IDV16_S__EXIT]] -// CHECK: _ZL6insertDv64_8bfloat16iDv16_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x bfloat> +// CHECK-NEXT: entry: +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x bfloat> [[A]] to <32 x i32> +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x bfloat> [[B]] to <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <64 x bfloat> // CHECK-NEXT: ret <64 x bfloat> [[TMP2]] // v64bfloat16 test_insert (v64bfloat16 a, int idx, v16bfloat16 b) @@ -4467,31 +3877,18 @@ v64bfloat16 test_insert (v64bfloat16 a, int idx, v16bfloat16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x bfloat> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x bfloat> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64BFLOAT16IDV16_8BFLOAT16_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64BFLOAT16IDV16_8BFLOAT16_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64BFLOAT16IDV16_8BFLOAT16_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64BFLOAT16IDV16_8BFLOAT16_EXIT]] -// CHECK: _ZL15set_v64bfloat16iDv16_8bfloat16.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x bfloat> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <64 x bfloat> // CHECK-NEXT: ret <64 x bfloat> [[TMP1]] // v64bfloat16 test_set_v64bfloat16 (int idx, v16bfloat16 b) @@ -4523,19 +3920,13 @@ v64bfloat16 test_concat (v16bfloat16 a0, v16bfloat16 a1, v16bfloat16 a2, v16bflo // CHECK-SAME: <64 x bfloat> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x bfloat> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V32BFLOAT16DV64_8BFLOAT16I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V32BFLOAT16DV64_8BFLOAT16I_EXIT]] -// CHECK: _ZL19extract_v32bfloat16Dv64_8bfloat16i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <32 x bfloat> -// CHECK-NEXT: ret <32 x bfloat> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <32 x bfloat> +// CHECK-NEXT: ret <32 x bfloat> [[TMP1]] // v32bfloat16 test_extract_v32bfloat16 (v64bfloat16 a, int idx) { @@ -4547,20 +3938,14 @@ v32bfloat16 test_extract_v32bfloat16 (v64bfloat16 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x bfloat> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x bfloat> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_8BFLOAT16IDV32_S__EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_8BFLOAT16IDV32_S__EXIT]] -// CHECK: _ZL6insertDv64_8bfloat16iDv32_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x bfloat> -// CHECK-NEXT: ret <64 x bfloat> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <64 x bfloat> +// CHECK-NEXT: ret <64 x bfloat> [[TMP2]] // v64bfloat16 test_insert (v64bfloat16 a, int idx, v32bfloat16 b) { @@ -4571,19 +3956,13 @@ v64bfloat16 test_insert (v64bfloat16 a, int idx, v32bfloat16 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x bfloat> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x bfloat> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64BFLOAT16IDV32_8BFLOAT16_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64BFLOAT16IDV32_8BFLOAT16_EXIT]] -// CHECK: _ZL15set_v64bfloat16iDv32_8bfloat16.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <64 x bfloat> -// CHECK-NEXT: ret <64 x bfloat> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <64 x bfloat> +// CHECK-NEXT: ret <64 x bfloat> [[TMP1]] // v64bfloat16 test_set_v64bfloat16 (int idx, v32bfloat16 b) { @@ -4610,19 +3989,13 @@ v64bfloat16 test_concat (v32bfloat16 a0, v32bfloat16 a1) // CHECK-SAME: <32 x float> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16ACCFLOATDV32_U10__ACCFLOATI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16ACCFLOATDV32_U10__ACCFLOATI_EXIT]] -// CHECK: _ZL19extract_v16accfloatDv32_u10__accfloati.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <16 x float> -// CHECK-NEXT: ret <16 x float> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <16 x float> +// CHECK-NEXT: ret <16 x float> [[TMP1]] // v16accfloat test_extract_v16accfloat (v32accfloat a, int idx) { @@ -4634,20 +4007,14 @@ v16accfloat test_extract_v16accfloat (v32accfloat a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x float> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U10__ACCFLOATIDV16_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U10__ACCFLOATIDV16_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL6insertDv32_u10__accfloatiDv16_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <32 x float> -// CHECK-NEXT: ret <32 x float> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <32 x float> +// CHECK-NEXT: ret <32 x float> [[TMP2]] // v32accfloat test_insert (v32accfloat a, int idx, v16accfloat b) { @@ -4658,19 +4025,13 @@ v32accfloat test_insert (v32accfloat a, int idx, v16accfloat b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x float> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V32ACCFLOATIDV16_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V32ACCFLOATIDV16_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL15set_v32accfloatiDv16_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <32 x float> -// CHECK-NEXT: ret <32 x float> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <32 x float> +// CHECK-NEXT: ret <32 x float> [[TMP1]] // v32accfloat test_set_v32accfloat (int idx, v16accfloat b) { @@ -4694,27 +4055,18 @@ v32accfloat test_concat (v16accfloat a0, v16accfloat a1) // CHECK-SAME: <32 x float> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8FLOATDV32_FI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8FLOATDV32_FI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8FLOATDV32_FI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8FLOATDV32_FI_EXIT]] -// CHECK: _ZL15extract_v8floatDv32_fi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <8 x float> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i32> [[SHUFFLE2_I_I]], <8 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i32> [[COND_I_I]], <8 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I]] to <8 x float> // CHECK-NEXT: ret <8 x float> [[TMP1]] // v8float test_extract_v8float (v32float a, int idx) @@ -4727,29 +4079,22 @@ v8float test_extract_v8float (v32float a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x float> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_FIDV8_F_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_FIDV8_F_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_FIDV8_F_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_FIDV8_F_EXIT]] -// CHECK: _ZL6insertDv32_fiDv8_f.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <32 x float> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE4_I_I]], <32 x i32> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE6_I_I]], <32 x i32> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I]] to <32 x float> // CHECK-NEXT: ret <32 x float> [[TMP2]] // v32float test_insert (v32float a, int idx, v8float b) @@ -4761,31 +4106,18 @@ v32float test_insert (v32float a, int idx, v8float b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x float> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x float> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32FLOATIDV8_F_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32FLOATIDV8_F_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32FLOATIDV8_F_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32FLOATIDV8_F_EXIT]] -// CHECK: _ZL12set_v32floatiDv8_f.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE14_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <32 x float> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE2_I_I]], <32 x i32> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i32> [[COND_I_I]], <32 x i32> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I]] to <32 x float> // CHECK-NEXT: ret <32 x float> [[TMP1]] // v32float test_set_v32float (int idx, v8float b) @@ -4812,19 +4144,13 @@ v32float test_concat (v8float a0, v8float a1, v8float a2, v8float a3) // CHECK-SAME: <32 x float> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16FLOATDV32_FI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16FLOATDV32_FI_EXIT]] -// CHECK: _ZL16extract_v16floatDv32_fi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <16 x float> -// CHECK-NEXT: ret <16 x float> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <16 x float> +// CHECK-NEXT: ret <16 x float> [[TMP1]] // v16float test_extract_v16float (v32float a, int idx) { @@ -4836,20 +4162,14 @@ v16float test_extract_v16float (v32float a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x float> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_FIDV16_F_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_FIDV16_F_EXIT]] -// CHECK: _ZL6insertDv32_fiDv16_f.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <32 x float> -// CHECK-NEXT: ret <32 x float> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <32 x float> +// CHECK-NEXT: ret <32 x float> [[TMP2]] // v32float test_insert (v32float a, int idx, v16float b) { @@ -4860,19 +4180,13 @@ v32float test_insert (v32float a, int idx, v16float b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x float> noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32FLOATIDV16_F_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32FLOATIDV16_F_EXIT]] -// CHECK: _ZL12set_v32floatiDv16_f.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <32 x float> -// CHECK-NEXT: ret <32 x float> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <32 x float> +// CHECK-NEXT: ret <32 x float> [[TMP1]] // v32float test_set_v32float (int idx, v16float b) { @@ -4895,18 +4209,12 @@ v32float test_concat (v16float a0, v16float a1) // CHECK-LABEL: define dso_local inreg noundef <16 x i32> @_Z21test_extract_v16acc32Dv32_u7__acc32i( // CHECK-SAME: <32 x i32> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16ACC32DV32_U7__ACC32I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16ACC32DV32_U7__ACC32I_EXIT]] -// CHECK: _ZL16extract_v16acc32Dv32_u7__acc32i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I]] // v16acc32 test_extract_v16acc32 (v32acc32 a, int idx) { @@ -4916,19 +4224,13 @@ v16acc32 test_extract_v16acc32 (v32acc32 a, int idx) // CHECK-LABEL: define dso_local inreg noundef <32 x i32> @_Z11test_insertDv32_u7__acc32iDv16_u7__acc32( // CHECK-SAME: <32 x i32> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <16 x i32> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC32IDV16_U7__ACC32_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC32IDV16_U7__ACC32_EXIT]] -// CHECK: _ZL6insertDv32_u7__acc32iDv16_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[A]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND_I_I]] // v32acc32 test_insert (v32acc32 a, int idx, v16acc32 b) { @@ -4938,18 +4240,12 @@ v32acc32 test_insert (v32acc32 a, int idx, v16acc32 b) // CHECK-LABEL: define dso_local inreg noundef <32 x i32> @_Z17test_set_v32acc32iDv16_u7__acc32( // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i32> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC32IDV16_U7__ACC32_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC32IDV16_U7__ACC32_EXIT]] -// CHECK: _ZL12set_v32acc32iDv16_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[B]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND_I_I]] // v32acc32 test_set_v32acc32 (int idx, v16acc32 b) { @@ -4973,19 +4269,13 @@ v32acc32 test_concat (v16acc32 a0, v16acc32 a1) // CHECK-SAME: <16 x i64> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i64> [[A]] to <32 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC64DV16_U7__ACC64I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC64DV16_U7__ACC64I_EXIT]] -// CHECK: _ZL15extract_v8acc64Dv16_u7__acc64i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I]] to <8 x i64> -// CHECK-NEXT: ret <8 x i64> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i32> [[SHUFFLE_I_I]], <16 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I]] to <8 x i64> +// CHECK-NEXT: ret <8 x i64> [[TMP1]] // v8acc64 test_extract_v8acc64 (v16acc64 a, int idx) { @@ -4997,20 +4287,14 @@ v8acc64 test_extract_v8acc64 (v16acc64 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i64> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i64> [[B]] to <16 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U7__ACC64IDV8_U7__ACC64_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U7__ACC64IDV8_U7__ACC64_EXIT]] -// CHECK: _ZL6insertDv16_u7__acc64iDv8_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <16 x i64> -// CHECK-NEXT: ret <16 x i64> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE1_I_I]], <32 x i32> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <16 x i64> +// CHECK-NEXT: ret <16 x i64> [[TMP2]] // v16acc64 test_insert (v16acc64 a, int idx, v8acc64 b) { @@ -5021,19 +4305,13 @@ v16acc64 test_insert (v16acc64 a, int idx, v8acc64 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x i64> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i64> [[B]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16ACC64IDV8_U7__ACC64_EXIT:%.*]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16ACC64IDV8_U7__ACC64_EXIT]] -// CHECK: _ZL12set_v16acc64iDv8_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I]] to <16 x i64> -// CHECK-NEXT: ret <16 x i64> [[TMP2]] +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i32> [[SHUFFLE_I_I]], <32 x i32> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND_I_I]] to <16 x i64> +// CHECK-NEXT: ret <16 x i64> [[TMP1]] // v16acc64 test_set_v16acc64 (int idx, v8acc64 b) { @@ -5057,27 +4335,18 @@ v16acc64 test_concat (v8acc64 a0, v8acc64 a1) // CHECK-SAME: <64 x float> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x float> [[A]] to <32 x i64> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16ACCFLOATDV64_U10__ACCFLOATI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16ACCFLOATDV64_U10__ACCFLOATI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16ACCFLOATDV64_U10__ACCFLOATI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V16ACCFLOATDV64_U10__ACCFLOATI_EXIT]] -// CHECK: _ZL19extract_v16accfloatDv64_u10__accfloati.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i64> [[RETVAL_0_I_I]] to <16 x float> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i64> [[SHUFFLE_I_I]], <8 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i64> [[SHUFFLE2_I_I]], <8 x i64> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i64> [[COND_I_I]], <8 x i64> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i64> [[COND15_I_I]] to <16 x float> // CHECK-NEXT: ret <16 x float> [[TMP1]] // v16accfloat test_extract_v16accfloat (v64accfloat a, int idx) @@ -5090,28 +4359,22 @@ v16accfloat test_extract_v16accfloat (v64accfloat a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x float> [[A]] to <32 x i64> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x float> [[B]] to <8 x i64> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE1_I_I]], <32 x i64> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U10__ACCFLOATIDV16_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U10__ACCFLOATIDV16_U10__ACCFLOAT_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U10__ACCFLOATIDV16_U10__ACCFLOAT_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U10__ACCFLOATIDV16_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL6insertDv64_u10__accfloatiDv16_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i64> [[RETVAL_0_I_I]] to <64 x float> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE4_I_I]], <32 x i64> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE6_I_I]], <32 x i64> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i64> [[COND_I_I]], <32 x i64> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i64> [[COND19_I_I]] to <64 x float> // CHECK-NEXT: ret <64 x float> [[TMP2]] // v64accfloat test_insert (v64accfloat a, int idx, v16accfloat b) @@ -5123,27 +4386,18 @@ v64accfloat test_insert (v64accfloat a, int idx, v16accfloat b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x float> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[B]] to <8 x i64> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN9_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64ACCFLOATIDV16_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64ACCFLOATIDV16_U10__ACCFLOAT_EXIT]] -// CHECK: if.then9.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64ACCFLOATIDV16_U10__ACCFLOAT_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64ACCFLOATIDV16_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL15set_v64accfloatiDv16_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE5_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_THEN9_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i64> [[RETVAL_0_I_I]] to <64 x float> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE2_I_I]], <32 x i64> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i64> [[COND_I_I]], <32 x i64> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i64> [[COND15_I_I]] to <64 x float> // CHECK-NEXT: ret <64 x float> [[TMP1]] // v64accfloat test_set_v64accfloat (int idx, v16accfloat b) @@ -5175,19 +4429,13 @@ v64accfloat test_concat (v16accfloat a0, v16accfloat a1, v16accfloat a2, v16accf // CHECK-SAME: <64 x float> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x float> [[A]] to <32 x i64> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V32ACCFLOATDV64_U10__ACCFLOATI_EXIT:%.*]] -// CHECK: if.else.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL19EXTRACT_V32ACCFLOATDV64_U10__ACCFLOATI_EXIT]] -// CHECK: _ZL19extract_v32accfloatDv64_u10__accfloati.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i64> [[RETVAL_0_I_I]] to <32 x float> -// CHECK-NEXT: ret <32 x float> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <16 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i64> [[SHUFFLE_I_I]], <16 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i64> [[COND_I_I]] to <32 x float> +// CHECK-NEXT: ret <32 x float> [[TMP1]] // v32accfloat test_extract_v32accfloat (v64accfloat a, int idx) { @@ -5200,19 +4448,13 @@ v32accfloat test_extract_v32accfloat (v64accfloat a, int idx) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x float> [[A]] to <32 x i64> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x float> [[B]] to <16 x i64> // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[TMP1]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U10__ACCFLOATIDV32_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U10__ACCFLOATIDV32_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL6insertDv64_u10__accfloatiDv32_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i64> [[RETVAL_0_I_I]] to <64 x float> -// CHECK-NEXT: ret <64 x float> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i64> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i64> [[COND_I_I]] to <64 x float> +// CHECK-NEXT: ret <64 x float> [[TMP2]] // v64accfloat test_insert (v64accfloat a, int idx, v32accfloat b) { @@ -5223,19 +4465,13 @@ v64accfloat test_insert (v64accfloat a, int idx, v32accfloat b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x float> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[B]] to <16 x i64> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[TMP0]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64ACCFLOATIDV32_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.else.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i64> [[TMP0]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V64ACCFLOATIDV32_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL15set_v64accfloatiDv32_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i64> [[RETVAL_0_I_I]] to <64 x float> -// CHECK-NEXT: ret <64 x float> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[TMP0]], <16 x i64> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i64> [[COND_I_I]] to <64 x float> +// CHECK-NEXT: ret <64 x float> [[TMP1]] // v64accfloat test_set_v64accfloat (int idx, v32accfloat b) { @@ -5262,27 +4498,18 @@ v64accfloat test_concat (v32accfloat a0, v32accfloat a1) // CHECK-SAME: <64 x i32> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i32> [[A]] to <32 x i64> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16ACC32DV64_U7__ACC32I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16ACC32DV64_U7__ACC32I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16ACC32DV64_U7__ACC32I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16ACC32DV64_U7__ACC32I_EXIT]] -// CHECK: _ZL16extract_v16acc32Dv64_u7__acc32i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i64> [[RETVAL_0_I_I]] to <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i64> [[SHUFFLE_I_I]], <8 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i64> [[SHUFFLE2_I_I]], <8 x i64> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i64> [[COND_I_I]], <8 x i64> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i64> [[COND15_I_I]] to <16 x i32> // CHECK-NEXT: ret <16 x i32> [[TMP1]] // v16acc32 test_extract_v16acc32 (v64acc32 a, int idx) @@ -5295,28 +4522,22 @@ v16acc32 test_extract_v16acc32 (v64acc32 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i32> [[A]] to <32 x i64> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[B]] to <8 x i64> -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE1_I_I]], <32 x i64> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U7__ACC32IDV16_U7__ACC32_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U7__ACC32IDV16_U7__ACC32_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U7__ACC32IDV16_U7__ACC32_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U7__ACC32IDV16_U7__ACC32_EXIT]] -// CHECK: _ZL6insertDv64_u7__acc32iDv16_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i64> [[RETVAL_0_I_I]] to <64 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i64> [[TMP1]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE4_I_I]], <32 x i64> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE6_I_I]], <32 x i64> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i64> [[COND_I_I]], <32 x i64> [[COND13_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i64> [[COND19_I_I]] to <64 x i32> // CHECK-NEXT: ret <64 x i32> [[TMP2]] // v64acc32 test_insert (v64acc32 a, int idx, v16acc32 b) @@ -5328,27 +4549,18 @@ v64acc32 test_insert (v64acc32 a, int idx, v16acc32 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i32> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i32> [[B]] to <8 x i64> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN9_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64ACC32IDV16_U7__ACC32_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64ACC32IDV16_U7__ACC32_EXIT]] -// CHECK: if.then9.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64ACC32IDV16_U7__ACC32_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64ACC32IDV16_U7__ACC32_EXIT]] -// CHECK: _ZL12set_v64acc32iDv16_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE5_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_THEN9_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i64> [[RETVAL_0_I_I]] to <64 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i64> [[TMP0]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE2_I_I]], <32 x i64> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i64> [[COND_I_I]], <32 x i64> [[COND9_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i64> [[COND15_I_I]] to <64 x i32> // CHECK-NEXT: ret <64 x i32> [[TMP1]] // v64acc32 test_set_v64acc32 (int idx, v16acc32 b) @@ -5380,19 +4592,13 @@ v64acc32 test_concat (v16acc32 a0, v16acc32 a1, v16acc32 a2, v16acc32 a3) // CHECK-SAME: <64 x i32> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i32> [[A]] to <32 x i64> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32ACC32DV64_U7__ACC32I_EXIT:%.*]] -// CHECK: if.else.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32ACC32DV64_U7__ACC32I_EXIT]] -// CHECK: _ZL16extract_v32acc32Dv64_u7__acc32i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i64> [[RETVAL_0_I_I]] to <32 x i32> -// CHECK-NEXT: ret <32 x i32> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> poison, <16 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i64> [[SHUFFLE_I_I]], <16 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i64> [[COND_I_I]] to <32 x i32> +// CHECK-NEXT: ret <32 x i32> [[TMP1]] // v32acc32 test_extract_v32acc32 (v64acc32 a, int idx) { @@ -5405,19 +4611,13 @@ v32acc32 test_extract_v32acc32 (v64acc32 a, int idx) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i32> [[A]] to <32 x i64> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[B]] to <16 x i64> // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[TMP1]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U7__ACC32IDV32_U7__ACC32_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[TMP0]], <32 x i64> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV64_U7__ACC32IDV32_U7__ACC32_EXIT]] -// CHECK: _ZL6insertDv64_u7__acc32iDv32_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <32 x i64> [[RETVAL_0_I_I]] to <64 x i32> -// CHECK-NEXT: ret <64 x i32> [[TMP3]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i64> [[SHUFFLE2_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i64> [[COND_I_I]] to <64 x i32> +// CHECK-NEXT: ret <64 x i32> [[TMP2]] // v64acc32 test_insert (v64acc32 a, int idx, v32acc32 b) { @@ -5428,19 +4628,13 @@ v64acc32 test_insert (v64acc32 a, int idx, v32acc32 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <32 x i32> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i32> [[B]] to <16 x i64> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[TMP0]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64ACC32IDV32_U7__ACC32_EXIT:%.*]] -// CHECK: if.else.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i64> [[TMP0]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64ACC32IDV32_U7__ACC32_EXIT]] -// CHECK: _ZL12set_v64acc32iDv32_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i64> [[RETVAL_0_I_I]] to <64 x i32> -// CHECK-NEXT: ret <64 x i32> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[TMP0]], <16 x i64> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i64> [[COND_I_I]] to <64 x i32> +// CHECK-NEXT: ret <64 x i32> [[TMP1]] // v64acc32 test_set_v64acc32 (int idx, v32acc32 b) { @@ -5466,27 +4660,18 @@ v64acc32 test_concat (v32acc32 a0, v32acc32 a1) // CHECK-LABEL: define dso_local inreg noundef <8 x i64> @_Z20test_extract_v8acc64Dv32_u7__acc64i( // CHECK-SAME: <32 x i64> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC64DV32_U7__ACC64I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC64DV32_U7__ACC64I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC64DV32_U7__ACC64I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC64DV32_U7__ACC64I_EXIT]] -// CHECK: _ZL15extract_v8acc64Dv32_u7__acc64i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <8 x i64> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i64> [[SHUFFLE_I_I]], <8 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <8 x i64> [[SHUFFLE2_I_I]], <8 x i64> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <8 x i64> [[COND_I_I]], <8 x i64> [[COND9_I_I]] +// CHECK-NEXT: ret <8 x i64> [[COND15_I_I]] // v8acc64 test_extract_v8acc64 (v32acc64 a, int idx) { @@ -5496,28 +4681,22 @@ v8acc64 test_extract_v8acc64 (v32acc64 a, int idx) // CHECK-LABEL: define dso_local inreg noundef <32 x i64> @_Z11test_insertDv32_u7__acc64iDv8_u7__acc64( // CHECK-SAME: <32 x i64> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <8 x i64> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE1_I_I]], <32 x i64> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC64IDV8_U7__ACC64_EXIT:%.*]] -// CHECK: if.then5.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC64IDV8_U7__ACC64_EXIT]] -// CHECK: if.then10.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC64IDV8_U7__ACC64_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC64IDV8_U7__ACC64_EXIT]] -// CHECK: _ZL6insertDv32_u7__acc64iDv8_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE2_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE6_I_I]], [[IF_THEN5_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_THEN10_I_I]] ], [ [[SHUFFLE12_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i64> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> [[SHUFFLE2_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> [[SHUFFLE3_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[A]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE4_I_I]], <32 x i64> [[SHUFFLE5_I_I]] +// CHECK-NEXT: [[COND13_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE6_I_I]], <32 x i64> [[SHUFFLE7_I_I]] +// CHECK-NEXT: [[AND14_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I:%.*]] = icmp eq i32 [[AND14_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I]], <32 x i64> [[COND_I_I]], <32 x i64> [[COND13_I_I]] +// CHECK-NEXT: ret <32 x i64> [[COND19_I_I]] // v32acc64 test_insert (v32acc64 a, int idx, v8acc64 b) { @@ -5527,27 +4706,18 @@ v32acc64 test_insert (v32acc64 a, int idx, v8acc64 b) // CHECK-LABEL: define dso_local inreg noundef <32 x i64> @_Z17test_set_v32acc64iDv8_u7__acc64( // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x i64> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN9_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC64IDV8_U7__ACC64_EXIT:%.*]] -// CHECK: if.then4.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC64IDV8_U7__ACC64_EXIT]] -// CHECK: if.then9.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC64IDV8_U7__ACC64_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC64IDV8_U7__ACC64_EXIT]] -// CHECK: _ZL12set_v32acc64iDv8_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE5_I_I]], [[IF_THEN4_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_THEN9_I_I]] ], [ [[SHUFFLE11_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i64> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i64> [[B]], <8 x i64> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: [[COND9_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE2_I_I]], <32 x i64> [[SHUFFLE3_I_I]] +// CHECK-NEXT: [[AND10_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I:%.*]] = icmp eq i32 [[AND10_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I]], <32 x i64> [[COND_I_I]], <32 x i64> [[COND9_I_I]] +// CHECK-NEXT: ret <32 x i64> [[COND15_I_I]] // v32acc64 test_set_v32acc64 (int idx, v8acc64 b) { @@ -5572,18 +4742,12 @@ v32acc64 test_concat (v8acc64 a0, v8acc64 a1, v8acc64 a2, v8acc64 a3) // CHECK-LABEL: define dso_local inreg noundef <16 x i64> @_Z21test_extract_v16acc64Dv32_u7__acc64i( // CHECK-SAME: <32 x i64> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16ACC64DV32_U7__ACC64I_EXIT:%.*]] -// CHECK: if.else.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <16 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16ACC64DV32_U7__ACC64I_EXIT]] -// CHECK: _ZL16extract_v16acc64Dv32_u7__acc64i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <16 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <16 x i64> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> poison, <16 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <16 x i64> [[SHUFFLE_I_I]], <16 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <16 x i64> [[COND_I_I]] // v16acc64 test_extract_v16acc64 (v32acc64 a, int idx) { @@ -5594,18 +4758,12 @@ v16acc64 test_extract_v16acc64 (v32acc64 a, int idx) // CHECK-SAME: <32 x i64> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <16 x i64> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[B]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC64IDV16_U7__ACC64_EXIT:%.*]] -// CHECK: if.end.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <32 x i64> [[A]], <32 x i64> [[SHUFFLE_I_I]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC64IDV16_U7__ACC64_EXIT]] -// CHECK: _ZL6insertDv32_u7__acc64iDv16_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_END_I_I]] ] -// CHECK-NEXT: ret <32 x i64> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[A]], <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE1_I_I]], <32 x i64> [[SHUFFLE2_I_I]] +// CHECK-NEXT: ret <32 x i64> [[COND_I_I]] // v32acc64 test_insert (v32acc64 a, int idx, v16acc64 b) { @@ -5615,18 +4773,12 @@ v32acc64 test_insert (v32acc64 a, int idx, v16acc64 b) // CHECK-LABEL: define dso_local inreg noundef <32 x i64> @_Z17test_set_v32acc64iDv16_u7__acc64( // CHECK-SAME: i32 noundef [[IDX:%.*]], <16 x i64> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[B]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC64IDV16_U7__ACC64_EXIT:%.*]] -// CHECK: if.else.i.i: +// CHECK-NEXT: [[AND_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I:%.*]] = icmp eq i32 [[AND_I_I]], 0 // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <16 x i64> [[B]], <16 x i64> poison, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC64IDV16_U7__ACC64_EXIT]] -// CHECK: _ZL12set_v32acc64iDv16_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <32 x i64> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <32 x i64> [[RETVAL_0_I_I]] +// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i64> [[B]], <16 x i64> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I]], <32 x i64> [[SHUFFLE_I_I]], <32 x i64> [[SHUFFLE1_I_I]] +// CHECK-NEXT: ret <32 x i64> [[COND_I_I]] // v32acc64 test_set_v32acc64 (int idx, v16acc64 b) { @@ -5647,32 +4799,23 @@ v32acc64 test_concat (v16acc64 a0, v16acc64 a1) -// CHECK-LABEL: define dso_local noundef <16 x i8> @_Z21test_extract_v32uint4Dv64_DU8_i( -// CHECK-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { -// CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT4DV64_DU8_I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT4DV64_DU8_I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT4DV64_DU8_I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT4DV64_DU8_I_EXIT]] -// CHECK: _ZL16extract_v32uint4Dv64_DU8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> -// CHECK-NEXT: ret <16 x i8> [[TMP1]] +// CHECK-AIE2P-LABEL: define dso_local noundef <16 x i8> @_Z21test_extract_v32uint4Dv64_DU8_i( +// CHECK-AIE2P-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2P-NEXT: entry: +// CHECK-AIE2P-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> +// CHECK-AIE2P-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-AIE2P-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2P-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <16 x i8> +// CHECK-AIE2P-NEXT: ret <16 x i8> [[TMP2]] +// +// CHECK-AIE2PS-LABEL: define dso_local noundef <16 x i8> @_Z21test_extract_v32uint4Dv64_DU8_i( +// CHECK-AIE2PS-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2PS-NEXT: entry: +// CHECK-AIE2PS-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> +// CHECK-AIE2PS-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-AIE2PS-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2PS-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <16 x i8> +// CHECK-AIE2PS-NEXT: ret <16 x i8> [[TMP2]] // v32uint4 test_extract_v32uint4 ( v128uint4 a, int idx ) { @@ -5680,32 +4823,23 @@ v32uint4 test_extract_v32uint4 ( v128uint4 a, int idx ) } -// CHECK-LABEL: define dso_local noundef <16 x i8> @_Z20test_extract_v32int4Dv64_DB8_i( -// CHECK-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { -// CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT4DV64_DB8_I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT4DV64_DB8_I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT4DV64_DB8_I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT4DV64_DB8_I_EXIT]] -// CHECK: _ZL15extract_v32int4Dv64_DB8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> -// CHECK-NEXT: ret <16 x i8> [[TMP1]] +// CHECK-AIE2P-LABEL: define dso_local noundef <16 x i8> @_Z20test_extract_v32int4Dv64_DB8_i( +// CHECK-AIE2P-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2P-NEXT: entry: +// CHECK-AIE2P-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> +// CHECK-AIE2P-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-AIE2P-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2P-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <16 x i8> +// CHECK-AIE2P-NEXT: ret <16 x i8> [[TMP2]] +// +// CHECK-AIE2PS-LABEL: define dso_local noundef <16 x i8> @_Z20test_extract_v32int4Dv64_DB8_i( +// CHECK-AIE2PS-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2PS-NEXT: entry: +// CHECK-AIE2PS-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> +// CHECK-AIE2PS-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-AIE2PS-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2PS-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <16 x i8> +// CHECK-AIE2PS-NEXT: ret <16 x i8> [[TMP2]] // v32int4 test_extract_v32int4 ( v128int4 a, int idx ) { @@ -5713,32 +4847,23 @@ v32int4 test_extract_v32int4 ( v128int4 a, int idx ) } -// CHECK-LABEL: define dso_local noundef <16 x i8> @_Z21test_extract_v16uint8Dv64_hi( -// CHECK-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { -// CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16UINT8DV64_HI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16UINT8DV64_HI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16UINT8DV64_HI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16UINT8DV64_HI_EXIT]] -// CHECK: _ZL16extract_v16uint8Dv64_hi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> -// CHECK-NEXT: ret <16 x i8> [[TMP1]] +// CHECK-AIE2P-LABEL: define dso_local noundef <16 x i8> @_Z21test_extract_v16uint8Dv64_hi( +// CHECK-AIE2P-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2P-NEXT: entry: +// CHECK-AIE2P-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> +// CHECK-AIE2P-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-AIE2P-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2P-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <16 x i8> +// CHECK-AIE2P-NEXT: ret <16 x i8> [[TMP2]] +// +// CHECK-AIE2PS-LABEL: define dso_local noundef <16 x i8> @_Z21test_extract_v16uint8Dv64_hi( +// CHECK-AIE2PS-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2PS-NEXT: entry: +// CHECK-AIE2PS-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> +// CHECK-AIE2PS-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-AIE2PS-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2PS-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <16 x i8> +// CHECK-AIE2PS-NEXT: ret <16 x i8> [[TMP2]] // v16uint8 test_extract_v16uint8 ( v64uint8 a, int idx ) { @@ -5746,32 +4871,23 @@ v16uint8 test_extract_v16uint8 ( v64uint8 a, int idx ) } -// CHECK-LABEL: define dso_local noundef <16 x i8> @_Z20test_extract_v16int8Dv64_ai( -// CHECK-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { -// CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V16INT8DV64_AI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V16INT8DV64_AI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V16INT8DV64_AI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V16INT8DV64_AI_EXIT]] -// CHECK: _ZL15extract_v16int8Dv64_ai.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> -// CHECK-NEXT: ret <16 x i8> [[TMP1]] +// CHECK-AIE2P-LABEL: define dso_local noundef <16 x i8> @_Z20test_extract_v16int8Dv64_ai( +// CHECK-AIE2P-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2P-NEXT: entry: +// CHECK-AIE2P-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> +// CHECK-AIE2P-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-AIE2P-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2P-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <16 x i8> +// CHECK-AIE2P-NEXT: ret <16 x i8> [[TMP2]] +// +// CHECK-AIE2PS-LABEL: define dso_local noundef <16 x i8> @_Z20test_extract_v16int8Dv64_ai( +// CHECK-AIE2PS-SAME: <64 x i8> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2PS-NEXT: entry: +// CHECK-AIE2PS-NEXT: [[TMP0:%.*]] = bitcast <64 x i8> [[A]] to <16 x i32> +// CHECK-AIE2PS-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-AIE2PS-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2PS-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <16 x i8> +// CHECK-AIE2PS-NEXT: ret <16 x i8> [[TMP2]] // v16int8 test_extract_v16int8 ( v64int8 a, int idx ) { @@ -5779,32 +4895,23 @@ v16int8 test_extract_v16int8 ( v64int8 a, int idx ) } -// CHECK-LABEL: define dso_local noundef <8 x i16> @_Z21test_extract_v8uint16Dv32_ti( -// CHECK-SAME: <32 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { -// CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT16DV32_TI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT16DV32_TI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT16DV32_TI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT16DV32_TI_EXIT]] -// CHECK: _ZL16extract_v8uint16Dv32_ti.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <8 x i16> -// CHECK-NEXT: ret <8 x i16> [[TMP1]] +// CHECK-AIE2P-LABEL: define dso_local noundef <8 x i16> @_Z21test_extract_v8uint16Dv32_ti( +// CHECK-AIE2P-SAME: <32 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2P-NEXT: entry: +// CHECK-AIE2P-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> +// CHECK-AIE2P-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-AIE2P-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2P-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <8 x i16> +// CHECK-AIE2P-NEXT: ret <8 x i16> [[TMP2]] +// +// CHECK-AIE2PS-LABEL: define dso_local noundef <8 x i16> @_Z21test_extract_v8uint16Dv32_ti( +// CHECK-AIE2PS-SAME: <32 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2PS-NEXT: entry: +// CHECK-AIE2PS-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> +// CHECK-AIE2PS-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-AIE2PS-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2PS-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <8 x i16> +// CHECK-AIE2PS-NEXT: ret <8 x i16> [[TMP2]] // v8uint16 test_extract_v8uint16 ( v32uint16 a, int idx ) { @@ -5812,32 +4919,23 @@ v8uint16 test_extract_v8uint16 ( v32uint16 a, int idx ) } -// CHECK-LABEL: define dso_local noundef <8 x i16> @_Z20test_extract_v8int16Dv32_si( -// CHECK-SAME: <32 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { -// CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT16DV32_SI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT16DV32_SI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT16DV32_SI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT16DV32_SI_EXIT]] -// CHECK: _ZL15extract_v8int16Dv32_si.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <8 x i16> -// CHECK-NEXT: ret <8 x i16> [[TMP1]] +// CHECK-AIE2P-LABEL: define dso_local noundef <8 x i16> @_Z20test_extract_v8int16Dv32_si( +// CHECK-AIE2P-SAME: <32 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2P-NEXT: entry: +// CHECK-AIE2P-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> +// CHECK-AIE2P-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-AIE2P-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2P-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <8 x i16> +// CHECK-AIE2P-NEXT: ret <8 x i16> [[TMP2]] +// +// CHECK-AIE2PS-LABEL: define dso_local noundef <8 x i16> @_Z20test_extract_v8int16Dv32_si( +// CHECK-AIE2PS-SAME: <32 x i16> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2PS-NEXT: entry: +// CHECK-AIE2PS-NEXT: [[TMP0:%.*]] = bitcast <32 x i16> [[A]] to <16 x i32> +// CHECK-AIE2PS-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-AIE2PS-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2PS-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <8 x i16> +// CHECK-AIE2PS-NEXT: ret <8 x i16> [[TMP2]] // v8int16 test_extract_v8int16 ( v32int16 a, int idx ) { @@ -5845,30 +4943,19 @@ v8int16 test_extract_v8int16 ( v32int16 a, int idx ) } -// CHECK-LABEL: define dso_local noundef <4 x i32> @_Z21test_extract_v4uint32Dv16_ji( -// CHECK-SAME: <16 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { -// CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V4UINT32DV16_JI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V4UINT32DV16_JI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V4UINT32DV16_JI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V4UINT32DV16_JI_EXIT]] -// CHECK: _ZL16extract_v4uint32Dv16_ji.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <4 x i32> [[RETVAL_0_I_I]] +// CHECK-AIE2P-LABEL: define dso_local noundef <4 x i32> @_Z21test_extract_v4uint32Dv16_ji( +// CHECK-AIE2P-SAME: <16 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2P-NEXT: entry: +// CHECK-AIE2P-NEXT: [[TMP0:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[A]], i32 [[IDX]]) +// CHECK-AIE2P-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2P-NEXT: ret <4 x i32> [[SHUFFLE_I_I]] +// +// CHECK-AIE2PS-LABEL: define dso_local noundef <4 x i32> @_Z21test_extract_v4uint32Dv16_ji( +// CHECK-AIE2PS-SAME: <16 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2PS-NEXT: entry: +// CHECK-AIE2PS-NEXT: [[TMP0:%.*]] = tail call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> [[A]], i32 [[IDX]]) +// CHECK-AIE2PS-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2PS-NEXT: ret <4 x i32> [[SHUFFLE_I_I]] // v4uint32 test_extract_v4uint32 ( v16uint32 a, int idx ) { @@ -5876,30 +4963,19 @@ v4uint32 test_extract_v4uint32 ( v16uint32 a, int idx ) } -// CHECK-LABEL: define dso_local noundef <4 x i32> @_Z20test_extract_v4int32Dv16_ii( -// CHECK-SAME: <16 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { -// CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4INT32DV16_II_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4INT32DV16_II_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4INT32DV16_II_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4INT32DV16_II_EXIT]] -// CHECK: _ZL15extract_v4int32Dv16_ii.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: ret <4 x i32> [[RETVAL_0_I_I]] +// CHECK-AIE2P-LABEL: define dso_local noundef <4 x i32> @_Z20test_extract_v4int32Dv16_ii( +// CHECK-AIE2P-SAME: <16 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2P-NEXT: entry: +// CHECK-AIE2P-NEXT: [[TMP0:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[A]], i32 [[IDX]]) +// CHECK-AIE2P-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2P-NEXT: ret <4 x i32> [[SHUFFLE_I_I]] +// +// CHECK-AIE2PS-LABEL: define dso_local noundef <4 x i32> @_Z20test_extract_v4int32Dv16_ii( +// CHECK-AIE2PS-SAME: <16 x i32> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2PS-NEXT: entry: +// CHECK-AIE2PS-NEXT: [[TMP0:%.*]] = tail call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> [[A]], i32 [[IDX]]) +// CHECK-AIE2PS-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2PS-NEXT: ret <4 x i32> [[SHUFFLE_I_I]] // v4int32 test_extract_v4int32 ( v16int32 a, int idx ) { @@ -5907,32 +4983,23 @@ v4int32 test_extract_v4int32 ( v16int32 a, int idx ) } -// CHECK-LABEL: define dso_local noundef <8 x bfloat> @_Z23test_extract_v8bfloat16Dv32_8bfloat16i( -// CHECK-SAME: <32 x bfloat> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { -// CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x bfloat> [[A]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8BFLOAT16DV32_8BFLOAT16I_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8BFLOAT16DV32_8BFLOAT16I_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8BFLOAT16DV32_8BFLOAT16I_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8BFLOAT16DV32_8BFLOAT16I_EXIT]] -// CHECK: _ZL18extract_v8bfloat16Dv32_8bfloat16i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <8 x bfloat> -// CHECK-NEXT: ret <8 x bfloat> [[TMP1]] +// CHECK-AIE2P-LABEL: define dso_local noundef <8 x bfloat> @_Z23test_extract_v8bfloat16Dv32_8bfloat16i( +// CHECK-AIE2P-SAME: <32 x bfloat> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2P-NEXT: entry: +// CHECK-AIE2P-NEXT: [[TMP0:%.*]] = bitcast <32 x bfloat> [[A]] to <16 x i32> +// CHECK-AIE2P-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-AIE2P-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2P-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <8 x bfloat> +// CHECK-AIE2P-NEXT: ret <8 x bfloat> [[TMP2]] +// +// CHECK-AIE2PS-LABEL: define dso_local noundef <8 x bfloat> @_Z23test_extract_v8bfloat16Dv32_8bfloat16i( +// CHECK-AIE2PS-SAME: <32 x bfloat> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2PS-NEXT: entry: +// CHECK-AIE2PS-NEXT: [[TMP0:%.*]] = bitcast <32 x bfloat> [[A]] to <16 x i32> +// CHECK-AIE2PS-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-AIE2PS-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP1]], <16 x i32> poison, <4 x i32> +// CHECK-AIE2PS-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[SHUFFLE_I_I]] to <8 x bfloat> +// CHECK-AIE2PS-NEXT: ret <8 x bfloat> [[TMP2]] // v8bfloat16 test_extract_v8bfloat16 ( v32bfloat16 a, int idx ) { @@ -5940,32 +5007,23 @@ v8bfloat16 test_extract_v8bfloat16 ( v32bfloat16 a, int idx ) } -// CHECK-LABEL: define dso_local noundef <4 x float> @_Z20test_extract_v4floatDv16_fi( -// CHECK-SAME: <16 x float> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { -// CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[A]] to <16 x i32> -// CHECK-NEXT: [[REM_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I]], label [[IF_ELSE_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4FLOATDV16_FI_EXIT:%.*]] -// CHECK: if.then3.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4FLOATDV16_FI_EXIT]] -// CHECK: if.then8.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4FLOATDV16_FI_EXIT]] -// CHECK: if.else.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4FLOATDV16_FI_EXIT]] -// CHECK: _ZL15extract_v4floatDv16_fi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE4_I_I]], [[IF_THEN3_I_I]] ], [ [[SHUFFLE9_I_I]], [[IF_THEN8_I_I]] ], [ [[SHUFFLE10_I_I]], [[IF_ELSE_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <4 x float> -// CHECK-NEXT: ret <4 x float> [[TMP1]] +// CHECK-AIE2P-LABEL: define dso_local noundef <4 x float> @_Z20test_extract_v4floatDv16_fi( +// CHECK-AIE2P-SAME: <16 x float> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2P-NEXT: entry: +// CHECK-AIE2P-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[A]] to <16 x i32> +// CHECK-AIE2P-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-AIE2P-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[TMP1]] to <16 x float> +// CHECK-AIE2P-NEXT: [[TMP3:%.*]] = shufflevector <16 x float> [[TMP2]], <16 x float> poison, <4 x i32> +// CHECK-AIE2P-NEXT: ret <4 x float> [[TMP3]] +// +// CHECK-AIE2PS-LABEL: define dso_local noundef <4 x float> @_Z20test_extract_v4floatDv16_fi( +// CHECK-AIE2PS-SAME: <16 x float> noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { +// CHECK-AIE2PS-NEXT: entry: +// CHECK-AIE2PS-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[A]] to <16 x i32> +// CHECK-AIE2PS-NEXT: [[TMP1:%.*]] = tail call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> [[TMP0]], i32 [[IDX]]) +// CHECK-AIE2PS-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[TMP1]] to <16 x float> +// CHECK-AIE2PS-NEXT: [[TMP3:%.*]] = shufflevector <16 x float> [[TMP2]], <16 x float> poison, <4 x i32> +// CHECK-AIE2PS-NEXT: ret <4 x float> [[TMP3]] // v4float test_extract_v4float ( v16float a, int idx ) { @@ -6346,15 +5404,9 @@ v16float test_set_v16float ( int idx, v4float a ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[A]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT4DV32_DU8_I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V32UINT4DV32_DU8_I_EXIT]] -// CHECK: _ZL16extract_v32uint4Dv32_DU8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> // CHECK-NEXT: ret <16 x i8> [[TMP2]] // @@ -6369,15 +5421,9 @@ v32uint4 test_extract_v32uint4 ( v64uint4 a, int idx ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[A]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT4DV32_DB8_I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V32INT4DV32_DB8_I_EXIT]] -// CHECK: _ZL15extract_v32int4Dv32_DB8_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> // CHECK-NEXT: ret <16 x i8> [[TMP2]] // @@ -6392,15 +5438,9 @@ v32int4 test_extract_v32int4 ( v64int4 a, int idx ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[A]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16UINT8DV32_HI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V16UINT8DV32_HI_EXIT]] -// CHECK: _ZL16extract_v16uint8Dv32_hi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> // CHECK-NEXT: ret <16 x i8> [[TMP2]] // @@ -6415,15 +5455,9 @@ v16uint8 test_extract_v16uint8 ( v32uint8 a, int idx ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x i8> [[A]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V16INT8DV32_AI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V16INT8DV32_AI_EXIT]] -// CHECK: _ZL15extract_v16int8Dv32_ai.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <16 x i8> // CHECK-NEXT: ret <16 x i8> [[TMP2]] // @@ -6438,15 +5472,9 @@ v16int8 test_extract_v16int8 ( v32int8 a, int idx ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i16> [[A]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT16DV16_TI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V8UINT16DV16_TI_EXIT]] -// CHECK: _ZL16extract_v8uint16Dv16_ti.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <8 x i16> // CHECK-NEXT: ret <8 x i16> [[TMP2]] // @@ -6461,15 +5489,9 @@ v8uint16 test_extract_v8uint16 ( v16uint16 a, int idx ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i16> [[A]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT16DV16_SI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8INT16DV16_SI_EXIT]] -// CHECK: _ZL15extract_v8int16Dv16_si.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <8 x i16> // CHECK-NEXT: ret <8 x i16> [[TMP2]] // @@ -6483,15 +5505,9 @@ v8int16 test_extract_v8int16 ( v16int16 a, int idx ) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V4UINT32DV8_JI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL16EXTRACT_V4UINT32DV8_JI_EXIT]] -// CHECK: _ZL16extract_v4uint32Dv8_ji.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: ret <4 x i32> [[RETVAL_0_I_I]] // v4uint32 test_extract_v4uint32 ( v8uint32 a, int idx ) @@ -6504,15 +5520,9 @@ v4uint32 test_extract_v4uint32 ( v8uint32 a, int idx ) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4INT32DV8_II_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4INT32DV8_II_EXIT]] -// CHECK: _ZL15extract_v4int32Dv8_ii.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: ret <4 x i32> [[RETVAL_0_I_I]] // v4int32 test_extract_v4int32 ( v8int32 a, int idx ) @@ -6526,15 +5536,9 @@ v4int32 test_extract_v4int32 ( v8int32 a, int idx ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x bfloat> [[A]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8BFLOAT16DV16_8BFLOAT16I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8BFLOAT16DV16_8BFLOAT16I_EXIT]] -// CHECK: _ZL18extract_v8bfloat16Dv16_8bfloat16i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <8 x bfloat> // CHECK-NEXT: ret <8 x bfloat> [[TMP2]] // @@ -6549,15 +5553,9 @@ v8bfloat16 test_extract_v8bfloat16 ( v16bfloat16 a, int idx ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x float> [[A]] to <8 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4FLOATDV8_FI_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <4 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4FLOATDV8_FI_EXIT]] -// CHECK: _ZL15extract_v4floatDv8_fi.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <4 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <4 x i32> [[SHUFFLE_I_I]], <4 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <4 x i32> [[RETVAL_0_I_I]] to <4 x float> // CHECK-NEXT: ret <4 x float> [[TMP2]] // @@ -6573,15 +5571,9 @@ v4float test_extract_v4float ( v8float a, int idx ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[A]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64UINT4IDV16_DU8__EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V64UINT4IDV16_DU8__EXIT]] -// CHECK: _ZL12set_v64uint4iDv16_DU8_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP2]] // @@ -6595,15 +5587,9 @@ v64uint4 test_set_v64uint4 (int idx, v32uint4 a ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[A]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V64INT4IDV16_DB8__EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V64INT4IDV16_DB8__EXIT]] -// CHECK: _ZL11set_v64int4iDv16_DB8_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP2]] // @@ -6617,15 +5603,9 @@ v64int4 test_set_v64int4 (int idx, v32int4 a ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[A]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32UINT8IDV16_H_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32UINT8IDV16_H_EXIT]] -// CHECK: _ZL12set_v32uint8iDv16_h.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP2]] // @@ -6639,15 +5619,9 @@ v32uint8 test_set_v32uint8 (int idx, v16uint8 a ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i8> [[A]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V32INT8IDV16_A_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V32INT8IDV16_A_EXIT]] -// CHECK: _ZL11set_v32int8iDv16_a.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP2]] // @@ -6661,15 +5635,9 @@ v32int8 test_set_v32int8 (int idx, v16int8 a ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[A]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V16UINT16IDV8_T_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL13SET_V16UINT16IDV8_T_EXIT]] -// CHECK: _ZL13set_v16uint16iDv8_t.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x i16> // CHECK-NEXT: ret <16 x i16> [[TMP2]] // @@ -6683,15 +5651,9 @@ v16uint16 test_set_v16uint16 (int idx, v8uint16 a ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[A]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16INT16IDV8_S_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16INT16IDV8_S_EXIT]] -// CHECK: _ZL12set_v16int16iDv8_s.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x i16> // CHECK-NEXT: ret <16 x i16> [[TMP2]] // @@ -6704,15 +5666,9 @@ v16int16 test_set_v16int16 (int idx, v8int16 a ) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V8UINT32IDV4_J_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V8UINT32IDV4_J_EXIT]] -// CHECK: _ZL12set_v8uint32iDv4_j.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I]] // v8uint32 test_set_v8uint32 (int idx, v4uint32 a ) @@ -6724,15 +5680,9 @@ v8uint32 test_set_v8uint32 (int idx, v4uint32 a ) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V8INT32IDV4_I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[A]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V8INT32IDV4_I_EXIT]] -// CHECK: _ZL11set_v8int32iDv4_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I]] // v8int32 test_set_v8int32 (int idx, v4int32 a ) @@ -6745,15 +5695,9 @@ v8int32 test_set_v8int32 (int idx, v4int32 a ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x bfloat> [[A]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V16BFLOAT16IDV8_8BFLOAT16_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V16BFLOAT16IDV8_8BFLOAT16_EXIT]] -// CHECK: _ZL15set_v16bfloat16iDv8_8bfloat16.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x bfloat> // CHECK-NEXT: ret <16 x bfloat> [[TMP2]] // @@ -6767,15 +5711,9 @@ v16bfloat16 test_set_v16bfloat16 (int idx, v8bfloat16 a ) // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x float> [[A]] to <4 x i32> // CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V8FLOATIDV4_F_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> undef, <8 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V8FLOATIDV4_F_EXIT]] -// CHECK: _ZL11set_v8floatiDv4_f.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE1_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[SHUFFLE1_I_I]] // CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <8 x float> // CHECK-NEXT: ret <8 x float> [[TMP2]] // @@ -7128,15 +6066,9 @@ v16float test_insert (v16float v, int idx, v4float b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_DU8_IDV16_S__EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_DU8_IDV16_S__EXIT]] -// CHECK: _ZL6insertDv32_DU8_iDv16_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP3]] // @@ -7152,15 +6084,9 @@ v64uint4 test_insert (v64uint4 a, int idx, v32uint4 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_DB8_IDV16_S__EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_DB8_IDV16_S__EXIT]] -// CHECK: _ZL6insertDv32_DB8_iDv16_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP3]] // @@ -7176,15 +6102,9 @@ v64int4 test_insert (v64int4 a, int idx, v32int4 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_HIDV16_H_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_HIDV16_H_EXIT]] -// CHECK: _ZL6insertDv32_hiDv16_h.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP3]] // @@ -7200,15 +6120,9 @@ v32uint8 test_insert (v32uint8 a, int idx, v16uint8 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_AIDV16_A_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_AIDV16_A_EXIT]] -// CHECK: _ZL6insertDv32_aiDv16_a.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <32 x i8> // CHECK-NEXT: ret <32 x i8> [[TMP3]] // @@ -7224,15 +6138,9 @@ v32int8 test_insert (v32int8 a, int idx, v16int8 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_TIDV8_T_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_TIDV8_T_EXIT]] -// CHECK: _ZL6insertDv16_tiDv8_t.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x i16> // CHECK-NEXT: ret <16 x i16> [[TMP3]] // @@ -7248,15 +6156,9 @@ v16uint16 test_insert (v16uint16 a, int idx, v8uint16 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_SIDV8_S_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_SIDV8_S_EXIT]] -// CHECK: _ZL6insertDv16_siDv8_s.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x i16> // CHECK-NEXT: ret <16 x i16> [[TMP3]] // @@ -7270,15 +6172,9 @@ v16int16 test_insert (v16int16 a, int idx, v8int16 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[A]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV8_JIDV4_J_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV8_JIDV4_J_EXIT]] -// CHECK: _ZL6insertDv8_jiDv4_j.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I]] // v8uint32 test_insert (v8uint32 a, int idx, v4uint32 b ) @@ -7291,15 +6187,9 @@ v8uint32 test_insert (v8uint32 a, int idx, v4uint32 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[B]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[A]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV8_IIDV4_I_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV8_IIDV4_I_EXIT]] -// CHECK: _ZL6insertDv8_iiDv4_i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I]] // v8int32 test_insert (v8int32 a, int idx, v4int32 b ) @@ -7314,15 +6204,9 @@ v8int32 test_insert (v8int32 a, int idx, v4int32 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_8BFLOAT16IDV8_S__EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_8BFLOAT16IDV8_S__EXIT]] -// CHECK: _ZL6insertDv16_8bfloat16iDv8_S_.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <16 x bfloat> // CHECK-NEXT: ret <16 x bfloat> [[TMP3]] // @@ -7338,15 +6222,9 @@ v16bfloat16 test_insert (v16bfloat16 a, int idx, v8bfloat16 b ) // CHECK-NEXT: [[SHUFFLE_I_I:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> undef, <8 x i32> // CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 // CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_ELSE_I_I:%.*]] -// CHECK: if.then.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I:%.*]] = shufflevector <8 x i32> [[SHUFFLE_I_I]], <8 x i32> [[TMP0]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV8_FIDV4_F_EXIT:%.*]] -// CHECK: if.else.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[SHUFFLE_I_I]], <8 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV8_FIDV4_F_EXIT]] -// CHECK: _ZL6insertDv8_fiDv4_f.exit: -// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE1_I_I]], [[IF_THEN_I_I]] ], [ [[SHUFFLE2_I_I]], [[IF_ELSE_I_I]] ] +// CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = select i1 [[CMP_I_I]], <8 x i32> [[SHUFFLE1_I_I]], <8 x i32> [[SHUFFLE2_I_I]] // CHECK-NEXT: [[TMP3:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I]] to <8 x float> // CHECK-NEXT: ret <8 x float> [[TMP3]] // @@ -7641,19 +6519,13 @@ v8float test_concat (v4float v0, v4float v1 ) // CHECK-SAME: <16 x float> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_ELSE_I_I_I:%.*]] -// CHECK: if.then.i.i.i: // CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8ACCFLOATDV16_U10__ACCFLOATI_EXIT:%.*]] -// CHECK: if.else.i.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8ACCFLOATDV16_U10__ACCFLOATI_EXIT]] -// CHECK: _ZL18extract_v8accfloatDv16_u10__accfloati.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE1_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I_I]] to <8 x float> -// CHECK-NEXT: ret <8 x float> [[TMP2]] +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE_I_I_I]], <8 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I_I]] to <8 x float> +// CHECK-NEXT: ret <8 x float> [[TMP1]] // v8accfloat test_extract_v8accfloat (v16accfloat a, int idx) { @@ -7665,20 +6537,14 @@ v8accfloat test_extract_v8accfloat (v16accfloat a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x float> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x float> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_END_I_I_I:%.*]] -// CHECK: if.then.i.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U10__ACCFLOATIDV8_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.end.i.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U10__ACCFLOATIDV8_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL6insertDv16_u10__accfloatiDv8_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE2_I_I_I]], [[IF_END_I_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I_I]] to <16 x float> -// CHECK-NEXT: ret <16 x float> [[TMP3]] +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <16 x i32> [[SHUFFLE1_I_I_I]], <16 x i32> [[SHUFFLE2_I_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I_I]] to <16 x float> +// CHECK-NEXT: ret <16 x float> [[TMP2]] // v16accfloat test_insert (v16accfloat a, int idx, v8accfloat b) { @@ -7689,19 +6555,13 @@ v16accfloat test_insert (v16accfloat a, int idx, v8accfloat b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x float> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x float> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_ELSE_I_I_I:%.*]] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V16ACCFLOATIDV8_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V16ACCFLOATIDV8_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL15set_v16accfloatiDv8_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE1_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I_I]] to <16 x float> -// CHECK-NEXT: ret <16 x float> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I_I]] to <16 x float> +// CHECK-NEXT: ret <16 x float> [[TMP1]] // v16accfloat test_set_v16accfloat (int idx, v8accfloat b) { @@ -7722,18 +6582,12 @@ v16accfloat test_concat (v8accfloat a, v8accfloat b) // CHECK-LABEL: define dso_local inreg noundef <8 x i32> @_Z20test_extract_v8acc32Dv16_u7__acc32i( // CHECK-SAME: <16 x i32> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_ELSE_I_I_I:%.*]] -// CHECK: if.then.i.i.i: // CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC32DV16_U7__ACC32I_EXIT:%.*]] -// CHECK: if.else.i.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC32DV16_U7__ACC32I_EXIT]] -// CHECK: _ZL15extract_v8acc32Dv16_u7__acc32i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE1_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I_I]] +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE_I_I_I]], <8 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: ret <8 x i32> [[COND_I_I_I]] // v8acc32 test_extract_v8acc32 (v16acc32 a, int idx) { @@ -7743,19 +6597,13 @@ v8acc32 test_extract_v8acc32 (v16acc32 a, int idx) // CHECK-LABEL: define dso_local inreg noundef <16 x i32> @_Z11test_insertDv16_u7__acc32iDv8_u7__acc32( // CHECK-SAME: <16 x i32> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <8 x i32> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_END_I_I_I:%.*]] -// CHECK: if.then.i.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> [[A]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U7__ACC32IDV8_U7__ACC32_EXIT:%.*]] -// CHECK: if.end.i.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U7__ACC32IDV8_U7__ACC32_EXIT]] -// CHECK: _ZL6insertDv16_u7__acc32iDv8_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE2_I_I_I]], [[IF_END_I_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I_I]] +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <16 x i32> [[SHUFFLE1_I_I_I]], <16 x i32> [[SHUFFLE2_I_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I_I]] // v16acc32 test_insert (v16acc32 a, int idx, v8acc32 b) { @@ -7765,18 +6613,12 @@ v16acc32 test_insert (v16acc32 a, int idx, v8acc32 b) // CHECK-LABEL: define dso_local inreg noundef <16 x i32> @_Z17test_set_v16acc32iDv8_u7__acc32( // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x i32> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[TMP0:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP0]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_ELSE_I_I_I:%.*]] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16ACC32IDV8_U7__ACC32_EXIT:%.*]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16ACC32IDV8_U7__ACC32_EXIT]] -// CHECK: _ZL12set_v16acc32iDv8_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE1_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: ret <16 x i32> [[RETVAL_0_I_I_I]] +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: ret <16 x i32> [[COND_I_I_I]] // v16acc32 test_set_v16acc32 (int idx, v8acc32 b) { @@ -7798,19 +6640,13 @@ v16acc32 test_concat (v8acc32 a, v8acc32 b) // CHECK-SAME: <8 x i64> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i64> [[A]] to <16 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_ELSE_I_I_I:%.*]] -// CHECK: if.then.i.i.i: // CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4ACC64DV8_U7__ACC64I_EXIT:%.*]] -// CHECK: if.else.i.i.i: // CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4ACC64DV8_U7__ACC64I_EXIT]] -// CHECK: _ZL15extract_v4acc64Dv8_u7__acc64i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE1_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I_I]] to <4 x i64> -// CHECK-NEXT: ret <4 x i64> [[TMP2]] +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE_I_I_I]], <8 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND_I_I_I]] to <4 x i64> +// CHECK-NEXT: ret <4 x i64> [[TMP1]] // v4acc64 test_extract_v4acc64 (v8acc64 a, int idx) { @@ -7822,20 +6658,14 @@ v4acc64 test_extract_v4acc64 (v8acc64 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i64> [[A]] to <16 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i64> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[TMP2:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP2]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_END_I_I_I:%.*]] -// CHECK: if.then.i.i.i: +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <16 x i32> // CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> [[TMP0]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV8_U7__ACC64IDV4_U7__ACC64_EXIT:%.*]] -// CHECK: if.end.i.i.i: // CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <16 x i32> [[TMP0]], <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV8_U7__ACC64IDV4_U7__ACC64_EXIT]] -// CHECK: _ZL6insertDv8_u7__acc64iDv4_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE1_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE2_I_I_I]], [[IF_END_I_I_I]] ] -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I_I]] to <8 x i64> -// CHECK-NEXT: ret <8 x i64> [[TMP3]] +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <16 x i32> [[SHUFFLE1_I_I_I]], <16 x i32> [[SHUFFLE2_I_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[COND_I_I_I]] to <8 x i64> +// CHECK-NEXT: ret <8 x i64> [[TMP2]] // v8acc64 test_insert (v8acc64 a, int idx, v4acc64 b) { @@ -7846,19 +6676,13 @@ v8acc64 test_insert (v8acc64 a, int idx, v4acc64 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <4 x i64> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i64> [[B]] to <8 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = and i32 [[IDX]], 1 -// CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[TMP1]], 0 -// CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[IF_THEN_I_I_I:%.*]], label [[IF_ELSE_I_I_I:%.*]] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V8ACC64IDV4_U7__ACC64_EXIT:%.*]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: br label [[_ZL11SET_V8ACC64IDV4_U7__ACC64_EXIT]] -// CHECK: _ZL11set_v8acc64iDv4_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <16 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE1_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i32> [[RETVAL_0_I_I_I]] to <8 x i64> -// CHECK-NEXT: ret <8 x i64> [[TMP2]] +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <16 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i32> [[COND_I_I_I]] to <8 x i64> +// CHECK-NEXT: ret <8 x i64> [[TMP1]] // v8acc64 test_set_v8acc64 (int idx, v4acc64 b) { @@ -7880,27 +6704,18 @@ v8acc64 test_concat (v4acc64 a, v4acc64 b) // CHECK-SAME: <32 x float> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: // CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8ACCFLOATDV32_U10__ACCFLOATI_EXIT:%.*]] -// CHECK: if.then3.i.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8ACCFLOATDV32_U10__ACCFLOATI_EXIT]] -// CHECK: if.then8.i.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8ACCFLOATDV32_U10__ACCFLOATI_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL18EXTRACT_V8ACCFLOATDV32_U10__ACCFLOATI_EXIT]] -// CHECK: _ZL18extract_v8accfloatDv32_u10__accfloati.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE4_I_I_I]], [[IF_THEN3_I_I_I]] ], [ [[SHUFFLE9_I_I_I]], [[IF_THEN8_I_I_I]] ], [ [[SHUFFLE10_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I_I]] to <8 x float> +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE_I_I_I]], <8 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[COND9_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE2_I_I_I]], <8 x i32> [[SHUFFLE3_I_I_I]] +// CHECK-NEXT: [[AND10_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I_I:%.*]] = icmp eq i32 [[AND10_I_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I_I]], <8 x i32> [[COND_I_I_I]], <8 x i32> [[COND9_I_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I_I]] to <8 x float> // CHECK-NEXT: ret <8 x float> [[TMP1]] // v8accfloat test_extract_v8accfloat (v32accfloat a, int idx) @@ -7913,29 +6728,22 @@ v8accfloat test_extract_v8accfloat (v32accfloat a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <32 x float> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x float> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U10__ACCFLOATIDV8_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.then5.i.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U10__ACCFLOATIDV8_U10__ACCFLOAT_EXIT]] -// CHECK: if.then10.i.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U10__ACCFLOATIDV8_U10__ACCFLOAT_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U10__ACCFLOATIDV8_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL6insertDv32_u10__accfloatiDv8_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE6_I_I_I]], [[IF_THEN5_I_I_I]] ], [ [[SHUFFLE11_I_I_I]], [[IF_THEN10_I_I_I]] ], [ [[SHUFFLE12_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I_I]] to <32 x float> +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE4_I_I_I]], <32 x i32> [[SHUFFLE5_I_I_I]] +// CHECK-NEXT: [[COND13_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE6_I_I_I]], <32 x i32> [[SHUFFLE7_I_I_I]] +// CHECK-NEXT: [[AND14_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I_I:%.*]] = icmp eq i32 [[AND14_I_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I_I]], <32 x i32> [[COND_I_I_I]], <32 x i32> [[COND13_I_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I_I]] to <32 x float> // CHECK-NEXT: ret <32 x float> [[TMP2]] // v32accfloat test_insert (v32accfloat a, int idx, v8accfloat b) @@ -7947,31 +6755,18 @@ v32accfloat test_insert (v32accfloat a, int idx, v8accfloat b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x float> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x float> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V32ACCFLOATIDV8_U10__ACCFLOAT_EXIT:%.*]] -// CHECK: if.then4.i.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V32ACCFLOATIDV8_U10__ACCFLOAT_EXIT]] -// CHECK: if.then10.i.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V32ACCFLOATIDV8_U10__ACCFLOAT_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL15SET_V32ACCFLOATIDV8_U10__ACCFLOAT_EXIT]] -// CHECK: _ZL15set_v32accfloatiDv8_u10__accfloat.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE6_I_I_I]], [[IF_THEN4_I_I_I]] ], [ [[SHUFFLE12_I_I_I]], [[IF_THEN10_I_I_I]] ], [ [[SHUFFLE14_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I_I]] to <32 x float> +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE_I_I_I]], <32 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[COND9_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE2_I_I_I]], <32 x i32> [[SHUFFLE3_I_I_I]] +// CHECK-NEXT: [[AND10_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I_I:%.*]] = icmp eq i32 [[AND10_I_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I_I]], <32 x i32> [[COND_I_I_I]], <32 x i32> [[COND9_I_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I_I]] to <32 x float> // CHECK-NEXT: ret <32 x float> [[TMP1]] // v32accfloat test_set_v32accfloat (int idx, v8accfloat b) @@ -7995,27 +6790,18 @@ v32accfloat test_concat (v8accfloat a, v8accfloat b, v8accfloat c, v8accfloat d) // CHECK-LABEL: define dso_local inreg noundef <8 x i32> @_Z20test_extract_v8acc32Dv32_u7__acc32i( // CHECK-SAME: <32 x i32> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: // CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC32DV32_U7__ACC32I_EXIT:%.*]] -// CHECK: if.then3.i.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC32DV32_U7__ACC32I_EXIT]] -// CHECK: if.then8.i.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC32DV32_U7__ACC32I_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V8ACC32DV32_U7__ACC32I_EXIT]] -// CHECK: _ZL15extract_v8acc32Dv32_u7__acc32i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE4_I_I_I]], [[IF_THEN3_I_I_I]] ], [ [[SHUFFLE9_I_I_I]], [[IF_THEN8_I_I_I]] ], [ [[SHUFFLE10_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: ret <8 x i32> [[RETVAL_0_I_I_I]] +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE_I_I_I]], <8 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[COND9_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE2_I_I_I]], <8 x i32> [[SHUFFLE3_I_I_I]] +// CHECK-NEXT: [[AND10_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I_I:%.*]] = icmp eq i32 [[AND10_I_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I_I]], <8 x i32> [[COND_I_I_I]], <8 x i32> [[COND9_I_I_I]] +// CHECK-NEXT: ret <8 x i32> [[COND15_I_I_I]] // v8acc32 test_extract_v8acc32 (v32acc32 a, int idx) { @@ -8025,29 +6811,22 @@ v8acc32 test_extract_v8acc32 (v32acc32 a, int idx) // CHECK-LABEL: define dso_local inreg noundef <32 x i32> @_Z11test_insertDv32_u7__acc32iDv8_u7__acc32( // CHECK-SAME: <32 x i32> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]], <8 x i32> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC32IDV8_U7__ACC32_EXIT:%.*]] -// CHECK: if.then5.i.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC32IDV8_U7__ACC32_EXIT]] -// CHECK: if.then10.i.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC32IDV8_U7__ACC32_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[A]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV32_U7__ACC32IDV8_U7__ACC32_EXIT]] -// CHECK: _ZL6insertDv32_u7__acc32iDv8_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE6_I_I_I]], [[IF_THEN5_I_I_I]] ], [ [[SHUFFLE11_I_I_I]], [[IF_THEN10_I_I_I]] ], [ [[SHUFFLE12_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I_I]] +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE2_I_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE3_I_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I_I:%.*]] = shufflevector <32 x i32> [[A]], <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I_I]], <32 x i32> [[A]], <32 x i32> +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE4_I_I_I]], <32 x i32> [[SHUFFLE5_I_I_I]] +// CHECK-NEXT: [[COND13_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE6_I_I_I]], <32 x i32> [[SHUFFLE7_I_I_I]] +// CHECK-NEXT: [[AND14_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I_I:%.*]] = icmp eq i32 [[AND14_I_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I_I]], <32 x i32> [[COND_I_I_I]], <32 x i32> [[COND13_I_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND19_I_I_I]] // v32acc32 test_insert (v32acc32 a, int idx, v8acc32 b) { @@ -8057,31 +6836,18 @@ v32acc32 test_insert (v32acc32 a, int idx, v8acc32 b) // CHECK-LABEL: define dso_local inreg noundef <32 x i32> @_Z17test_set_v32acc32iDv8_u7__acc32( // CHECK-SAME: i32 noundef [[IDX:%.*]], <8 x i32> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC32IDV8_U7__ACC32_EXIT:%.*]] -// CHECK: if.then4.i.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC32IDV8_U7__ACC32_EXIT]] -// CHECK: if.then10.i.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC32IDV8_U7__ACC32_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V32ACC32IDV8_U7__ACC32_EXIT]] -// CHECK: _ZL12set_v32acc32iDv8_u7__acc32.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE6_I_I_I]], [[IF_THEN4_I_I_I]] ], [ [[SHUFFLE12_I_I_I]], [[IF_THEN10_I_I_I]] ], [ [[SHUFFLE14_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: ret <32 x i32> [[RETVAL_0_I_I_I]] +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE_I_I_I]], <32 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[COND9_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE2_I_I_I]], <32 x i32> [[SHUFFLE3_I_I_I]] +// CHECK-NEXT: [[AND10_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I_I:%.*]] = icmp eq i32 [[AND10_I_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I_I]], <32 x i32> [[COND_I_I_I]], <32 x i32> [[COND9_I_I_I]] +// CHECK-NEXT: ret <32 x i32> [[COND15_I_I_I]] // v32acc32 test_set_v32acc32 (int idx, v8acc32 b) { @@ -8105,27 +6871,18 @@ v32acc32 test_concat (v8acc32 a, v8acc32 b, v8acc32 c, v8acc32 d) // CHECK-SAME: <16 x i64> inreg noundef [[A:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i64> [[A]] to <32 x i32> -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN3_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN8_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: // CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4ACC64DV16_U7__ACC64I_EXIT:%.*]] -// CHECK: if.then3.i.i.i: -// CHECK-NEXT: [[SHUFFLE4_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4ACC64DV16_U7__ACC64I_EXIT]] -// CHECK: if.then8.i.i.i: -// CHECK-NEXT: [[SHUFFLE9_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4ACC64DV16_U7__ACC64I_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE10_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> -// CHECK-NEXT: br label [[_ZL15EXTRACT_V4ACC64DV16_U7__ACC64I_EXIT]] -// CHECK: _ZL15extract_v4acc64Dv16_u7__acc64i.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <8 x i32> [ [[SHUFFLE_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE4_I_I_I]], [[IF_THEN3_I_I_I]] ], [ [[SHUFFLE9_I_I_I]], [[IF_THEN8_I_I_I]] ], [ [[SHUFFLE10_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[RETVAL_0_I_I_I]] to <4 x i64> +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> poison, <8 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE_I_I_I]], <8 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[COND9_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <8 x i32> [[SHUFFLE2_I_I_I]], <8 x i32> [[SHUFFLE3_I_I_I]] +// CHECK-NEXT: [[AND10_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I_I:%.*]] = icmp eq i32 [[AND10_I_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I_I]], <8 x i32> [[COND_I_I_I]], <8 x i32> [[COND9_I_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i32> [[COND15_I_I_I]] to <4 x i64> // CHECK-NEXT: ret <4 x i64> [[TMP1]] // v4acc64 test_extract_v4acc64 (v16acc64 a, int idx) @@ -8138,29 +6895,22 @@ v4acc64 test_extract_v4acc64 (v16acc64 a, int idx) // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <16 x i64> [[A]] to <32 x i32> // CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i64> [[B]] to <8 x i32> -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN5_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U7__ACC64IDV4_U7__ACC64_EXIT:%.*]] -// CHECK: if.then5.i.i.i: -// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U7__ACC64IDV4_U7__ACC64_EXIT]] -// CHECK: if.then10.i.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U7__ACC64IDV4_U7__ACC64_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE12_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> -// CHECK-NEXT: br label [[_ZL6INSERTDV16_U7__ACC64IDV4_U7__ACC64_EXIT]] -// CHECK: _ZL6insertDv16_u7__acc64iDv4_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE2_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE6_I_I_I]], [[IF_THEN5_I_I_I]] ], [ [[SHUFFLE11_I_I_I]], [[IF_THEN10_I_I_I]] ], [ [[SHUFFLE12_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I_I]] to <16 x i64> +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE2_I_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE7_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE3_I_I_I]], <32 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE5_I_I_I:%.*]] = shufflevector <32 x i32> [[TMP0]], <32 x i32> [[SHUFFLE1_I_I_I]], <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE4_I_I_I:%.*]] = shufflevector <32 x i32> [[SHUFFLE_I_I_I]], <32 x i32> [[TMP0]], <32 x i32> +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE4_I_I_I]], <32 x i32> [[SHUFFLE5_I_I_I]] +// CHECK-NEXT: [[COND13_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE6_I_I_I]], <32 x i32> [[SHUFFLE7_I_I_I]] +// CHECK-NEXT: [[AND14_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL15_NOT_I_I_I:%.*]] = icmp eq i32 [[AND14_I_I_I]], 0 +// CHECK-NEXT: [[COND19_I_I_I:%.*]] = select i1 [[TOBOOL15_NOT_I_I_I]], <32 x i32> [[COND_I_I_I]], <32 x i32> [[COND13_I_I_I]] +// CHECK-NEXT: [[TMP2:%.*]] = bitcast <32 x i32> [[COND19_I_I_I]] to <16 x i64> // CHECK-NEXT: ret <16 x i64> [[TMP2]] // v16acc64 test_insert (v16acc64 a, int idx, v4acc64 b) @@ -8172,31 +6922,18 @@ v16acc64 test_insert (v16acc64 a, int idx, v4acc64 b) // CHECK-SAME: i32 noundef [[IDX:%.*]], <4 x i64> inreg noundef [[B:%.*]]) local_unnamed_addr #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i64> [[B]] to <8 x i32> -// CHECK-NEXT: [[REM_I_I_I:%.*]] = srem i32 [[IDX]], 4 -// CHECK-NEXT: switch i32 [[REM_I_I_I]], label [[IF_ELSE_I_I_I:%.*]] [ -// CHECK-NEXT: i32 0, label [[IF_THEN_I_I_I:%.*]] -// CHECK-NEXT: i32 1, label [[IF_THEN4_I_I_I:%.*]] -// CHECK-NEXT: i32 2, label [[IF_THEN10_I_I_I:%.*]] -// CHECK-NEXT: ] -// CHECK: if.then.i.i.i: -// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16ACC64IDV4_U7__ACC64_EXIT:%.*]] -// CHECK: if.then4.i.i.i: -// CHECK-NEXT: [[SHUFFLE5_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE6_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE5_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16ACC64IDV4_U7__ACC64_EXIT]] -// CHECK: if.then10.i.i.i: -// CHECK-NEXT: [[SHUFFLE11_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE12_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE11_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16ACC64IDV4_U7__ACC64_EXIT]] -// CHECK: if.else.i.i.i: -// CHECK-NEXT: [[SHUFFLE13_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> undef, <16 x i32> -// CHECK-NEXT: [[SHUFFLE14_I_I_I:%.*]] = shufflevector <16 x i32> [[SHUFFLE13_I_I_I]], <16 x i32> undef, <32 x i32> -// CHECK-NEXT: br label [[_ZL12SET_V16ACC64IDV4_U7__ACC64_EXIT]] -// CHECK: _ZL12set_v16acc64iDv4_u7__acc64.exit: -// CHECK-NEXT: [[RETVAL_0_I_I_I:%.*]] = phi <32 x i32> [ [[SHUFFLE1_I_I_I]], [[IF_THEN_I_I_I]] ], [ [[SHUFFLE6_I_I_I]], [[IF_THEN4_I_I_I]] ], [ [[SHUFFLE12_I_I_I]], [[IF_THEN10_I_I_I]] ], [ [[SHUFFLE14_I_I_I]], [[IF_ELSE_I_I_I]] ] -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[RETVAL_0_I_I_I]] to <16 x i64> +// CHECK-NEXT: [[SHUFFLE2_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE3_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[AND_I_I_I:%.*]] = and i32 [[IDX]], 1 +// CHECK-NEXT: [[TOBOOL_NOT_I_I_I:%.*]] = icmp eq i32 [[AND_I_I_I]], 0 +// CHECK-NEXT: [[SHUFFLE1_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[SHUFFLE_I_I_I:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> poison, <32 x i32> +// CHECK-NEXT: [[COND_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE_I_I_I]], <32 x i32> [[SHUFFLE1_I_I_I]] +// CHECK-NEXT: [[COND9_I_I_I:%.*]] = select i1 [[TOBOOL_NOT_I_I_I]], <32 x i32> [[SHUFFLE2_I_I_I]], <32 x i32> [[SHUFFLE3_I_I_I]] +// CHECK-NEXT: [[AND10_I_I_I:%.*]] = and i32 [[IDX]], 2 +// CHECK-NEXT: [[TOBOOL11_NOT_I_I_I:%.*]] = icmp eq i32 [[AND10_I_I_I]], 0 +// CHECK-NEXT: [[COND15_I_I_I:%.*]] = select i1 [[TOBOOL11_NOT_I_I_I]], <32 x i32> [[COND_I_I_I]], <32 x i32> [[COND9_I_I_I]] +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <32 x i32> [[COND15_I_I_I]] to <16 x i64> // CHECK-NEXT: ret <16 x i64> [[TMP1]] // v16acc64 test_set_v16acc64 (int idx, v4acc64 b) diff --git a/llvm/lib/Target/AIE/AIEBaseTargetTransformInfo.h b/llvm/lib/Target/AIE/AIEBaseTargetTransformInfo.h index 9b34fff8163c..cc0030fb419e 100644 --- a/llvm/lib/Target/AIE/AIEBaseTargetTransformInfo.h +++ b/llvm/lib/Target/AIE/AIEBaseTargetTransformInfo.h @@ -147,6 +147,32 @@ template class AIEBaseTTIImpl : public BasicTTIImplBase { bool shouldMergeCongruentIVs(const PHINode *IV1, const PHINode *IV2) const { return shouldMergeCongruentIVsImpl(IV1, IV2); } + + /// For the `TCK_SizeAndLatency` cost kind report all shufflevectors as + /// free. This is the cost kind queried by + /// `SimplifyCFG::computeSpeculationCost` (the function that decides + /// whether to fold a `br + 2 BBs + phi` diamond back into a `select`) + /// via `BasicTTIImplBase::computeSpeculationCost` → + /// `TTI::getInstructionCost(I, ..., TCK_SizeAndLatency)`. On AIE every + /// shufflevector that survives to ISel maps to a register-class view + /// (`wl0`/`wh0`/etc.) or a single-cycle `vshift`/`vsel`, so reporting + /// the default per-element scalarised cost there is wildly conservative + /// and blows the `4 * TCC_Basic` speculation budget for + /// `c ? wide_a : wide_b` ternaries — leaving a real branch in the + /// final asm. The throughput / latency / recip-throughput cost kinds + /// fall through to the base implementation so the loop vectoriser and + /// other passes still see the realistic per-element cost. + InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp, + ArrayRef Mask, + TTI::TargetCostKind CostKind, int Index, + VectorType *SubTp, + ArrayRef Args = {}, + const Instruction *CxtI = nullptr) { + if (CostKind == TTI::TCK_SizeAndLatency) + return TTI::TCC_Free; + return BaseT::getShuffleCost(Kind, Tp, Mask, CostKind, Index, SubTp, Args, + CxtI); + } }; } // end namespace llvm diff --git a/llvm/lib/Target/AIE/Utils/AIEIRUtils.cpp b/llvm/lib/Target/AIE/Utils/AIEIRUtils.cpp index 7a11296e5f51..2cb3723da9d7 100644 --- a/llvm/lib/Target/AIE/Utils/AIEIRUtils.cpp +++ b/llvm/lib/Target/AIE/Utils/AIEIRUtils.cpp @@ -4,7 +4,7 @@ // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -// (c) Copyright 2025 Advanced Micro Devices, Inc. or its affiliates +// (c) Copyright 2025-2026 Advanced Micro Devices, Inc. or its affiliates // //===----------------------------------------------------------------------===// @@ -31,6 +31,49 @@ std::optional instCombineDemandedBits(InstCombiner &IC, return std::nullopt; } +std::optional instCombineVExtractBroadcast(InstCombiner &IC, + IntrinsicInst &II, + unsigned LaneBits) { + // The fold only applies when the lane index is a compile-time constant. + // For runtime indices we leave the opaque intrinsic so the backend can + // select a single VEXTBCST instruction. + auto *IdxC = dyn_cast(II.getArgOperand(1)); + if (!IdxC) + return std::nullopt; + + Value *Vec = II.getArgOperand(0); + auto *VecTy = cast(Vec->getType()); + const unsigned ElemBits = + VecTy->getElementType()->getPrimitiveSizeInBits().getFixedValue(); + + // The lane width must be a whole multiple of the element width, and the + // 512-bit register must split into a whole number of LaneBits-wide lanes. + // Bail out instead of asserting so the optimisation is robust against + // unexpected intrinsic signatures introduced later. + if (ElemBits == 0 || LaneBits % ElemBits != 0) + return std::nullopt; + const unsigned LaneElems = LaneBits / ElemBits; + const unsigned NumElems = VecTy->getNumElements(); + if (LaneElems == 0 || NumElems % LaneElems != 0) + return std::nullopt; + const unsigned NumLanes = NumElems / LaneElems; + + // VEXTBCST encodes the index modulo the number of lanes (the upper bits of + // the 6-bit immediate field are documented as zero-extended). + const unsigned LaneIdx = IdxC->getZExtValue() & (NumLanes - 1); + const unsigned Base = LaneIdx * LaneElems; + + // Build a mask that broadcasts elements [Base, Base+LaneElems) across all + // NumLanes quadrants of the 512-bit result. + SmallVector Mask; + Mask.reserve(NumElems); + for (unsigned Lane = 0; Lane < NumLanes; ++Lane) + for (unsigned E = 0; E < LaneElems; ++E) + Mask.push_back(Base + E); + + return new ShuffleVectorInst(Vec, Mask); +} + /// Helper function to recursively check if a user (and all its users if it's a /// bitcast) access lanes higher than HighestLane. bool checkIfUsersDontAccessLanesHigherThan(Instruction *User, Type *CurrentType, diff --git a/llvm/lib/Target/AIE/Utils/AIEIRUtils.h b/llvm/lib/Target/AIE/Utils/AIEIRUtils.h index e5cd48f808ab..faafd50e83ad 100644 --- a/llvm/lib/Target/AIE/Utils/AIEIRUtils.h +++ b/llvm/lib/Target/AIE/Utils/AIEIRUtils.h @@ -4,7 +4,7 @@ // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // -// (c) Copyright 2025 Advanced Micro Devices, Inc. or its affiliates +// (c) Copyright 2025-2026 Advanced Micro Devices, Inc. or its affiliates // //===----------------------------------------------------------------------===// @@ -41,6 +41,21 @@ std::optional instCombineDemandedBits(InstCombiner &IC, unsigned NumBits, unsigned Operand = 0); +/// Fold a `vextract_broadcast{8,16,32,64,128}_I512` (or _bf512) call with a +/// constant lane index into an equivalent `shufflevector` that broadcasts the +/// chosen lane (LaneBits wide) across all lanes of the 512-bit result. Once +/// the opaque intrinsic is replaced, downstream low-N shuffles collapse to a +/// single constant-mask shuffle, restoring the codegen quality of constant-idx +/// callers (e.g. `extract_v*(_, 0)` from the `GET_SS_4`/`GET_SS_8` macros and +/// any templated `extract<>(constant)` chain). +/// +/// The intrinsic is assumed to take (vec512, i32 idx) and return the same +/// vector type. The shape is uniform across AIE2 / AIE2P / AIE2PS, so the +/// caller passes the lane width in bits and this helper does the rest. +std::optional instCombineVExtractBroadcast(InstCombiner &IC, + IntrinsicInst &II, + unsigned LaneBits); + } // namespace llvm::AIEIRUtils #endif // LLVM_LIB_TARGET_AIE_UTILS_AIEIRUTILS_H diff --git a/llvm/lib/Target/AIE/aie2p/AIE2PTargetTransformInfo.cpp b/llvm/lib/Target/AIE/aie2p/AIE2PTargetTransformInfo.cpp index 1e47b96567af..0f0912e65187 100644 --- a/llvm/lib/Target/AIE/aie2p/AIE2PTargetTransformInfo.cpp +++ b/llvm/lib/Target/AIE/aie2p/AIE2PTargetTransformInfo.cpp @@ -75,6 +75,8 @@ AIE2PTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { break; case Intrinsic::aie2p_vsel32: return AIEIRUtils::instCombineDemandedBits(IC, II, 16, 2); + case Intrinsic::aie2p_vextract_broadcast128_I512: + return AIEIRUtils::instCombineVExtractBroadcast(IC, II, /*LaneBits=*/128); } return std::nullopt; } diff --git a/llvm/lib/Target/AIE/aie2ps/AIE2PSTargetTransformInfo.cpp b/llvm/lib/Target/AIE/aie2ps/AIE2PSTargetTransformInfo.cpp index 068a92183d8b..c049d14ffb4c 100644 --- a/llvm/lib/Target/AIE/aie2ps/AIE2PSTargetTransformInfo.cpp +++ b/llvm/lib/Target/AIE/aie2ps/AIE2PSTargetTransformInfo.cpp @@ -76,6 +76,8 @@ AIE2PSTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { break; case Intrinsic::aie2ps_vsel32: return AIEIRUtils::instCombineDemandedBits(IC, II, 16, 2); + case Intrinsic::aie2ps_vextract_broadcast128_I512: + return AIEIRUtils::instCombineVExtractBroadcast(IC, II, /*LaneBits=*/128); } return std::nullopt; } diff --git a/llvm/test/CodeGen/AIE/opt/instcombine-aie2p-vextract-broadcast128.ll b/llvm/test/CodeGen/AIE/opt/instcombine-aie2p-vextract-broadcast128.ll new file mode 100644 index 000000000000..967001d81e02 --- /dev/null +++ b/llvm/test/CodeGen/AIE/opt/instcombine-aie2p-vextract-broadcast128.ll @@ -0,0 +1,61 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; +; This file is licensed under the Apache License v2.0 with LLVM Exceptions. +; See https://llvm.org/LICENSE.txt for license information. +; SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +; +; (c) Copyright 2026 Advanced Micro Devices, Inc. or its affiliates +; +; RUN: opt -S -passes=instcombine -mtriple=aie2p %s | FileCheck %s + +; Baseline test for the upcoming InstCombine fold of +; @llvm.aie2p.vextract.broadcast128.I512 with a constant lane index. See the +; aie2ps companion test for the full description; the same fold (added in the +; next commit) applies here through the AIE2P TTI hook. + +declare <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32>, i32) + +; Constant idx 0 -- should fold to shufflevector picking lanes 0..3 of %v. +define <4 x i32> @test_vextbcst128_const_idx0(<16 x i32> %v) { +; CHECK-LABEL: @test_vextbcst128_const_idx0( +; CHECK-NEXT: [[R:%.*]] = shufflevector <16 x i32> [[BCST:%.*]], <16 x i32> poison, <4 x i32> +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %bcst = call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> %v, i32 0) + %r = shufflevector <16 x i32> %bcst, <16 x i32> poison, <4 x i32> + ret <4 x i32> %r +} + +; Constant idx 2 -- should fold to shufflevector picking lanes 8..11 of %v. +define <4 x i32> @test_vextbcst128_const_idx2(<16 x i32> %v) { +; CHECK-LABEL: @test_vextbcst128_const_idx2( +; CHECK-NEXT: [[R:%.*]] = shufflevector <16 x i32> [[V:%.*]], <16 x i32> poison, <4 x i32> +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %bcst = call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> %v, i32 2) + %r = shufflevector <16 x i32> %bcst, <16 x i32> poison, <4 x i32> + ret <4 x i32> %r +} + +; Constant idx 3 -- should fold to shufflevector picking lanes 12..15 of %v. +define <4 x i32> @test_vextbcst128_const_idx3(<16 x i32> %v) { +; CHECK-LABEL: @test_vextbcst128_const_idx3( +; CHECK-NEXT: [[R:%.*]] = shufflevector <16 x i32> [[V:%.*]], <16 x i32> poison, <4 x i32> +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %bcst = call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> %v, i32 3) + %r = shufflevector <16 x i32> %bcst, <16 x i32> poison, <4 x i32> + ret <4 x i32> %r +} + +; Runtime idx -- intrinsic must NOT fold (no constant lane known). +define <4 x i32> @test_vextbcst128_runtime_idx(<16 x i32> %v, i32 %idx) { +; CHECK-LABEL: @test_vextbcst128_runtime_idx( +; CHECK-NEXT: [[BCST:%.*]] = call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> [[V:%.*]], i32 [[IDX:%.*]]) +; CHECK-NEXT: [[R:%.*]] = shufflevector <16 x i32> [[BCST]], <16 x i32> poison, <4 x i32> +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %bcst = call <16 x i32> @llvm.aie2p.vextract.broadcast128.I512(<16 x i32> %v, i32 %idx) + %r = shufflevector <16 x i32> %bcst, <16 x i32> poison, <4 x i32> + ret <4 x i32> %r +} diff --git a/llvm/test/CodeGen/AIE/opt/instcombine-aie2ps-vextract-broadcast128.ll b/llvm/test/CodeGen/AIE/opt/instcombine-aie2ps-vextract-broadcast128.ll new file mode 100644 index 000000000000..8460dc4158d1 --- /dev/null +++ b/llvm/test/CodeGen/AIE/opt/instcombine-aie2ps-vextract-broadcast128.ll @@ -0,0 +1,70 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; +; This file is licensed under the Apache License v2.0 with LLVM Exceptions. +; See https://llvm.org/LICENSE.txt for license information. +; SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +; +; (c) Copyright 2026 Advanced Micro Devices, Inc. or its affiliates +; +; RUN: opt -S -passes=instcombine -mtriple=aie2ps %s | FileCheck %s + +; Baseline test for the upcoming InstCombine fold of +; @llvm.aie2ps.vextract.broadcast128.I512 with a constant lane index. The +; intrinsic has the semantics "extract the 128-bit lane at of a 512-bit +; vector and broadcast it to all four lanes of the 512-bit destination". When +; is a compile-time constant and only the low 128 bits of the broadcast +; result are consumed, the whole call is equivalent to a single constant-mask +; shufflevector. +; +; Today the intrinsic survives InstCombine, even with constant idx, because +; LLVM treats it as opaque. The follow-up commit adds the target-specific +; instCombineIntrinsic hook that rewrites it; this test's CHECK lines are +; regenerated in that commit to show the intrinsic disappearing for the +; constant-idx cases while staying intact for the runtime-idx case. + +declare <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32>, i32) + +; Constant idx 0 -- should fold to shufflevector picking lanes 0..3 of %v. +define <4 x i32> @test_vextbcst128_const_idx0(<16 x i32> %v) { +; CHECK-LABEL: @test_vextbcst128_const_idx0( +; CHECK-NEXT: [[R:%.*]] = shufflevector <16 x i32> [[BCST:%.*]], <16 x i32> poison, <4 x i32> +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %bcst = call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> %v, i32 0) + %r = shufflevector <16 x i32> %bcst, <16 x i32> poison, <4 x i32> + ret <4 x i32> %r +} + +; Constant idx 2 -- should fold to shufflevector picking lanes 8..11 of %v. +define <4 x i32> @test_vextbcst128_const_idx2(<16 x i32> %v) { +; CHECK-LABEL: @test_vextbcst128_const_idx2( +; CHECK-NEXT: [[R:%.*]] = shufflevector <16 x i32> [[V:%.*]], <16 x i32> poison, <4 x i32> +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %bcst = call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> %v, i32 2) + %r = shufflevector <16 x i32> %bcst, <16 x i32> poison, <4 x i32> + ret <4 x i32> %r +} + +; Constant idx 3 -- should fold to shufflevector picking lanes 12..15 of %v. +define <4 x i32> @test_vextbcst128_const_idx3(<16 x i32> %v) { +; CHECK-LABEL: @test_vextbcst128_const_idx3( +; CHECK-NEXT: [[R:%.*]] = shufflevector <16 x i32> [[V:%.*]], <16 x i32> poison, <4 x i32> +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %bcst = call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> %v, i32 3) + %r = shufflevector <16 x i32> %bcst, <16 x i32> poison, <4 x i32> + ret <4 x i32> %r +} + +; Runtime idx -- intrinsic must NOT fold (no constant lane known). +define <4 x i32> @test_vextbcst128_runtime_idx(<16 x i32> %v, i32 %idx) { +; CHECK-LABEL: @test_vextbcst128_runtime_idx( +; CHECK-NEXT: [[BCST:%.*]] = call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> [[V:%.*]], i32 [[IDX:%.*]]) +; CHECK-NEXT: [[R:%.*]] = shufflevector <16 x i32> [[BCST]], <16 x i32> poison, <4 x i32> +; CHECK-NEXT: ret <4 x i32> [[R]] +; + %bcst = call <16 x i32> @llvm.aie2ps.vextract.broadcast128.I512(<16 x i32> %v, i32 %idx) + %r = shufflevector <16 x i32> %bcst, <16 x i32> poison, <4 x i32> + ret <4 x i32> %r +}