diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp index 314f59f00a0eb..ec0ca9eafc3fa 100644 --- a/llvm/lib/Transforms/IPO/Attributor.cpp +++ b/llvm/lib/Transforms/IPO/Attributor.cpp @@ -204,9 +204,10 @@ bool AA::isNoSyncInst(Attributor &A, const Instruction &I, if (AANoSync::isNoSyncIntrinsic(&I)) return true; - const auto *NoSyncAA = A.getAAFor( - QueryingAA, IRPosition::callsite_function(*CB), DepClassTy::OPTIONAL); - return NoSyncAA && NoSyncAA->isAssumedNoSync(); + bool IsKnownNoSync; + return AA::hasAssumedIRAttr( + A, &QueryingAA, IRPosition::callsite_function(*CB), + DepClassTy::OPTIONAL, IsKnownNoSync); } if (!I.mayReadOrWriteMemory()) @@ -3284,8 +3285,7 @@ void Attributor::identifyDefaultAbstractAttributes(Function &F) { checkAndQueryIRAttr(FPos, FnAttrs); // Every function might be marked "nosync" - if (!Attrs.hasFnAttr(Attribute::NoSync)) - getOrCreateAAFor(FPos); + checkAndQueryIRAttr(FPos, FnAttrs); // Every function might be "no-free". checkAndQueryIRAttr(FPos, FnAttrs); diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp index 081f9f0f0ac31..643818416af9a 100644 --- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp +++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp @@ -2417,6 +2417,13 @@ namespace { struct AANoSyncImpl : AANoSync { AANoSyncImpl(const IRPosition &IRP, Attributor &A) : AANoSync(IRP, A) {} + /// See AbstractAttribute::initialize(...). + void initialize(Attributor &A) override { + bool IsKnown; + assert(!AA::hasAssumedIRAttr(A, nullptr, getIRPosition(), + DepClassTy::NONE, IsKnown)); + } + const std::string getAsStr(Attributor *A) const override { return getAssumed() ? "nosync" : "may-sync"; }