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