https://github.com/Men-cotton updated 
https://github.com/llvm/llvm-project/pull/199530

>From 9c9c9aaa48b05a0bf833bb8e2111a8e0163385a0 Mon Sep 17 00:00:00 2001
From: mencotton <[email protected]>
Date: Sun, 24 May 2026 00:49:55 +0900
Subject: [PATCH 1/5] [CIR][OpenCL] Add kernel argument metadata attribute

Add a CIR attribute that carries OpenCL kernel argument metadata in source 
argument order. Verify that each metadata field has the expected element type 
and that all present arrays describe the same number of arguments.
---
 .../include/clang/CIR/Dialect/IR/CIRAttrs.td  |  1 +
 .../clang/CIR/Dialect/IR/CIRDialect.td        |  1 +
 .../clang/CIR/Dialect/IR/CIROpenCLAttrs.td    | 46 +++++++++++
 clang/lib/CIR/Dialect/IR/CIROpenCLAttrs.cpp   | 60 ++++++++++++++
 clang/lib/CIR/Dialect/IR/CMakeLists.txt       |  1 +
 .../IR/invalid-opencl-kernel-arg-metadata.cir | 78 +++++++++++++++++++
 .../CIR/IR/opencl-kernel-arg-metadata.cir     | 27 +++++++
 7 files changed, 214 insertions(+)
 create mode 100644 clang/include/clang/CIR/Dialect/IR/CIROpenCLAttrs.td
 create mode 100644 clang/lib/CIR/Dialect/IR/CIROpenCLAttrs.cpp
 create mode 100644 clang/test/CIR/IR/invalid-opencl-kernel-arg-metadata.cir
 create mode 100644 clang/test/CIR/IR/opencl-kernel-arg-metadata.cir

diff --git a/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td 
b/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td
index 4032d8219fff3..19a0c25c8b10e 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td
@@ -1687,6 +1687,7 @@ def CIR_AnnotationArrayAttr
     : TypedArrayAttrBase<CIR_AnnotationAttr,
                          "array of cir.annotation attributes">;
 
+include "clang/CIR/Dialect/IR/CIROpenCLAttrs.td"
 include "clang/CIR/Dialect/IR/CIRCUDAAttrs.td"
 
 #endif // CLANG_CIR_DIALECT_IR_CIRATTRS_TD
diff --git a/clang/include/clang/CIR/Dialect/IR/CIRDialect.td 
b/clang/include/clang/CIR/Dialect/IR/CIRDialect.td
index aaa7b48262c80..c20af04f97a1a 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIRDialect.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIRDialect.td
@@ -82,6 +82,7 @@ def CIR_Dialect : Dialect {
 
     static llvm::StringRef getAMDGPUCodeObjectVersionAttrName() { return 
"cir.amdhsa_code_object_version"; }
     static llvm::StringRef getAMDGPUPrintfKindAttrName() { return 
"cir.amdgpu_printf_kind"; }
+    static llvm::StringRef getOpenCLKernelArgMetadataAttrName() { return 
"cir.cl.kernel_arg_metadata"; }
 
     void registerAttributes();
     void registerTypes();
diff --git a/clang/include/clang/CIR/Dialect/IR/CIROpenCLAttrs.td 
b/clang/include/clang/CIR/Dialect/IR/CIROpenCLAttrs.td
new file mode 100644
index 0000000000000..c0ec9c7f28f85
--- /dev/null
+++ b/clang/include/clang/CIR/Dialect/IR/CIROpenCLAttrs.td
@@ -0,0 +1,46 @@
+//===- CIROpenCLAttrs.td - CIR dialect attrs for OpenCL ----*- tablegen 
-*-===//
+//
+// 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 file declares the CIR dialect attributes for OpenCL.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CLANG_CIR_DIALECT_IR_CIROPENCLATTRS_TD
+#define CLANG_CIR_DIALECT_IR_CIROPENCLATTRS_TD
+
+//===----------------------------------------------------------------------===//
+// OpenCLKernelArgMetadataAttr
+//===----------------------------------------------------------------------===//
+
+def CIR_OpenCLKernelArgMetadataAttr
+    : CIR_Attr<"OpenCLKernelArgMetadata", "cl.kernel_arg_metadata"> {
+  let summary = "OpenCL kernel argument metadata";
+  let description = [{
+    Stores the OpenCL kernel argument metadata emitted to LLVM IR as
+    `kernel_arg_*` metadata.
+
+    All parameters are arrays containing the argument information in source
+    order. The `name` field is optional and is emitted only when requested by
+    `-cl-kernel-arg-info`.
+  }];
+
+  let parameters = (ins
+    "::mlir::ArrayAttr":$addr_space,
+    "::mlir::ArrayAttr":$access_qual,
+    "::mlir::ArrayAttr":$type,
+    "::mlir::ArrayAttr":$base_type,
+    "::mlir::ArrayAttr":$type_qual,
+    OptionalParameter<"::mlir::ArrayAttr">:$name
+  );
+
+  let assemblyFormat = "`<` struct(params) `>`";
+  let genVerifyDecl = 1;
+  let canHaveIllegalCXXABIType = 0;
+}
+
+#endif // CLANG_CIR_DIALECT_IR_CIROPENCLATTRS_TD
diff --git a/clang/lib/CIR/Dialect/IR/CIROpenCLAttrs.cpp 
b/clang/lib/CIR/Dialect/IR/CIROpenCLAttrs.cpp
new file mode 100644
index 0000000000000..57692cd4783b8
--- /dev/null
+++ b/clang/lib/CIR/Dialect/IR/CIROpenCLAttrs.cpp
@@ -0,0 +1,60 @@
+//===- CIROpenCLAttrs.cpp - OpenCL specific attributes in CIR 
-------------===//
+//
+// 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 file defines the OpenCL-specific attrs in the CIR dialect.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/CIR/Dialect/IR/CIRAttrs.h"
+
+#include "mlir/IR/Attributes.h"
+#include "mlir/IR/Diagnostics.h"
+#include "llvm/ADT/STLExtras.h"
+
+using namespace mlir;
+using namespace cir;
+
+//===----------------------------------------------------------------------===//
+// OpenCLKernelArgMetadataAttr definitions
+//===----------------------------------------------------------------------===//
+
+LogicalResult OpenCLKernelArgMetadataAttr::verify(
+    function_ref<InFlightDiagnostic()> emitError, ArrayAttr addrSpaces,
+    ArrayAttr accessQuals, ArrayAttr types, ArrayAttr baseTypes,
+    ArrayAttr typeQuals, ArrayAttr argNames) {
+  auto isIntArray = [](ArrayAttr attr) {
+    return llvm::all_of(
+        attr, [](Attribute elem) { return mlir::isa<IntegerAttr>(elem); });
+  };
+  auto isStrArray = [](ArrayAttr attr) {
+    return llvm::all_of(
+        attr, [](Attribute elem) { return mlir::isa<StringAttr>(elem); });
+  };
+
+  if (!isIntArray(addrSpaces))
+    return emitError() << "addr_space must be an integer array";
+  if (!isStrArray(accessQuals))
+    return emitError() << "access_qual must be a string array";
+  if (!isStrArray(types))
+    return emitError() << "type must be a string array";
+  if (!isStrArray(baseTypes))
+    return emitError() << "base_type must be a string array";
+  if (!isStrArray(typeQuals))
+    return emitError() << "type_qual must be a string array";
+  if (argNames && !isStrArray(argNames))
+    return emitError() << "name must be a string array";
+
+  if (!llvm::all_of(ArrayRef<ArrayAttr>{addrSpaces, accessQuals, types,
+                                        baseTypes, typeQuals, argNames},
+                    [&](ArrayAttr attr) {
+                      return !attr || attr.size() == addrSpaces.size();
+                    }))
+    return emitError() << "all arrays must have the same number of elements";
+
+  return success();
+}
diff --git a/clang/lib/CIR/Dialect/IR/CMakeLists.txt 
b/clang/lib/CIR/Dialect/IR/CMakeLists.txt
index 98575941035f2..c8205ebeabf6c 100644
--- a/clang/lib/CIR/Dialect/IR/CMakeLists.txt
+++ b/clang/lib/CIR/Dialect/IR/CMakeLists.txt
@@ -4,6 +4,7 @@ add_clang_library(MLIRCIR
   CIRMemorySlot.cpp
   CIRTypes.cpp
   CIRDataLayout.cpp
+  CIROpenCLAttrs.cpp
 
   DEPENDS
   MLIRCIROpsIncGen
diff --git a/clang/test/CIR/IR/invalid-opencl-kernel-arg-metadata.cir 
b/clang/test/CIR/IR/invalid-opencl-kernel-arg-metadata.cir
new file mode 100644
index 0000000000000..23c62c09100f5
--- /dev/null
+++ b/clang/test/CIR/IR/invalid-opencl-kernel-arg-metadata.cir
@@ -0,0 +1,78 @@
+// RUN: cir-opt %s -verify-diagnostics -split-input-file
+
+// expected-error @below {{addr_space must be an integer array}}
+#attr = #cir.cl.kernel_arg_metadata<
+  addr_space = ["none"],
+  access_qual = ["none"],
+  type = ["uint*"],
+  base_type = ["uint*"],
+  type_qual = [""]
+>
+
+// -----
+
+// expected-error @below {{access_qual must be a string array}}
+#attr = #cir.cl.kernel_arg_metadata<
+  addr_space = [0 : i32],
+  access_qual = [42 : i32],
+  type = ["uint*"],
+  base_type = ["uint*"],
+  type_qual = [""]
+>
+
+// -----
+
+// expected-error @below {{type must be a string array}}
+#attr = #cir.cl.kernel_arg_metadata<
+  addr_space = [0 : i32],
+  access_qual = ["none"],
+  type = [42 : i32],
+  base_type = ["uint*"],
+  type_qual = [""]
+>
+
+// -----
+
+// expected-error @below {{base_type must be a string array}}
+#attr = #cir.cl.kernel_arg_metadata<
+  addr_space = [0 : i32],
+  access_qual = ["none"],
+  type = ["uint*"],
+  base_type = [42 : i32],
+  type_qual = [""]
+>
+
+// -----
+
+// expected-error @below {{type_qual must be a string array}}
+#attr = #cir.cl.kernel_arg_metadata<
+  addr_space = [0 : i32],
+  access_qual = ["none"],
+  type = ["uint*"],
+  base_type = ["uint*"],
+  type_qual = [42 : i32]
+>
+
+// -----
+
+// expected-error @below {{name must be a string array}}
+#attr = #cir.cl.kernel_arg_metadata<
+  addr_space = [0 : i32],
+  access_qual = ["none"],
+  type = ["uint*"],
+  base_type = ["uint*"],
+  type_qual = [""],
+  name = [33 : i32]
+>
+
+// -----
+
+// expected-error @below {{all arrays must have the same number of elements}}
+#attr = #cir.cl.kernel_arg_metadata<
+  addr_space = [0 : i32],
+  access_qual = ["none"],
+  type = ["uint*", "myunsignedint*"],
+  base_type = ["uint*", "uint*"],
+  type_qual = [""],
+  name = ["foo"]
+>
diff --git a/clang/test/CIR/IR/opencl-kernel-arg-metadata.cir 
b/clang/test/CIR/IR/opencl-kernel-arg-metadata.cir
new file mode 100644
index 0000000000000..89b3f0722d6f6
--- /dev/null
+++ b/clang/test/CIR/IR/opencl-kernel-arg-metadata.cir
@@ -0,0 +1,27 @@
+// RUN: cir-opt %s --verify-roundtrip | FileCheck %s
+
+module {
+  cir.func @without_names() attributes {cir.cl.kernel_arg_metadata = 
#cir.cl.kernel_arg_metadata<addr_space = [1 : i32, 0 : i32], access_qual = 
["none", "none"], type = ["uint*", "int"], base_type = ["uint*", "int"], 
type_qual = ["restrict", ""]>} {
+    cir.return
+  }
+
+  cir.func @with_names() attributes {cir.cl.kernel_arg_metadata = 
#cir.cl.kernel_arg_metadata<addr_space = [1 : i32, 0 : i32], access_qual = 
["none", "none"], type = ["uint*", "int"], base_type = ["uint*", "int"], 
type_qual = ["restrict", ""], name = ["data", "count"]>} {
+    cir.return
+  }
+}
+
+// CHECK-LABEL: cir.func @without_names()
+// CHECK-SAME: cir.cl.kernel_arg_metadata = #cir.cl.kernel_arg_metadata
+// CHECK-SAME: addr_space = [1 : i32, 0 : i32]
+// CHECK-SAME: type = ["uint*", "int"]
+// CHECK-SAME: base_type = ["uint*", "int"]
+// CHECK-SAME: type_qual = ["restrict", ""]
+// CHECK-NOT: name =
+
+// CHECK-LABEL: cir.func @with_names()
+// CHECK-SAME: cir.cl.kernel_arg_metadata = #cir.cl.kernel_arg_metadata
+// CHECK-SAME: addr_space = [1 : i32, 0 : i32]
+// CHECK-SAME: type = ["uint*", "int"]
+// CHECK-SAME: base_type = ["uint*", "int"]
+// CHECK-SAME: type_qual = ["restrict", ""]
+// CHECK-SAME: name = ["data", "count"]

>From a428e4aba11259eee3af902ac2061e4e09f8d0c8 Mon Sep 17 00:00:00 2001
From: mencotton <[email protected]>
Date: Tue, 26 May 2026 22:17:23 +0900
Subject: [PATCH 2/5] fix: Add zero-argument kernel arg metadata test

---
 clang/test/CIR/IR/opencl-kernel-arg-metadata.cir | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/clang/test/CIR/IR/opencl-kernel-arg-metadata.cir 
b/clang/test/CIR/IR/opencl-kernel-arg-metadata.cir
index 89b3f0722d6f6..e6982d5353186 100644
--- a/clang/test/CIR/IR/opencl-kernel-arg-metadata.cir
+++ b/clang/test/CIR/IR/opencl-kernel-arg-metadata.cir
@@ -8,6 +8,10 @@ module {
   cir.func @with_names() attributes {cir.cl.kernel_arg_metadata = 
#cir.cl.kernel_arg_metadata<addr_space = [1 : i32, 0 : i32], access_qual = 
["none", "none"], type = ["uint*", "int"], base_type = ["uint*", "int"], 
type_qual = ["restrict", ""], name = ["data", "count"]>} {
     cir.return
   }
+
+  cir.func @no_args() attributes {cir.cl.kernel_arg_metadata = 
#cir.cl.kernel_arg_metadata<addr_space = [], access_qual = [], type = [], 
base_type = [], type_qual = []>} {
+    cir.return
+  }
 }
 
 // CHECK-LABEL: cir.func @without_names()
@@ -25,3 +29,11 @@ module {
 // CHECK-SAME: base_type = ["uint*", "int"]
 // CHECK-SAME: type_qual = ["restrict", ""]
 // CHECK-SAME: name = ["data", "count"]
+
+// CHECK-LABEL: cir.func @no_args()
+// CHECK-SAME: cir.cl.kernel_arg_metadata = #cir.cl.kernel_arg_metadata
+// CHECK-SAME: addr_space = []
+// CHECK-SAME: access_qual = []
+// CHECK-SAME: type = []
+// CHECK-SAME: base_type = []
+// CHECK-SAME: type_qual = []

>From b429e72b735c1d44022a25d58998414cdfeed0d1 Mon Sep 17 00:00:00 2001
From: mencotton <[email protected]>
Date: Tue, 26 May 2026 22:17:49 +0900
Subject: [PATCH 3/5] fix: Verify kernel arg addr_space values

---
 clang/lib/CIR/Dialect/IR/CIROpenCLAttrs.cpp   | 19 +++++++++++----
 .../IR/invalid-opencl-kernel-arg-metadata.cir | 24 ++++++++++++++++++-
 2 files changed, 37 insertions(+), 6 deletions(-)

diff --git a/clang/lib/CIR/Dialect/IR/CIROpenCLAttrs.cpp 
b/clang/lib/CIR/Dialect/IR/CIROpenCLAttrs.cpp
index 57692cd4783b8..ac8c01ecc1565 100644
--- a/clang/lib/CIR/Dialect/IR/CIROpenCLAttrs.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIROpenCLAttrs.cpp
@@ -27,17 +27,26 @@ LogicalResult OpenCLKernelArgMetadataAttr::verify(
     function_ref<InFlightDiagnostic()> emitError, ArrayAttr addrSpaces,
     ArrayAttr accessQuals, ArrayAttr types, ArrayAttr baseTypes,
     ArrayAttr typeQuals, ArrayAttr argNames) {
-  auto isIntArray = [](ArrayAttr attr) {
-    return llvm::all_of(
-        attr, [](Attribute elem) { return mlir::isa<IntegerAttr>(elem); });
+  auto isInt32Array = [](ArrayAttr attr) {
+    return llvm::all_of(attr, [](Attribute elem) {
+      auto intAttr = mlir::dyn_cast<IntegerAttr>(elem);
+      return intAttr && intAttr.getType().isInteger(32);
+    });
+  };
+  auto isNonNegativeIntArray = [](ArrayAttr attr) {
+    return llvm::all_of(attr, [](Attribute elem) {
+      return mlir::cast<IntegerAttr>(elem).getValue().isNonNegative();
+    });
   };
   auto isStrArray = [](ArrayAttr attr) {
     return llvm::all_of(
         attr, [](Attribute elem) { return mlir::isa<StringAttr>(elem); });
   };
 
-  if (!isIntArray(addrSpaces))
-    return emitError() << "addr_space must be an integer array";
+  if (!isInt32Array(addrSpaces))
+    return emitError() << "addr_space must be an i32 integer array";
+  if (!isNonNegativeIntArray(addrSpaces))
+    return emitError() << "addr_space values must be non-negative";
   if (!isStrArray(accessQuals))
     return emitError() << "access_qual must be a string array";
   if (!isStrArray(types))
diff --git a/clang/test/CIR/IR/invalid-opencl-kernel-arg-metadata.cir 
b/clang/test/CIR/IR/invalid-opencl-kernel-arg-metadata.cir
index 23c62c09100f5..18f239d2e0ee5 100644
--- a/clang/test/CIR/IR/invalid-opencl-kernel-arg-metadata.cir
+++ b/clang/test/CIR/IR/invalid-opencl-kernel-arg-metadata.cir
@@ -1,6 +1,6 @@
 // RUN: cir-opt %s -verify-diagnostics -split-input-file
 
-// expected-error @below {{addr_space must be an integer array}}
+// expected-error @below {{addr_space must be an i32 integer array}}
 #attr = #cir.cl.kernel_arg_metadata<
   addr_space = ["none"],
   access_qual = ["none"],
@@ -11,6 +11,28 @@
 
 // -----
 
+// expected-error @below {{addr_space must be an i32 integer array}}
+#attr = #cir.cl.kernel_arg_metadata<
+  addr_space = [0 : i64],
+  access_qual = ["none"],
+  type = ["uint*"],
+  base_type = ["uint*"],
+  type_qual = [""]
+>
+
+// -----
+
+// expected-error @below {{addr_space values must be non-negative}}
+#attr = #cir.cl.kernel_arg_metadata<
+  addr_space = [-1 : i32],
+  access_qual = ["none"],
+  type = ["uint*"],
+  base_type = ["uint*"],
+  type_qual = [""]
+>
+
+// -----
+
 // expected-error @below {{access_qual must be a string array}}
 #attr = #cir.cl.kernel_arg_metadata<
   addr_space = [0 : i32],

>From ad298e32a3afdc0eabc7db43542efbfb389921a6 Mon Sep 17 00:00:00 2001
From: mencotton <[email protected]>
Date: Tue, 26 May 2026 23:18:45 +0900
Subject: [PATCH 4/5] fix: Use CIR_LangAddressSpace instead of a raw integer

---
 .../clang/CIR/Dialect/IR/CIREnumAttr.td       |  4 ++-
 clang/lib/CIR/Dialect/IR/CIROpenCLAttrs.cpp   | 16 +++------
 clang/lib/CIR/Dialect/IR/CIRTypes.cpp         |  2 ++
 .../TargetLowering/Targets/AMDGPU.cpp         |  2 ++
 .../TargetLowering/Targets/NVPTX.cpp          |  1 +
 .../TargetLowering/Targets/SPIRV.cpp          |  2 ++
 .../IR/invalid-opencl-kernel-arg-metadata.cir | 36 ++++---------------
 .../CIR/IR/opencl-kernel-arg-metadata.cir     |  8 ++---
 8 files changed, 25 insertions(+), 46 deletions(-)

diff --git a/clang/include/clang/CIR/Dialect/IR/CIREnumAttr.td 
b/clang/include/clang/CIR/Dialect/IR/CIREnumAttr.td
index 1de6ffdc08d72..cc6f256ddfef4 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIREnumAttr.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIREnumAttr.td
@@ -43,7 +43,9 @@ def CIR_LangAddressSpace : CIR_I32EnumAttr<
   I32EnumAttrCase<"OffloadLocal", 2, "offload_local">,
   I32EnumAttrCase<"OffloadGlobal", 3, "offload_global">,
   I32EnumAttrCase<"OffloadConstant", 4, "offload_constant">,
-  I32EnumAttrCase<"OffloadGeneric", 5, "offload_generic">
+  I32EnumAttrCase<"OffloadGeneric", 5, "offload_generic">,
+  I32EnumAttrCase<"OffloadGlobalDevice", 6, "offload_global_device">,
+  I32EnumAttrCase<"OffloadGlobalHost", 7, "offload_global_host">
 ]> {
   let description = [{
     Enumerates language-specific address spaces used by CIR. These represent
diff --git a/clang/lib/CIR/Dialect/IR/CIROpenCLAttrs.cpp 
b/clang/lib/CIR/Dialect/IR/CIROpenCLAttrs.cpp
index ac8c01ecc1565..0560b3494f1f6 100644
--- a/clang/lib/CIR/Dialect/IR/CIROpenCLAttrs.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIROpenCLAttrs.cpp
@@ -27,15 +27,9 @@ LogicalResult OpenCLKernelArgMetadataAttr::verify(
     function_ref<InFlightDiagnostic()> emitError, ArrayAttr addrSpaces,
     ArrayAttr accessQuals, ArrayAttr types, ArrayAttr baseTypes,
     ArrayAttr typeQuals, ArrayAttr argNames) {
-  auto isInt32Array = [](ArrayAttr attr) {
+  auto isLangAddressSpaceArray = [](ArrayAttr attr) {
     return llvm::all_of(attr, [](Attribute elem) {
-      auto intAttr = mlir::dyn_cast<IntegerAttr>(elem);
-      return intAttr && intAttr.getType().isInteger(32);
-    });
-  };
-  auto isNonNegativeIntArray = [](ArrayAttr attr) {
-    return llvm::all_of(attr, [](Attribute elem) {
-      return mlir::cast<IntegerAttr>(elem).getValue().isNonNegative();
+      return mlir::isa<cir::LangAddressSpaceAttr>(elem);
     });
   };
   auto isStrArray = [](ArrayAttr attr) {
@@ -43,10 +37,8 @@ LogicalResult OpenCLKernelArgMetadataAttr::verify(
         attr, [](Attribute elem) { return mlir::isa<StringAttr>(elem); });
   };
 
-  if (!isInt32Array(addrSpaces))
-    return emitError() << "addr_space must be an i32 integer array";
-  if (!isNonNegativeIntArray(addrSpaces))
-    return emitError() << "addr_space values must be non-negative";
+  if (!isLangAddressSpaceArray(addrSpaces))
+    return emitError() << "addr_space must be a language address space array";
   if (!isStrArray(accessQuals))
     return emitError() << "access_qual must be a string array";
   if (!isStrArray(types))
diff --git a/clang/lib/CIR/Dialect/IR/CIRTypes.cpp 
b/clang/lib/CIR/Dialect/IR/CIRTypes.cpp
index 23c327e81831b..4a7f6e6a15579 100644
--- a/clang/lib/CIR/Dialect/IR/CIRTypes.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIRTypes.cpp
@@ -1069,7 +1069,9 @@ cir::LangAddressSpace 
cir::toCIRLangAddressSpace(clang::LangAS langAS) {
   case LangAS::opencl_generic:
     return LangAddressSpace::OffloadGeneric;
   case LangAS::opencl_global_device:
+    return LangAddressSpace::OffloadGlobalDevice;
   case LangAS::opencl_global_host:
+    return LangAddressSpace::OffloadGlobalHost;
   case LangAS::sycl_global:
   case LangAS::sycl_global_device:
   case LangAS::sycl_global_host:
diff --git a/clang/lib/CIR/Dialect/Transforms/TargetLowering/Targets/AMDGPU.cpp 
b/clang/lib/CIR/Dialect/Transforms/TargetLowering/Targets/AMDGPU.cpp
index aa396335dc1cb..f4cdc88d60cf4 100644
--- a/clang/lib/CIR/Dialect/Transforms/TargetLowering/Targets/AMDGPU.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/TargetLowering/Targets/AMDGPU.cpp
@@ -25,6 +25,8 @@ constexpr unsigned AMDGPUAddrSpaceMap[] = {
     llvm::AMDGPUAS::GLOBAL_ADDRESS,   // OffloadGlobal
     llvm::AMDGPUAS::CONSTANT_ADDRESS, // OffloadConstant
     llvm::AMDGPUAS::FLAT_ADDRESS,     // OffloadGeneric
+    llvm::AMDGPUAS::GLOBAL_ADDRESS,   // OffloadGlobalDevice
+    llvm::AMDGPUAS::GLOBAL_ADDRESS,   // OffloadGlobalHost
 };
 
 class AMDGPUTargetLoweringInfo : public TargetLoweringInfo {
diff --git a/clang/lib/CIR/Dialect/Transforms/TargetLowering/Targets/NVPTX.cpp 
b/clang/lib/CIR/Dialect/Transforms/TargetLowering/Targets/NVPTX.cpp
index f38d2b8bfa32d..806e3235b6a8e 100644
--- a/clang/lib/CIR/Dialect/Transforms/TargetLowering/Targets/NVPTX.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/TargetLowering/Targets/NVPTX.cpp
@@ -17,6 +17,7 @@ constexpr unsigned NVPTXAddrSpaceMap[] = {
     llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, llvm::NVPTXAS::ADDRESS_SPACE_GENERIC,
     llvm::NVPTXAS::ADDRESS_SPACE_SHARED,  llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL,
     llvm::NVPTXAS::ADDRESS_SPACE_CONST,   llvm::NVPTXAS::ADDRESS_SPACE_GENERIC,
+    llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL,  llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL,
 };
 
 class NVPTXTargetLoweringInfo : public TargetLoweringInfo {
diff --git a/clang/lib/CIR/Dialect/Transforms/TargetLowering/Targets/SPIRV.cpp 
b/clang/lib/CIR/Dialect/Transforms/TargetLowering/Targets/SPIRV.cpp
index b759acccd1ac6..5367b4c76e2a0 100644
--- a/clang/lib/CIR/Dialect/Transforms/TargetLowering/Targets/SPIRV.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/TargetLowering/Targets/SPIRV.cpp
@@ -21,6 +21,8 @@ constexpr unsigned SPIRVAddrSpaceMap[] = {
     1, // CrossWorkgroup
     2, // UniformConstant
     4, // Generic
+    5, // GlobalDevice
+    6, // GlobalHost
 };
 
 class SPIRVTargetLoweringInfo : public TargetLoweringInfo {
diff --git a/clang/test/CIR/IR/invalid-opencl-kernel-arg-metadata.cir 
b/clang/test/CIR/IR/invalid-opencl-kernel-arg-metadata.cir
index 18f239d2e0ee5..f3cd9bb5a2bdf 100644
--- a/clang/test/CIR/IR/invalid-opencl-kernel-arg-metadata.cir
+++ b/clang/test/CIR/IR/invalid-opencl-kernel-arg-metadata.cir
@@ -1,6 +1,6 @@
 // RUN: cir-opt %s -verify-diagnostics -split-input-file
 
-// expected-error @below {{addr_space must be an i32 integer array}}
+// expected-error @below {{addr_space must be a language address space array}}
 #attr = #cir.cl.kernel_arg_metadata<
   addr_space = ["none"],
   access_qual = ["none"],
@@ -11,31 +11,9 @@
 
 // -----
 
-// expected-error @below {{addr_space must be an i32 integer array}}
-#attr = #cir.cl.kernel_arg_metadata<
-  addr_space = [0 : i64],
-  access_qual = ["none"],
-  type = ["uint*"],
-  base_type = ["uint*"],
-  type_qual = [""]
->
-
-// -----
-
-// expected-error @below {{addr_space values must be non-negative}}
-#attr = #cir.cl.kernel_arg_metadata<
-  addr_space = [-1 : i32],
-  access_qual = ["none"],
-  type = ["uint*"],
-  base_type = ["uint*"],
-  type_qual = [""]
->
-
-// -----
-
 // expected-error @below {{access_qual must be a string array}}
 #attr = #cir.cl.kernel_arg_metadata<
-  addr_space = [0 : i32],
+  addr_space = [#cir<lang_address_space(default)>],
   access_qual = [42 : i32],
   type = ["uint*"],
   base_type = ["uint*"],
@@ -46,7 +24,7 @@
 
 // expected-error @below {{type must be a string array}}
 #attr = #cir.cl.kernel_arg_metadata<
-  addr_space = [0 : i32],
+  addr_space = [#cir<lang_address_space(default)>],
   access_qual = ["none"],
   type = [42 : i32],
   base_type = ["uint*"],
@@ -57,7 +35,7 @@
 
 // expected-error @below {{base_type must be a string array}}
 #attr = #cir.cl.kernel_arg_metadata<
-  addr_space = [0 : i32],
+  addr_space = [#cir<lang_address_space(default)>],
   access_qual = ["none"],
   type = ["uint*"],
   base_type = [42 : i32],
@@ -68,7 +46,7 @@
 
 // expected-error @below {{type_qual must be a string array}}
 #attr = #cir.cl.kernel_arg_metadata<
-  addr_space = [0 : i32],
+  addr_space = [#cir<lang_address_space(default)>],
   access_qual = ["none"],
   type = ["uint*"],
   base_type = ["uint*"],
@@ -79,7 +57,7 @@
 
 // expected-error @below {{name must be a string array}}
 #attr = #cir.cl.kernel_arg_metadata<
-  addr_space = [0 : i32],
+  addr_space = [#cir<lang_address_space(default)>],
   access_qual = ["none"],
   type = ["uint*"],
   base_type = ["uint*"],
@@ -91,7 +69,7 @@
 
 // expected-error @below {{all arrays must have the same number of elements}}
 #attr = #cir.cl.kernel_arg_metadata<
-  addr_space = [0 : i32],
+  addr_space = [#cir<lang_address_space(default)>],
   access_qual = ["none"],
   type = ["uint*", "myunsignedint*"],
   base_type = ["uint*", "uint*"],
diff --git a/clang/test/CIR/IR/opencl-kernel-arg-metadata.cir 
b/clang/test/CIR/IR/opencl-kernel-arg-metadata.cir
index e6982d5353186..811ac2019a925 100644
--- a/clang/test/CIR/IR/opencl-kernel-arg-metadata.cir
+++ b/clang/test/CIR/IR/opencl-kernel-arg-metadata.cir
@@ -1,11 +1,11 @@
 // RUN: cir-opt %s --verify-roundtrip | FileCheck %s
 
 module {
-  cir.func @without_names() attributes {cir.cl.kernel_arg_metadata = 
#cir.cl.kernel_arg_metadata<addr_space = [1 : i32, 0 : i32], access_qual = 
["none", "none"], type = ["uint*", "int"], base_type = ["uint*", "int"], 
type_qual = ["restrict", ""]>} {
+  cir.func @without_names() attributes {cir.cl.kernel_arg_metadata = 
#cir.cl.kernel_arg_metadata<addr_space = 
[#cir<lang_address_space(offload_global)>, #cir<lang_address_space(default)>], 
access_qual = ["none", "none"], type = ["uint*", "int"], base_type = ["uint*", 
"int"], type_qual = ["restrict", ""]>} {
     cir.return
   }
 
-  cir.func @with_names() attributes {cir.cl.kernel_arg_metadata = 
#cir.cl.kernel_arg_metadata<addr_space = [1 : i32, 0 : i32], access_qual = 
["none", "none"], type = ["uint*", "int"], base_type = ["uint*", "int"], 
type_qual = ["restrict", ""], name = ["data", "count"]>} {
+  cir.func @with_names() attributes {cir.cl.kernel_arg_metadata = 
#cir.cl.kernel_arg_metadata<addr_space = 
[#cir<lang_address_space(offload_global)>, #cir<lang_address_space(default)>], 
access_qual = ["none", "none"], type = ["uint*", "int"], base_type = ["uint*", 
"int"], type_qual = ["restrict", ""], name = ["data", "count"]>} {
     cir.return
   }
 
@@ -16,7 +16,7 @@ module {
 
 // CHECK-LABEL: cir.func @without_names()
 // CHECK-SAME: cir.cl.kernel_arg_metadata = #cir.cl.kernel_arg_metadata
-// CHECK-SAME: addr_space = [1 : i32, 0 : i32]
+// CHECK-SAME: addr_space = [#cir<lang_address_space(offload_global)>, 
#cir<lang_address_space(default)>]
 // CHECK-SAME: type = ["uint*", "int"]
 // CHECK-SAME: base_type = ["uint*", "int"]
 // CHECK-SAME: type_qual = ["restrict", ""]
@@ -24,7 +24,7 @@ module {
 
 // CHECK-LABEL: cir.func @with_names()
 // CHECK-SAME: cir.cl.kernel_arg_metadata = #cir.cl.kernel_arg_metadata
-// CHECK-SAME: addr_space = [1 : i32, 0 : i32]
+// CHECK-SAME: addr_space = [#cir<lang_address_space(offload_global)>, 
#cir<lang_address_space(default)>]
 // CHECK-SAME: type = ["uint*", "int"]
 // CHECK-SAME: base_type = ["uint*", "int"]
 // CHECK-SAME: type_qual = ["restrict", ""]

>From 0b5cb80df8ae3a63c268e21c6c72026cf6320fd8 Mon Sep 17 00:00:00 2001
From: mencotton <[email protected]>
Date: Tue, 26 May 2026 23:59:41 +0900
Subject: [PATCH 5/5] fix: Update CIR invalid address space diagnostic

---
 clang/test/CIR/IR/invalid-addrspace.cir | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/CIR/IR/invalid-addrspace.cir 
b/clang/test/CIR/IR/invalid-addrspace.cir
index 882199afd6490..8562aa7a090ab 100644
--- a/clang/test/CIR/IR/invalid-addrspace.cir
+++ b/clang/test/CIR/IR/invalid-addrspace.cir
@@ -46,7 +46,7 @@ cir.func @lang_address_space_empty(%p : !cir.ptr<!u64i, 
lang_address_space()>) {
 // -----
 
 !u64i = !cir.int<u, 64>
-// expected-error@+1 {{expected one of [default, offload_private, 
offload_local, offload_global, offload_constant, offload_generic] for language 
address space kind}}
+// expected-error@+1 {{expected one of [default, offload_private, 
offload_local, offload_global, offload_constant, offload_generic, 
offload_global_device, offload_global_host] for language address space kind}}
 cir.func @lang_address_space_invalid(%p : !cir.ptr<!u64i, 
lang_address_space(foobar)>) {
   cir.return
 }

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to