[llvm] Attributor: Add noalias.addrspace attribute for store and load (PR #136553)

via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 21 19:33:04 PDT 2025


================
@@ -12784,6 +12785,172 @@ struct AAAddressSpaceCallSiteArgument final : AAAddressSpaceImpl {
 };
 } // namespace
 
+/// ------------------------ No Alias 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");
+
+    if (!A.getInfoCache().getFlatAddressSpace().has_value()) {
+      indicatePessimisticFixpoint();
+      return;
+    }
+
+    unsigned FlatAS = A.getInfoCache().getFlatAddressSpace().value();
+    unsigned AS = getAssociatedType()->getPointerAddressSpace();
+    if (AS != FlatAS) {
+      removeAssumedBits(1 << AS);
+      indicateOptimisticFixpoint();
+    }
+  }
+
+  ChangeStatus updateImpl(Attributor &A) override {
+    unsigned FlatAS = A.getInfoCache().getFlatAddressSpace().value();
+    uint32_t OrigAssumed = getAssumed();
+
+    auto CheckAddressSpace = [&](Value &Obj) {
+      if (isa<UndefValue>(&Obj))
+        return true;
+      // Handle argument in flat address space only has addrspace cast uses
+      if (auto *Arg = dyn_cast<Argument>(&Obj)) {
+        if (Arg->getType()->getPointerAddressSpace() == FlatAS) {
+          for (auto *U : Arg->users()) {
+            auto *ASCI = dyn_cast<AddrSpaceCastInst>(U);
+            if (!ASCI)
+              return false;
----------------
Shoreshen wrote:

Hi @arsenm , this is set for special case such as follow:
```
define amdgpu_kernel void @no_alias_addr_space_arg(ptr %gptr, i32 %val, i1 %cond) #0 {
  %a = addrspacecast ptr %gptr to ptr addrspace(5)
  %b = addrspacecast ptr %gptr to ptr addrspace(7)
  %ptr_a = addrspacecast ptr addrspace(5) %a to ptr
  %ptr_b = addrspacecast ptr addrspace(7) %b to ptr
  %ptr = select i1 %cond, ptr %ptr_a, ptr %ptr_b
  store i32 %val, ptr %ptr
  ret void
}
```
The underlying obj will find `%gptr` only with flat addrspace, but due to the `addrspacecast` the we know that it will not touch addrspace other than 5 and 7.... It is a special case discussed with @shiltian ..

https://github.com/llvm/llvm-project/pull/136553


More information about the llvm-commits mailing list