[clang] [llvm] [llvm][opt][Transforms][SPIR-V] Enable `InferAddressSpaces` for SPIR-V (PR #110897)
Matt Arsenault via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 14 10:00:11 PDT 2024
================
@@ -91,6 +97,100 @@ SPIRVTargetMachine::SPIRVTargetMachine(const Target &T, const Triple &TT,
setRequiresStructuredCFG(false);
}
+enum AddressSpace {
+ Function = storageClassToAddressSpace(SPIRV::StorageClass::Function),
+ CrossWorkgroup =
+ storageClassToAddressSpace(SPIRV::StorageClass::CrossWorkgroup),
+ UniformConstant =
+ storageClassToAddressSpace(SPIRV::StorageClass::UniformConstant),
+ Workgroup = storageClassToAddressSpace(SPIRV::StorageClass::Workgroup),
+ Generic = storageClassToAddressSpace(SPIRV::StorageClass::Generic)
+};
+
+unsigned SPIRVTargetMachine::getAssumedAddrSpace(const Value *V) const {
+ // TODO: we only enable this for AMDGCN flavoured SPIR-V, where we know it to
+ // be correct; this might be relaxed in the future.
+ if (getTargetTriple().getVendor() != Triple::VendorType::AMD)
+ return UINT32_MAX;
+
+ const auto *LD = dyn_cast<LoadInst>(V);
+ if (!LD)
+ return UINT32_MAX;
+
+ // It must be a load from a pointer to Generic.
+ assert(V->getType()->isPointerTy() &&
+ V->getType()->getPointerAddressSpace() == AddressSpace::Generic);
+
+ const auto *Ptr = LD->getPointerOperand();
+ if (Ptr->getType()->getPointerAddressSpace() != AddressSpace::UniformConstant)
+ return UINT32_MAX;
+ // For a loaded from a pointer to UniformConstant, we can infer CrossWorkgroup
+ // storage, as this could only have been legally initialised with a
+ // CrossWorkgroup (aka device) constant pointer.
+ return AddressSpace::CrossWorkgroup;
+}
+
+std::pair<const Value *, unsigned>
+SPIRVTargetMachine::getPredicatedAddrSpace(const Value *V) const {
+ // TODO: this is only enabled for AMDGCN flavoured SPIR-V at the moment, where
+ // we can rely on the intrinsics being available; we should re-implement it on
+ // top of SPIR-V specific intrinsics if/when they are added or
+ // OpGenericCastToPtrExplicit / OpGenericPtrMemSemantics directly.
+ if (getTargetTriple().getVendor() != Triple::VendorType::AMD)
+ return std::pair(nullptr, UINT32_MAX);
----------------
arsenm wrote:
Don't need the vendor check
https://github.com/llvm/llvm-project/pull/110897
More information about the cfe-commits
mailing list