| #!/bin/bash |
| |
| set -eux |
| |
| target="${1:-}" |
| |
| if [ -z "$target" ]; then |
| host_target=$(rustc -vV | awk '/^host/ { print $2 }') |
| echo "Defaulted to host target $host_target" |
| target="$host_target" |
| fi |
| |
| iai_home="iai-home" |
| |
| # Use the arch as a tag to disambiguate artifacts |
| tag="$(echo "$target" | cut -d'-' -f1)" |
| |
| # Download the baseline from master |
| ./ci/ci-util.py locate-baseline --download --extract --tag "$tag" |
| |
| # Run benchmarks once |
| function run_icount_benchmarks() { |
| cargo_args=( |
| "--bench" "icount" |
| "--no-default-features" |
| "--features" "unstable,unstable-float,icount" |
| ) |
| |
| iai_args=( |
| "--home" "$(pwd)/$iai_home" |
| "--callgrind-limits=ir=5.0" |
| "--save-summary" |
| ) |
| |
| # Parse `cargo_arg0 cargo_arg1 -- iai_arg0 iai_arg1` syntax |
| parsing_iai_args=0 |
| while [ "$#" -gt 0 ]; do |
| if [ "$parsing_iai_args" == "1" ]; then |
| iai_args+=("$1") |
| elif [ "$1" == "--" ]; then |
| parsing_iai_args=1 |
| else |
| cargo_args+=("$1") |
| fi |
| |
| shift |
| done |
| |
| # Run iai-callgrind benchmarks. Do this in a subshell with `&& true` to |
| # capture rather than exit on error. |
| (cargo bench "${cargo_args[@]}" -- "${iai_args[@]}") && true |
| exit_code="$?" |
| |
| if [ "$exit_code" -eq 0 ]; then |
| echo "Benchmarks completed with no regressions" |
| elif [ -z "${PR_NUMBER:-}" ]; then |
| # Disregard regressions after merge |
| echo "Benchmarks completed with regressions; ignoring (not in a PR)" |
| else |
| ./ci/ci-util.py handle-bench-regressions "$PR_NUMBER" |
| fi |
| } |
| |
| # Run once with softfloats, once with arch instructions enabled |
| run_icount_benchmarks --features force-soft-floats -- --save-baseline=softfloat |
| run_icount_benchmarks -- --save-baseline=hardfloat |
| |
| # Name and tar the new baseline |
| name="baseline-icount-$tag-$(date -u +'%Y%m%d%H%M')-${GITHUB_SHA:0:12}" |
| echo "BASELINE_NAME=$name" >>"$GITHUB_ENV" |
| tar cJf "$name.tar.xz" "$iai_home" |