mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-21 03:37:47 +00:00
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
This commit is contained in:
parent
7625374502
commit
d703e44ea8
@ -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<GEPOperator>(Ptr)) {
|
||||
InnermostGEP = GEP;
|
||||
InBounds &= GEP->isInBounds();
|
||||
|
||||
SmallVector<Value *, 4> 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!");
|
||||
|
||||
|
@ -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 }]
|
||||
|
Loading…
x
Reference in New Issue
Block a user