We were chatting on IRC about the problem Simon found with IPCP getting confused because during -fwhopr builds, the inliner always runs first, so when LTRANS starts up, we run all the IPA passes before applying inlining decisions. This confuses IPCP.
For lto1 we have 3 different modes of operation: LTO (-flto) This does the usual link-time operations. All the IL files are loaded in memory (callgraph and bodies) and then cgraph_optimize() is invoked to do IPA, GIMPLE, RTL optimizations and generate final code. WPA (-fwpa) This is stage 2 of WHOPR. We load the whole callgraph sans the function bodies and run all the IPA passes capable of operating with summaries only (currently, the inliner). We then partition the callgraph into separate sub-graphs which are written out to new IL files. LTRANS (-fltran) This is stage 3 of WHOPR. We execute as many LTRANS processes as IL files we wrote out during WPA. Each of these will read a single IL file and compile it exactly as LTO. After this stage, all the output files are ready for final linking. The problem here is that LTRANS will run the standard pipeline over a callgraph that hasn't been "settled" (i.e., no inlining decisions have been applied yet). Perhaps the first thing LTRANS should do is just call execute_all_ipa_transforms() and then proceed with the regular pipeline. Honza, these three stages are all controlled by lto.c:lto_main. Diego.