<div dir="ltr"><div><div><div>Thanks for the clear answers.<br><br></div>At the moment, my only request would be to also make sure that profile lib works with MSVC (3.7 needed small patching, trunk is fine now).<br><br>Thanks!<br></div></div>  Johan<br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Dec 18, 2015 at 7:49 PM, Xinliang David Li <span dir="ltr"><<a href="mailto:davidxl@google.com" target="_blank">davidxl@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Fri, Dec 18, 2015 at 5:37 AM, Johan Engelen <<a href="mailto:jbc.engelen@gmail.com">jbc.engelen@gmail.com</a>> wrote:<br>
> Hi all,<br>
>   I am working on adding PGO to LDC (LLVM D Compiler). The current<br>
> implementation<br>
> 1) uses LLVM's InstrProf pass to generate an instrumented executable<br>
> 2) links to compiler-rt/lib/profile for the runtime functionality to write a<br>
> raw profile data file<br>
> 3) uses llvm-profdata to merge profile data and convert from profraw to<br>
> profdata format<br>
> 4) uses llvm::IndexedInstrProfReader to read-in the profdata file for the<br>
> 2nd PGO compile pass<br>
><br>
> This all works well with LLVM 3.7. While testing this with LLVM trunk, I run<br>
> into a version compatibility problem between different versions of LLVM: I<br>
> made a local copy of the compiler-rt/lib/profile release_37 version (with a<br>
> few fixes for MSVC) and so steps 1,2, and 4 use LLVM trunk, but step 2 uses<br>
> an older version of compiler-rt/lib/profile. Apparently, trunk's<br>
<br>
</span>Runtime and InstrProf pass have to be in sync. You can not use 3.7<br>
version of runtime with trunk version of 1).<br>
<br>
Perhaps you want to explain more about your use cases? If you want to<br>
use 3.7 compiler/runtime to produce profile to be used by trunk<br>
compiler -- that is doable.<br>
<br>
1) instrument the code with 3.7 compiler and link with 3.7 runtime<br>
2) run and dump the profile<br>
3) use 3.7 llvm-profdata tool to do a merge and generate indexed format profile<br>
4) use that profile with the trunk compiler<br>
<br>
However, the other direction does not work -- you can not expect older<br>
version of compiler to consume indexed format profile of the new<br>
compiler.<br>
<span class=""><br>
<br>
> llvm-profdata cannot read raw profile data files generated by compiler-rt<br>
> 3.7. Is this intended?<br>
<br>
</span>yes. New version of raw profile reader does not understand old version<br>
of raw profile data. You need to use older version of llvm-profdata to<br>
produce old version of indexed format, and then use new version of<br>
llvm-profdata to convert the indexed format into new version. Here is<br>
flow:<br>
<br>
1) llvm-profdata_3.7 merge -o my_profdata_old.profdata my_profdata_old.profraw<br>
<br>
At this point, my_profdata_old.profdata *can* be consumed by trunk<br>
version of compiler already, but if you want to convert it to new<br>
version of indexed format, do this:<br>
<br>
2) llvm-profdata_trunk merge -o my_profdata_new.profdata<br>
my_profdata_old.profdata<br>
<br>
Now my_profdata_new.profdata is in shiny new version (indexed).<br>
<span class=""><br>
<br>
 Is llvm-profdata's output also incompatible between<br>
> different versions of LLVM (InstrProfWriter/Reader are not meant to be<br>
> compatible across LLVM versions) ?<br>
<br>
</span>The merge output format (indexed format) is backward compatible as<br>
explained by Vedant.<br>
<span class=""><br>
><br>
> LDC is currently compatible with LLVM 3.5 up to trunk. To support PGO for<br>
> multiple LLVM versions (>= 3.7), I think that we will need to have a copy of<br>
> compiler-rt/lib/profile for each version of LLVM >= 3.7. We also need to<br>
> have a copy of llvm-profdata for each version of LLVM >= 3.7. We already do<br>
> this with the FileCheck utility and will not be a big problem.<br>
><br>
<br>
</span>yes -- see above. Remember compiler instrumentation and supporting<br>
runtime must be in sync.<br>
<br>
thanks,<br>
<br>
David<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
> Does that make sense? What do you advise?<br>
><br>
> Thanks very much for your comments,<br>
>   Johan<br>
><br>
</div></div></blockquote></div><br></div>