From: Peter Collingbourne Date: Tue, 22 Nov 2016 01:03:40 +0000 (+0000) Subject: Analysis: gep inbounds (gep inbounds (...)) is inbounds. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d703e44ea8171cbc7cbad4d7d0a28c37bf46c985;p=llvm Analysis: gep inbounds (gep inbounds (...)) is inbounds. Differential Revision: https://reviews.llvm.org/D26441 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@287604 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/ConstantFolding.cpp b/lib/Analysis/ConstantFolding.cpp index 69e2e8ad20f..500faed39b1 100644 --- a/lib/Analysis/ConstantFolding.cpp +++ b/lib/Analysis/ConstantFolding.cpp @@ -773,6 +773,7 @@ Constant *SymbolicallyEvaluateGEP(const GEPOperator *GEP, const DataLayout &DL, const TargetLibraryInfo *TLI) { const GEPOperator *InnermostGEP = GEP; + bool InBounds = GEP->isInBounds(); Type *SrcElemTy = GEP->getSourceElementType(); Type *ResElemTy = GEP->getResultElementType(); @@ -825,6 +826,7 @@ Constant *SymbolicallyEvaluateGEP(const GEPOperator *GEP, // If this is a GEP of a GEP, fold it all into a single GEP. while (auto *GEP = dyn_cast(Ptr)) { InnermostGEP = GEP; + InBounds &= GEP->isInBounds(); SmallVector NestedOps(GEP->op_begin() + 1, GEP->op_end()); @@ -946,8 +948,8 @@ Constant *SymbolicallyEvaluateGEP(const GEPOperator *GEP, } // Create a GEP. - Constant *C = ConstantExpr::getGetElementPtr( - SrcElemTy, Ptr, NewIdxs, /*InBounds=*/false, InRangeIndex); + Constant *C = ConstantExpr::getGetElementPtr(SrcElemTy, Ptr, NewIdxs, + InBounds, InRangeIndex); assert(C->getType()->getPointerElementType() == Ty && "Computed GetElementPtr has unexpected type!"); diff --git a/test/Other/constant-fold-gep.ll b/test/Other/constant-fold-gep.ll index 9d52f800bc2..77c43a200c0 100644 --- a/test/Other/constant-fold-gep.ll +++ b/test/Other/constant-fold-gep.ll @@ -106,9 +106,9 @@ ; PLAIN: @Y = global [3 x { i32, i32 }]* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 2) ; PLAIN: @Z = global i32* getelementptr inbounds (i32, i32* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 0, i64 1, i32 0), i64 1) -; OPT: @Y = local_unnamed_addr global [3 x { i32, i32 }]* getelementptr ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 2) +; OPT: @Y = local_unnamed_addr global [3 x { i32, i32 }]* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 2) ; OPT: @Z = local_unnamed_addr global i32* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 0, i64 1, i32 1) -; TO: @Y = local_unnamed_addr global [3 x { i32, i32 }]* getelementptr ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 2) +; TO: @Y = local_unnamed_addr global [3 x { i32, i32 }]* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 2) ; TO: @Z = local_unnamed_addr global i32* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 0, i64 1, i32 1) @ext = external global [3 x { i32, i32 }]