|
69 | 69 | #include <optional>
|
70 | 70 | #include <set>
|
71 | 71 |
|
| 72 | +#include "LowerModule.h" |
| 73 | + |
72 | 74 | using namespace cir;
|
73 | 75 | using namespace llvm;
|
74 | 76 |
|
@@ -3479,24 +3481,43 @@ void populateCIRToLLVMConversionPatterns(mlir::RewritePatternSet &patterns,
|
3479 | 3481 | }
|
3480 | 3482 |
|
3481 | 3483 | namespace {
|
| 3484 | + |
| 3485 | +std::unique_ptr<mlir::cir::LowerModule> |
| 3486 | +prepareLowerModule(mlir::ModuleOp module) { |
| 3487 | + mlir::PatternRewriter rewriter{module->getContext()}; |
| 3488 | + // If the triple is not present, e.g. CIR modules parsed from text, we |
| 3489 | + // cannot init LowerModule properly. |
| 3490 | + assert(!::cir::MissingFeatures::makeTripleAlwaysPresent()); |
| 3491 | + if (!module->hasAttr("cir.triple")) |
| 3492 | + return {}; |
| 3493 | + return mlir::cir::createLowerModule(module, rewriter); |
| 3494 | +} |
| 3495 | + |
| 3496 | +// FIXME: change the type of lowerModule to `LowerModule &` to have better |
| 3497 | +// lambda capturing experience. Also blocked by makeTripleAlwaysPresent. |
3482 | 3498 | void prepareTypeConverter(mlir::LLVMTypeConverter &converter,
|
3483 |
| - mlir::DataLayout &dataLayout) { |
3484 |
| - converter.addConversion([&](mlir::cir::PointerType type) -> mlir::Type { |
| 3499 | + mlir::DataLayout &dataLayout, |
| 3500 | + mlir::cir::LowerModule *lowerModule) { |
| 3501 | + converter.addConversion([&, lowerModule]( |
| 3502 | + mlir::cir::PointerType type) -> mlir::Type { |
3485 | 3503 | // Drop pointee type since LLVM dialect only allows opaque pointers.
|
3486 | 3504 |
|
3487 | 3505 | auto addrSpace =
|
3488 | 3506 | mlir::cast_if_present<mlir::cir::AddressSpaceAttr>(type.getAddrSpace());
|
3489 |
| - // null addrspace attribute indicates the default addrspace |
| 3507 | + // Null addrspace attribute indicates the default addrspace. |
3490 | 3508 | if (!addrSpace)
|
3491 | 3509 | return mlir::LLVM::LLVMPointerType::get(type.getContext());
|
3492 | 3510 |
|
3493 |
| - // TODO(cir): Query the target-specific address space map to lower other ASs |
3494 |
| - // like `opencl_private`. |
3495 |
| - assert(!MissingFeatures::targetLoweringInfoAddressSpaceMap()); |
3496 |
| - assert(addrSpace.isTarget() && "NYI"); |
| 3511 | + assert(lowerModule && "CIR AS map is not available"); |
| 3512 | + // Pass through target addrspace and map CIR addrspace to LLVM addrspace by |
| 3513 | + // querying the target info. |
| 3514 | + unsigned targetAS = |
| 3515 | + addrSpace.isTarget() |
| 3516 | + ? addrSpace.getTargetValue() |
| 3517 | + : lowerModule->getTargetLoweringInfo() |
| 3518 | + .getTargetAddrSpaceFromCIRAddrSpace(addrSpace); |
3497 | 3519 |
|
3498 |
| - return mlir::LLVM::LLVMPointerType::get(type.getContext(), |
3499 |
| - addrSpace.getTargetValue()); |
| 3520 | + return mlir::LLVM::LLVMPointerType::get(type.getContext(), targetAS); |
3500 | 3521 | });
|
3501 | 3522 | converter.addConversion([&](mlir::cir::DataMemberType type) -> mlir::Type {
|
3502 | 3523 | return mlir::IntegerType::get(type.getContext(),
|
@@ -3721,7 +3742,9 @@ void ConvertCIRToLLVMPass::runOnOperation() {
|
3721 | 3742 | auto module = getOperation();
|
3722 | 3743 | mlir::DataLayout dataLayout(module);
|
3723 | 3744 | mlir::LLVMTypeConverter converter(&getContext());
|
3724 |
| - prepareTypeConverter(converter, dataLayout); |
| 3745 | + std::unique_ptr<mlir::cir::LowerModule> lowerModule = |
| 3746 | + prepareLowerModule(module); |
| 3747 | + prepareTypeConverter(converter, dataLayout, lowerModule.get()); |
3725 | 3748 |
|
3726 | 3749 | mlir::RewritePatternSet patterns(&getContext());
|
3727 | 3750 |
|
|
0 commit comments