Skip to content

Memory leak in HW to SystemC conversion #9376

@sairam2661

Description

@sairam2661

Test commit
417a5112947d9889cad54cb5b2110b37978b86b8

Description
The pass leaks memory when it fails to legalize nested operations (like sv.reg): it allocates systemc.module and systemc.ctor operations but fails to deallocate them when the conversion is aborted due to incorrect/illegal IR.

Steps to reproduce

  • Minimal MLIR program (test.mlir)
"builtin.module"() ({
  "hw.module"() <{module_type = !hw.modty<>, parameters = [], sym_name = "Bar"}> ({
    %0 = "hw.constant"() <{value = false}> : () -> i1
    %1 = "sv.reg"(%0) <{name = "reg"}> : (i1) -> !hw.inout<i1>
    "hw.output"() : () -> ()
  }) : () -> ()
}) : () -> ()

Command

circt-opt --convert-hw-to-systemc test.mlir

Output

test.mlir:4:10: error: failed to legalize operation 'sv.reg'
    %1 = "sv.reg"(%0) <{name = "reg"}> : (i1) -> !hw.inout<i1>
         ^
test.mlir:4:10: note: see current operation: %2 = "sv.reg"(%1) <{name = "reg"}> : (i1) -> !hw.inout<i1>

=================================================================
==108527==ERROR: LeakSanitizer: detected memory leaks

Indirect leak of 88 byte(s) in 1 object(s) allocated from:
    #0 0x55b3b1245c5e in malloc (/workdir/builds/circt/bin/circt-opt+0x6f95c5e) (BuildId: d0273fc7523026d0)
    #1 0x55b3b72f252a in mlir::Operation::create(mlir::Location, mlir::OperationName, mlir::TypeRange, mlir::ValueRange, mlir::DictionaryAttr, mlir::OpaqueProperties, mlir::BlockRange, unsigned int) /workdir/sources/circt/llvm/mlir/lib/IR/Operation.cpp:114:46

Indirect leak of 72 byte(s) in 1 object(s) allocated from:
    #0 0x55b3b1280aad in operator new(unsigned long) (/workdir/builds/circt/bin/circt-opt+0x6fd0aad) (BuildId: d0273fc7523026d0)
    #1 0x55b3b62d9d73 in circt::systemc::CtorOp::build(mlir::OpBuilder&, mlir::OperationState&) /workdir/builds/circt/include/circt/Dialect/SystemC/SystemC.cpp.inc:1849:25
    #2 0x55b3b629c0c8 in circt::systemc::CtorOp::create(mlir::OpBuilder&, mlir::Location) /workdir/builds/circt/include/circt/Dialect/SystemC/SystemC.cpp.inc:1855:3
    #3 0x55b3b629be5c in circt::systemc::SCModuleOp::getOrCreateCtor() /workdir/sources/circt/lib/Dialect/SystemC/SystemCOps.cpp:336:10
    #4 0x55b3b69e3243 in (anonymous namespace)::ConvertHWModule::matchAndRewrite(circt::hw::HWModuleOp, circt::hw::HWModuleOpAdaptor, mlir::ConversionPatternRewriter&) const /workdir/sources/circt/lib/Conversion/HWToSystemC/HWToSystemC.cpp:86:18
    #5 0x55b3b69d6038 in llvm::LogicalResult mlir::ConversionPattern::dispatchTo1To1<mlir::OpConversionPattern<circt::hw::HWModuleOp>, circt::hw::HWModuleOp>(mlir::OpConversionPattern<circt::hw::HWModuleOp> const&, circt::hw::HWModuleOp, circt::hw::HWModuleOp::GenericAdaptor<llvm::ArrayRef<mlir::ValueRange> >, mlir::ConversionPatternRewriter&) /workdir/sources/circt/llvm/mlir/include/mlir/Transforms/DialectConversion.h:1069:15
    #6 0x55b3b69d5b4f in mlir::OpConversionPattern<circt::hw::HWModuleOp>::matchAndRewrite(circt::hw::HWModuleOp, circt::hw::HWModuleOpGenericAdaptor<llvm::ArrayRef<mlir::ValueRange> >, mlir::ConversionPatternRewriter&) const /workdir/sources/circt/llvm/mlir/include/mlir/Transforms/DialectConversion.h:727:12
    #7 0x55b3b69d43bf in mlir::OpConversionPattern<circt::hw::HWModuleOp>::matchAndRewrite(mlir::Operation*, llvm::ArrayRef<mlir::ValueRange>, mlir::ConversionPatternRewriter&) const /workdir/sources/circt/llvm/mlir/include/mlir/Transforms/DialectConversion.h:713:12
    #8 0x55b3b7e3c195 in mlir::ConversionPattern::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&) const /workdir/sources/circt/llvm/mlir/lib/Transforms/Utils/DialectConversion.cpp:2434:10

Indirect leak of 72 byte(s) in 1 object(s) allocated from:
    #0 0x55b3b1280aad in operator new(unsigned long) (/workdir/builds/circt/bin/circt-opt+0x6fd0aad) (BuildId: d0273fc7523026d0)
    #1 0x55b3b6296442 in circt::systemc::SCModuleOp::build(mlir::OpBuilder&, mlir::OperationState&, mlir::StringAttr, mlir::ArrayAttr, llvm::ArrayRef<mlir::Type>, llvm::ArrayRef<mlir::NamedAttribute>) /workdir/sources/circt/lib/Dialect/SystemC/SystemCOps.cpp:249:21
    #2 0x55b3b629706a in circt::systemc::SCModuleOp::build(mlir::OpBuilder&, mlir::OperationState&, mlir::StringAttr, llvm::ArrayRef<circt::hw::PortInfo>, llvm::ArrayRef<mlir::NamedAttribute>) /workdir/sources/circt/lib/Dialect/SystemC/SystemCOps.cpp:266:3
    #3 0x55b3b6331669 in circt::systemc::SCModuleOp::create(mlir::OpBuilder&, mlir::Location, mlir::StringAttr, llvm::ArrayRef<circt::hw::PortInfo>, llvm::ArrayRef<mlir::NamedAttribute>) /workdir/builds/circt/include/circt/Dialect/SystemC/SystemC.cpp.inc:5747:3
    #4 0x55b3b69e2e3b in (anonymous namespace)::ConvertHWModule::matchAndRewrite(circt::hw::HWModuleOp, circt::hw::HWModuleOpAdaptor, mlir::ConversionPatternRewriter&) const /workdir/sources/circt/lib/Conversion/HWToSystemC/HWToSystemC.cpp:61:21
    #5 0x55b3b69d6038 in llvm::LogicalResult mlir::ConversionPattern::dispatchTo1To1<mlir::OpConversionPattern<circt::hw::HWModuleOp>, circt::hw::HWModuleOp>(mlir::OpConversionPattern<circt::hw::HWModuleOp> const&, circt::hw::HWModuleOp, circt::hw::HWModuleOp::GenericAdaptor<llvm::ArrayRef<mlir::ValueRange> >, mlir::ConversionPatternRewriter&) /workdir/sources/circt/llvm/mlir/include/mlir/Transforms/DialectConversion.h:1069:15
    #6 0x55b3b69d5b4f in mlir::OpConversionPattern<circt::hw::HWModuleOp>::matchAndRewrite(circt::hw::HWModuleOp, circt::hw::HWModuleOpGenericAdaptor<llvm::ArrayRef<mlir::ValueRange> >, mlir::ConversionPatternRewriter&) const /workdir/sources/circt/llvm/mlir/include/mlir/Transforms/DialectConversion.h:727:12
    #7 0x55b3b69d43bf in mlir::OpConversionPattern<circt::hw::HWModuleOp>::matchAndRewrite(mlir::Operation*, llvm::ArrayRef<mlir::ValueRange>, mlir::ConversionPatternRewriter&) const /workdir/sources/circt/llvm/mlir/include/mlir/Transforms/DialectConversion.h:713:12
    #8 0x55b3b7e3c195 in mlir::ConversionPattern::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&) const /workdir/sources/circt/llvm/mlir/lib/Transforms/Utils/DialectConversion.cpp:2434:10

SUMMARY: AddressSanitizer: 232 byte(s) leaked in 3 allocation(s).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions