================
@@ -723,6 +695,58 @@ mlir::Value
CIRAttrToValue::visitCirAttr(cir::BlockAddrInfoAttr blockAddrInfo) {
return blockAddressOp;
}
+/// BlockAddrDiffAttr visitor.
+mlir::Value CIRAttrToValue::visitCirAttr(cir::BlockAddrDiffAttr blockAddrDiff)
{
+ assert(blockInfoAddr &&
+ "block address lowering requires LLVMBlockAddressInfo");
+ // A block-address difference initializer is lowered to the difference of the
+ // two block addresses: trunc(ptrtoint(lhs) - ptrtoint(rhs)). Just like a
+ // single block address, each referenced block tag may not have been emitted
+ // yet, in which case it is recorded as unresolved and patched up later in
+ // resolveBlockAddressOp.
+ mlir::Location loc = parentOp->getLoc();
+ mlir::DataLayout layout(parentOp->getParentOfType<mlir::ModuleOp>());
+ mlir::MLIRContext *ctx = rewriter.getContext();
+ auto ptrTy = mlir::LLVM::LLVMPointerType::get(ctx);
+
+ auto emitBlockAddr = [&](mlir::StringAttr label) -> mlir::Value {
+ auto info = cir::BlockAddrInfoAttr::get(
+ ctx, blockAddrDiff.getFunc().getValue(), label.getValue());
+ mlir::LLVM::BlockTagOp matchLabel = blockInfoAddr->lookupBlockTag(info);
+ mlir::LLVM::BlockTagAttr tagAttr =
+ matchLabel ? matchLabel.getTag() : mlir::LLVM::BlockTagAttr{};
+ auto blkAddr = mlir::LLVM::BlockAddressAttr::get(
+ ctx, blockAddrDiff.getFunc(), tagAttr);
+ auto addrOp =
+ mlir::LLVM::BlockAddressOp::create(rewriter, loc, ptrTy, blkAddr);
+ if (!matchLabel)
+ blockInfoAddr->addUnresolvedBlockAddress(addrOp, info);
+ return addrOp;
+ };
+
+ mlir::Value lhsAddr = emitBlockAddr(blockAddrDiff.getLhsLabel());
+ mlir::Value rhsAddr = emitBlockAddr(blockAddrDiff.getRhsLabel());
+
+ // Compute the difference in a pointer-sized integer, then truncate to the
+ // initializer's type. LLVM is sensitive about the exact format of the
+ // address-of-label difference, so the truncation must happen after the
+ // subtraction.
+ mlir::Type intptrTy =
+ rewriter.getIntegerType(layout.getTypeSizeInBits(ptrTy));
+ mlir::Value lhsInt =
+ mlir::LLVM::PtrToIntOp::create(rewriter, loc, intptrTy, lhsAddr);
+ mlir::Value rhsInt =
+ mlir::LLVM::PtrToIntOp::create(rewriter, loc, intptrTy, rhsAddr);
+ mlir::Value diffVal =
+ mlir::LLVM::SubOp::create(rewriter, loc, lhsInt, rhsInt);
+
+ mlir::Type resultTy = converter->convertType(blockAddrDiff.getType());
+ mlir::Value result = diffVal;
+ if (resultTy != intptrTy)
----------------
erichkeane wrote:
Why not just do the PtrTointOp in the type of `resultTy`?
https://github.com/llvm/llvm-project/pull/205437
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits