Skip to content

RFC: [TTI] Assume casts between aliasing addrspaces are valid. NFCI. #137969

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from

Conversation

jayfoad
Copy link
Contributor

@jayfoad jayfoad commented Apr 30, 2025

Change the default implementation of isValidAddrSpaceCast to assume that
casts between any address spaces satisfying addrspacesMayAlias are
valid. This seems like a reasonable default assumption and targets can
still override it if they need something different.

This simplifies away the AMDGPU implementation.

Change the default implementation of isValidAddrSpaceCast to assume that
casts between any address spaces satisfying addrspacesMayAlias are
valid. This seems like a reasonable default assumption and targets can
still override it if they need something different.

This simplifies away the AMDGPU implementation.
@llvmbot
Copy link
Member

llvmbot commented Apr 30, 2025

@llvm/pr-subscribers-llvm-analysis

Author: Jay Foad (jayfoad)

Changes

Change the default implementation of isValidAddrSpaceCast to assume that
casts between any address spaces satisfying addrspacesMayAlias are
valid. This seems like a reasonable default assumption and targets can
still override it if they need something different.

This simplifies away the AMDGPU implementation.


Full diff: https://github.com/llvm/llvm-project/pull/137969.diff

3 Files Affected:

  • (modified) llvm/include/llvm/Analysis/TargetTransformInfoImpl.h (+1-1)
  • (modified) llvm/include/llvm/CodeGen/BasicTTIImpl.h (-4)
  • (modified) llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h (-21)
diff --git a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
index cd0e8769f5eb6..93ff091d4599a 100644
--- a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
+++ b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
@@ -136,7 +136,7 @@ class TargetTransformInfoImplBase {
   virtual bool isAlwaysUniform(const Value *V) const { return false; }
 
   virtual bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const {
-    return false;
+    return addrspacesMayAlias(FromAS, ToAS);
   }
 
   virtual bool addrspacesMayAlias(unsigned AS0, unsigned AS1) const {
diff --git a/llvm/include/llvm/CodeGen/BasicTTIImpl.h b/llvm/include/llvm/CodeGen/BasicTTIImpl.h
index 6e2f65c01bf77..5cb8136aeb624 100644
--- a/llvm/include/llvm/CodeGen/BasicTTIImpl.h
+++ b/llvm/include/llvm/CodeGen/BasicTTIImpl.h
@@ -387,10 +387,6 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {
 
   bool isAlwaysUniform(const Value *V) const override { return false; }
 
-  bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const override {
-    return false;
-  }
-
   bool addrspacesMayAlias(unsigned AS0, unsigned AS1) const override {
     return true;
   }
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h b/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h
index f6f7bd4bfcf5b..9b0adcaa19aea 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h
+++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h
@@ -177,27 +177,6 @@ class GCNTTIImpl final : public BasicTTIImplBase<GCNTTIImpl> {
   bool isSourceOfDivergence(const Value *V) const override;
   bool isAlwaysUniform(const Value *V) const override;
 
-  bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const override {
-    // Address space casts must cast between different address spaces.
-    if (FromAS == ToAS)
-      return false;
-
-    if (FromAS == AMDGPUAS::FLAT_ADDRESS)
-      return AMDGPU::isExtendedGlobalAddrSpace(ToAS) ||
-             ToAS == AMDGPUAS::LOCAL_ADDRESS ||
-             ToAS == AMDGPUAS::PRIVATE_ADDRESS;
-
-    if (AMDGPU::isExtendedGlobalAddrSpace(FromAS))
-      return AMDGPU::isFlatGlobalAddrSpace(ToAS) ||
-             ToAS == AMDGPUAS::CONSTANT_ADDRESS_32BIT;
-
-    if (FromAS == AMDGPUAS::LOCAL_ADDRESS ||
-        FromAS == AMDGPUAS::PRIVATE_ADDRESS)
-      return ToAS == AMDGPUAS::FLAT_ADDRESS;
-
-    return false;
-  }
-
   bool addrspacesMayAlias(unsigned AS0, unsigned AS1) const override {
     return AMDGPU::addrspacesMayAlias(AS0, AS1);
   }

@llvmbot
Copy link
Member

llvmbot commented Apr 30, 2025

@llvm/pr-subscribers-backend-amdgpu

Author: Jay Foad (jayfoad)

Changes

Change the default implementation of isValidAddrSpaceCast to assume that
casts between any address spaces satisfying addrspacesMayAlias are
valid. This seems like a reasonable default assumption and targets can
still override it if they need something different.

This simplifies away the AMDGPU implementation.


Full diff: https://github.com/llvm/llvm-project/pull/137969.diff

3 Files Affected:

  • (modified) llvm/include/llvm/Analysis/TargetTransformInfoImpl.h (+1-1)
  • (modified) llvm/include/llvm/CodeGen/BasicTTIImpl.h (-4)
  • (modified) llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h (-21)
diff --git a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
index cd0e8769f5eb6..93ff091d4599a 100644
--- a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
+++ b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h
@@ -136,7 +136,7 @@ class TargetTransformInfoImplBase {
   virtual bool isAlwaysUniform(const Value *V) const { return false; }
 
   virtual bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const {
-    return false;
+    return addrspacesMayAlias(FromAS, ToAS);
   }
 
   virtual bool addrspacesMayAlias(unsigned AS0, unsigned AS1) const {
diff --git a/llvm/include/llvm/CodeGen/BasicTTIImpl.h b/llvm/include/llvm/CodeGen/BasicTTIImpl.h
index 6e2f65c01bf77..5cb8136aeb624 100644
--- a/llvm/include/llvm/CodeGen/BasicTTIImpl.h
+++ b/llvm/include/llvm/CodeGen/BasicTTIImpl.h
@@ -387,10 +387,6 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {
 
   bool isAlwaysUniform(const Value *V) const override { return false; }
 
-  bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const override {
-    return false;
-  }
-
   bool addrspacesMayAlias(unsigned AS0, unsigned AS1) const override {
     return true;
   }
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h b/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h
index f6f7bd4bfcf5b..9b0adcaa19aea 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h
+++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h
@@ -177,27 +177,6 @@ class GCNTTIImpl final : public BasicTTIImplBase<GCNTTIImpl> {
   bool isSourceOfDivergence(const Value *V) const override;
   bool isAlwaysUniform(const Value *V) const override;
 
-  bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const override {
-    // Address space casts must cast between different address spaces.
-    if (FromAS == ToAS)
-      return false;
-
-    if (FromAS == AMDGPUAS::FLAT_ADDRESS)
-      return AMDGPU::isExtendedGlobalAddrSpace(ToAS) ||
-             ToAS == AMDGPUAS::LOCAL_ADDRESS ||
-             ToAS == AMDGPUAS::PRIVATE_ADDRESS;
-
-    if (AMDGPU::isExtendedGlobalAddrSpace(FromAS))
-      return AMDGPU::isFlatGlobalAddrSpace(ToAS) ||
-             ToAS == AMDGPUAS::CONSTANT_ADDRESS_32BIT;
-
-    if (FromAS == AMDGPUAS::LOCAL_ADDRESS ||
-        FromAS == AMDGPUAS::PRIVATE_ADDRESS)
-      return ToAS == AMDGPUAS::FLAT_ADDRESS;
-
-    return false;
-  }
-
   bool addrspacesMayAlias(unsigned AS0, unsigned AS1) const override {
     return AMDGPU::addrspacesMayAlias(AS0, AS1);
   }

@@ -387,10 +387,6 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {

bool isAlwaysUniform(const Value *V) const override { return false; }

bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const override {
Copy link
Contributor Author

@jayfoad jayfoad Apr 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TBH I don't understand the relationship between BasicTTIImpl and TargetTransformInfoImplBase. I just removed this to stop it from overriding my default implementation in TTIIB.

Copy link
Contributor

@s-barannikov s-barannikov Apr 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TTIImplBase has two derived classes, BasicTTIImpl and NoTTIImpl. The latter is used when the target doesn't provide its own implementation of TTIImplBase (which is usually, if not always, done by inheriting from BasicTTIImpl).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably anything that doesn't make use of TM/TLI (like this and surrounding methods) should only be in TTIImplBase rather than BasicTTIImpl?

@shiltian shiltian requested a review from nikic April 30, 2025 14:19
Copy link
Contributor

@nikic nikic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this is the right thing to do, as these should have inverse defaults. We want to assume that all address spaces alias and no addrspacecasts are valid by default. A precise addrspacesMayAlias + isValidAddrSpaceCast will converge to being the same, but if either of them are approximate (including the fully conservative default approximation) they will differ.

@jayfoad
Copy link
Contributor Author

jayfoad commented Apr 30, 2025

I don't think this is the right thing to do, as these should have inverse defaults. We want to assume that all address spaces alias and no addrspacecasts are valid by default. A precise addrspacesMayAlias + isValidAddrSpaceCast will converge to being the same, but if either of them are approximate (including the full conservative default approximation) they will differ.

Fair enough, I can handle this in the target instead: #137986.

@jayfoad jayfoad closed this Apr 30, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants