================
@@ -4348,19 +4351,90 @@ mlir::LogicalResult
CIRToLLVMVAArgOpLowering::matchAndRewrite(
mlir::LogicalResult CIRToLLVMLabelOpLowering::matchAndRewrite(
cir::LabelOp op, OpAdaptor adaptor,
mlir::ConversionPatternRewriter &rewriter) const {
- return mlir::failure();
+ mlir::MLIRContext *ctx = rewriter.getContext();
+ mlir::Block *block = op->getBlock();
+ // A BlockTagOp cannot reside in the entry block. The address of the entry
+ // block cannot be taken
+ if (block->isEntryBlock()) {
+ mlir::Block *newBlock =
+ rewriter.splitBlock(op->getBlock(), mlir::Block::iterator(op));
+ rewriter.setInsertionPointToEnd(block);
+ mlir::LLVM::BrOp::create(rewriter, op.getLoc(), newBlock);
+ }
+ auto tagAttr =
+ mlir::LLVM::BlockTagAttr::get(ctx, blockInfoAddr.getTagIndex());
+ rewriter.setInsertionPoint(op);
+
+ auto blockTagOp =
+ mlir::LLVM::BlockTagOp::create(rewriter, op->getLoc(), tagAttr);
+ mlir::LLVM::LLVMFuncOp func = op->getParentOfType<mlir::LLVM::LLVMFuncOp>();
+ auto blockInfoAttr =
+ cir::BlockAddrInfoAttr::get(ctx, func.getSymName(), op.getLabel());
+ blockInfoAddr.mapBlockTag(blockInfoAttr, blockTagOp);
+ rewriter.eraseOp(op);
+
+ return mlir::success();
}
mlir::LogicalResult CIRToLLVMBlockAddressOpLowering::matchAndRewrite(
cir::BlockAddressOp op, OpAdaptor adaptor,
mlir::ConversionPatternRewriter &rewriter) const {
- return mlir::failure();
+ mlir::MLIRContext *ctx = rewriter.getContext();
+
+ mlir::LLVM::BlockTagOp matchLabel =
+ blockInfoAddr.lookupBlockTag(op.getBlockAddrInfoAttr());
+ mlir::LLVM::BlockTagAttr tagAttr;
+ if (!matchLabel)
+ // If the BlockTagOp has not been emitted yet, use a placeholder.
+ // This will later be replaced with the correct tag index during
+ // `resolveBlockAddressOp`.
+ tagAttr = {};
+ else
+ tagAttr = matchLabel.getTag();
+
+ auto blkAddr = mlir::LLVM::BlockAddressAttr::get(
+ rewriter.getContext(), op.getBlockAddrInfoAttr().getFunc(), tagAttr);
+ rewriter.setInsertionPoint(op);
+ auto newOp = mlir::LLVM::BlockAddressOp::create(
+ rewriter, op.getLoc(), mlir::LLVM::LLVMPointerType::get(ctx), blkAddr);
+ if (!matchLabel)
+ blockInfoAddr.addUnresolvedBlockAddress(newOp, op.getBlockAddrInfoAttr());
+ rewriter.replaceOp(op, newOp);
+ return mlir::success();
}
mlir::LogicalResult CIRToLLVMIndirectBrOpLowering::matchAndRewrite(
cir::IndirectBrOp op, OpAdaptor adaptor,
mlir::ConversionPatternRewriter &rewriter) const {
- return mlir::failure();
+
+ llvm::SmallVector<mlir::Block *, 8> successors;
+ llvm::SmallVector<mlir::ValueRange, 8> succOperands;
+ bool poison = op.getPoison();
+ for (mlir::Block *succ : op->getSuccessors()) {
----------------
Andres-Salamanca wrote:
Done
https://github.com/llvm/llvm-project/pull/178106
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits