diff --git a/llvm/lib/Transforms/Scalar/LoopFlatten.cpp b/llvm/lib/Transforms/Scalar/LoopFlatten.cpp index a7f8a22ece2775..bb9632ff73a422 100644 --- a/llvm/lib/Transforms/Scalar/LoopFlatten.cpp +++ b/llvm/lib/Transforms/Scalar/LoopFlatten.cpp @@ -808,8 +808,10 @@ static bool DoFlattenLoopPair(FlattenInfo &FI, DominatorTree *DT, LoopInfo *LI, // we need to insert the new GEP where the old GEP was. if (!DT->dominates(Base, &*Builder.GetInsertPoint())) Builder.SetInsertPoint(cast(V)); - OuterValue = Builder.CreateGEP(GEP->getSourceElementType(), Base, - OuterValue, "flatten." + V->getName()); + OuterValue = + Builder.CreateGEP(GEP->getSourceElementType(), Base, OuterValue, + "flatten." + V->getName(), + GEP->isInBounds() && InnerGEP->isInBounds()); } LLVM_DEBUG(dbgs() << "Replacing: "; V->dump(); dbgs() << "with: "; diff --git a/llvm/test/Transforms/LoopFlatten/loop-flatten-gep.ll b/llvm/test/Transforms/LoopFlatten/loop-flatten-gep.ll index f4b8ea97237fe6..e30001670b1e95 100644 --- a/llvm/test/Transforms/LoopFlatten/loop-flatten-gep.ll +++ b/llvm/test/Transforms/LoopFlatten/loop-flatten-gep.ll @@ -15,7 +15,7 @@ for.outer.preheader: br label %for.inner.preheader ; CHECK-LABEL: for.inner.preheader: -; CHECK: %flatten.arrayidx = getelementptr i32, ptr %A, i32 %i +; CHECK: %flatten.arrayidx = getelementptr inbounds i32, ptr %A, i32 %i for.inner.preheader: %i = phi i32 [ 0, %for.outer.preheader ], [ %inc2, %for.outer ] br label %for.inner @@ -61,13 +61,13 @@ for.outer.preheader: br label %for.inner.preheader ; CHECK-LABEL: for.inner.preheader: -; CHECK-NOT: getelementptr i32, ptr %ptr, i32 %i +; CHECK-NOT: getelementptr inbounds i32, ptr %ptr, i32 %i for.inner.preheader: %i = phi i32 [ 0, %for.outer.preheader ], [ %inc2, %for.outer ] br label %for.inner ; CHECK-LABEL: for.inner: -; CHECK: %flatten.arrayidx = getelementptr i32, ptr %ptr, i32 %i +; CHECK: %flatten.arrayidx = getelementptr inbounds i32, ptr %ptr, i32 %i ; CHECK: store i32 0, ptr %flatten.arrayidx, align 4 ; CHECK: br label %for.outer for.inner: