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