19#include <mlir/Dialect/SCF/Transforms/Patterns.h>
20#include <mlir/Transforms/DialectConversion.h>
24#define GEN_PASS_DEF_EMPTYPARAMLISTREMOVALPASS
30#define DEBUG_TYPE "llzk-drop-empty-params"
41 if (paramList.empty()) {
49class EmptyParamListStructTypeConverter :
public TypeConverter {
51 EmptyParamListStructTypeConverter() : TypeConverter() {
53 addConversion([](Type inputTy) {
return inputTy; });
68class CallOpTypeReplacePattern :
public OpConversionPattern<StructDefOp> {
70 using OpConversionPattern<StructDefOp>::OpConversionPattern;
72 LogicalResult match(StructDefOp op)
const override {
73 return success(hasEmptyParamList(op.
getType()));
77 rewrite(StructDefOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter)
const override {
84class EmptyParamRemovalPass
87 void runOnOperation()
override {
88 ModuleOp modOp = getOperation();
89 MLIRContext *ctx = modOp.getContext();
90 EmptyParamListStructTypeConverter tyConv;
93 target.addDynamicallyLegalOp<StructDefOp>([](StructDefOp op) {
94 return !hasEmptyParamList(op.
getType());
97 patterns.add<CallOpTypeReplacePattern>(tyConv, ctx);
98 if (failed(applyFullConversion(modOp, target, std::move(patterns)))) {
107 return std::make_unique<EmptyParamRemovalPass>();
Common private implementation for poly dialect passes.
::mlir::Type getElementType() const
static ArrayType get(::mlir::Type elementType, ::llvm::ArrayRef<::mlir::Attribute > dimensionSizes)
::llvm::ArrayRef<::mlir::Attribute > getDimensionSizes() const
StructType getType(::std::optional<::mlir::ArrayAttr > constParams={})
Gets the StructType representing this struct.
void setConstParamsAttr(::mlir::ArrayAttr attr)
::mlir::SymbolRefAttr getNameRef() const
static StructType get(::mlir::SymbolRefAttr structName)
::mlir::ArrayAttr getParams() const
mlir::RewritePatternSet newGeneralRewritePatternSet(mlir::TypeConverter &tyConv, mlir::MLIRContext *ctx, mlir::ConversionTarget &target)
Return a new RewritePatternSet that includes a GeneralTypeReplacePattern for all of OpClassesWithStru...
mlir::ConversionTarget newConverterDefinedTarget(mlir::TypeConverter &tyConv, mlir::MLIRContext *ctx, AdditionalChecks &&...checks)
Return a new ConversionTarget allowing all LLZK-required dialects and defining Op legality based on t...
std::unique_ptr< mlir::Pass > createEmptyParamListRemoval()