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