[Mlir-commits] [mlir] [MLIR] Preserve operand segment sizes when removing dead inputs (PR #223154)
Ivan Butygin
llvmlistbot at llvm.org
Sat Sep 12 10:03:02 PDT 2026
================
@@ -919,11 +919,41 @@ struct RemoveDeadRegionBranchOpSuccessorInputs : public RewritePattern {
}
}
+ StringAttr attrName;
// Erase operands.
for (auto &pair : operandsToRemove) {
Operation *op = pair.first;
BitVector &operands = pair.second;
- rewriter.modifyOpInPlace(op, [&]() { op->eraseOperands(operands); });
+ rewriter.modifyOpInPlace(op, [&]() {
+ if (!op->hasTrait<OpTrait::AttrSizedOperandSegments>()) {
+ op->eraseOperands(operands);
+ return;
+ }
+ if (!attrName)
+ attrName = rewriter.getStringAttr(OpTrait::AttrSizedOperandSegments<
+ void>::getOperandSegmentSizeAttr());
+ auto sizes = op->getAttrOfType<DenseI32ArrayAttr>(attrName);
+ assert(sizes && "expected operand segment sizes attribute");
+ unsigned offset = op->getNumOperands();
+ // Erase from the last segment first to preserve the original indices.
+ for (unsigned segment :
+ llvm::reverse(llvm::seq<unsigned>(sizes.size()))) {
+ unsigned size = sizes.asArrayRef()[segment];
+ offset -= size;
+ SmallVector<Value> retained;
+ for (unsigned i : llvm::seq(size))
+ if (!operands.test(offset + i))
+ retained.push_back(op->getOperand(offset + i));
+ if (retained.size() == size)
+ continue;
+ // Use getAttr to keep changes to later segments.
+ MutableOperandRange range(
+ op, offset, size,
+ MutableOperandRange::OperandSegment(
+ segment, {attrName, op->getAttr(attrName)}));
+ range.assign(retained);
+ }
----------------
Hardcode84 wrote:
There are few scattered places where rewrites reconstruct/fixup `AttrSizedOperandSegments` directly but nothing exactly like this on the first glance. I wonder if we should just add a helper function to `OperationSupport.h`.
https://github.com/llvm/llvm-project/pull/223154
More information about the Mlir-commits
mailing list