Skip to content

[SCFToCalyx] Cannot lower to Calyx with memref.global #9737

@Abhilekhgautam

Description

@Abhilekhgautam

The --lower-scf-to-calyx pass fails with a seg fault:

module {
memref.global "private" @conv_weight : memref<600xf32> = dense<"0x3644523B0CAFE0BDA86574BD3333103D1468EBBDD6E89E3DC229C7BDAF39CFBC1146CF3CC6D9B23DFE12353C3F87783CC2B5E83D1BEC9B3D2210B23D339B893D7E49BDBDE2F31CBD5240E4BCCAA142BDC5E594BD98CBD5BC2BE7DA3DA7B0DFBD3074493D27DA01BCA0AFDD3DBD5E21BD192F95BD1DBE223C52739FBD2946033DB1AAE6BBE6B5D53D6D23BE3D7817A5BDF976903DD9C6CA3DDFC404BD6C1BE8BDE01887BD54B1713DFAE7D83DAD7808BC3FD2B2BDAFD986BDC76CCDBDDF7298BD13F2E8BDA632953DEE3CC83D7A2B6F3C83EEA6BD6607F7BC2400083D999E11BDBA63503DE29B753D095E39BD581F983C66AB343DA22FB53D654296BCEB4AA2BD54E4A93D483C283D47E535BD8E70BB3DD13FDA3DF0E620BC47C1D8BD88DB40BD3A11723D97C7EABD5DF75C3D081EBF3DC0E9953DDC0492BD89E113BD45A23CBB264B72BD417BB43D5A86A13DF727A0BD1E2C45BAE3CFAABD59DFC8BD4AFD463D647E6CBDDC621ABC18BF94BD722BD6BD28E6C2BDE82E7ABCFB73CB3D024C8C3CFF89BABCDA0312BC90D50CBD369E783D5FF328BD8185BEBDFC278D3D29698D3C7CE9B23DEFCE52BD0FB8E5BD309D19BDD67CC3BBB9B6D5BC7F18BD3D06A8A73D97B6C43DB5B0E7BDAF87193D8E8DB7BC3A6C863DEDCE8ABD2BB99C3D61A7EB3D78F4C4BDA5BF273D9D0E8F3D0B225E3DC291C8BD94E67EBD0E152BBDCB79ABBDFF1290BDA98DB8BD20AD893CBDED86BDE667C83D36C7D8BD2CAE293D4B7D6CBC731E843C50E0C13DEA2C753DDB0EA6BD7D806ABD43B0763D81C6C33BC7D8943D56C8083D2926A13D63789D3D4E1B7BBD3B440BBDF9924FBCF41354BD9E3C44BD9A6FE6BC3E3B273D3FE8723D7A92A9BC2462E4BD31DDE0BD82756ABDBDFAC4BD2DE482BDBEE4713B41B2663C706EA3BDF069DD3A9690463DB5E48D3D5F19673CC88CB63D4B00A0BD57CFFEBA1D27CABD898DDCBCBEF1CFBDF36CEEBCADB6BDBCDEA6E8BD05C3DFBCFC666A3DDA7F2BBD1DE37A3D547616BD76011ABCDF39E1BDFBC7E0BC4B0813BD648191BD21CFC9BDE3E3D43D704FDB3D447C63BD7E4F8CBDCBCF6E3C2ECFCBBDA8FCC03DD27C8C3CE631CABDC6B6523D189626BB5E62BDBD2246613CD1FE3DBCE1C885BA6853CFBC0B2EA53D18ABA1BC23873B3C8D2562BD1852DB3DCB192A3D1483BC3D6CF61CBDB893EEBC8DAFB43DAC80BD3D2321163DD64550BD7738B83D6736E03CDD4E9EBD61CF8E3C6827E7BDC2E3CFBD635E2DBD6BE34C3DE8C55E3D855481BDFDB1C5BDAA08CD3DF8A4CABD77E7AABDA3F04E3D108EE63DC322C0BD648382BDD18C6F3DA31426BDAD164C3C8E6534BA2E6896BB6CD0AFBDC02913BD02A23CBDE4AD77BDA2B664BD5AFFC6BD4AC827BD9821BE3DA69103BD2805283DAC51AF3D3F67E53D2FDE7DBD08467F3D1073B4BC264C813D6EC3353D0236C1BD4274BABD29C2483CAFBAAB3A0A848CBCDA923DBCF7C4A1BD9F35E83DBB7FB9BDD7CDAA3DCF0ECA3DD52ADC3D150598BDFB7B7B3CB3FED3BD81C1BEBD996B763BD5BF863D7F4072BD542DB6BD1A5E8E3CAB06DC3D68D63BBC0EB225BDC425A43DEEC880BD5FE2D43D4834BFBD34DCDDBD88CFDF3D80C4AABC03D098BCA4EF43BD64BC473DF83BAB3DBF0F253CB79DA13DA178133DEC1FE2BDB8C1AE3B0D5A7A3DCF30FB3B7E0E6FBDB01893BD4E01D93D70386F3DAAA8E83D1F0E91BD04E2913C5DC583BCB419E7BDB47CD3BC3457403DE76C3E3D2BF5DA3DC73BB43D2DBC60BD5BB991BDA095D0BC3A2BE1BCF2F559BDC027E6BB568AA6BD915066BD2062A0BD050DC3BD569EB4BC34E0A3BD472BC1BDEF6DB63D617011BD078B653D5FE8013D918B683CCC13B83D2D78513CE2CDC03D15B8CA3D2804C23D87D0DABDCDDCC03C0FBD1EBD13F6B83D921DA4BD5D68043D6A9686BAB9A52BBC7C0A3BBC72E8B2BDFD04C23D39BFBFBD1CA7A4BD876F4D396F9C11BDF971B7BDE2A746BD0BFE22BDED79993D2EEFCA3DE8D9C33D7520E03D8323823DB5E797BDD172DDBD6C4C9F3DD6B6CB3CAB38103D764CD23D9ADA06BC52CB9DBC1E288FBB2AB509BD8CEB8D3D0FB598BD7A9BB53D7C93E5BC6CE0A8BD9745B93D327A6B3DE2648CBD409D88BD3E65B23C03BDABBD530FE2BD46CB5ABD03611ABD30A0D6BD1785493DF02577BDAB68B5BC70029BBDF205A8BDB05D613BC5CEA2BD920B303D79E5E43CD658CBBD23914A3B4B2D87BDDA548A3DE678473CB5E6A33D7D3ECD3DFD4A64BD809BA5BD16EB0ABD892B2DBD37638C3D6379B4BD9A23A2BD3C4DE0BD293E2B3D9D25E83D9F6267BD9CCC6C3D5802E43D6128CF3D74EF7ABCFB8944BDCD9BE23DCBC7C9BD212D88BD621DD13D04BAC03D28CCC63B0D1B95BC7FA2B5BDAAF788BC7AB7C23DCC8B0ABDF4D6BB3D27915EBD01EC253CC88B64BD76F87ABC8300873DE379AC3D7CA856BCD715B5BDABC2B6BD1F8925BD45A946BD4C4A59BD72B2AE3C1C35B43D7F9BD33D5658333DE3D0B5BD73144D3D4486D0BA9194A23DF3D72CBDB1BC87BC7FC1C9BCA7088ABD05F3913CED0BB53D9D5F83BD40E906BD17573A3DC61E51BD2A60DEBD3DFDA33D0B853BBD825A763BC8CB2C3D89E3B13DBAEA00BC8FEE6BBD9889613DACD186BDCFF1C2BDA7D64A3C90BB71BDCF9467BDE8997EBD5EB0B3BDBD4935BDC350B73DA313A4BD86B5DA3CCDFFCD3DC081FD3BA10AA5BD250A66BD9F0D903D711691BDCDCE5EBDFFB81BBDBEF39DBDAED3FB3C6F09D9BD3860A8BCCCECE73C1F79CABA2E16A63D1BCF17BDD367D83D116A6DBCD9AE0D3DC7ACEDBC98BC153CD6BB92BD4071E53CCCA91B3D58A25E3D3A3085BBCB1BDDBDDAD4ADBD016791BD9579C03DD07BCD3DA86462BD757B85BD90A5E5BD7449D7BC981905BCC96713BCE8E259BCA25CE43D99709B3B2103C1BDC305383D64B1603DBBFE37BD673951BDB12CB53D0D169C3D22E6C4BDC45FBCBD18A5AE3D53898BBCB690823D979EE83C122B1F3C5425D03D907B1C3C9819A3BD6E09DC3D73BDA8BD486F123DD5E7C8BCE37C323B96E8163A39F6213D2E99CE3D17A3BABD2A001EBD73B9BF3DF142DA3D88ED0E3D23BDDD3C735354BD67C2B13B25B4D8BD3153353D4A5399BD11B3A9BBD5C8D33D034110BD9ED8923DF6E4A5BC5E0651BD75B0053D3B71A33D42A2B33DE25B663C9B15DC3D3FF2CEBDD1B182BD07EAF03C4E55E5BD538EC2BD96E594BC9EB0193D910E053C531E43BC9CFA8F3DDA42973DD4BEB83CB982A13DAD43D33D84FD8EBD8685393BEB339A3CE1B5D6BDBE42D13C10ECD7BD49D2AEBCE405893D9692E63DD1DCE23B7BC69C3D86046E3DED7D8AB991648FBD38384DBD24E81A3D14B85ABD0FD9193DB5B4883DDB99C5BD8C481F3D">
   func.func @test() -> i32{
       %0 = arith.constant 1 : i32

       %1 = memref.get_global @conv_weight : memref<600xf32>

       %2 = arith.sitofp %0 : i32 to f32
       %3 = arith.index_cast %0 : i32 to index
       memref.store %2, %1[%3] : memref<600xf32>

       %4 = arith.addf %2, %2 : f32

       %5 = arith.fptosi %4 : f32 to i32

       return %0 : i32
   }
}

The stack dump:

0.	Program arguments: /opt/compiler-explorer/circt-trunk/bin/circt-opt -o /app/example.out.mlir --pass-pipeline=builtin.module(lower-scf-to-calyx{top-level-function=test}) <source>
 #0 0x0000000001414b58 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/compiler-explorer/circt-trunk/bin/circt-opt+0x1414b58)
 #1 0x0000000001411835 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #2 0x00007f518a842520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #3 0x0000000002ed482b mlir::DenseElementsAttr::getNumElements() const (/opt/compiler-explorer/circt-trunk/bin/circt-opt+0x2ed482b)
 #4 0x0000000002cd36a8 llvm::LogicalResult circt::scftocalyx::buildAllocOp<mlir::memref::GetGlobalOp>(circt::scftocalyx::ComponentLoweringState&, mlir::PatternRewriter&, mlir::memref::GetGlobalOp) SCFToCalyx.cpp:0:0
 #5 0x0000000002cd472d circt::scftocalyx::BuildOpGroups::partiallyLowerFuncToComp(mlir::func::FuncOp, mlir::PatternRewriter&) const::'lambda'(mlir::Operation*)::operator()(mlir::Operation*) const (/opt/compiler-explorer/circt-trunk/bin/circt-opt+0x2cd472d)
 #6 0x0000000002cd5840 mlir::WalkResult mlir::detail::walk<mlir::ForwardIterator>(mlir::Operation*, llvm::function_ref<mlir::WalkResult (mlir::Operation*)>, mlir::WalkOrder) (.constprop.5) SCFToCalyx.cpp:0:0
 #7 0x0000000002cd5814 mlir::WalkResult mlir::detail::walk<mlir::ForwardIterator>(mlir::Operation*, llvm::function_ref<mlir::WalkResult (mlir::Operation*)>, mlir::WalkOrder) (.constprop.5) SCFToCalyx.cpp:0:0
 #8 0x0000000002cd58e3 circt::scftocalyx::BuildOpGroups::partiallyLowerFuncToComp(mlir::func::FuncOp, mlir::PatternRewriter&) const (/opt/compiler-explorer/circt-trunk/bin/circt-opt+0x2cd58e3)
 #9 0x0000000002c1f283 circt::calyx::PartialLoweringPattern<mlir::func::FuncOp, mlir::OpRewritePattern>::matchAndRewrite(mlir::func::FuncOp, mlir::PatternRewriter&) const (/opt/compiler-explorer/circt-trunk/bin/circt-opt+0x2c1f283)
#10 0x0000000003b35192 mlir::PatternApplicator::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&, llvm::function_ref<bool (mlir::Pattern const&)>, llvm::function_ref<void (mlir::Pattern const&)>, llvm::function_ref<llvm::LogicalResult (mlir::Pattern const&)>)::'lambda'()::operator()() const PatternApplicator.cpp:0:0
#11 0x0000000003b3653a mlir::PatternApplicator::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&, llvm::function_ref<bool (mlir::Pattern const&)>, llvm::function_ref<void (mlir::Pattern const&)>, llvm::function_ref<llvm::LogicalResult (mlir::Pattern const&)>) (/opt/compiler-explorer/circt-trunk/bin/circt-opt+0x3b3653a)
#12 0x0000000003b03cb3 (anonymous namespace)::GreedyPatternRewriteDriver::processWorklist() GreedyPatternRewriteDriver.cpp:0:0
#13 0x0000000003b084b3 mlir::applyPatternsGreedily(mlir::Region&, mlir::FrozenRewritePatternSet const&, mlir::GreedyRewriteConfig, bool*) (/opt/compiler-explorer/circt-trunk/bin/circt-opt+0x3b084b3)
#14 0x0000000002cded27 circt::(anonymous namespace)::SCFToCalyxPass::runOnOperation() SCFToCalyx.cpp:0:0
#15 0x0000000003c45fa1 mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) (/opt/compiler-explorer/circt-trunk/bin/circt-opt+0x3c45fa1)
#16 0x0000000003c462d7 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) (/opt/compiler-explorer/circt-trunk/bin/circt-opt+0x3c462d7)
#17 0x0000000003c480ba mlir::PassManager::runPasses(mlir::Operation*, mlir::AnalysisManager) (/opt/compiler-explorer/circt-trunk/bin/circt-opt+0x3c480ba)
#18 0x0000000003c48f31 mlir::PassManager::run(mlir::Operation*) (/opt/compiler-explorer/circt-trunk/bin/circt-opt+0x3c48f31)
#19 0x000000000344a637 performActions(llvm::raw_ostream&, std::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, mlir::MlirOptMainConfig const&) MlirOptMain.cpp:0:0
#20 0x000000000344b047 llvm::LogicalResult llvm::function_ref<llvm::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::MemoryBufferRef const&, llvm::raw_ostream&)>::callback_fn<mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::'lambda'(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::MemoryBufferRef, llvm::raw_ostream&)>(long, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::MemoryBufferRef const&, llvm::raw_ostream&) MlirOptMain.cpp:0:0
#21 0x000000000347eafe mlir::splitAndProcessBuffer(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<llvm::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::MemoryBufferRef const&, llvm::raw_ostream&)>, llvm::raw_ostream&, llvm::StringRef, llvm::StringRef) (/opt/compiler-explorer/circt-trunk/bin/circt-opt+0x347eafe)
#22 0x0000000003446a89 mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&) (.part.0) MlirOptMain.cpp:0:0
#23 0x000000000344b7a4 mlir::MlirOptMain(int, char**, llvm::StringRef, llvm::StringRef, mlir::DialectRegistry&) (/opt/compiler-explorer/circt-trunk/bin/circt-opt+0x344b7a4)
#24 0x000000000344b9ed mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&) (/opt/compiler-explorer/circt-trunk/bin/circt-opt+0x344b9ed)
#25 0x000000000137819d main (/opt/compiler-explorer/circt-trunk/bin/circt-opt+0x137819d)
#26 0x00007f518a829d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#27 0x00007f518a829e40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#28 0x000000000137c445 _start (/opt/compiler-explorer/circt-trunk/bin/circt-opt+0x137c445)

The issue is likely not checking for null before trying to call getValues()

 auto cstAttr = llvm::dyn_cast_or_null<DenseElementsAttr>(
        globalOp.getConstantInitValue());
    int sizeCount = 0;
    for (auto attr : cstAttr.template getValues<Attribute>()) {
      assert((isa<mlir::FloatAttr, mlir::IntegerAttr>(attr)) &&
             "memory attributes must be float or int");
      if (auto fltAttr = dyn_cast<mlir::FloatAttr>(attr)) {
        flattenedVals[sizeCount++] =
            bit_cast<uint64_t>(fltAttr.getValueAsDouble());
      } else {
        auto intAttr = dyn_cast<mlir::IntegerAttr>(attr);
        APInt value = intAttr.getValue();
        flattenedVals[sizeCount++] = *value.getRawData();
      }
    }

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