Skip to content

[FATAL] Failed to place smart buffers #703

@KatCe

Description

@KatCe

Hello,
For the program (function myfunc) below, and the following synthesis commands:

set-clock-period 13
compile --sharing  --buffer-algorithm fpl22
write-hdl --hdl verilog

I get the following error:

PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.	Program arguments: /data//workspace/dynamatic/bin/dynamatic-opt /home//turboturtle/fuzzing/run_20260112124954/run_20260112124954_design_0000/synth/../out/comp/handshake_transformed.mlir --handshake-mark-fpu-impl=impl=flopoco --handshake-set-buffering-properties=version=fpga20 "--handshake-place-buffers=algorithm=fpl22 solver=gurobi frequencies=/home//turboturtle/fuzzing/run_20260112124954/run_20260112124954_design_0000/synth/../out/comp/frequencies.csv timing-models=/data//workspace/dynamatic/data/components.json target-period=13.000 timeout=300 dump-logs     blif-files=/data//workspace/dynamatic/data/aig/ lut-delay=0.55 lut-size=6 acyclic-type" "--credit-based-sharing=timing-models=/data//workspace/dynamatic/data/components.json target-period=13.000"
 #0 0x00007ffff16299f8 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/data//workspace/dynamatic/polygeist/llvm-project/build/./lib/libLLVMSupport.so.18git+0x1ca9f8)
 #1 0x00007ffff16277de llvm::sys::RunSignalHandlers() (/data//workspace/dynamatic/polygeist/llvm-project/build/./lib/libLLVMSupport.so.18git+0x1c87de)
 #2 0x00007ffff162a0a8 SignalHandler(int) Signals.cpp:0:0
 #3 0x00007ffff0c45330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
 #4 0x00005555557f412b std::_Function_handler<bool (mlir::Operation*), isShiftByConstantImpl(mlir::Operation*)::$_0>::_M_invoke(std::_Any_data const&, mlir::Operation*&&) HandshakeInterfaces.cpp:0:0
 #5 0x00005555557f4192 std::_Function_handler<bool (mlir::Operation*), isShiftByConstantImpl(mlir::Operation*)::$_0>::_M_invoke(std::_Any_data const&, mlir::Operation*&&) HandshakeInterfaces.cpp:0:0
 #6 0x00005555557f4192 std::_Function_handler<bool (mlir::Operation*), isShiftByConstantImpl(mlir::Operation*)::$_0>::_M_invoke(std::_Any_data const&, mlir::Operation*&&) HandshakeInterfaces.cpp:0:0
 #7 0x00005555557f3ce0 dynamatic::handshake::ShRSIOp::isShiftByConstant() (/data//workspace/dynamatic/bin/dynamatic-opt+0x29fce0)
 #8 0x00005555557bd47d dynamatic::handshake::detail::ShiftLikeArithOpInterfaceInterfaceTraits::Model<dynamatic::handshake::ShRSIOp>::isShiftByConstant(dynamatic::handshake::detail::ShiftLikeArithOpInterfaceInterfaceTraits::Concept const*, mlir::Operation*) HandshakeDialect.cpp:0:0
 #9 0x00005555556b2447 dynamatic::buffer::BufferPlacementMILP::addUnitTimingConstraints(mlir::Operation*, dynamatic::SignalType, std::function<bool (mlir::Value)> const&) (/data//workspace/dynamatic/bin/dynamatic-opt+0x15e447)
#10 0x00005555556d24d1 dynamatic::buffer::fpl22::OutOfCycleBuffers::setup() (/data//workspace/dynamatic/bin/dynamatic-opt+0x17e4d1)
#11 0x000055555568d6c0 dynamatic::buffer::HandshakePlaceBuffersPass::getBufferPlacement(dynamatic::buffer::FuncInfo&, dynamatic::TimingDatabase&, dynamatic::Logger*, llvm::MapVector<mlir::Value, dynamatic::buffer::PlacementResult, llvm::DenseMap<mlir::Value, unsigned int, llvm::DenseMapInfo<mlir::Value, void>, llvm::detail::DenseMapPair<mlir::Value, unsigned int>>, llvm::SmallVector<std::pair<mlir::Value, dynamatic::buffer::PlacementResult>, 0u>>&) (/data//workspace/dynamatic/bin/dynamatic-opt+0x1396c0)
#12 0x000055555568ae5c dynamatic::buffer::HandshakePlaceBuffersPass::placeBuffers(dynamatic::buffer::FuncInfo&, dynamatic::TimingDatabase&, dynamatic::CFDFCAnalysis&) (/data//workspace/dynamatic/bin/dynamatic-opt+0x136e5c)
#13 0x00005555556885d8 dynamatic::buffer::HandshakePlaceBuffersPass::placeUsingMILP() (/data//workspace/dynamatic/bin/dynamatic-opt+0x1345d8)
#14 0x0000555555686d8e dynamatic::buffer::HandshakePlaceBuffersPass::runOnOperation() (/data//workspace/dynamatic/bin/dynamatic-opt+0x132d8e)
#15 0x00007ffff2e3e542 mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) (/data//workspace/dynamatic/polygeist/llvm-project/build/./lib/libMLIRPass.so.18git+0x1c542)
#16 0x00007ffff2e41eeb mlir::PassManager::run(mlir::Operation*) (/data//workspace/dynamatic/polygeist/llvm-project/build/./lib/libMLIRPass.so.18git+0x1feeb)
#17 0x00007ffff773304a performActions(llvm::raw_ostream&, std::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, mlir::MlirOptMainConfig const&) MlirOptMain.cpp:0:0
#18 0x00007ffff7732236 mlir::LogicalResult llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, 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&)::$_0>(long, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) MlirOptMain.cpp:0:0
#19 0x00007ffff168e432 mlir::splitAndProcessBuffer(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>, llvm::raw_ostream&, bool, bool) (/data//workspace/dynamatic/polygeist/llvm-project/build/./lib/libMLIRSupport.so.18git+0x14432)
#20 0x00007ffff772d3a9 mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&) (/data//workspace/dynamatic/polygeist/llvm-project/build/./lib/libMLIROptLib.so.18git+0xb3a9)
#21 0x00007ffff772d83a mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&) (/data//workspace/dynamatic/polygeist/llvm-project/build/./lib/libMLIROptLib.so.18git+0xb83a)
#22 0x000055555567e600 main (/data//workspace/dynamatic/bin/dynamatic-opt+0x12a600)
#23 0x00007ffff0c2a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#24 0x00007ffff0c2a28b call_init ./csu/../csu/libc-start.c:128:20
#25 0x00007ffff0c2a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
#26 0x000055555567e0d5 _start (/data//workspace/dynamatic/bin/dynamatic-opt+0x12a0d5)
/data//workspace/dynamatic/tools/dynamatic/scripts/compile.sh: line 309: 3315703 Segmentation fault      "$DYNAMATIC_OPT_BIN" "$F_HANDSHAKE_TRANSFORMED" --handshake-mark-fpu-impl="impl=$FPUNITS_GEN" --handshake-set-buffering-properties="version=fpga20" --handshake-place-buffers="algorithm=$BUFFER_ALGORITHM solver=$MILP_SOLVER frequencies=$F_FREQUENCIES timing-models=$DYNAMATIC_DIR/data/components.json target-period=$TARGET_CP timeout=300 dump-logs     blif-files=$DYNAMATIC_DIR/data/aig/ lut-delay=0.55 lut-size=6 acyclic-type" ${SHARING_PASS:+"$SHARING_PASS"} > "$F_HANDSHAKE_BUFFERED"

The program (compiles and runs on a x86 CPU):

// var_0,var_1,var_2_secret,var_3_secret,var_4_secret,var_5_secret,var_6_secret,var_7_secret,var_8_secret,var_9_secret

unsigned char myfunc(unsigned char var_0, unsigned char var_1, unsigned char var_2_secret, char var_3_secret, char var_4_secret, char var_5_secret, unsigned char var_6_secret, char var_7_secret, char var_8_secret, unsigned char var_9_secret) {
  char arr_10_secret[256] = { (char) var_5_secret };
  unsigned char var_11_secret = (unsigned char) var_7_secret;
  char var_12_secret = (char) var_9_secret;
  char var_13 = (char) var_1;
  unsigned char var_14_secret = (unsigned char) var_7_secret;
  unsigned char var_15_secret = (unsigned char) var_5_secret;
  unsigned char var_16_secret = (unsigned char) var_7_secret;
  unsigned char var_17 = (unsigned char) var_0;
  char var_18 = (char) var_0;
  unsigned char var_19 = (unsigned char) var_0;
  char var_20_secret = (char) var_3_secret;
  char var_21 = (char) var_1;
  char var_22_secret = (char) var_7_secret;
  char var_23 = (char) var_1;
  unsigned char var_24_secret = (unsigned char) var_6_secret;
  unsigned char var_25 = (unsigned char) var_0;
  unsigned char var_26 = (unsigned char) var_0;
  char var_27_secret = (char) var_9_secret;
  char var_28 = (char) var_1;
  char var_29_secret = (char) var_4_secret;
  unsigned char var_30 = (unsigned char) var_1;
  unsigned char var_31 = (unsigned char) var_0;
  char var_32_secret = (char) var_6_secret;
  char var_33_secret = (char) var_2_secret;
  unsigned char var_34 = (unsigned char) var_1;
  char var_35 = (char) var_1;
  unsigned char var_36_secret = (unsigned char) var_4_secret;
  char var_37 = (char) var_0;
  unsigned char var_38_secret = (unsigned char) var_2_secret;
  char var_39_secret = (char) var_3_secret;
  unsigned char var_40_secret = (unsigned char) var_4_secret;
  unsigned char var_41_secret = (unsigned char) var_7_secret;
  char var_42_secret = (char) var_8_secret;
  unsigned char var_43 = (unsigned char) var_1;
  char var_44_secret = (char) var_2_secret;
  unsigned char var_45_secret = (unsigned char) var_6_secret;
  char var_46 = (char) var_1;
  char var_47_secret = (char) var_2_secret;
  unsigned char var_48 = (unsigned char) var_1;
  char var_49 = (char) var_0;
  unsigned char var_50 = (unsigned char) var_0;
  unsigned char var_51 = (unsigned char) var_1;
  char var_52 = (char) var_0;
  unsigned char var_53 = (unsigned char) var_1;
  char var_54_secret = (char) var_9_secret;
  unsigned char var_55 = (unsigned char) var_0;
  char var_56_secret = (char) var_6_secret;
  char var_57 = (char) var_1;
  char var_58 = (char) var_1;
  char var_59 = (char) var_1;
  char var_60_secret = (char) var_9_secret;
  unsigned char var_61 = (unsigned char) var_1;
  char var_62 = (char) var_0;
  char var_63_secret = (char) var_6_secret;
  arr_10_secret[((int) var_0)] = var_7_secret | var_8_secret;
  arr_10_secret[((int) var_1)] = var_4_secret >> var_8_secret;
  arr_10_secret[((int) var_0)] = var_5_secret << var_7_secret;
  arr_10_secret[((int) var_0)] = arr_10_secret[((int) var_0)] & var_5_secret;
  arr_10_secret[((int) var_0)] = var_4_secret - var_7_secret;
  var_36_secret = var_0 - var_6_secret;
  arr_10_secret[((int) var_0)] = var_3_secret >> arr_10_secret[((int) var_0)];
  arr_10_secret[((int) var_0)] = var_5_secret - arr_10_secret[((int) var_1)];
  if (var_1 ^ var_0)
  {
      arr_10_secret[((int) var_1)] = var_3_secret >> var_7_secret;
      arr_10_secret[((int) var_0)] = var_7_secret ^ var_8_secret;
  }
  else
  {
      var_17 = 0;
      while (var_17 < 11)
      {
          arr_10_secret[((int) var_17)] = var_8_secret ^ arr_10_secret[((int) var_0)];
          arr_10_secret[((int) var_48)] = arr_10_secret[((int) var_17)] ^ var_5_secret;
          arr_10_secret[((int) var_17)] = arr_10_secret[((int) var_0)] * var_8_secret;
          var_39_secret = arr_10_secret[((int) var_48)] - var_8_secret;
          var_27_secret = arr_10_secret[((int) var_0)] | var_3_secret;
          if (var_17 < var_0)
            break;
          var_17++;
      }
      arr_10_secret[((int) var_17)] = arr_10_secret[((int) var_17)] << var_7_secret;
  }
  arr_10_secret[((int) var_17)] = arr_10_secret[((int) var_0)] & var_8_secret;
  arr_10_secret[((int) var_1)] = arr_10_secret[((int) var_17)] & var_5_secret;
  arr_10_secret[((int) var_17)] = arr_10_secret[((int) var_17)] & var_7_secret;
  arr_10_secret[((int) var_1)] = arr_10_secret[((int) var_1)] >> var_8_secret;
  arr_10_secret[((int) var_17)] = arr_10_secret[((int) var_17)] + var_5_secret;
  return (unsigned char) (var_0) + (unsigned char) (var_1) + (unsigned char) (var_2_secret) + (unsigned char) (var_3_secret) + (unsigned char) (var_4_secret) + (unsigned char) (var_5_secret) + (unsigned char) (var_6_secret) + (unsigned char) (var_7_secret) + (unsigned char) (var_8_secret) + (unsigned char) (var_9_secret) + (unsigned char) (arr_10_secret[((int) var_17)]) + (unsigned char) (arr_10_secret[((int) var_1)]) + (unsigned char) (arr_10_secret[((int) var_1)]) + (unsigned char) (arr_10_secret[((int) var_0)]) + (unsigned char) (arr_10_secret[((int) var_17)]) + (unsigned char) (arr_10_secret[((int) var_17)]) + (unsigned char) (arr_10_secret[((int) var_17)]) + (unsigned char) (arr_10_secret[((int) var_0)]) + (unsigned char) (arr_10_secret[((int) var_0)]) + (unsigned char) (arr_10_secret[((int) var_25)]) + (unsigned char) (arr_10_secret[((int) var_0)]) + (unsigned char) (arr_10_secret[((int) var_0)]) + (unsigned char) (arr_10_secret[((int) var_0)]) + (unsigned char) (arr_10_secret[((int) var_0)]) + (unsigned char) (arr_10_secret[((int) var_17)]) + (unsigned char) (arr_10_secret[((int) var_1)]) + (unsigned char) (arr_10_secret[((int) var_1)]) + (unsigned char) (arr_10_secret[((int) var_25)]) + (unsigned char) (arr_10_secret[((int) var_48)]) + (unsigned char) (arr_10_secret[((int) var_17)]) + (unsigned char) (arr_10_secret[((int) var_0)]) + (unsigned char) (arr_10_secret[((int) var_17)]) + (unsigned char) (arr_10_secret[((int) var_1)]) + (unsigned char) (arr_10_secret[((int) var_1)]) + (unsigned char) (arr_10_secret[((int) var_17)]) + (unsigned char) (arr_10_secret[((int) var_0)]) + (unsigned char) (arr_10_secret[((int) var_1)]) + (unsigned char) (arr_10_secret[((int) var_17)]) + (unsigned char) (arr_10_secret[((int) var_1)]) + (unsigned char) (arr_10_secret[((int) var_0)]) + (unsigned char) (arr_10_secret[((int) var_0)]) + (unsigned char) (arr_10_secret[((int) var_0)]) + (unsigned char) (arr_10_secret[((int) var_1)]) + (unsigned char) (arr_10_secret[((int) var_0)]) + (unsigned char) (arr_10_secret[((int) var_25)]) + (unsigned char) (var_11_secret) + (unsigned char) (var_14_secret) + (unsigned char) (var_17) + (unsigned char) (var_25) + (unsigned char) (var_27_secret) + (unsigned char) (var_36_secret) + (unsigned char) (var_39_secret) + (unsigned char) (var_41_secret);
}

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
  srand(time(NULL));

  for (int i = 0; i < 10; i++) {
    unsigned char var_0 = rand() % 256;
    unsigned char var_1 = rand() % 256;
    unsigned char var_2_secret = rand() % 256;
    char var_3_secret = rand() % 256;
    char var_4_secret = rand() % 256;
    char var_5_secret = rand() % 256;
    unsigned char var_6_secret = rand() % 256;
    char var_7_secret = rand() % 256;
    char var_8_secret = rand() % 256;
    unsigned char var_9_secret = rand() % 256;

    unsigned char result = myfunc(var_0, var_1, var_2_secret, var_3_secret,
                                   var_4_secret, var_5_secret, var_6_secret,
                                   var_7_secret, var_8_secret, var_9_secret);

    printf("Result %d: %u\n", i + 1, result);
  }

  return 0;
}

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