[llvm] f98be87 - [InstSimplify] Accept GEPNoWrapFlags instead of only InBounds flag
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 4 02:15:14 PDT 2024
Author: Nikita Popov
Date: 2024-06-04T11:15:06+02:00
New Revision: f98be870e4da1c124f476ce441d2a49e248091cf
URL: https://github.com/llvm/llvm-project/commit/f98be870e4da1c124f476ce441d2a49e248091cf
DIFF: https://github.com/llvm/llvm-project/commit/f98be870e4da1c124f476ce441d2a49e248091cf.diff
LOG: [InstSimplify] Accept GEPNoWrapFlags instead of only InBounds flag
This preserves the flags if a constexpr GEP is created (at least
as long as they don't get dropped later -- the test cases uses a
constexpr index to avoid that).
Added:
Modified:
llvm/include/llvm/Analysis/InstructionSimplify.h
llvm/lib/Analysis/InstructionSimplify.cpp
llvm/lib/Analysis/PHITransAddr.cpp
llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
llvm/lib/Transforms/Scalar/NewGVN.cpp
llvm/test/Transforms/InstSimplify/gep.ll
Removed:
################################################################################
diff --git a/llvm/include/llvm/Analysis/InstructionSimplify.h b/llvm/include/llvm/Analysis/InstructionSimplify.h
index 719cffc118f55..053367a78bfcf 100644
--- a/llvm/include/llvm/Analysis/InstructionSimplify.h
+++ b/llvm/include/llvm/Analysis/InstructionSimplify.h
@@ -166,7 +166,7 @@ Value *simplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal,
/// Given operands for a GetElementPtrInst, fold the result or return null.
Value *simplifyGEPInst(Type *SrcTy, Value *Ptr, ArrayRef<Value *> Indices,
- bool InBounds, const SimplifyQuery &Q);
+ GEPNoWrapFlags NW, const SimplifyQuery &Q);
/// Given operands for an InsertValueInst, fold the result or return null.
Value *simplifyInsertValueInst(Value *Agg, Value *Val, ArrayRef<unsigned> Idxs,
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 53a974c5294c6..8b2aa6b9f18b0 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -71,8 +71,8 @@ static Value *simplifyXorInst(Value *, Value *, const SimplifyQuery &,
unsigned);
static Value *simplifyCastInst(unsigned, Value *, Type *, const SimplifyQuery &,
unsigned);
-static Value *simplifyGEPInst(Type *, Value *, ArrayRef<Value *>, bool,
- const SimplifyQuery &, unsigned);
+static Value *simplifyGEPInst(Type *, Value *, ArrayRef<Value *>,
+ GEPNoWrapFlags, const SimplifyQuery &, unsigned);
static Value *simplifySelectInst(Value *, Value *, Value *,
const SimplifyQuery &, unsigned);
static Value *simplifyInstructionWithOperands(Instruction *I,
@@ -4943,7 +4943,7 @@ Value *llvm::simplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal,
/// Given operands for an GetElementPtrInst, see if we can fold the result.
/// If not, this returns null.
static Value *simplifyGEPInst(Type *SrcTy, Value *Ptr,
- ArrayRef<Value *> Indices, bool InBounds,
+ ArrayRef<Value *> Indices, GEPNoWrapFlags NW,
const SimplifyQuery &Q, unsigned) {
// The type of the GEP pointer operand.
unsigned AS =
@@ -5068,17 +5068,18 @@ static Value *simplifyGEPInst(Type *SrcTy, Value *Ptr,
return nullptr;
if (!ConstantExpr::isSupportedGetElementPtr(SrcTy))
- return ConstantFoldGetElementPtr(SrcTy, cast<Constant>(Ptr), InBounds,
- std::nullopt, Indices);
+ // TODO(gep_nowrap): Pass on the whole GEPNoWrapFlags.
+ return ConstantFoldGetElementPtr(SrcTy, cast<Constant>(Ptr),
+ NW.isInBounds(), std::nullopt, Indices);
- auto *CE = ConstantExpr::getGetElementPtr(SrcTy, cast<Constant>(Ptr), Indices,
- InBounds);
+ auto *CE =
+ ConstantExpr::getGetElementPtr(SrcTy, cast<Constant>(Ptr), Indices, NW);
return ConstantFoldConstant(CE, Q.DL);
}
Value *llvm::simplifyGEPInst(Type *SrcTy, Value *Ptr, ArrayRef<Value *> Indices,
- bool InBounds, const SimplifyQuery &Q) {
- return ::simplifyGEPInst(SrcTy, Ptr, Indices, InBounds, Q, RecursionLimit);
+ GEPNoWrapFlags NW, const SimplifyQuery &Q) {
+ return ::simplifyGEPInst(SrcTy, Ptr, Indices, NW, Q, RecursionLimit);
}
/// Given operands for an InsertValueInst, see if we can fold the result.
@@ -7077,7 +7078,7 @@ static Value *simplifyInstructionWithOperands(Instruction *I,
case Instruction::GetElementPtr: {
auto *GEPI = cast<GetElementPtrInst>(I);
return simplifyGEPInst(GEPI->getSourceElementType(), NewOps[0],
- ArrayRef(NewOps).slice(1), GEPI->isInBounds(), Q,
+ ArrayRef(NewOps).slice(1), GEPI->getNoWrapFlags(), Q,
MaxRecurse);
}
case Instruction::InsertValue: {
diff --git a/llvm/lib/Analysis/PHITransAddr.cpp b/llvm/lib/Analysis/PHITransAddr.cpp
index cf6a7924a3042..1a02497f25c33 100644
--- a/llvm/lib/Analysis/PHITransAddr.cpp
+++ b/llvm/lib/Analysis/PHITransAddr.cpp
@@ -214,7 +214,7 @@ Value *PHITransAddr::translateSubExpr(Value *V, BasicBlock *CurBB,
// Simplify the GEP to handle 'gep x, 0' -> x etc.
if (Value *V = simplifyGEPInst(GEP->getSourceElementType(), GEPOps[0],
ArrayRef<Value *>(GEPOps).slice(1),
- GEP->isInBounds(), {DL, TLI, DT, AC})) {
+ GEP->getNoWrapFlags(), {DL, TLI, DT, AC})) {
for (unsigned i = 0, e = GEPOps.size(); i != e; ++i)
RemoveInstInputs(GEPOps[i], InstInputs);
diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
index c34d1e5832ea1..39a87e267e00e 100644
--- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -2709,8 +2709,9 @@ Instruction *InstCombinerImpl::visitGetElementPtrInst(GetElementPtrInst &GEP) {
SmallVector<Value *, 8> Indices(GEP.indices());
Type *GEPType = GEP.getType();
Type *GEPEltType = GEP.getSourceElementType();
- if (Value *V = simplifyGEPInst(GEPEltType, PtrOp, Indices, GEP.isInBounds(),
- SQ.getWithInstruction(&GEP)))
+ if (Value *V =
+ simplifyGEPInst(GEPEltType, PtrOp, Indices, GEP.getNoWrapFlags(),
+ SQ.getWithInstruction(&GEP)))
return replaceInstUsesWith(GEP, V);
// For vector geps, use the generic demanded vector support.
diff --git a/llvm/lib/Transforms/Scalar/NewGVN.cpp b/llvm/lib/Transforms/Scalar/NewGVN.cpp
index 40a6a89d23c2c..3e2f99acdc9a6 100644
--- a/llvm/lib/Transforms/Scalar/NewGVN.cpp
+++ b/llvm/lib/Transforms/Scalar/NewGVN.cpp
@@ -1199,7 +1199,7 @@ NewGVN::ExprResult NewGVN::createExpression(Instruction *I) const {
} else if (auto *GEPI = dyn_cast<GetElementPtrInst>(I)) {
Value *V = simplifyGEPInst(GEPI->getSourceElementType(), *E->op_begin(),
ArrayRef(std::next(E->op_begin()), E->op_end()),
- GEPI->isInBounds(), Q);
+ GEPI->getNoWrapFlags(), Q);
if (auto Simplified = checkExprResults(E, I, V))
return Simplified;
} else if (AllConstant) {
diff --git a/llvm/test/Transforms/InstSimplify/gep.ll b/llvm/test/Transforms/InstSimplify/gep.ll
index 281c286ef36ea..f682fe82ca798 100644
--- a/llvm/test/Transforms/InstSimplify/gep.ll
+++ b/llvm/test/Transforms/InstSimplify/gep.ll
@@ -5,6 +5,8 @@ target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
%struct.A = type { [7 x i8] }
+ at g = external global i8
+
define ptr @test1(ptr %b, ptr %e) {
; CHECK-LABEL: @test1(
; CHECK-NEXT: [[E_PTR:%.*]] = ptrtoint ptr [[E:%.*]] to i64
@@ -271,6 +273,14 @@ define <vscale x 2 x ptr> @ptr_idx_mix_scalar_scalable_vector() {
ret <vscale x 2 x ptr> %v
}
+define ptr @constexpr_gep_nusw_nuw() {
+; CHECK-LABEL: @constexpr_gep_nusw_nuw(
+; CHECK-NEXT: ret ptr getelementptr nusw nuw (i8, ptr @g, i64 ptrtoint (ptr @g to i64))
+;
+ %v = getelementptr nusw nuw i8, ptr @g, i64 ptrtoint (ptr @g to i64)
+ ret ptr %v
+}
+
; Check ConstantExpr::getGetElementPtr() using ElementCount for size queries - end.
define ptr @poison() {
More information about the llvm-commits
mailing list