[llvm-branch-commits] [clang] [CIR] Reject language address spaces in DirectToLLVM pointer conversion (PR #224239)

Bruno Cardoso Lopes via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Oct 15 19:49:49 PDT 2026


================
@@ -4190,12 +4203,51 @@ mlir::LogicalResult CIRToLLVMSelectOpLowering::matchAndRewrite(
   return mlir::success();
 }
 
+static bool
+containsLangAddressSpace(mlir::Type type,
+                         llvm::SmallDenseSet<mlir::Type, 4> &visited) {
+  if (!visited.insert(type).second)
+    return false;
+
+  if (auto ptrTy = mlir::dyn_cast<cir::PointerType>(type))
+    return mlir::isa_and_present<cir::LangAddressSpaceAttr>(
+               ptrTy.getAddrSpace()) ||
+           containsLangAddressSpace(ptrTy.getPointee(), visited);
+  if (auto arrayTy = mlir::dyn_cast<cir::ArrayType>(type))
+    return containsLangAddressSpace(arrayTy.getElementType(), visited);
+  if (auto vectorTy = mlir::dyn_cast<cir::VectorType>(type))
+    return containsLangAddressSpace(vectorTy.getElementType(), visited);
+  if (auto funcTy = mlir::dyn_cast<cir::FuncType>(type))
+    return llvm::any_of(funcTy.getInputs(),
+                        [&](mlir::Type input) {
+                          return containsLangAddressSpace(input, visited);
+                        }) ||
+           containsLangAddressSpace(funcTy.getReturnType(), visited);
+  if (auto dataMemberTy = mlir::dyn_cast<cir::DataMemberType>(type))
+    return containsLangAddressSpace(dataMemberTy.getMemberTy(), visited);
+  if (auto methodTy = mlir::dyn_cast<cir::MethodType>(type))
+    return containsLangAddressSpace(methodTy.getMemberFuncTy(), visited);
+  if (auto recordTy = mlir::dyn_cast<cir::RecordType>(type))
+    return llvm::any_of(recordTy.getMembers(), [&](mlir::Type member) {
+      return containsLangAddressSpace(member, visited);
+    });
+  return false;
+}
+
+static bool containsLangAddressSpace(mlir::Type type) {
+  llvm::SmallDenseSet<mlir::Type, 4> visited;
+  return containsLangAddressSpace(type, visited);
+}
+
 static void prepareTypeConverter(mlir::LLVMTypeConverter &converter,
                                  mlir::DataLayout &dataLayout) {
   converter.addConversion([&](cir::PointerType type) -> mlir::Type {
     mlir::ptr::MemorySpaceAttrInterface addrSpaceAttr = type.getAddrSpace();
     unsigned numericAS = 0;
 
+    if (containsLangAddressSpace(type))
----------------
bcardosolopes wrote:

LLVM pointers are opaque, so only this pointer's own address space matters for the conversion. Walking the whole pointee graph (records, function types, arrays) for every pointer type rejects `!cir.ptr<!cir.ptr<T, lang_address_space(...)>>` even though the outer pointer lowers fine, and it costs a type-graph walk per distinct pointer type. A leftover language address space on an inner pointer still fails as soon as that inner type is converted. Can this just check `type.getAddrSpace()`?

https://github.com/llvm/llvm-project/pull/224239


More information about the llvm-branch-commits mailing list