Implement AOT static PGO (#2243)
LLVM PGO (Profile-Guided Optimization) allows the compiler to better optimize code
for how it actually runs. This PR implements the AOT static PGO, and is tested on
Linux x86-64 and x86-32. The basic steps are:
1. Use `wamrc --enable-llvm-pgo -o <aot_file_of_pgo> <wasm_file>`
to generate an instrumented aot file.
2. Compile iwasm with `cmake -DWAMR_BUILD_STATIC_PGO=1` and run
`iwasm --gen-prof-file=<raw_profile_file> <aot_file_of_pgo>`
to generate the raw profile file.
3. Run `llvm-profdata merge -output=<profile_file> <raw_profile_file>`
to merge the raw profile file into the profile file.
4. Run `wamrc --use-prof-file=<profile_file> -o <aot_file> <wasm_file>`
to generate the optimized aot file.
5. Run the optimized aot_file: `iwasm <aot_file>`.
The test scripts are also added for each benchmark, run `test_pgo.sh` under
each benchmark's folder to test the AOT static pgo.
This commit is contained in:
@ -1670,6 +1670,12 @@ aot_create_comp_context(const AOTCompData *comp_data, aot_comp_option_t option)
|
||||
if (option->disable_llvm_lto)
|
||||
comp_ctx->disable_llvm_lto = true;
|
||||
|
||||
if (option->enable_llvm_pgo)
|
||||
comp_ctx->enable_llvm_pgo = true;
|
||||
|
||||
if (option->use_prof_file)
|
||||
comp_ctx->use_prof_file = option->use_prof_file;
|
||||
|
||||
if (option->enable_stack_estimation)
|
||||
comp_ctx->enable_stack_estimation = true;
|
||||
|
||||
@ -2829,3 +2835,23 @@ aot_load_const_from_table(AOTCompContext *comp_ctx, LLVMValueRef base,
|
||||
(void)const_type;
|
||||
return const_value;
|
||||
}
|
||||
|
||||
bool
|
||||
aot_set_cond_br_weights(AOTCompContext *comp_ctx, LLVMValueRef cond_br,
|
||||
int32 weights_true, int32 weights_false)
|
||||
{
|
||||
LLVMMetadataRef md_nodes[3], meta_data;
|
||||
LLVMValueRef meta_data_as_value;
|
||||
|
||||
md_nodes[0] = LLVMMDStringInContext2(comp_ctx->context, "branch_weights",
|
||||
strlen("branch_weights"));
|
||||
md_nodes[1] = LLVMValueAsMetadata(I32_CONST(weights_true));
|
||||
md_nodes[2] = LLVMValueAsMetadata(I32_CONST(weights_false));
|
||||
|
||||
meta_data = LLVMMDNodeInContext2(comp_ctx->context, md_nodes, 3);
|
||||
meta_data_as_value = LLVMMetadataAsValue(comp_ctx->context, meta_data);
|
||||
|
||||
LLVMSetMetadata(cond_br, 2, meta_data_as_value);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user