diff --git a/src/ci/pgo.sh b/src/ci/pgo.sh index eaf92b033a1a8..88a03c05d9fe2 100755 --- a/src/ci/pgo.sh +++ b/src/ci/pgo.sh @@ -2,6 +2,40 @@ set -euxo pipefail +# Compile several crates to gather execution PGO profiles. +# Arg0 => builds (Debug, Opt) +# Arg1 => runs (Full, IncrFull, All) +# Arg2 => crates (syn, cargo, ...) +gather_profiles () { + cd /checkout/obj + + # Compile libcore, both in opt-level=0 and opt-level=3 + RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST/stage2/bin/rustc \ + --edition=2021 --crate-type=lib ../library/core/src/lib.rs + RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST/stage2/bin/rustc \ + --edition=2021 --crate-type=lib -Copt-level=3 ../library/core/src/lib.rs + + cd rustc-perf + + # Run rustc-perf benchmarks + # Benchmark using profile_local with eprintln, which essentially just means + # don't actually benchmark -- just make sure we run rustc a bunch of times. + RUST_LOG=collector=debug \ + RUSTC=/checkout/obj/build/$PGO_HOST/stage0/bin/rustc \ + RUSTC_BOOTSTRAP=1 \ + /checkout/obj/build/$PGO_HOST/stage0/bin/cargo run -p collector --bin collector -- \ + profile_local \ + eprintln \ + /checkout/obj/build/$PGO_HOST/stage2/bin/rustc \ + Test \ + --builds $1 \ + --cargo /checkout/obj/build/$PGO_HOST/stage0/bin/cargo \ + --runs $2 \ + --include $3 + + cd /checkout/obj +} + rm -rf /tmp/rustc-pgo # We collect LLVM profiling information and rustc profiling information in @@ -19,6 +53,19 @@ RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST/stage2/bin/rustc \ RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST/stage2/bin/rustc \ --edition=2021 --crate-type=lib -Copt-level=3 ../library/core/src/lib.rs +# Compile rustc perf +cp -r /tmp/rustc-perf ./ +chown -R $(whoami): ./rustc-perf +cd rustc-perf + +# Build the collector ahead of time, which is needed to make sure the rustc-fake +# binary used by the collector is present. +RUSTC=/checkout/obj/build/$PGO_HOST/stage0/bin/rustc \ +RUSTC_BOOTSTRAP=1 \ +/checkout/obj/build/$PGO_HOST/stage0/bin/cargo build -p collector + +gather_profiles "Debug,Opt" "Full" "syn,cargo,serde,ripgrep,regex,clap-rs,hyper-2" + # Merge the profile data we gathered for LLVM # Note that this uses the profdata from the clang we used to build LLVM, # which likely has a different version than our in-tree clang. @@ -36,38 +83,8 @@ python3 ../x.py build --target=$PGO_HOST --host=$PGO_HOST \ --stage 2 library/std \ --rust-profile-generate=/tmp/rustc-pgo -# Profile libcore compilation in opt-level=0 and opt-level=3 -RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST/stage2/bin/rustc \ - --edition=2021 --crate-type=lib ../library/core/src/lib.rs -RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST/stage2/bin/rustc \ - --edition=2021 --crate-type=lib -Copt-level=3 ../library/core/src/lib.rs - -cp -r /tmp/rustc-perf ./ -chown -R $(whoami): ./rustc-perf -cd rustc-perf - -# Build the collector ahead of time, which is needed to make sure the rustc-fake -# binary used by the collector is present. -RUSTC=/checkout/obj/build/$PGO_HOST/stage0/bin/rustc \ -RUSTC_BOOTSTRAP=1 \ -/checkout/obj/build/$PGO_HOST/stage0/bin/cargo build -p collector - -# benchmark using profile_local with eprintln, which essentially just means -# don't actually benchmark -- just make sure we run rustc a bunch of times. -RUST_LOG=collector=debug \ -RUSTC=/checkout/obj/build/$PGO_HOST/stage0/bin/rustc \ -RUSTC_BOOTSTRAP=1 \ -/checkout/obj/build/$PGO_HOST/stage0/bin/cargo run -p collector --bin collector -- \ - profile_local \ - eprintln \ - /checkout/obj/build/$PGO_HOST/stage2/bin/rustc \ - Test \ - --builds Check,Debug,Opt \ - --cargo /checkout/obj/build/$PGO_HOST/stage0/bin/cargo \ - --runs All \ - --include externs,ctfe-stress-4,inflate,cargo,token-stream-stress,match-stress-enum - -cd /checkout/obj +gather_profiles "Check,Debug,Opt" "All" \ + "externs,ctfe-stress-4,inflate,cargo,token-stream-stress,match-stress-enum" # Merge the profile data we gathered ./build/$PGO_HOST/llvm/bin/llvm-profdata \