[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