[Mlir-commits] [mlir] [MLIR] Preserve operand segment sizes when removing dead inputs (PR #223154)
Ivan Butygin
llvmlistbot at llvm.org
Sat Sep 19 02:30:10 PDT 2026
================
@@ -244,6 +244,35 @@ void RewriterBase::eraseBlock(Block *block) {
block->erase();
}
+void RewriterBase::eraseOperands(Operation *op, const BitVector &eraseIndices) {
+ assert(eraseIndices.size() == op->getNumOperands() &&
+ "expected one bit per operand");
+ if (eraseIndices.none())
+ return;
+
+ modifyOpInPlace(op, [&]() {
+ op->eraseOperands(eraseIndices);
+ if (!op->hasTrait<OpTrait::AttrSizedOperandSegments>())
+ return;
+
+ auto attrName = StringAttr::get(
+ op->getContext(),
+ OpTrait::AttrSizedOperandSegments<void>::getOperandSegmentSizeAttr());
+ auto sizes = op->getAttrOfType<DenseI32ArrayAttr>(attrName);
+ assert(sizes && "expected operand segment sizes attribute");
+ SmallVector<int32_t> newSizes(sizes.asArrayRef());
+ unsigned offset = 0;
+ for (int32_t &size : newSizes) {
+ // The attribute and bit vector still use the original operand indices.
+ unsigned end = offset + size;
+ for (; offset < end; ++offset)
+ size -= eraseIndices.test(offset);
+ }
+ op->setInherentAttr(attrName,
+ DenseI32ArrayAttr::get(op->getContext(), newSizes));
----------------
Hardcode84 wrote:
I can take a look into it later.
https://github.com/llvm/llvm-project/pull/223154
More information about the Mlir-commits
mailing list