[llvm] [InstCombine] Don't strip leading zero index for overaligned vector GEP (PR #184364)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 3 07:40:41 PST 2026


https://github.com/nikic created https://github.com/llvm/llvm-project/pull/184364

In this case the stride is not equal to the type alloc size.

Fixes issue reported in: https://github.com/llvm/llvm-project/pull/180745#discussion_r2860093376

>From cfbfc6fed388242d87a56ece885a34aa2c5bfe6e Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Tue, 3 Mar 2026 16:35:06 +0100
Subject: [PATCH 1/2] Add test for incorrect zero index stripping

---
 llvm/test/Transforms/InstCombine/getelementptr.ll | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/llvm/test/Transforms/InstCombine/getelementptr.ll b/llvm/test/Transforms/InstCombine/getelementptr.ll
index 92b76c5d1b46a..0a4f197018058 100644
--- a/llvm/test/Transforms/InstCombine/getelementptr.ll
+++ b/llvm/test/Transforms/InstCombine/getelementptr.ll
@@ -123,6 +123,15 @@ define void @test_overaligned_vec(i8 %B) {
   ret void
 }
 
+define ptr @test_overaligned_vec_dyn(ptr %p, i64 %idx) {
+; CHECK-LABEL: @test_overaligned_vec_dyn(
+; CHECK-NEXT:    [[GEP:%.*]] = getelementptr half, ptr [[P:%.*]], i64 [[IDX:%.*]]
+; CHECK-NEXT:    ret ptr [[GEP]]
+;
+  %gep = getelementptr <2 x half>, ptr %p, i64 0, i64 %idx
+  ret ptr %gep
+}
+
 define ptr @test7(ptr %I, i64 %C, i64 %D) {
 ; CHECK-LABEL: @test7(
 ; CHECK-NEXT:    [[A:%.*]] = getelementptr i32, ptr [[I:%.*]], i64 [[C:%.*]]
@@ -680,7 +689,7 @@ entry:
 define i32 @test28() nounwind  {
 ; CHECK-LABEL: @test28(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[ORIENTATIONS:%.*]] = alloca [1 x [1 x %struct.x]], align 8
+; CHECK-NEXT:    [[ORIENTATIONS:%.*]] = alloca [1 x [1 x [[STRUCT_X:%.*]]]], align 8
 ; CHECK-NEXT:    [[T3:%.*]] = call i32 @puts(ptr noundef nonnull dereferenceable(1) @.str) #[[ATTR0]]
 ; CHECK-NEXT:    br label [[BB10:%.*]]
 ; CHECK:       bb10:

>From dff7076f263f021919a0f90f9fd1c3c38e321967 Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Tue, 3 Mar 2026 16:36:30 +0100
Subject: [PATCH 2/2] Fix incorrect zero index stripping for overaligned vector

---
 llvm/lib/Transforms/InstCombine/InstructionCombining.cpp | 3 ++-
 llvm/test/Transforms/InstCombine/getelementptr.ll        | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
index e5c750fc6b130..94d26705b9045 100644
--- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -3429,7 +3429,8 @@ Instruction *InstCombinerImpl::visitGetElementPtrInst(GetElementPtrInst &GEP) {
       !FirstIdx->getType()->isVectorTy()) {
     gep_type_iterator GTI = gep_type_begin(GEP);
     ++GTI;
-    if (!GTI.isStruct())
+    if (!GTI.isStruct() && GTI.getSequentialElementStride(DL) ==
+                               DL.getTypeAllocSize(GTI.getIndexedType()))
       return replaceInstUsesWith(GEP, Builder.CreateGEP(GTI.getIndexedType(),
                                                         GEP.getPointerOperand(),
                                                         drop_begin(Indices), "",
diff --git a/llvm/test/Transforms/InstCombine/getelementptr.ll b/llvm/test/Transforms/InstCombine/getelementptr.ll
index 0a4f197018058..3b062527dbc36 100644
--- a/llvm/test/Transforms/InstCombine/getelementptr.ll
+++ b/llvm/test/Transforms/InstCombine/getelementptr.ll
@@ -125,7 +125,7 @@ define void @test_overaligned_vec(i8 %B) {
 
 define ptr @test_overaligned_vec_dyn(ptr %p, i64 %idx) {
 ; CHECK-LABEL: @test_overaligned_vec_dyn(
-; CHECK-NEXT:    [[GEP:%.*]] = getelementptr half, ptr [[P:%.*]], i64 [[IDX:%.*]]
+; CHECK-NEXT:    [[GEP:%.*]] = getelementptr <2 x half>, ptr [[P:%.*]], i64 0, i64 [[IDX:%.*]]
 ; CHECK-NEXT:    ret ptr [[GEP]]
 ;
   %gep = getelementptr <2 x half>, ptr %p, i64 0, i64 %idx



More information about the llvm-commits mailing list