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. :::