[llvm] cbb709e - [Attributor] Disable simplification AAs if a callback is present
Johannes Doerfert via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 27 15:50:38 PDT 2021
Author: Johannes Doerfert
Date: 2021-07-27T17:50:26-05:00
New Revision: cbb709e25124dc38ee593882051fc88c987fe591
URL: https://github.com/llvm/llvm-project/commit/cbb709e25124dc38ee593882051fc88c987fe591
DIFF: https://github.com/llvm/llvm-project/commit/cbb709e25124dc38ee593882051fc88c987fe591.diff
LOG: [Attributor] Disable simplification AAs if a callback is present
AAValueSimplify, AAValueConstantRange, and AAPotentialValues all look at
the IR by default. If queried for a IR position which has a
simplification callback we should either look at the callback return, or
give up. We do the latter for now.
Added:
Modified:
llvm/include/llvm/Transforms/IPO/Attributor.h
llvm/lib/Transforms/IPO/AttributorAttributes.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Transforms/IPO/Attributor.h b/llvm/include/llvm/Transforms/IPO/Attributor.h
index 25f3f2ccfb1bf..c93b8adcc8901 100644
--- a/llvm/include/llvm/Transforms/IPO/Attributor.h
+++ b/llvm/include/llvm/Transforms/IPO/Attributor.h
@@ -1563,6 +1563,11 @@ struct Attributor {
SimplificationCallbacks[IRP].emplace_back(CB);
}
+ /// Return true if there is a simplification callback for \p IRP.
+ bool hasSimplificationCallback(const IRPosition &IRP) {
+ return SimplificationCallbacks.count(IRP);
+ }
+
private:
/// The vector with all simplification callbacks registered by outside AAs.
DenseMap<IRPosition, SmallVector<SimplifictionCallbackTy, 1>>
diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
index 9dcc0457bff80..538c37a1985f3 100644
--- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
+++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
@@ -5067,6 +5067,8 @@ struct AAValueSimplifyImpl : AAValueSimplify {
void initialize(Attributor &A) override {
if (getAssociatedValue().getType()->isVoidTy())
indicatePessimisticFixpoint();
+ if (A.hasSimplificationCallback(getIRPosition()))
+ indicatePessimisticFixpoint();
}
/// See AbstractAttribute::getAsStr().
@@ -5400,9 +5402,7 @@ struct AAValueSimplifyFloating : AAValueSimplifyImpl {
/// See AbstractAttribute::initialize(...).
void initialize(Attributor &A) override {
- // FIXME: This might have exposed a SCC iterator update bug in the old PM.
- // Needs investigation.
- // AAValueSimplifyImpl::initialize(A);
+ AAValueSimplifyImpl::initialize(A);
Value &V = getAnchorValue();
// TODO: add other stuffs
@@ -5639,6 +5639,7 @@ struct AAValueSimplifyCallSiteReturned : AAValueSimplifyImpl {
: AAValueSimplifyImpl(IRP, A) {}
void initialize(Attributor &A) override {
+ AAValueSimplifyImpl::initialize(A);
if (!getAssociatedFunction())
indicatePessimisticFixpoint();
}
@@ -7886,6 +7887,20 @@ struct AAValueConstantRangeImpl : AAValueConstantRange {
AAValueConstantRangeImpl(const IRPosition &IRP, Attributor &A)
: AAValueConstantRange(IRP, A) {}
+ /// See AbstractAttribute::initialize(..).
+ void initialize(Attributor &A) override {
+ if (A.hasSimplificationCallback(getIRPosition())) {
+ indicatePessimisticFixpoint();
+ return;
+ }
+
+ // Intersect a range given by SCEV.
+ intersectKnown(getConstantRangeFromSCEV(A, getCtxI()));
+
+ // Intersect a range given by LVI.
+ intersectKnown(getConstantRangeFromLVI(A, getCtxI()));
+ }
+
/// See AbstractAttribute::getAsStr().
const std::string getAsStr() const override {
std::string Str;
@@ -8017,15 +8032,6 @@ struct AAValueConstantRangeImpl : AAValueConstantRange {
return getAssumed().intersectWith(SCEVR).intersectWith(LVIR);
}
- /// See AbstractAttribute::initialize(..).
- void initialize(Attributor &A) override {
- // Intersect a range given by SCEV.
- intersectKnown(getConstantRangeFromSCEV(A, getCtxI()));
-
- // Intersect a range given by LVI.
- intersectKnown(getConstantRangeFromLVI(A, getCtxI()));
- }
-
/// Helper function to create MDNode for range metadata.
static MDNode *
getMDNodeForConstantRange(Type *Ty, LLVMContext &Ctx,
@@ -8155,6 +8161,9 @@ struct AAValueConstantRangeFloating : AAValueConstantRangeImpl {
/// See AbstractAttribute::initialize(...).
void initialize(Attributor &A) override {
AAValueConstantRangeImpl::initialize(A);
+ if (isAtFixpoint())
+ return;
+
Value &V = getAssociatedValue();
if (auto *C = dyn_cast<ConstantInt>(&V)) {
@@ -8175,6 +8184,7 @@ struct AAValueConstantRangeFloating : AAValueConstantRangeImpl {
if (isa<BinaryOperator>(&V) || isa<CmpInst>(&V) || isa<CastInst>(&V))
return;
+
// If it is a load instruction with range metadata, use it.
if (LoadInst *LI = dyn_cast<LoadInst>(&V))
if (auto *RangeMD = LI->getMetadata(LLVMContext::MD_range)) {
@@ -8502,6 +8512,14 @@ struct AAPotentialValuesImpl : AAPotentialValues {
AAPotentialValuesImpl(const IRPosition &IRP, Attributor &A)
: AAPotentialValues(IRP, A) {}
+ /// See AbstractAttribute::initialize(..).
+ void initialize(Attributor &A) override {
+ if (A.hasSimplificationCallback(getIRPosition()))
+ indicatePessimisticFixpoint();
+ else
+ AAPotentialValues::initialize(A);
+ }
+
/// See AbstractAttribute::getAsStr().
const std::string getAsStr() const override {
std::string Str;
@@ -8559,6 +8577,10 @@ struct AAPotentialValuesFloating : AAPotentialValuesImpl {
/// See AbstractAttribute::initialize(..).
void initialize(Attributor &A) override {
+ AAPotentialValuesImpl::initialize(A);
+ if (isAtFixpoint())
+ return;
+
Value &V = getAssociatedValue();
if (auto *C = dyn_cast<ConstantInt>(&V)) {
@@ -9091,6 +9113,10 @@ struct AAPotentialValuesCallSiteArgument : AAPotentialValuesFloating {
/// See AbstractAttribute::initialize(..).
void initialize(Attributor &A) override {
+ AAPotentialValuesImpl::initialize(A);
+ if (isAtFixpoint())
+ return;
+
Value &V = getAssociatedValue();
if (auto *C = dyn_cast<ConstantInt>(&V)) {
More information about the llvm-commits
mailing list