Skip to content

Instantly share code, notes, and snippets.

@seven-mile
Last active July 10, 2024 13:35
Show Gist options
  • Save seven-mile/c57ddfb96e180af1609d429e1e66f67b to your computer and use it in GitHub Desktop.
Save seven-mile/c57ddfb96e180af1609d429e1e66f67b to your computer and use it in GitHub Desktop.
AddrSpaceLowering in TypeConverter
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index d9b4724e4c71..c3664fca1a4f 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -68,6 +68,9 @@
#include <optional>
#include <set>
+// FIXME: Use a public header in include/ when there's one available
+#include "../../Dialect/Transforms/TargetLowering/LowerModule.h"
+
using namespace cir;
using namespace llvm;
@@ -3462,24 +3465,27 @@ void populateCIRToLLVMConversionPatterns(mlir::RewritePatternSet &patterns,
}
namespace {
-void prepareTypeConverter(mlir::LLVMTypeConverter &converter,
- mlir::DataLayout &dataLayout) {
- converter.addConversion([&](mlir::cir::PointerType type) -> mlir::Type {
+void prepareTypeConverter(
+ mlir::LLVMTypeConverter &converter, mlir::DataLayout &dataLayout,
+ llvm::function_ref<mlir::cir::LowerModule &()> getOrCreateLowerModule) {
+ converter.addConversion([&, getOrCreateLowerModule](
+ mlir::cir::PointerType type) -> mlir::Type {
// Drop pointee type since LLVM dialect only allows opaque pointers.
auto addrSpace =
mlir::cast_if_present<mlir::cir::AddressSpaceAttr>(type.getAddrSpace());
// null addrspace attribute indicates the default addrspace
if (!addrSpace)
return mlir::LLVM::LLVMPointerType::get(type.getContext());
- // TODO(cir): Query the target-specific address space map to lower other ASs
- // like `opencl_private`.
- assert(!MissingFeatures::targetLoweringInfoAddressSpaceMap());
- assert(addrSpace.isTarget() && "NYI");
+ // Pass through target addrspace and map CIR addrspace to LLVM addrspace.
+ unsigned targetAS = addrSpace.isTarget()
+ ? addrSpace.getTargetValue()
+ : getOrCreateLowerModule()
+ .getTargetLoweringInfo()
+ .getCIRAddrSpaceMap()[addrSpace.getValue()];
- return mlir::LLVM::LLVMPointerType::get(type.getContext(),
- addrSpace.getTargetValue());
+ return mlir::LLVM::LLVMPointerType::get(type.getContext(), targetAS);
});
converter.addConversion([&](mlir::cir::DataMemberType type) -> mlir::Type {
return mlir::IntegerType::get(type.getContext(),
@@ -3704,7 +3710,24 @@ void ConvertCIRToLLVMPass::runOnOperation() {
auto module = getOperation();
mlir::DataLayout dataLayout(module);
mlir::LLVMTypeConverter converter(&getContext());
- prepareTypeConverter(converter, dataLayout);
+
+ // If the triple is not present, e.g. CIR modules parsed from text, we
+ // cannot init LowerModule properly. Here we lazily init it as demand
+ // to not pay anything when we do not need it.
+ assert(!::cir::MissingFeatures::makeTripleAlwaysPresent());
+ std::mutex lowerModuleMtx;
+ std::unique_ptr<mlir::cir::LowerModule> lowerModule;
+ mlir::PatternRewriter rewriter{&getContext()};
+ auto getOrCreateLowerModule = [&]() -> mlir::cir::LowerModule & {
+ std::unique_lock lock(lowerModuleMtx, std::defer_lock);
+ if (getContext().isMultithreadingEnabled()) {
+ lock.lock();
+ }
+ if (!lowerModule)
+ lowerModule = mlir::cir::createLowerModule(module, rewriter);
+ return *lowerModule;
+ };
+ prepareTypeConverter(converter, dataLayout, getOrCreateLowerModule);
mlir::RewritePatternSet patterns(&getContext());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment