126 PatternRewriter &rewriter)
const override {
128 if (addOp.getNumOperands() <= 2)
132 auto operands = addOp.getOperands();
133 llvm::SmallSetVector<Value, 8> processedCompressorResults;
134 SmallVector<Value, 8> newCompressOperands;
138 bool shouldFold =
false, hasDatapathOperand =
false;
140 for (Value operand : operands) {
143 if (processedCompressorResults.contains(operand))
146 if (
auto *op = operand.getDefiningOp())
147 if (isa_and_nonnull<datapath::DatapathDialect>(op->getDialect()))
148 hasDatapathOperand =
true;
152 if (!operand.hasOneUse()) {
153 shouldFold |= !newCompressOperands.empty();
154 newCompressOperands.push_back(operand);
159 if (
auto compressOp = operand.getDefiningOp<datapath::CompressOp>()) {
166 shouldFold |= !newCompressOperands.empty();
167 llvm::append_range(newCompressOperands, compressOp.getOperands());
169 processedCompressorResults.insert(compressOp.getResults().begin(),
170 compressOp.getResults().end());
174 if (
auto addOp = operand.getDefiningOp<
comb::AddOp>()) {
175 shouldFold |= !newCompressOperands.empty();
176 llvm::append_range(newCompressOperands, addOp.getOperands());
181 shouldFold |= !newCompressOperands.empty();
182 newCompressOperands.push_back(operand);
187 if (!shouldFold || !hasDatapathOperand)
191 auto newCompressOp = datapath::CompressOp::create(rewriter, addOp.getLoc(),
192 newCompressOperands, 2);
195 rewriter.replaceOpWithNewOp<
comb::AddOp>(addOp, newCompressOp.getResults(),