| # AArch64 Optimization and Flags Status |
| |
| ## Overview |
| |
| This page summarizes default-off BOLT optimization flags that users may |
| explicitly enable when optimizing AArch64 binaries. |
| |
| BOLT is to be used with binaries linked with |
| relocations (`--emit-relocs` or `-Wl,-q`) and representative profile data. |
| |
| ## Main Code-Layout Optimizations |
| |
| The following code-layout optimizations are typically the first options to |
| consider when optimizing AArch64 binaries with representative profile data. |
| They typically provide the largest performance gains among BOLT optimizations. |
| |
| :::{list-table} |
| :header-rows: 1 |
| :widths: 34 42 |
| :align: left |
| |
| * - Flag |
| - Optimization |
| * - `--reorder-functions=exec-count|hfsort|cdsort|pettis-hansen|random|user` |
| `--function-order=<file>` |
| - Reorder functions |
| * - `--reorder-blocks=normal|ext-tsp|cache|branch-predictor|reverse|cluster-shuffle` |
| - Reorder basic blocks |
| * - `--split-functions` |
| `--split-strategy=profile2|random2|randomN|all` |
| `--split-all-cold` |
| `--split-eh` |
| - Split hot and cold code |
| ::: |
| |
| ## Other Supported Optimizations |
| |
| The following optimizations are also supported for AArch64. |
| |
| :::{list-table} |
| :header-rows: 1 |
| :widths: 34 42 |
| :align: left |
| |
| * - Flag |
| - Optimization |
| * - `--align-blocks` |
| `--block-alignment=<uint>` |
| - Align basic blocks |
| * - `--tail-duplication=aggressive|moderate|cache` |
| - Duplicate branch tails |
| * - `--peepholes=double-jumps|tailcall-traps|useless-branches|all` |
| - Run peephole optimizations |
| * - `--inline-all` |
| `--inline-small-functions` |
| Related options: |
| `--inline-ap` |
| `--inline-limit=<uint>` |
| `--inline-small-functions-bytes=<uint>` |
| - Inline functions |
| * - `--icf=safe|all` |
| - Fold identical functions |
| ::: |
| |
| ## Supported Flags With Limitations |
| |
| The following flags are implemented for AArch64, but require specific runtime |
| or option conditions. Enabling them without the required conditions may report |
| an error or perform no transformation. |
| |
| :::{list-table} |
| :header-rows: 1 |
| :widths: 30 28 44 |
| :align: left |
| |
| * - Flag |
| - Optimization |
| - Notes |
| * - `--inline-memcpy` |
| - Inline fixed-size `memcpy` calls |
| - Only applies when the copy size is a known constant; AArch64 skips sizes over 64 bytes. |
| * - `--plt=hot|all` |
| - Optimize PLT calls |
| - Requires immediate binding. If BOLT cannot update the binary, relink with `-znow`. |
| * - `--hugify` |
| - Place hot code on huge pages |
| - Applies to binaries with a recognized entry point; skipped when `--instrument` is used. |
| * - `--reorder-data=<section1,section2,...>` |
| `--reorder-data-algo=count|funcs` |
| - Reorder data sections |
| - `move`, `split` and `aggressive` disable data reordering. |
| * - `--split-strategy=cdsplit` |
| - Split functions using cache-directed splitting |
| - Requires `--compact-code-model` on AArch64. |
| ::: |
| |
| ## Unsupported Flags |
| |
| The following flags are not available for AArch64. `Not applicable to |
| AArch64` means the optimization targets architectural features or mechanisms |
| that do not apply to AArch64. `Not implemented for AArch64` means the |
| optimization could be relevant, but is not currently implemented for this |
| target. |
| |
| :::{list-table} |
| :header-rows: 1 |
| :widths: 30 28 42 |
| :align: left |
| |
| * - Flag |
| - Optimization |
| - Notes |
| * - `--jt-footprint-reduction` |
| - Reduce jump-table footprint |
| - Not implemented for AArch64. |
| * - `--three-way-branch` |
| - Reorder three-way branches |
| - Not implemented for AArch64. |
| * - `--simplify-rodata-loads` |
| - Replace read-only data loads with constants |
| - Not implemented for AArch64. |
| * - `--frame-opt=hot|all` |
| - Optimize stack-frame accesses |
| - Not implemented for AArch64. |
| * - `--indirect-call-promotion=calls|jump-tables|all` |
| - Promote indirect calls |
| - Not implemented for AArch64. |
| * - `--memcpy1-spec=<func1,func2:cs1:cs2,...>` |
| - Specialize one-byte `memcpy` calls |
| - Not implemented for AArch64. |
| * - `--reg-reassign` |
| - Reassign registers to reduce encoding size |
| - Not applicable to AArch64. |
| * - `--cmov-conversion` |
| - Convert branches to conditional moves |
| - Not applicable to AArch64. |
| * - `--stoke` |
| |
| `--stoke-out` |
| - Emit STOKE optimization data |
| - Not applicable to AArch64. |
| * - `--insert-retpolines` |
| - Insert retpolines |
| - Not applicable to AArch64. |
| ::: |