@@ -1488,6 +1488,8 @@ struct ConvertCIRToLLVMPass
1488
1488
llvm::StringMap<mlir::LLVM::GlobalOp> &argStringGlobalsMap,
1489
1489
llvm::MapVector<mlir::ArrayAttr, mlir::LLVM::GlobalOp> &argsVarMap);
1490
1490
1491
+ void resolveBlockAddressOp (LLVMBlockAddressInfo &blockInfoAddr);
1492
+
1491
1493
void processCIRAttrs (mlir::ModuleOp moduleOp);
1492
1494
1493
1495
StringRef getDescription () const override {
@@ -4496,16 +4498,74 @@ mlir::LogicalResult CIRToLLVMLinkerOptionsOpLowering::matchAndRewrite(
4496
4498
return mlir::success ();
4497
4499
}
4498
4500
4501
+ mlir::LogicalResult CIRToLLVMLabelOpLowering::matchAndRewrite (
4502
+ cir::LabelOp op, OpAdaptor adaptor,
4503
+ mlir::ConversionPatternRewriter &rewriter) const {
4504
+ mlir::MLIRContext *ctx = rewriter.getContext ();
4505
+ mlir::Block *block = op->getBlock ();
4506
+ // A BlockTagOp cannot reside in the entry block. The address of the entry
4507
+ // block cannot be taken
4508
+ if (block->isEntryBlock ()) {
4509
+ mlir::Block *newBlock =
4510
+ rewriter.splitBlock (op->getBlock (), mlir::Block::iterator (op));
4511
+ rewriter.setInsertionPointToEnd (block);
4512
+ mlir::LLVM::BrOp::create (rewriter, op.getLoc (), newBlock);
4513
+ }
4514
+ auto tagAttr =
4515
+ mlir::LLVM::BlockTagAttr::get (ctx, blockInfoAddr.getTagIndex ());
4516
+ rewriter.setInsertionPoint (op);
4517
+
4518
+ auto blockTagOp =
4519
+ mlir::LLVM::BlockTagOp::create (rewriter, op->getLoc (), tagAttr);
4520
+ auto func = op->getParentOfType <mlir::LLVM::LLVMFuncOp>();
4521
+ blockInfoAddr.mapBlockTag (func.getSymName (), op.getLabel (), blockTagOp);
4522
+ rewriter.eraseOp (op);
4523
+
4524
+ return mlir::success ();
4525
+ }
4526
+
4527
+ mlir::LogicalResult CIRToLLVMBlockAddressOpLowering::matchAndRewrite (
4528
+ cir::BlockAddressOp op, OpAdaptor adaptor,
4529
+ mlir::ConversionPatternRewriter &rewriter) const {
4530
+ mlir::MLIRContext *ctx = rewriter.getContext ();
4531
+
4532
+ mlir::LLVM::BlockTagOp matchLabel =
4533
+ blockInfoAddr.lookupBlockTag (op.getFunc (), op.getLabel ());
4534
+ mlir::LLVM::BlockTagAttr tagAttr;
4535
+ if (!matchLabel)
4536
+ // If the BlockTagOp has not been emitted yet, use a placeholder.
4537
+ // This will later be replaced with the correct tag index during
4538
+ // `resolveBlockAddressOp`.
4539
+ tagAttr = {};
4540
+ else
4541
+ tagAttr = matchLabel.getTag ();
4542
+
4543
+ auto blkAddr = mlir::LLVM::BlockAddressAttr::get (rewriter.getContext (),
4544
+ op.getFuncAttr (), tagAttr);
4545
+ rewriter.setInsertionPoint (op);
4546
+ auto newOp = mlir::LLVM::BlockAddressOp::create (
4547
+ rewriter, op.getLoc (), mlir::LLVM::LLVMPointerType::get (ctx), blkAddr);
4548
+ if (!matchLabel)
4549
+ blockInfoAddr.addUnresolvedBlockAddress (newOp, op.getFunc (), op.getLabel ());
4550
+ rewriter.replaceOp (op, newOp);
4551
+ return mlir::success ();
4552
+ }
4553
+
4499
4554
void populateCIRToLLVMConversionPatterns (
4500
4555
mlir::RewritePatternSet &patterns, mlir::TypeConverter &converter,
4501
4556
mlir::DataLayout &dataLayout, cir::LowerModule *lowerModule,
4502
4557
llvm::StringMap<mlir::LLVM::GlobalOp> &stringGlobalsMap,
4503
4558
llvm::StringMap<mlir::LLVM::GlobalOp> &argStringGlobalsMap,
4504
- llvm::MapVector<mlir::ArrayAttr, mlir::LLVM::GlobalOp> &argsVarMap) {
4559
+ llvm::MapVector<mlir::ArrayAttr, mlir::LLVM::GlobalOp> &argsVarMap,
4560
+ LLVMBlockAddressInfo &blockAddrInfo) {
4505
4561
patterns.add <CIRToLLVMReturnOpLowering>(patterns.getContext ());
4506
4562
patterns.add <CIRToLLVMAllocaOpLowering>(converter, dataLayout,
4507
4563
stringGlobalsMap, argStringGlobalsMap,
4508
4564
argsVarMap, patterns.getContext ());
4565
+ patterns.add <CIRToLLVMBlockAddressOpLowering>(
4566
+ converter, patterns.getContext (), blockAddrInfo);
4567
+ patterns.add <CIRToLLVMLabelOpLowering>(converter, patterns.getContext (),
4568
+ blockAddrInfo);
4509
4569
patterns.add <
4510
4570
// clang-format off
4511
4571
CIRToLLVMCastOpLowering,
@@ -4990,6 +5050,25 @@ void ConvertCIRToLLVMPass::buildGlobalAnnotationsVar(
4990
5050
}
4991
5051
}
4992
5052
5053
+ void ConvertCIRToLLVMPass::resolveBlockAddressOp (
5054
+ LLVMBlockAddressInfo &blockInfoAddr) {
5055
+
5056
+ mlir::ModuleOp module = getOperation ();
5057
+ mlir::OpBuilder opBuilder (module .getContext ());
5058
+ for (auto &[blockAddOp, blockInfo] :
5059
+ blockInfoAddr.getUnresolvedBlockAddress ()) {
5060
+ mlir::LLVM::BlockTagOp resolvedLabel =
5061
+ blockInfoAddr.lookupBlockTag (blockInfo.first , blockInfo.second );
5062
+ assert (resolvedLabel && " expected BlockTagOp to already be emitted" );
5063
+ auto fnSym =
5064
+ mlir::FlatSymbolRefAttr::get (module .getContext (), blockInfo.first );
5065
+ auto blkAddTag = mlir::LLVM::BlockAddressAttr::get (
5066
+ opBuilder.getContext (), fnSym, resolvedLabel.getTagAttr ());
5067
+ blockAddOp.setBlockAddrAttr (blkAddTag);
5068
+ }
5069
+ blockInfoAddr.clearUnresolvedMap ();
5070
+ }
5071
+
4993
5072
void ConvertCIRToLLVMPass::processCIRAttrs (mlir::ModuleOp module ) {
4994
5073
// Lower the module attributes to LLVM equivalents.
4995
5074
if (auto tripleAttr = module ->getAttr (cir::CIRDialect::getTripleAttrName ()))
@@ -5021,10 +5100,15 @@ void ConvertCIRToLLVMPass::runOnOperation() {
5021
5100
llvm::StringMap<mlir::LLVM::GlobalOp> argStringGlobalsMap;
5022
5101
// Track globals created for annotation args.
5023
5102
llvm::MapVector<mlir::ArrayAttr, mlir::LLVM::GlobalOp> argsVarMap;
5103
+ // / Tracks the state required to lower CIR `LabelOp` and `BlockAddressOp`.
5104
+ // / Maps labels to their corresponding `BlockTagOp` and keeps bookkeeping
5105
+ // / of unresolved `BlockAddressOp`s until they are matched with the
5106
+ // / corresponding `BlockTagOp` in `resolveBlockAddressOp`.
5107
+ LLVMBlockAddressInfo blockInfoAddr;
5108
+ populateCIRToLLVMConversionPatterns (
5109
+ patterns, converter, dataLayout, lowerModule.get (), stringGlobalsMap,
5110
+ argStringGlobalsMap, argsVarMap, blockInfoAddr);
5024
5111
5025
- populateCIRToLLVMConversionPatterns (patterns, converter, dataLayout,
5026
- lowerModule.get (), stringGlobalsMap,
5027
- argStringGlobalsMap, argsVarMap);
5028
5112
mlir::populateFuncToLLVMConversionPatterns (converter, patterns);
5029
5113
5030
5114
mlir::ConversionTarget target (getContext ());
@@ -5078,7 +5162,7 @@ void ConvertCIRToLLVMPass::runOnOperation() {
5078
5162
dtorAttr.getPriority ());
5079
5163
});
5080
5164
buildGlobalAnnotationsVar (stringGlobalsMap, argStringGlobalsMap, argsVarMap);
5081
-
5165
+ resolveBlockAddressOp (blockInfoAddr);
5082
5166
processCIRAttrs (module );
5083
5167
}
5084
5168
0 commit comments