Skip to content

Commit 4d1ecf1

Browse files
authored
[Transforms] Preserve inbounds attribute of transformed GEPs when flattening loops (llvm#86961)
When flattening the loop, if the GEP was inbound, it should stay inbound, because the only thing that changed is how the pointers are calculated, not the elements being accessed. Proof: https://alive2.llvm.org/ce/z/dApMpQ
1 parent 03c7458 commit 4d1ecf1

File tree

2 files changed

+7
-5
lines changed

2 files changed

+7
-5
lines changed

llvm/lib/Transforms/Scalar/LoopFlatten.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -808,8 +808,10 @@ static bool DoFlattenLoopPair(FlattenInfo &FI, DominatorTree *DT, LoopInfo *LI,
808808
// we need to insert the new GEP where the old GEP was.
809809
if (!DT->dominates(Base, &*Builder.GetInsertPoint()))
810810
Builder.SetInsertPoint(cast<Instruction>(V));
811-
OuterValue = Builder.CreateGEP(GEP->getSourceElementType(), Base,
812-
OuterValue, "flatten." + V->getName());
811+
OuterValue =
812+
Builder.CreateGEP(GEP->getSourceElementType(), Base, OuterValue,
813+
"flatten." + V->getName(),
814+
GEP->isInBounds() && InnerGEP->isInBounds());
813815
}
814816

815817
LLVM_DEBUG(dbgs() << "Replacing: "; V->dump(); dbgs() << "with: ";

llvm/test/Transforms/LoopFlatten/loop-flatten-gep.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ for.outer.preheader:
1515
br label %for.inner.preheader
1616

1717
; CHECK-LABEL: for.inner.preheader:
18-
; CHECK: %flatten.arrayidx = getelementptr i32, ptr %A, i32 %i
18+
; CHECK: %flatten.arrayidx = getelementptr inbounds i32, ptr %A, i32 %i
1919
for.inner.preheader:
2020
%i = phi i32 [ 0, %for.outer.preheader ], [ %inc2, %for.outer ]
2121
br label %for.inner
@@ -61,13 +61,13 @@ for.outer.preheader:
6161
br label %for.inner.preheader
6262

6363
; CHECK-LABEL: for.inner.preheader:
64-
; CHECK-NOT: getelementptr i32, ptr %ptr, i32 %i
64+
; CHECK-NOT: getelementptr inbounds i32, ptr %ptr, i32 %i
6565
for.inner.preheader:
6666
%i = phi i32 [ 0, %for.outer.preheader ], [ %inc2, %for.outer ]
6767
br label %for.inner
6868

6969
; CHECK-LABEL: for.inner:
70-
; CHECK: %flatten.arrayidx = getelementptr i32, ptr %ptr, i32 %i
70+
; CHECK: %flatten.arrayidx = getelementptr inbounds i32, ptr %ptr, i32 %i
7171
; CHECK: store i32 0, ptr %flatten.arrayidx, align 4
7272
; CHECK: br label %for.outer
7373
for.inner:

0 commit comments

Comments
 (0)