[all-commits] [llvm/llvm-project] 1518b2: [TypeProf][InstrFDO]Implement more efficient compa...
Mingming Liu via All-commits
all-commits at lists.llvm.org
Sat Jun 29 23:21:54 PDT 2024
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: 1518b260ce2cbd9286365709642dc749e542d683
https://github.com/llvm/llvm-project/commit/1518b260ce2cbd9286365709642dc749e542d683
Author: Mingming Liu <mingmingl at google.com>
Date: 2024-06-29 (Sat, 29 Jun 2024)
Changed paths:
M compiler-rt/test/profile/Linux/instrprof-vtable-value-prof.cpp
M llvm/include/llvm/Analysis/IndirectCallPromotionAnalysis.h
M llvm/include/llvm/Analysis/IndirectCallVisitor.h
M llvm/include/llvm/ProfileData/InstrProf.h
M llvm/lib/Analysis/IndirectCallPromotionAnalysis.cpp
M llvm/lib/ProfileData/InstrProf.cpp
M llvm/lib/Transforms/Instrumentation/IndirectCallPromotion.cpp
M llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp
M llvm/lib/Transforms/Utils/InlineFunction.cpp
M llvm/test/Transforms/Inline/update_invoke_prof.ll
M llvm/test/Transforms/Inline/update_value_profile.ll
A llvm/test/Transforms/PGOProfile/icp_vtable_cmp.ll
A llvm/test/Transforms/PGOProfile/icp_vtable_invoke.ll
A llvm/test/Transforms/PGOProfile/icp_vtable_tail_call.ll
Log Message:
-----------
[TypeProf][InstrFDO]Implement more efficient comparison sequence for indirect-call-promotion with vtable profiles. (#81442)
Clang's `-fwhole-program-vtables` is required for this optimization to
take place. If `-fwhole-program-vtables` is not enabled, this change is
no-op.
* Function-comparison (before):
```
%vtable = load ptr, ptr %obj
%vfn = getelementptr inbounds ptr, ptr %vtable, i64 1
%func = load ptr, ptr %vfn
%cond = icmp eq ptr %func, @callee
br i1 %cond, label bb1, label bb2:
bb1:
call @callee
bb2:
call %func
```
* VTable-comparison (after):
```
%vtable = load ptr, ptr %obj
%cond = icmp eq ptr %vtable, @vtable-address-point
br i1 %cond, label bb1, label bb2:
bb1:
call @callee
bb2:
%vfn = getelementptr inbounds ptr, ptr %vtable, i64 1
%func = load ptr, ptr %vfn
call %func
```
Key changes:
1. Find out virtual calls and the vtables they come from.
- The ICP relies on type intrinsic `llvm.type.test` to find out virtual
calls and the
compatible vtables, and relies on type metadata to find the address
point for comparison.
2. ICP pass does cost-benefit analysis and compares vtable only when the
number of vtables for a function candidate is within (option specified)
threshold.
3. Sink the function addressing and vtable load instruction to indirect
fallback.
- The sink helper functions are simplified versions of
`InstCombinerImpl::tryToSinkInstruction`. Currently debug intrinsics are
not handled. Ideally `InstCombinerImpl::tryToSinkInstructionDbgValues`
and `InstCombinerImpl::tryToSinkInstructionDbgVariableRecords` could be
moved into Transforms/Utils/Local.cpp (or another util cpp file) to
handle debug intrinsics when moving instructions across basic blocks.
4. Keep value profiles updated
1) Update vtable value profiles after inline
2) For either function-based comparison or vtable-based comparison,
update both vtable and indirect call value profiles.
To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications
More information about the All-commits
mailing list