================
@@ -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
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to