Awesome! Thanks! Let's go a little bit into the transformation mechanics itself. I am somewhat familiar with LTO but I am always confused about the transformations scheduled during WPA.
Let's assume that: 1. we have the profiling pass, which profiles each argument in each callsite. 2. we are now running in the -fprofile-use so that means that we have access to the value profiles for each of the arguments 3. there's an IPA/LTO pass which creates edge summaries storing "likely" values for each of callsite/argument 4. we have a heuristic that let's us decide to some extent which subset of likely values will yield good results (heavily used and specialization is greatly beneficial if found) and run it during WPA. Then, what happens next? I know that the idea is to create some parameter tests at the callsite and call the respective parameter. The gap in my understanding is that at this point I am assuming we are in WPA and therefore have no function bodies to add these parameter tests. Would it be sufficient to do the following: 1. Store in optimization (edge) summaries the (argument position x value x specialized function version) 2. During LTRANS actually perform the transformation for the parameter test Or is there some other way? I am still working on understanding how ipa_make_edge_direct_to_target with speculative = true adds the edge and function test during WPA. Otherwise, if we go with the two steps above, the edges won't be visible to the rest of the IPA optimizations. I'll be reading the cgraph_edge::make_speculative and the rest of the infrastructure a bit more closely... Any help or direction is greatly appreciated. Thanks! -Erick