121 PatternRewriter &rewriter)
const override {
123 if (addOp.getNumOperands() <= 2)
127 auto operands = addOp.getOperands();
128 llvm::SmallSetVector<Value, 8> processedCompressorResults;
129 SmallVector<Value, 8> newCompressOperands;
132 bool shouldFold =
false;
134 for (Value operand : operands) {
137 if (processedCompressorResults.contains(operand))
142 if (!operand.hasOneUse()) {
143 shouldFold |= !newCompressOperands.empty();
144 newCompressOperands.push_back(operand);
149 if (
auto compressOp = operand.getDefiningOp<datapath::CompressOp>()) {
156 shouldFold |= !newCompressOperands.empty();
157 llvm::append_range(newCompressOperands, compressOp.getOperands());
159 processedCompressorResults.insert(compressOp.getResults().begin(),
160 compressOp.getResults().end());
164 if (
auto addOp = operand.getDefiningOp<
comb::AddOp>()) {
165 shouldFold |= !newCompressOperands.empty();
166 llvm::append_range(newCompressOperands, addOp.getOperands());
171 shouldFold |= !newCompressOperands.empty();
172 newCompressOperands.push_back(operand);
181 auto newCompressOp = datapath::CompressOp::create(rewriter, addOp.getLoc(),
182 newCompressOperands, 2);
185 rewriter.replaceOpWithNewOp<
comb::AddOp>(addOp, newCompressOp.getResults(),