Conversation

Is there a document somewhere that describes what optimizations PGO opens up? Like I imagine it can say "don't inline this, it doesn't get called" and "inline this, it gets called a bunch", but what else?
1
2
Replying to
It provides branch metadata so it knows how to order branches or add hints for better branch prediction. Can also decide when to use cmov, etc. that way. Since it has metadata on function call sites, callees and branches it can also split out functions into hit/cold regions, etc.
2
Replying to
Is there a doc with all of this? I actually don't even know how code tells a branch predictor "this is the likely branch", although I know that gcc had a 'likely' builtin iirc. I see you mentioned a builtin, I'll check that out too.
1
Replying to
Yes, since it turns into a branch instruction where one path falls through and the other jumps somewhere. If it jumps up to a block above, it looks like a loop. If it jumps down, that looks like a jump to a cold path so the fall through looks hotter. It's just implicit hints.
1
1
Replying to and
Also, it can decide when to use a condition move (CMOV) instead of a branch, etc. Sometimes it might make sense to generate code with a branch or without a branch depending on probability. And of course, inlining, ordering, grouping, how much it optimizes for perf vs. size.
1
Replying to and
It can ramp up unrolling, vectorization, inlining, etc. for hot cold and not only avoid it but heavily optimize cold code for size, etc. LLVM barely does some of these things, but it could, and is getting better. It's really not as smart as you would probably expect it to be.
1
Show replies
Replying to
Got it, that makes sense, I'd never heard of a "tell the branch predictor this" but I can totally see how a compiler would go "branch predictors are gonna see this code and make these choices"