mlir clone
clone中设置新op的位置
auto copyKernelOp = cast<KernelOp>(transposeParentKernelOp->clone());// insert cloned op before kernelOp
kernelOp->getBlock()->getOperations().insert(Block::iterator(kernelOp), copykernelOp);
// insert cloned op after kernelOp
kernelOp->getBlock()->getOperations().insert(++Block::iterator(kernelOp), copykernelOp);// kernelOp->getBlock()的意思是获取kernelOp所属于的block
// kernelOp->getBlocks()的意思是获取kernelOp中所有的的block
clone中的IRMapping
IR 中 Value的映射替换.在clone的模块为:Operation/Region/Block时,如果被克隆的模块所使用的参数来源于外部,需要把原复制模块里的操作数value映射为新的从外面传入的value
IRMapping mapper;
mapper.map(oldArg, newArg); // 把 oldArg 对应到 newArgOperation *newOp = builder.clone(*oldOp, mapper);
IRMapping mapper;
// 如果 Region 有入口参数,要先建立映射 oldArg->newArg
for (auto [oldBbArg, newBbArg] : llvm::zip(oldBlock->getArguments(), newBlock->getArguments())) {mapper.map(oldBbArg, newBbArg);
}// 遍历 clone Block 内的 Ops
for (auto &op : oldBlock->getOperations()) {builder.clone(op, mapper);
}