[clang] [CIR][NVPTX][NFC] Add initial NVPTX builtin infrastructure (PR #195214)

David Rivera via cfe-commits cfe-commits at lists.llvm.org
Sun May 3 14:06:09 PDT 2026


https://github.com/RiverDave updated https://github.com/llvm/llvm-project/pull/195214

>From e451d973a8f7126796d6a94df5be0b3a69ebe58f Mon Sep 17 00:00:00 2001
From: David Rivera <davidriverg at gmail.com>
Date: Fri, 1 May 2026 00:18:20 -0400
Subject: [PATCH 1/3] [CIR][CUDA][NFC] Add initial NVPTX builtin infrastructure

---
 clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp      |   1 +
 clang/lib/CIR/CodeGen/CIRGenBuiltinNVPTX.cpp | 948 +++++++++++++++++++
 clang/lib/CIR/CodeGen/CIRGenFunction.h       |   4 +
 clang/lib/CIR/CodeGen/CMakeLists.txt         |   1 +
 4 files changed, 954 insertions(+)
 create mode 100644 clang/lib/CIR/CodeGen/CIRGenBuiltinNVPTX.cpp

diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
index fa0d02f9e4eef..f6721ff2effea 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
@@ -2609,6 +2609,7 @@ emitTargetArchBuiltinExpr(CIRGenFunction *cgf, unsigned builtinID,
   case llvm::Triple::systemz:
   case llvm::Triple::nvptx:
   case llvm::Triple::nvptx64:
+    return cgf->emitNVPTXBuiltinExpr(builtinID, e);
   case llvm::Triple::wasm32:
   case llvm::Triple::wasm64:
   case llvm::Triple::hexagon:
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinNVPTX.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinNVPTX.cpp
new file mode 100644
index 0000000000000..1c527b4dab614
--- /dev/null
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinNVPTX.cpp
@@ -0,0 +1,948 @@
+//===---- CIRGenBuiltinNVPTX.cpp - Emit CIR for NVPTX builtins ------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This contains code to emit NVPTX Builtin calls.
+//
+//===----------------------------------------------------------------------===//
+
+#include "CIRGenFunction.h"
+
+#include "mlir/IR/Value.h"
+#include "clang/Basic/TargetBuiltins.h"
+
+using namespace clang;
+using namespace clang::CIRGen;
+
+std::optional<mlir::Value>
+CIRGenFunction::emitNVPTXBuiltinExpr(unsigned builtinId, const CallExpr *expr) {
+  switch (builtinId) {
+  case NVPTX::BI__nvvm_atom_add_gen_i:
+  case NVPTX::BI__nvvm_atom_add_gen_l:
+  case NVPTX::BI__nvvm_atom_add_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_sub_gen_i:
+  case NVPTX::BI__nvvm_atom_sub_gen_l:
+  case NVPTX::BI__nvvm_atom_sub_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_and_gen_i:
+  case NVPTX::BI__nvvm_atom_and_gen_l:
+  case NVPTX::BI__nvvm_atom_and_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_or_gen_i:
+  case NVPTX::BI__nvvm_atom_or_gen_l:
+  case NVPTX::BI__nvvm_atom_or_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_xor_gen_i:
+  case NVPTX::BI__nvvm_atom_xor_gen_l:
+  case NVPTX::BI__nvvm_atom_xor_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_xchg_gen_i:
+  case NVPTX::BI__nvvm_atom_xchg_gen_l:
+  case NVPTX::BI__nvvm_atom_xchg_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_max_gen_i:
+  case NVPTX::BI__nvvm_atom_max_gen_l:
+  case NVPTX::BI__nvvm_atom_max_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_max_gen_ui:
+  case NVPTX::BI__nvvm_atom_max_gen_ul:
+  case NVPTX::BI__nvvm_atom_max_gen_ull:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_min_gen_i:
+  case NVPTX::BI__nvvm_atom_min_gen_l:
+  case NVPTX::BI__nvvm_atom_min_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_min_gen_ui:
+  case NVPTX::BI__nvvm_atom_min_gen_ul:
+  case NVPTX::BI__nvvm_atom_min_gen_ull:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_cas_gen_us:
+  case NVPTX::BI__nvvm_atom_cas_gen_i:
+  case NVPTX::BI__nvvm_atom_cas_gen_l:
+  case NVPTX::BI__nvvm_atom_cas_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+    // success flag.
+  case NVPTX::BI__nvvm_atom_add_gen_f:
+  case NVPTX::BI__nvvm_atom_add_gen_d:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_inc_gen_ui:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_dec_gen_ui:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_ldg_c:
+  case NVPTX::BI__nvvm_ldg_sc:
+  case NVPTX::BI__nvvm_ldg_c2:
+  case NVPTX::BI__nvvm_ldg_sc2:
+  case NVPTX::BI__nvvm_ldg_c4:
+  case NVPTX::BI__nvvm_ldg_sc4:
+  case NVPTX::BI__nvvm_ldg_s:
+  case NVPTX::BI__nvvm_ldg_s2:
+  case NVPTX::BI__nvvm_ldg_s4:
+  case NVPTX::BI__nvvm_ldg_i:
+  case NVPTX::BI__nvvm_ldg_i2:
+  case NVPTX::BI__nvvm_ldg_i4:
+  case NVPTX::BI__nvvm_ldg_l:
+  case NVPTX::BI__nvvm_ldg_l2:
+  case NVPTX::BI__nvvm_ldg_ll:
+  case NVPTX::BI__nvvm_ldg_ll2:
+  case NVPTX::BI__nvvm_ldg_uc:
+  case NVPTX::BI__nvvm_ldg_uc2:
+  case NVPTX::BI__nvvm_ldg_uc4:
+  case NVPTX::BI__nvvm_ldg_us:
+  case NVPTX::BI__nvvm_ldg_us2:
+  case NVPTX::BI__nvvm_ldg_us4:
+  case NVPTX::BI__nvvm_ldg_ui:
+  case NVPTX::BI__nvvm_ldg_ui2:
+  case NVPTX::BI__nvvm_ldg_ui4:
+  case NVPTX::BI__nvvm_ldg_ul:
+  case NVPTX::BI__nvvm_ldg_ul2:
+  case NVPTX::BI__nvvm_ldg_ull:
+  case NVPTX::BI__nvvm_ldg_ull2:
+  case NVPTX::BI__nvvm_ldg_f:
+  case NVPTX::BI__nvvm_ldg_f2:
+  case NVPTX::BI__nvvm_ldg_f4:
+  case NVPTX::BI__nvvm_ldg_d:
+  case NVPTX::BI__nvvm_ldg_d2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_ldu_c:
+  case NVPTX::BI__nvvm_ldu_sc:
+  case NVPTX::BI__nvvm_ldu_c2:
+  case NVPTX::BI__nvvm_ldu_sc2:
+  case NVPTX::BI__nvvm_ldu_c4:
+  case NVPTX::BI__nvvm_ldu_sc4:
+  case NVPTX::BI__nvvm_ldu_s:
+  case NVPTX::BI__nvvm_ldu_s2:
+  case NVPTX::BI__nvvm_ldu_s4:
+  case NVPTX::BI__nvvm_ldu_i:
+  case NVPTX::BI__nvvm_ldu_i2:
+  case NVPTX::BI__nvvm_ldu_i4:
+  case NVPTX::BI__nvvm_ldu_l:
+  case NVPTX::BI__nvvm_ldu_l2:
+  case NVPTX::BI__nvvm_ldu_ll:
+  case NVPTX::BI__nvvm_ldu_ll2:
+  case NVPTX::BI__nvvm_ldu_uc:
+  case NVPTX::BI__nvvm_ldu_uc2:
+  case NVPTX::BI__nvvm_ldu_uc4:
+  case NVPTX::BI__nvvm_ldu_us:
+  case NVPTX::BI__nvvm_ldu_us2:
+  case NVPTX::BI__nvvm_ldu_us4:
+  case NVPTX::BI__nvvm_ldu_ui:
+  case NVPTX::BI__nvvm_ldu_ui2:
+  case NVPTX::BI__nvvm_ldu_ui4:
+  case NVPTX::BI__nvvm_ldu_ul:
+  case NVPTX::BI__nvvm_ldu_ul2:
+  case NVPTX::BI__nvvm_ldu_ull:
+  case NVPTX::BI__nvvm_ldu_ull2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_ldu_f:
+  case NVPTX::BI__nvvm_ldu_f2:
+  case NVPTX::BI__nvvm_ldu_f4:
+  case NVPTX::BI__nvvm_ldu_d:
+  case NVPTX::BI__nvvm_ldu_d2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_cta_add_gen_i:
+  case NVPTX::BI__nvvm_atom_cta_add_gen_l:
+  case NVPTX::BI__nvvm_atom_cta_add_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_sys_add_gen_i:
+  case NVPTX::BI__nvvm_atom_sys_add_gen_l:
+  case NVPTX::BI__nvvm_atom_sys_add_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_cta_add_gen_f:
+  case NVPTX::BI__nvvm_atom_cta_add_gen_d:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_sys_add_gen_f:
+  case NVPTX::BI__nvvm_atom_sys_add_gen_d:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_cta_xchg_gen_i:
+  case NVPTX::BI__nvvm_atom_cta_xchg_gen_l:
+  case NVPTX::BI__nvvm_atom_cta_xchg_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_sys_xchg_gen_i:
+  case NVPTX::BI__nvvm_atom_sys_xchg_gen_l:
+  case NVPTX::BI__nvvm_atom_sys_xchg_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_cta_max_gen_i:
+  case NVPTX::BI__nvvm_atom_cta_max_gen_ui:
+  case NVPTX::BI__nvvm_atom_cta_max_gen_l:
+  case NVPTX::BI__nvvm_atom_cta_max_gen_ul:
+  case NVPTX::BI__nvvm_atom_cta_max_gen_ll:
+  case NVPTX::BI__nvvm_atom_cta_max_gen_ull:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_sys_max_gen_i:
+  case NVPTX::BI__nvvm_atom_sys_max_gen_ui:
+  case NVPTX::BI__nvvm_atom_sys_max_gen_l:
+  case NVPTX::BI__nvvm_atom_sys_max_gen_ul:
+  case NVPTX::BI__nvvm_atom_sys_max_gen_ll:
+  case NVPTX::BI__nvvm_atom_sys_max_gen_ull:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_cta_min_gen_i:
+  case NVPTX::BI__nvvm_atom_cta_min_gen_ui:
+  case NVPTX::BI__nvvm_atom_cta_min_gen_l:
+  case NVPTX::BI__nvvm_atom_cta_min_gen_ul:
+  case NVPTX::BI__nvvm_atom_cta_min_gen_ll:
+  case NVPTX::BI__nvvm_atom_cta_min_gen_ull:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_sys_min_gen_i:
+  case NVPTX::BI__nvvm_atom_sys_min_gen_ui:
+  case NVPTX::BI__nvvm_atom_sys_min_gen_l:
+  case NVPTX::BI__nvvm_atom_sys_min_gen_ul:
+  case NVPTX::BI__nvvm_atom_sys_min_gen_ll:
+  case NVPTX::BI__nvvm_atom_sys_min_gen_ull:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_cta_inc_gen_ui:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_cta_dec_gen_ui:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_sys_inc_gen_ui:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_sys_dec_gen_ui:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_cta_and_gen_i:
+  case NVPTX::BI__nvvm_atom_cta_and_gen_l:
+  case NVPTX::BI__nvvm_atom_cta_and_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_sys_and_gen_i:
+  case NVPTX::BI__nvvm_atom_sys_and_gen_l:
+  case NVPTX::BI__nvvm_atom_sys_and_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_cta_or_gen_i:
+  case NVPTX::BI__nvvm_atom_cta_or_gen_l:
+  case NVPTX::BI__nvvm_atom_cta_or_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_sys_or_gen_i:
+  case NVPTX::BI__nvvm_atom_sys_or_gen_l:
+  case NVPTX::BI__nvvm_atom_sys_or_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_cta_xor_gen_i:
+  case NVPTX::BI__nvvm_atom_cta_xor_gen_l:
+  case NVPTX::BI__nvvm_atom_cta_xor_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_sys_xor_gen_i:
+  case NVPTX::BI__nvvm_atom_sys_xor_gen_l:
+  case NVPTX::BI__nvvm_atom_sys_xor_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_cta_cas_gen_us:
+  case NVPTX::BI__nvvm_atom_cta_cas_gen_i:
+  case NVPTX::BI__nvvm_atom_cta_cas_gen_l:
+  case NVPTX::BI__nvvm_atom_cta_cas_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_atom_sys_cas_gen_us:
+  case NVPTX::BI__nvvm_atom_sys_cas_gen_i:
+  case NVPTX::BI__nvvm_atom_sys_cas_gen_l:
+  case NVPTX::BI__nvvm_atom_sys_cas_gen_ll:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_match_all_sync_i32p:
+  case NVPTX::BI__nvvm_match_all_sync_i64p:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  // FP MMA loads
+  case NVPTX::BI__hmma_m16n16k16_ld_a:
+  case NVPTX::BI__hmma_m16n16k16_ld_b:
+  case NVPTX::BI__hmma_m16n16k16_ld_c_f16:
+  case NVPTX::BI__hmma_m16n16k16_ld_c_f32:
+  case NVPTX::BI__hmma_m32n8k16_ld_a:
+  case NVPTX::BI__hmma_m32n8k16_ld_b:
+  case NVPTX::BI__hmma_m32n8k16_ld_c_f16:
+  case NVPTX::BI__hmma_m32n8k16_ld_c_f32:
+  case NVPTX::BI__hmma_m8n32k16_ld_a:
+  case NVPTX::BI__hmma_m8n32k16_ld_b:
+  case NVPTX::BI__hmma_m8n32k16_ld_c_f16:
+  case NVPTX::BI__hmma_m8n32k16_ld_c_f32:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__imma_m16n16k16_ld_a_s8:
+  case NVPTX::BI__imma_m16n16k16_ld_a_u8:
+  case NVPTX::BI__imma_m16n16k16_ld_b_s8:
+  case NVPTX::BI__imma_m16n16k16_ld_b_u8:
+  case NVPTX::BI__imma_m16n16k16_ld_c:
+  case NVPTX::BI__imma_m32n8k16_ld_a_s8:
+  case NVPTX::BI__imma_m32n8k16_ld_a_u8:
+  case NVPTX::BI__imma_m32n8k16_ld_b_s8:
+  case NVPTX::BI__imma_m32n8k16_ld_b_u8:
+  case NVPTX::BI__imma_m32n8k16_ld_c:
+  case NVPTX::BI__imma_m8n32k16_ld_a_s8:
+  case NVPTX::BI__imma_m8n32k16_ld_a_u8:
+  case NVPTX::BI__imma_m8n32k16_ld_b_s8:
+  case NVPTX::BI__imma_m8n32k16_ld_b_u8:
+  case NVPTX::BI__imma_m8n32k16_ld_c:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__imma_m8n8k32_ld_a_s4:
+  case NVPTX::BI__imma_m8n8k32_ld_a_u4:
+  case NVPTX::BI__imma_m8n8k32_ld_b_s4:
+  case NVPTX::BI__imma_m8n8k32_ld_b_u4:
+  case NVPTX::BI__imma_m8n8k32_ld_c:
+  case NVPTX::BI__bmma_m8n8k128_ld_a_b1:
+  case NVPTX::BI__bmma_m8n8k128_ld_b_b1:
+  case NVPTX::BI__bmma_m8n8k128_ld_c:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__dmma_m8n8k4_ld_a:
+  case NVPTX::BI__dmma_m8n8k4_ld_b:
+  case NVPTX::BI__dmma_m8n8k4_ld_c:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__mma_bf16_m16n16k16_ld_a:
+  case NVPTX::BI__mma_bf16_m16n16k16_ld_b:
+  case NVPTX::BI__mma_bf16_m8n32k16_ld_a:
+  case NVPTX::BI__mma_bf16_m8n32k16_ld_b:
+  case NVPTX::BI__mma_bf16_m32n8k16_ld_a:
+  case NVPTX::BI__mma_bf16_m32n8k16_ld_b:
+  case NVPTX::BI__mma_tf32_m16n16k8_ld_a:
+  case NVPTX::BI__mma_tf32_m16n16k8_ld_b:
+  case NVPTX::BI__mma_tf32_m16n16k8_ld_c:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__hmma_m16n16k16_st_c_f16:
+  case NVPTX::BI__hmma_m16n16k16_st_c_f32:
+  case NVPTX::BI__hmma_m32n8k16_st_c_f16:
+  case NVPTX::BI__hmma_m32n8k16_st_c_f32:
+  case NVPTX::BI__hmma_m8n32k16_st_c_f16:
+  case NVPTX::BI__hmma_m8n32k16_st_c_f32:
+  case NVPTX::BI__imma_m16n16k16_st_c_i32:
+  case NVPTX::BI__imma_m32n8k16_st_c_i32:
+  case NVPTX::BI__imma_m8n32k16_st_c_i32:
+  case NVPTX::BI__imma_m8n8k32_st_c_i32:
+  case NVPTX::BI__bmma_m8n8k128_st_c_i32:
+  case NVPTX::BI__dmma_m8n8k4_st_c_f64:
+  case NVPTX::BI__mma_m16n16k8_st_c_f32:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  // BI__hmma_m16n16k16_mma_<Dtype><CType>(d, a, b, c, layout, satf) -->
+  // Intrinsic::nvvm_wmma_m16n16k16_mma_sync<layout A,B><DType><CType><Satf>
+  case NVPTX::BI__hmma_m16n16k16_mma_f16f16:
+  case NVPTX::BI__hmma_m16n16k16_mma_f32f16:
+  case NVPTX::BI__hmma_m16n16k16_mma_f32f32:
+  case NVPTX::BI__hmma_m16n16k16_mma_f16f32:
+  case NVPTX::BI__hmma_m32n8k16_mma_f16f16:
+  case NVPTX::BI__hmma_m32n8k16_mma_f32f16:
+  case NVPTX::BI__hmma_m32n8k16_mma_f32f32:
+  case NVPTX::BI__hmma_m32n8k16_mma_f16f32:
+  case NVPTX::BI__hmma_m8n32k16_mma_f16f16:
+  case NVPTX::BI__hmma_m8n32k16_mma_f32f16:
+  case NVPTX::BI__hmma_m8n32k16_mma_f32f32:
+  case NVPTX::BI__hmma_m8n32k16_mma_f16f32:
+  case NVPTX::BI__imma_m16n16k16_mma_s8:
+  case NVPTX::BI__imma_m16n16k16_mma_u8:
+  case NVPTX::BI__imma_m32n8k16_mma_s8:
+  case NVPTX::BI__imma_m32n8k16_mma_u8:
+  case NVPTX::BI__imma_m8n32k16_mma_s8:
+  case NVPTX::BI__imma_m8n32k16_mma_u8:
+  case NVPTX::BI__imma_m8n8k32_mma_s4:
+  case NVPTX::BI__imma_m8n8k32_mma_u4:
+  case NVPTX::BI__bmma_m8n8k128_mma_xor_popc_b1:
+  case NVPTX::BI__bmma_m8n8k128_mma_and_popc_b1:
+  case NVPTX::BI__dmma_m8n8k4_mma_f64:
+  case NVPTX::BI__mma_bf16_m16n16k16_mma_f32:
+  case NVPTX::BI__mma_bf16_m8n32k16_mma_f32:
+  case NVPTX::BI__mma_bf16_m32n8k16_mma_f32:
+  case NVPTX::BI__mma_tf32_m16n16k8_mma_f32:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  // The following builtins require half type support
+  case NVPTX::BI__nvvm_ex2_approx_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_ex2_approx_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_ff2f16x2_rn:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_ff2f16x2_rn_relu:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_ff2f16x2_rz:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_ff2f16x2_rz_relu:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_ftz_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_ftz_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_ftz_relu_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_ftz_relu_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_ftz_sat_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_ftz_sat_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_relu_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_relu_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_sat_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_sat_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmax_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmax_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmax_ftz_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmax_ftz_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmax_ftz_nan_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmax_ftz_nan_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmax_ftz_nan_xorsign_abs_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmax_ftz_nan_xorsign_abs_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmax_ftz_xorsign_abs_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmax_ftz_xorsign_abs_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmax_nan_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmax_nan_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmax_nan_xorsign_abs_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmax_nan_xorsign_abs_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmax_xorsign_abs_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmax_xorsign_abs_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmin_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmin_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmin_ftz_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmin_ftz_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmin_ftz_nan_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmin_ftz_nan_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmin_ftz_nan_xorsign_abs_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmin_ftz_nan_xorsign_abs_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmin_ftz_xorsign_abs_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmin_ftz_xorsign_abs_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmin_nan_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmin_nan_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmin_nan_xorsign_abs_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmin_nan_xorsign_abs_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmin_xorsign_abs_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fmin_xorsign_abs_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fabs_f:
+  case NVPTX::BI__nvvm_abs_bf16:
+  case NVPTX::BI__nvvm_abs_bf16x2:
+  case NVPTX::BI__nvvm_fabs_f16:
+  case NVPTX::BI__nvvm_fabs_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fabs_ftz_f:
+  case NVPTX::BI__nvvm_fabs_ftz_f16:
+  case NVPTX::BI__nvvm_fabs_ftz_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fabs_d:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_ldg_h:
+  case NVPTX::BI__nvvm_ldg_h2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_ldu_h:
+  case NVPTX::BI__nvvm_ldu_h2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_cp_async_ca_shared_global_4:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_cp_async_ca_shared_global_8:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_cp_async_ca_shared_global_16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_cp_async_cg_shared_global_16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_clusterid_x:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_clusterid_y:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_clusterid_z:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_clusterid_w:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_nclusterid_x:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_nclusterid_y:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_nclusterid_z:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_nclusterid_w:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_cluster_ctaid_x:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_cluster_ctaid_y:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_cluster_ctaid_z:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_cluster_ctaid_w:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_cluster_nctaid_x:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_cluster_nctaid_y:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_cluster_nctaid_z:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_cluster_nctaid_w:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_cluster_ctarank:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_read_ptx_sreg_cluster_nctarank:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_is_explicit_cluster:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_isspacep_shared_cluster:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_mapa:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_mapa_shared_cluster:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_getctarank:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_getctarank_shared_cluster:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_barrier_cluster_arrive:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_barrier_cluster_arrive_relaxed:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_barrier_cluster_wait:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fence_sc_cluster:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_bar_sync:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__syncthreads:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_barrier_sync:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_barrier_sync_cnt:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  default:
+    return std::nullopt;
+  }
+}
diff --git a/clang/lib/CIR/CodeGen/CIRGenFunction.h b/clang/lib/CIR/CodeGen/CIRGenFunction.h
index 3905c154e472c..d58c0556aada6 100644
--- a/clang/lib/CIR/CodeGen/CIRGenFunction.h
+++ b/clang/lib/CIR/CodeGen/CIRGenFunction.h
@@ -2018,6 +2018,10 @@ class CIRGenFunction : public CIRGenTypeCache {
   std::optional<mlir::Value> emitAMDGPUBuiltinExpr(unsigned builtinID,
                                                    const CallExpr *expr);
 
+  /// Emit a call to an NVPTX builtin function.
+  std::optional<mlir::Value> emitNVPTXBuiltinExpr(unsigned builtinID,
+                                                  const CallExpr *expr);
+
   LValue emitOpaqueValueLValue(const OpaqueValueExpr *e);
 
   LValue emitConditionalOperatorLValue(const AbstractConditionalOperator *expr);
diff --git a/clang/lib/CIR/CodeGen/CMakeLists.txt b/clang/lib/CIR/CodeGen/CMakeLists.txt
index b59addbfd6beb..7320afe626bdc 100644
--- a/clang/lib/CIR/CodeGen/CMakeLists.txt
+++ b/clang/lib/CIR/CodeGen/CMakeLists.txt
@@ -14,6 +14,7 @@ add_clang_library(clangCIR
   CIRGenBuiltin.cpp
   CIRGenBuiltinAArch64.cpp
   CIRGenBuiltinAMDGPU.cpp
+  CIRGenBuiltinNVPTX.cpp
   CIRGenAMDGPU.cpp
   CIRGenBuiltinRISCV.cpp
   CIRGenBuiltinX86.cpp

>From a07daf0d58713b8a23c8aa6d363ebca46ae7a486 Mon Sep 17 00:00:00 2001
From: David Rivera <davidriverg at gmail.com>
Date: Fri, 1 May 2026 00:22:15 -0400
Subject: [PATCH 2/3] re-arrange system-v fall-through

---
 clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
index f6721ff2effea..00964dc805dd4 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
@@ -2606,10 +2606,10 @@ emitTargetArchBuiltinExpr(CIRGenFunction *cgf, unsigned builtinID,
     return std::nullopt;
   case llvm::Triple::amdgcn:
     return cgf->emitAMDGPUBuiltinExpr(builtinID, e);
-  case llvm::Triple::systemz:
   case llvm::Triple::nvptx:
   case llvm::Triple::nvptx64:
     return cgf->emitNVPTXBuiltinExpr(builtinID, e);
+  case llvm::Triple::systemz:
   case llvm::Triple::wasm32:
   case llvm::Triple::wasm64:
   case llvm::Triple::hexagon:

>From 7287ab0d8b350df5a6cbaa351ea249b37a0c5826 Mon Sep 17 00:00:00 2001
From: David Rivera <davidriverg at gmail.com>
Date: Sun, 3 May 2026 16:59:30 -0400
Subject: [PATCH 3/3] Address comments and add missing OG builtins.

---
 clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp      |  3 +-
 clang/lib/CIR/CodeGen/CIRGenBuiltinNVPTX.cpp | 68 ++++++++++++++++++++
 2 files changed, 70 insertions(+), 1 deletion(-)

diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
index 00964dc805dd4..5af132d7c0691 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
@@ -2606,10 +2606,11 @@ emitTargetArchBuiltinExpr(CIRGenFunction *cgf, unsigned builtinID,
     return std::nullopt;
   case llvm::Triple::amdgcn:
     return cgf->emitAMDGPUBuiltinExpr(builtinID, e);
+  case llvm::Triple::systemz:
+    return std::nullopt;
   case llvm::Triple::nvptx:
   case llvm::Triple::nvptx64:
     return cgf->emitNVPTXBuiltinExpr(builtinID, e);
-  case llvm::Triple::systemz:
   case llvm::Triple::wasm32:
   case llvm::Triple::wasm64:
   case llvm::Triple::hexagon:
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinNVPTX.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinNVPTX.cpp
index 1c527b4dab614..52dfc58cfe824 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltinNVPTX.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinNVPTX.cpp
@@ -569,6 +569,46 @@ CIRGenFunction::emitNVPTXBuiltinExpr(unsigned builtinId, const CallExpr *expr) {
                  std::string("unimplemented NVPTX builtin call: ") +
                      getContext().BuiltinInfo.getName(builtinId));
     return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_oob_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_oob_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_oob_bf16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_oob_bf16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_oob_relu_f16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_oob_relu_f16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_oob_relu_bf16:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_fma_rn_oob_relu_bf16x2:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
   case NVPTX::BI__nvvm_fmax_f16:
     cgm.errorNYI(expr->getSourceRange(),
                  std::string("unimplemented NVPTX builtin call: ") +
@@ -750,6 +790,17 @@ CIRGenFunction::emitNVPTXBuiltinExpr(unsigned builtinId, const CallExpr *expr) {
                  std::string("unimplemented NVPTX builtin call: ") +
                      getContext().BuiltinInfo.getName(builtinId));
     return mlir::Value{};
+  case NVPTX::BI__nvvm_ex2_approx_d:
+  case NVPTX::BI__nvvm_ex2_approx_f:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_ex2_approx_ftz_f:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
   case NVPTX::BI__nvvm_ldg_h:
   case NVPTX::BI__nvvm_ldg_h2:
     cgm.errorNYI(expr->getSourceRange(),
@@ -942,6 +993,23 @@ CIRGenFunction::emitNVPTXBuiltinExpr(unsigned builtinId, const CallExpr *expr) {
                  std::string("unimplemented NVPTX builtin call: ") +
                      getContext().BuiltinInfo.getName(builtinId));
     return mlir::Value{};
+  case NVPTX::BI__nvvm_bar0_and:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+
+  case NVPTX::BI__nvvm_bar0_or:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+  case NVPTX::BI__nvvm_bar0_popc:
+    cgm.errorNYI(expr->getSourceRange(),
+                 std::string("unimplemented NVPTX builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinId));
+    return mlir::Value{};
+
   default:
     return std::nullopt;
   }



More information about the cfe-commits mailing list