From 8e4e56f9954a541af31f556ac2f57e2ed0d5a981 Mon Sep 17 00:00:00 2001 From: Martijn Courteaux Date: Thu, 8 Jan 2026 23:26:52 +0100 Subject: [PATCH 1/3] Random hexagon bug. --- src/CodeGen_Hexagon.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/CodeGen_Hexagon.cpp b/src/CodeGen_Hexagon.cpp index 05b68447b6a4..2ec0b507f949 100644 --- a/src/CodeGen_Hexagon.cpp +++ b/src/CodeGen_Hexagon.cpp @@ -1516,7 +1516,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); From dae0a65e4ee0a51a2376d1c2ca8d2a787ed5cd01 Mon Sep 17 00:00:00 2001 From: Martijn Courteaux Date: Thu, 8 Jan 2026 23:31:06 +0100 Subject: [PATCH 2/3] Clangformat --- src/CodeGen_Hexagon.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CodeGen_Hexagon.cpp b/src/CodeGen_Hexagon.cpp index 2ec0b507f949..36a811c28479 100644 --- a/src/CodeGen_Hexagon.cpp +++ b/src/CodeGen_Hexagon.cpp @@ -1517,7 +1517,7 @@ Value *CodeGen_Hexagon::vdelta(Value *lut, const vector &indices) { for (size_t i = 0; i < indices.size(); i++) { for (int j = 0; j < replicate; j++) { if (indices[i] == -1) { - i8_indices[i * replicate + j] = -1; // Replicate the don't-care. + i8_indices[i * replicate + j] = -1; // Replicate the don't-care. } else { i8_indices[i * replicate + j] = indices[i] * replicate + j; } From a09542b4a38d1194ad5607b0295b9d3468721a0b Mon Sep 17 00:00:00 2001 From: Martijn Courteaux Date: Fri, 9 Jan 2026 14:05:10 +0100 Subject: [PATCH 3/3] Cherrypicked changes from my vulkan-interleave fix branch. --- src/CodeGen_Hexagon.cpp | 18 ++++++++++-------- src/CodeGen_LLVM.cpp | 3 ++- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/CodeGen_Hexagon.cpp b/src/CodeGen_Hexagon.cpp index 36a811c28479..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); } } @@ -1560,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.