[llvm] [VectorCombine] reject out-of-bounds extract indexes in foldExtractExtract (PR #194381)

Arda Serdar Pektezol via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 27 07:50:18 PDT 2026


https://github.com/pektezol updated https://github.com/llvm/llvm-project/pull/194381

>From acd504243dea54eab1e66f4b8e8c276446027a12 Mon Sep 17 00:00:00 2001
From: Arda Serdar Pektezol <arda at pektezol.dev>
Date: Mon, 27 Apr 2026 17:05:16 +0300
Subject: [PATCH 1/2] [VectorCombine] reject out-of-bounds extract indexes in
 foldExtractExtract

---
 llvm/lib/Transforms/Vectorize/VectorCombine.cpp |  7 +++++++
 .../VectorCombine/X86/extract-extract-oob.ll    | 17 +++++++++++++++++
 2 files changed, 24 insertions(+)
 create mode 100644 llvm/test/Transforms/VectorCombine/X86/extract-extract-oob.ll

diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
index 29eced7ee9de1..b59d0d827e6ed 100644
--- a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
+++ b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
@@ -659,6 +659,13 @@ bool VectorCombine::foldExtractExtract(Instruction &I) {
       !match(I1, m_ExtractElt(m_Value(V1), m_ConstantInt(C1))) ||
       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
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..6358acf79032f
--- /dev/null
+++ b/llvm/test/Transforms/VectorCombine/X86/extract-extract-oob.ll
@@ -0,0 +1,17 @@
+; 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 @f() {
+; CHECK-LABEL: define i8 @f() {
+; CHECK-NEXT:  [[BB:.*:]]
+; CHECK-NEXT:    [[E:%.*]] = extractelement <8 x i8> zeroinitializer, i32 133769
+; CHECK-NEXT:    [[E6:%.*]] = extractelement <8 x i8> zeroinitializer, i32 1
+; CHECK-NEXT:    [[B:%.*]] = mul i8 [[E]], [[E6]]
+; CHECK-NEXT:    ret i8 [[B]]
+;
+BB:
+  %E = extractelement <8 x i8> zeroinitializer, i32 133769
+  %E6 = extractelement <8 x i8> zeroinitializer, i32 1
+  %B = mul i8 %E, %E6
+  ret i8 %B
+}

>From e432064800aeaecfb2b4a199ecbd240d721a7aa8 Mon Sep 17 00:00:00 2001
From: Arda Serdar Pektezol <arda at pektezol.dev>
Date: Mon, 27 Apr 2026 17:50:00 +0300
Subject: [PATCH 2/2] [VectorCombine] update test case extract-extract-oob.ll

---
 .../VectorCombine/X86/extract-extract-oob.ll  | 22 +++++++++----------
 1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/llvm/test/Transforms/VectorCombine/X86/extract-extract-oob.ll b/llvm/test/Transforms/VectorCombine/X86/extract-extract-oob.ll
index 6358acf79032f..789d17733e807 100644
--- a/llvm/test/Transforms/VectorCombine/X86/extract-extract-oob.ll
+++ b/llvm/test/Transforms/VectorCombine/X86/extract-extract-oob.ll
@@ -1,17 +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 @f() {
-; CHECK-LABEL: define i8 @f() {
-; CHECK-NEXT:  [[BB:.*:]]
-; CHECK-NEXT:    [[E:%.*]] = extractelement <8 x i8> zeroinitializer, i32 133769
-; CHECK-NEXT:    [[E6:%.*]] = extractelement <8 x i8> zeroinitializer, i32 1
-; CHECK-NEXT:    [[B:%.*]] = mul i8 [[E]], [[E6]]
-; CHECK-NEXT:    ret i8 [[B]]
+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]]
 ;
-BB:
-  %E = extractelement <8 x i8> zeroinitializer, i32 133769
-  %E6 = extractelement <8 x i8> zeroinitializer, i32 1
-  %B = mul i8 %E, %E6
-  ret i8 %B
+  %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