[llvm] 822392d - [VectorCombine] reject out-of-bounds extract indexes in foldExtractExtract (#194381)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 27 15:57:27 PDT 2026
Author: Arda Serdar Pektezol
Date: 2026-04-27T22:57:22Z
New Revision: 822392d2dda851139b840b24672294378d5cc29f
URL: https://github.com/llvm/llvm-project/commit/822392d2dda851139b840b24672294378d5cc29f
DIFF: https://github.com/llvm/llvm-project/commit/822392d2dda851139b840b24672294378d5cc29f.diff
LOG: [VectorCombine] reject out-of-bounds extract indexes in foldExtractExtract (#194381)
Fixes #194355
`VectorCombine::foldExtractExtract()` matches any constant-index
`extractelement` operands, but it never verifies that they are in range
for a fixed-width vector.
Added:
llvm/test/Transforms/VectorCombine/X86/extract-extract-oob.ll
Modified:
llvm/lib/Transforms/Vectorize/VectorCombine.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
index 29eced7ee9de1..5ba344ea9a808 100644
--- a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
+++ b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
@@ -660,6 +660,13 @@ bool VectorCombine::foldExtractExtract(Instruction &I) {
V0->getType() != V1->getType())
return false;
+ // For fixed-width vectors, reject out-of-bounds extract indexes
+ if (auto *FixedVecTy = dyn_cast<FixedVectorType>(V0->getType())) {
+ unsigned NumElts = FixedVecTy->getNumElements();
+ if (C0 >= NumElts || C1 >= NumElts)
+ return false;
+ }
+
// If the scalar value 'I' is going to be re-inserted into a vector, then try
// to create an extract to that same element. The extract/insert can be
// reduced to a "select shuffle".
diff --git a/llvm/test/Transforms/VectorCombine/X86/extract-extract-oob.ll b/llvm/test/Transforms/VectorCombine/X86/extract-extract-oob.ll
new file mode 100644
index 0000000000000..789d17733e807
--- /dev/null
+++ b/llvm/test/Transforms/VectorCombine/X86/extract-extract-oob.ll
@@ -0,0 +1,15 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -passes=vector-combine -S -mtriple=x86_64-- < %s | FileCheck %s
+
+define i8 @PR194355() {
+; CHECK-LABEL: define i8 @PR194355() {
+; CHECK-NEXT: [[X:%.*]] = extractelement <8 x i8> zeroinitializer, i32 133769
+; CHECK-NEXT: [[Y:%.*]] = extractelement <8 x i8> zeroinitializer, i32 1
+; CHECK-NEXT: [[Z:%.*]] = mul i8 [[X]], [[Y]]
+; CHECK-NEXT: ret i8 [[Z]]
+;
+ %x = extractelement <8 x i8> zeroinitializer, i32 133769
+ %y = extractelement <8 x i8> zeroinitializer, i32 1
+ %z = mul i8 %x, %y
+ ret i8 %z
+}
More information about the llvm-commits
mailing list