================
@@ -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