[FIRRTL][LowerIntrinsics] Add stat and preserve if no changes. (#6911)

This commit is contained in:
Will Dietz 2024-05-08 17:05:00 -05:00 committed by GitHub
parent c18a7c4646
commit 54ace0c344
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 24 additions and 7 deletions

View File

@ -236,8 +236,8 @@ public:
(addConverter<T>(args), ...); (addConverter<T>(args), ...);
} }
/// Lowers all intrinsics in a module. /// Lowers all intrinsics in a module. Returns number converted or failure.
LogicalResult lower(FModuleOp mod, bool allowUnknownIntrinsics = false); FailureOr<size_t> lower(FModuleOp mod, bool allowUnknownIntrinsics = false);
private: private:
template <typename T> template <typename T>

View File

@ -711,6 +711,9 @@ def LowerIntrinsics : Pass<"firrtl-lower-intrinsics", "firrtl::FModuleOp"> {
This pass lowers generic intrinsic ops to their implementation or op. This pass lowers generic intrinsic ops to their implementation or op.
}]; }];
let constructor = "circt::firrtl::createLowerIntrinsicsPass()"; let constructor = "circt::firrtl::createLowerIntrinsicsPass()";
let statistics = [
Statistic<"numConverted", "num-converted", "Number of intrinsic operations lowered">,
];
} }
def LowerOpenAggs : Pass<"firrtl-lower-open-aggs", "firrtl::CircuitOp"> { def LowerOpenAggs : Pass<"firrtl-lower-open-aggs", "firrtl::CircuitOp"> {

View File

@ -96,8 +96,10 @@ public:
IntrinsicOpConversion(MLIRContext *context, IntrinsicOpConversion(MLIRContext *context,
const ConversionMapTy &conversions, const ConversionMapTy &conversions,
size_t &numConversions,
bool allowUnknownIntrinsics = false) bool allowUnknownIntrinsics = false)
: OpConversionPattern(context), conversions(conversions), : OpConversionPattern(context), conversions(conversions),
numConversions(numConversions),
allowUnknownIntrinsics(allowUnknownIntrinsics) {} allowUnknownIntrinsics(allowUnknownIntrinsics) {}
LogicalResult LogicalResult
@ -115,11 +117,13 @@ public:
if (conv.check(GenericIntrinsic(op))) if (conv.check(GenericIntrinsic(op)))
return failure(); return failure();
conv.convert(GenericIntrinsic(op), adaptor, rewriter); conv.convert(GenericIntrinsic(op), adaptor, rewriter);
++numConversions;
return success(); return success();
} }
private: private:
const ConversionMapTy &conversions; const ConversionMapTy &conversions;
size_t &numConversions;
const bool allowUnknownIntrinsics; const bool allowUnknownIntrinsics;
}; };
} // namespace } // namespace
@ -128,8 +132,8 @@ private:
// IntrinsicLowerings // IntrinsicLowerings
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
LogicalResult IntrinsicLowerings::lower(FModuleOp mod, FailureOr<size_t> IntrinsicLowerings::lower(FModuleOp mod,
bool allowUnknownIntrinsics) { bool allowUnknownIntrinsics) {
ConversionTarget target(*context); ConversionTarget target(*context);
@ -143,10 +147,14 @@ LogicalResult IntrinsicLowerings::lower(FModuleOp mod,
target.addIllegalOp<GenericIntrinsicOp>(); target.addIllegalOp<GenericIntrinsicOp>();
RewritePatternSet patterns(context); RewritePatternSet patterns(context);
patterns.add<IntrinsicOpConversion>(context, conversions, size_t count = 0;
patterns.add<IntrinsicOpConversion>(context, conversions, count,
allowUnknownIntrinsics); allowUnknownIntrinsics);
return mlir::applyPartialConversion(mod, target, std::move(patterns)); if (failed(mlir::applyPartialConversion(mod, target, std::move(patterns))))
return failure();
return count;
} }
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//

View File

@ -43,8 +43,14 @@ LogicalResult LowerIntrinsicsPass::initialize(MLIRContext *context) {
// This is the main entrypoint for the lowering pass. // This is the main entrypoint for the lowering pass.
void LowerIntrinsicsPass::runOnOperation() { void LowerIntrinsicsPass::runOnOperation() {
if (failed(lowering->lower(getOperation()))) auto result = lowering->lower(getOperation());
if (failed(result))
return signalPassFailure(); return signalPassFailure();
numConverted += *result;
if (*result == 0)
markAllAnalysesPreserved();
} }
/// This is the pass constructor. /// This is the pass constructor.