[llvm] [SDAG][NVPTX] Cache control metadata support and lowering (PR #204067)
Antonio Frighetto via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 5 01:16:19 PDT 2026
================
@@ -1117,6 +1136,164 @@ bool NVPTXDAGToDAGISel::SelectADDR(SDValue Addr, SDValue &Base,
return true;
}
+static void emitInvalidMemCacheHint(LLVMContext &Ctx, const Twine &Msg) {
+ Ctx.diagnose(DiagnosticInfoGeneric(
+ Twine("invalid NVPTX !mem.cache_hint metadata: ") + Msg, DS_Warning));
+}
+
+static std::optional<NVPTX::L1Eviction> parseL1Eviction(StringRef Str) {
+ return StringSwitch<std::optional<NVPTX::L1Eviction>>(Str)
+ .Case("normal", NVPTX::L1Eviction::Normal)
+ .Case("unchanged", NVPTX::L1Eviction::Unchanged)
+ .Case("first", NVPTX::L1Eviction::First)
+ .Case("last", NVPTX::L1Eviction::Last)
+ .Case("no_allocate", NVPTX::L1Eviction::NoAllocate)
+ .Default(std::nullopt);
+}
+
+static std::optional<NVPTX::L2Eviction> parseL2Eviction(StringRef Str) {
+ return StringSwitch<std::optional<NVPTX::L2Eviction>>(Str)
+ .Case("normal", NVPTX::L2Eviction::Normal)
+ .Case("first", NVPTX::L2Eviction::First)
+ .Case("last", NVPTX::L2Eviction::Last)
+ .Default(std::nullopt);
+}
+
+static std::optional<NVPTX::L2Prefetch> parseL2Prefetch(StringRef Str) {
+ return StringSwitch<std::optional<NVPTX::L2Prefetch>>(Str)
+ .Case("64B", NVPTX::L2Prefetch::Bytes64)
+ .Case("128B", NVPTX::L2Prefetch::Bytes128)
+ .Case("256B", NVPTX::L2Prefetch::Bytes256)
+ .Default(std::nullopt);
+}
+
+template <typename T>
+static std::optional<T>
+parseMemCacheHintStringValue(LLVMContext &Ctx, StringRef Key,
+ const Metadata *Value,
+ std::optional<T> (*Parse)(StringRef)) {
+ const auto *Val = dyn_cast<MDString>(Value);
+ if (!Val) {
+ emitInvalidMemCacheHint(Ctx, Twine("'") + Key + "' expects a string value");
+ return std::nullopt;
+ }
+
+ StringRef ValStr = Val->getString();
+ auto Parsed = Parse(ValStr);
+ if (!Parsed)
+ emitInvalidMemCacheHint(Ctx, Twine("unknown value '") + ValStr + "' for '" +
+ Key + "'");
+ return Parsed;
+}
+
+static bool isGlobalOrGeneric(NVPTX::AddressSpace AddrSpace) {
+ return AddrSpace == NVPTX::AddressSpace::Global ||
+ AddrSpace == NVPTX::AddressSpace::Generic;
+}
+
+static bool isL2PrefetchSupported(const NVPTXSubtarget &Subtarget,
+ NVPTX::L2Prefetch Prefetch,
+ NVPTXMemCacheHintAccess Access) {
+ switch (Prefetch) {
+ case NVPTX::L2Prefetch::None:
+ return true;
+ case NVPTX::L2Prefetch::Bytes64:
+ return Access.IsLoad && isGlobalOrGeneric(Access.AddrSpace) &&
+ Subtarget.hasL2Prefetch64B();
+ case NVPTX::L2Prefetch::Bytes128:
+ return Access.IsLoad && isGlobalOrGeneric(Access.AddrSpace) &&
+ Subtarget.hasL2Prefetch128B();
+ case NVPTX::L2Prefetch::Bytes256:
+ return Access.IsLoad && isGlobalOrGeneric(Access.AddrSpace) &&
+ Subtarget.hasL2Prefetch256B();
+ }
+ llvm_unreachable("Unexpected L2 prefetch hint");
+}
+
+static bool isL2EvictionSupported(const NVPTXSubtarget &Subtarget,
+ NVPTXMemCacheHintAccess Access,
+ NVPTX::L2Eviction Eviction) {
----------------
antoniofrighetto wrote:
```suggestion
NVPTX::L2Eviction Eviction,
NVPTXMemCacheHintAccess Access) {
```
(So we are consistent w/ the other helper above)
https://github.com/llvm/llvm-project/pull/204067
More information about the llvm-commits
mailing list