dtolnay / cargo-llvm-lines

Count lines of LLVM IR per generic function
Apache License 2.0
414 stars 24 forks source link

Inconsistent output between --lib and --bin #31

Open panstromek opened 4 years ago

panstromek commented 4 years ago

I am pretty confused by what llvm-lines is actually measuring. I think @nnethercote raised similar concern on internals some time ago, I just found another pretty confusing instance and I don't really understand what's going on.

I have a crate and it has two targets - one lib and one bin. bin target is simple - it doesn't actually do anything, it only calls main function from a lib.

use legacy_zebra::src::zebra::main as main_lib;

fn main () {
    main_lib();
}

And yet, when I run both targets through llvm-lines, I get completely different output.

cargo llvm-lines --lib 

Lines         Copies      Function name
  -----         ------      -------------
  54411 (100%)  468 (100%)  (TOTAL)
   2939 (5.4%)    1 (0.2%)  engine::src::end::end_tree_search
   2549 (4.7%)    1 (0.2%)  engine::src::midgame::tree_search
   2238 (4.1%)    1 (0.2%)  engine::src::getcoeff::unpack_coeffs
   1682 (3.1%)    1 (0.2%)  engine::src::thordb::database_search
   1622 (3.0%)    1 (0.2%)  legacy_zebra::src::zebra::main_0
   1594 (2.9%)    1 (0.2%)  legacy_zebra::src::zebra::analyze_game
   1581 (2.9%)    1 (0.2%)  engine::src::game::generic_compute_move
   1545 (2.8%)    1 (0.2%)  engine::src::end::end_game
   1512 (2.8%)    1 (0.2%)  engine::src::midgame::root_tree_search
   1276 (2.3%)    1 (0.2%)  legacy_zebra::src::osfbook::add_new_game
   1198 (2.2%)    1 (0.2%)  engine::src::zebra::engine_play_game
   1108 (2.0%)    1 (0.2%)  engine::src::osfbook::get_book_move
   1010 (1.9%)    1 (0.2%)  legacy_zebra::src::zebra::run_endgame_script
    982 (1.8%)    1 (0.2%)  legacy_zebra::src::osfbook::book_statistics
    927 (1.7%)    1 (0.2%)  legacy_zebra::src::osfbook::do_correct
    889 (1.6%)    1 (0.2%)  engine::src::midgame::middle_game
    852 (1.6%)    1 (0.2%)  legacy_zebra::src::display::display_board
    842 (1.5%)    1 (0.2%)  engine::src::getcoeff::load_set
    834 (1.5%)    1 (0.2%)  engine::src::midgame::fast_tree_search
    784 (1.4%)    1 (0.2%)  engine::src::thordb::choose_thor_opening_move
    722 (1.3%)    1 (0.2%)  engine::src::osfbook::fill_move_alternatives
    706 (1.3%)    1 (0.2%)  legacy_zebra::src::osfbook::convert_opening_list
    684 (1.3%)    1 (0.2%)  legacy_zebra::src::game::ponder_move
cargo llvm-lines --bin zebra 

Lines          Copies       Function name
  -----          ------       -------------
  163815 (100%)  1340 (100%)  (TOTAL)
   13340 (8.1%)     1 (0.1%)  engine::src::getcoeff::constant_and_parity_feature
    4630 (2.8%)     1 (0.1%)  std::backtrace_rs::symbolize::gimli::elf::<impl std::backtrace_rs::symbolize::gimli::Mapping>::new
    3767 (2.3%)     1 (0.1%)  engine::src::doflip::DoFlips_hash
    3123 (1.9%)     1 (0.1%)  engine::src::getcoeff::terminal_patterns
    2800 (1.7%)     1 (0.1%)  engine::src::end::end_tree_search
    2715 (1.7%)     1 (0.1%)  engine::src::doflip::DoFlips_no_hash
    2531 (1.5%)     1 (0.1%)  addr2line::ResUnit<R>::parse_lines
    2471 (1.5%)     1 (0.1%)  miniz_oxide::inflate::core::decompress
    2426 (1.5%)     1 (0.1%)  engine::src::midgame::tree_search
    2210 (1.3%)     1 (0.1%)  engine::src::getcoeff::unpack_coeffs
    2082 (1.3%)   107 (8.0%)  core::ptr::drop_in_place
    2056 (1.3%)     1 (0.1%)  std::backtrace_rs::symbolize::gimli::resolve
    1644 (1.0%)     1 (0.1%)  gimli::read::unit::parse_attribute
    1624 (1.0%)     1 (0.1%)  engine::src::thordb::database_search
    1490 (0.9%)     1 (0.1%)  legacy_zebra::src::zebra::analyze_game
    1464 (0.9%)     1 (0.1%)  gimli::read::unit::Attribute<R>::value
    1440 (0.9%)     1 (0.1%)  engine::src::game::generic_compute_move
    1440 (0.9%)     1 (0.1%)  engine::src::midgame::root_tree_search
    1424 (0.9%)     1 (0.1%)  engine::src::end::solve_parity_hash_high
    1374 (0.8%)     1 (0.1%)  engine::src::end::end_game
    1308 (0.8%)     1 (0.1%)  addr2line::ResUnit<R>::parse_functions
    1283 (0.8%)     1 (0.1%)  legacy_zebra::src::zebra::main_0
    1173 (0.7%)     1 (0.1%)  engine::src::zebra::engine_play_game
    1163 (0.7%)     1 (0.1%)  legacy_zebra::src::osfbook::add_new_game

I thought this could be because the main function calls some generic function in dependencies, so if you don't call it, then those dependencies are not codegened. But the main function is actually present in both outputs (as main_0) - and more than that, it has different line count.

    1283 (0.8%)     1 (0.1%)  legacy_zebra::src::zebra::main_0
    1622 (3.0%)     1 (0.2%)  legacy_zebra::src::zebra::main_0

This is really confusing to me, and I don't really understand how to interpret the results. There's no diference between these targets but the llvm-lines output is massively different and the functions that stand out seems to be all over the place. Some are generic, some are not. Some functions from dependencies are shown, some not (some are generic, some are not).

The project is not open source, yet, so it might be difficult to interpret now. I will open source it in following weeks/months, though.