diff --git a/src/CodeGen_Hexagon.cpp b/src/CodeGen_Hexagon.cpp index 05b68447b6a4..852721e0077d 100644 --- a/src/CodeGen_Hexagon.cpp +++ b/src/CodeGen_Hexagon.cpp @@ -1186,15 +1186,16 @@ Value *CodeGen_Hexagon::shuffle_vectors(Value *a, Value *b, create_bitcast(a_call->getArgOperand(1), native_ty), create_bitcast(a_call->getArgOperand(0), native_ty), indices); } else if (ShuffleVectorInst *a_shuffle = dyn_cast(a)) { - bool is_identity = true; - for (int i = 0; i < a_elements; i++) { - int mask_i = a_shuffle->getMaskValue(i); - is_identity = is_identity && (mask_i == i || mask_i == -1); - } - if (is_identity) { - return shuffle_vectors(a_shuffle->getOperand(0), - a_shuffle->getOperand(1), indices); + std::vector new_indices(indices.size()); + for (size_t i = 0; i < indices.size(); i++) { + if (indices[i] != -1) { + new_indices[i] = a_shuffle->getMaskValue(indices[i]); + } else { + new_indices[i] = -1; + } } + return shuffle_vectors(a_shuffle->getOperand(0), + a_shuffle->getOperand(1), new_indices); } } @@ -1516,7 +1517,11 @@ Value *CodeGen_Hexagon::vdelta(Value *lut, const vector &indices) { vector i8_indices(indices.size() * replicate); for (size_t i = 0; i < indices.size(); i++) { for (int j = 0; j < replicate; j++) { - i8_indices[i * replicate + j] = indices[i] * replicate + j; + if (indices[i] == -1) { + i8_indices[i * replicate + j] = -1; // Replicate the don't-care. + } else { + i8_indices[i * replicate + j] = indices[i] * replicate + j; + } } } Value *result = vdelta(i8_lut, i8_indices); @@ -1556,6 +1561,7 @@ Value *CodeGen_Hexagon::vdelta(Value *lut, const vector &indices) { Value *ret = nullptr; for (int i = 0; i < lut_elements; i += native_elements) { Value *lut_i = slice_vector(lut, i, native_elements); + internal_assert(get_vector_num_elements(lut_i->getType()) == native_elements); vector indices_i(native_elements); vector mask(native_elements); bool all_used = true; diff --git a/src/CodeGen_LLVM.cpp b/src/CodeGen_LLVM.cpp index 4a5b45475533..f5573219968e 100644 --- a/src/CodeGen_LLVM.cpp +++ b/src/CodeGen_LLVM.cpp @@ -5017,10 +5017,11 @@ Value *CodeGen_LLVM::shuffle_vectors(Value *a, Value *b, } // Check for type identity *after* normalizing to fixed vectors internal_assert(a->getType() == b->getType()); + int elements_a = get_vector_num_elements(a->getType()); vector llvm_indices(indices.size()); for (size_t i = 0; i < llvm_indices.size(); i++) { if (indices[i] >= 0) { - internal_assert(indices[i] < get_vector_num_elements(a->getType()) * 2); + internal_assert(indices[i] < elements_a * 2) << indices[i] << " " << elements_a * 2; llvm_indices[i] = ConstantInt::get(i32_t, indices[i]); } else { // Only let -1 be undef.