===================================== 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=`` - 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=`` - 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=`` | ``--inline-small-functions-bytes=`` - 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=`` | ``--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=`` - 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.