|
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 |
|
@@ -3452,28 +3454,48 @@ void populateCIRToLLVMConversionPatterns(mlir::RewritePatternSet &patterns,
|
3452 | 3454 | CIRRintOpLowering, CIRRoundOpLowering, CIRSinOpLowering,
|
3453 | 3455 | CIRSqrtOpLowering, CIRTruncOpLowering, CIRCopysignOpLowering,
|
3454 | 3456 | CIRFModOpLowering, CIRFMaxOpLowering, CIRFMinOpLowering, CIRPowOpLowering,
|
3455 |
| - CIRClearCacheOpLowering, CIRUndefOpLowering>(converter, patterns.getContext()); |
| 3457 | + CIRClearCacheOpLowering, CIRUndefOpLowering>(converter, |
| 3458 | + patterns.getContext()); |
3456 | 3459 | }
|
3457 | 3460 |
|
3458 | 3461 | namespace {
|
| 3462 | + |
| 3463 | +std::unique_ptr<mlir::cir::LowerModule> |
| 3464 | +prepareLowerModule(mlir::ModuleOp module) { |
| 3465 | + mlir::PatternRewriter rewriter{module->getContext()}; |
| 3466 | + // If the triple is not present, e.g. CIR modules parsed from text, we |
| 3467 | + // cannot init LowerModule properly. |
| 3468 | + assert(!::cir::MissingFeatures::makeTripleAlwaysPresent()); |
| 3469 | + if (!module->hasAttr("cir.triple")) |
| 3470 | + return {}; |
| 3471 | + return mlir::cir::createLowerModule(module, rewriter); |
| 3472 | +} |
| 3473 | + |
| 3474 | +// FIXME: change the type of lowerModule to `LowerModule &` to have better |
| 3475 | +// lambda capturing experience. Also blocked by makeTripleAlwaysPresent. |
3459 | 3476 | void prepareTypeConverter(mlir::LLVMTypeConverter &converter,
|
3460 |
| - mlir::DataLayout &dataLayout) { |
3461 |
| - converter.addConversion([&](mlir::cir::PointerType type) -> mlir::Type { |
| 3477 | + mlir::DataLayout &dataLayout, |
| 3478 | + mlir::cir::LowerModule *lowerModule) { |
| 3479 | + converter.addConversion([&, lowerModule]( |
| 3480 | + mlir::cir::PointerType type) -> mlir::Type { |
3462 | 3481 | // Drop pointee type since LLVM dialect only allows opaque pointers.
|
3463 | 3482 |
|
3464 | 3483 | auto addrSpace =
|
3465 | 3484 | mlir::cast_if_present<mlir::cir::AddressSpaceAttr>(type.getAddrSpace());
|
3466 |
| - // null addrspace attribute indicates the default addrspace |
| 3485 | + // Null addrspace attribute indicates the default addrspace. |
3467 | 3486 | if (!addrSpace)
|
3468 | 3487 | return mlir::LLVM::LLVMPointerType::get(type.getContext());
|
3469 | 3488 |
|
3470 |
| - // TODO(cir): Query the target-specific address space map to lower other ASs |
3471 |
| - // like `opencl_private`. |
3472 |
| - assert(!MissingFeatures::targetLoweringInfoAddressSpaceMap()); |
3473 |
| - assert(addrSpace.isTarget() && "NYI"); |
| 3489 | + assert(lowerModule && "CIR AS map is not available"); |
| 3490 | + // Pass through target addrspace and map CIR addrspace to LLVM addrspace by |
| 3491 | + // querying the target info. |
| 3492 | + unsigned targetAS = |
| 3493 | + addrSpace.isTarget() |
| 3494 | + ? addrSpace.getTargetValue() |
| 3495 | + : lowerModule->getTargetLoweringInfo() |
| 3496 | + .getTargetAddrSpaceFromCIRAddrSpace(addrSpace); |
3474 | 3497 |
|
3475 |
| - return mlir::LLVM::LLVMPointerType::get(type.getContext(), |
3476 |
| - addrSpace.getTargetValue()); |
| 3498 | + return mlir::LLVM::LLVMPointerType::get(type.getContext(), targetAS); |
3477 | 3499 | });
|
3478 | 3500 | converter.addConversion([&](mlir::cir::DataMemberType type) -> mlir::Type {
|
3479 | 3501 | return mlir::IntegerType::get(type.getContext(),
|
@@ -3698,7 +3720,9 @@ void ConvertCIRToLLVMPass::runOnOperation() {
|
3698 | 3720 | auto module = getOperation();
|
3699 | 3721 | mlir::DataLayout dataLayout(module);
|
3700 | 3722 | mlir::LLVMTypeConverter converter(&getContext());
|
3701 |
| - prepareTypeConverter(converter, dataLayout); |
| 3723 | + std::unique_ptr<mlir::cir::LowerModule> lowerModule = |
| 3724 | + prepareLowerModule(module); |
| 3725 | + prepareTypeConverter(converter, dataLayout, lowerModule.get()); |
3702 | 3726 |
|
3703 | 3727 | mlir::RewritePatternSet patterns(&getContext());
|
3704 | 3728 |
|
|
0 commit comments