On Mon, Jan 11, 2021 at 4:38 PM Bill Wendling <morbo@xxxxxxxxxx> wrote: > > On Mon, Jan 11, 2021 at 12:31 PM Fangrui Song <maskray@xxxxxxxxxx> wrote: > > On 2021-01-11, Bill Wendling wrote: > > >On Mon, Jan 11, 2021 at 12:12 PM Fangrui Song <maskray@xxxxxxxxxx> wrote: > > >> > > >> On 2021-01-11, 'Bill Wendling' via Clang Built Linux wrote: > > >> >From: Sami Tolvanen <samitolvanen@xxxxxxxxxx> > > >> > > > >> >Enable the use of clang's Profile-Guided Optimization[1]. To generate a > > >> >profile, the kernel is instrumented with PGO counters, a representative > > >> >workload is run, and the raw profile data is collected from > > >> >/sys/kernel/debug/pgo/profraw. > > >> > > > >> >The raw profile data must be processed by clang's "llvm-profdata" tool before > > >> >it can be used during recompilation: > > >> > > > >> > $ cp /sys/kernel/debug/pgo/profraw vmlinux.profraw > > >> > $ llvm-profdata merge --output=vmlinux.profdata vmlinux.profraw > > >> > > > >> >Multiple raw profiles may be merged during this step. > > >> > > > >> >The data can be used either by the compiler if LTO isn't enabled: > > >> > > > >> > ... -fprofile-use=vmlinux.profdata ... > > >> > > > >> >or by LLD if LTO is enabled: > > >> > > > >> > ... -lto-cs-profile-file=vmlinux.profdata ... > > >> > > >> This LLD option does not exist. > > >> LLD does have some `--lto-*` options but the `-lto-*` form is not supported > > >> (it clashes with -l) https://reviews.llvm.org/D79371 > > >> > > >That's strange. I've been using that option for years now. :-) Is this > > >a recent change? > > > > The more frequently used options (specifyed by the clang driver) are > > -plugin-opt=... (options implemented by LLVMgold.so). > > `-lto-*` is rare. > > > > >> (There is an earlier -fprofile-instr-generate which does > > >> instrumentation in Clang, but the option does not have broad usage. > > >> It is used more for code coverage, not for optimization. > > >> Noticeably, it does not even implement the Kirchhoff's current law > > >> optimization) > > >> > > >Right. I've been told outside of this email that -fprofile-generate is > > >the prefered flag to use. > > > > > >> -fprofile-use= is used by both regular PGO and context-sensitive PGO (CSPGO). > > >> > > >> clang -flto=thin -fprofile-use= passes -plugin-opt=cs-profile-path= to the linker. > > >> For regular PGO, this option is effectively a no-op (confirmed with CSPGO main developer). > > >> > > >> So I think the "or by LLD if LTO is enabled:" part should be removed. > > > > > >But what if you specify the linking step explicitly? Linux doesn't > > >call "clang" when linking, but "ld.lld". > > > > Regular PGO+LTO does not need -plugin-opt=cs-profile-path= > > CSPGO+LTO needs it. > > Because -fprofile-use= may be used by both, Clang driver adds it. > > CSPGO is relevant in this this patch, so the linker option does not need to be mentioned. > > I'm still a bit confused. Are you saying that when clang uses > `-flto=thin -fprofile-use=foo` that the profile file "foo" is embedded > into the bitcode file so that when the linker's run it'll be used? > > This is the workflow: > > clang ... -fprofile-use=vmlinux.profdata ... -c -o foo.o foo.c > clang ... -fprofile-use=vmlinux.profdata ... -c -o bar.o bar.c > ld.lld ... <output file> foo.o bar.o > > Are you saying that we don't need to have > "-plugin-opt=cs-profile-path=vmlinux.profdata" on the "ld.lld ..." > line? > > -bw The backend compile step -flto=thin -fprofile-use=foo has all the information. -plugin-opt=cs-profile-path=vmlinux.profdata is not needed for regular PGO.