[llvm] Attributor: Infer noalias.addrspace metadata for memory instructions (PR #136553)
via llvm-commits
llvm-commits at lists.llvm.org
Thu May 22 20:19:47 PDT 2025
================
@@ -12778,6 +12779,191 @@ struct AAAddressSpaceCallSiteArgument final : AAAddressSpaceImpl {
};
} // namespace
+/// ------------------------ No Alias Address Space ---------------------------
+// This attrubte assumes flat address space can alias all other address space
+namespace {
+struct AANoAliasAddrSpaceImpl : public AANoAliasAddrSpace {
+ AANoAliasAddrSpaceImpl(const IRPosition &IRP, Attributor &A)
+ : AANoAliasAddrSpace(IRP, A) {}
+
+ void initialize(Attributor &A) override {
+ assert(getAssociatedType()->isPtrOrPtrVectorTy() &&
+ "Associated value is not a pointer");
+
+ resetASRanges(A);
+
+ auto FlatAS = A.getInfoCache().getFlatAddressSpace();
+ if (!FlatAS.has_value()) {
+ indicatePessimisticFixpoint();
+ return;
+ }
+
+ removeAS(FlatAS.value());
+
+ unsigned AS = getAssociatedType()->getPointerAddressSpace();
+ if (AS != FlatAS.value()) {
+ removeAS(AS);
+ indicateOptimisticFixpoint();
+ }
+ }
+
+ ChangeStatus updateImpl(Attributor &A) override {
+ unsigned FlatAS = A.getInfoCache().getFlatAddressSpace().value();
+ uint32_t OrigAssumed = getAssumed();
+
+ auto CheckAddressSpace = [&](Value &Obj) {
+ if (isa<PoisonValue>(&Obj))
+ return true;
+
+ unsigned AS = Obj.getType()->getPointerAddressSpace();
+ if (AS == FlatAS)
+ return false;
+
+ removeAS(Obj.getType()->getPointerAddressSpace());
+ return true;
+ };
+
+ auto *AUO = A.getOrCreateAAFor<AAUnderlyingObjects>(getIRPosition(), this,
+ DepClassTy::REQUIRED);
+ if (!AUO->forallUnderlyingObjects(CheckAddressSpace)) {
+ return indicatePessimisticFixpoint();
+ }
+
+ return OrigAssumed == getAssumed() ? ChangeStatus::UNCHANGED
+ : ChangeStatus::CHANGED;
+ }
+
+ /// See AbstractAttribute::manifest(...).
+ ChangeStatus manifest(Attributor &A) override {
+ auto FlatAS = A.getInfoCache().getFlatAddressSpace();
+ if (!FlatAS.has_value())
+ llvm_unreachable("Must have flat address space!");
+
+ unsigned AS = getAssociatedType()->getPointerAddressSpace();
+ if (AS != FlatAS.value() || Map.empty())
+ return ChangeStatus::UNCHANGED;
+
+ LLVMContext &Ctx = getAssociatedValue().getContext();
+ MDNode *NoAliasASNode = nullptr;
+ MDBuilder MDB(Ctx);
+ for (RangeMap::const_iterator I = Map.begin(); I != Map.end(); I++) {
----------------
Shoreshen wrote:
Hi @arsenm , this is iterating over the IntervalMap, RangeMap is a simplified name for IntervalMap<unsigned, bool>
https://github.com/llvm/llvm-project/pull/136553
More information about the llvm-commits
mailing list