forked from OSchip/llvm-project
223 lines
4.9 KiB
ReStructuredText
223 lines
4.9 KiB
ReStructuredText
llvm-remark-size-diff - diff size remarks
|
|
=========================================
|
|
|
|
.. program:: llvm-remark-size-diff
|
|
|
|
SYNOPSIS
|
|
--------
|
|
|
|
:program:`llvm-remark-size-diff` [*options*] *file_a* *file_b* **--parser** *parser*
|
|
|
|
DESCRIPTION
|
|
-----------
|
|
|
|
:program:`llvm-remark-size-diff` diffs size
|
|
`remarks <https://llvm.org/docs/Remarks.html>`_ in two remark files: ``file_a``
|
|
and ``file_b``.
|
|
|
|
:program:`llvm-remark-size-diff` can be used to gain insight into which
|
|
functions were impacted the most by code generation changes.
|
|
|
|
In most common use-cases ``file_a`` and ``file_b`` will be remarks output by
|
|
compiling a **fixed source** with **differing compilers** or
|
|
**differing optimization settings**.
|
|
|
|
:program:`llvm-remark-size-diff` handles both
|
|
`YAML <https://llvm.org/docs/Remarks.html#yaml-remarks>`_ and
|
|
`bitstream <https://llvm.org/docs/Remarks.html#llvm-bitstream-remarks>`_
|
|
remarks.
|
|
|
|
OPTIONS
|
|
-------
|
|
|
|
.. option:: --parser=<yaml|bitstream>
|
|
|
|
Select the type of input remark parser. Required.
|
|
* ``yaml``: The tool will parse YAML remarks.
|
|
* ``bitstream``: The tool will parse bitstream remarks.
|
|
|
|
.. option:: --report-style=<human|json>
|
|
|
|
Output style.
|
|
* ``human``: Human-readable textual report. Default option.
|
|
* ``json``: JSON report.
|
|
|
|
.. option:: --pretty
|
|
|
|
Pretty-print JSON output. Optional.
|
|
|
|
If output is not set to JSON, this does nothing.
|
|
|
|
.. option:: -o=<file>
|
|
|
|
Output file for the report. Outputs to stdout by default.
|
|
|
|
HUMAN-READABLE OUTPUT
|
|
---------------------
|
|
|
|
The human-readable format for :program:`llvm-remark-size-diff` is composed of
|
|
two sections:
|
|
|
|
* Per-function changes.
|
|
* A high-level summary of all changes.
|
|
|
|
Changed Function Section
|
|
########################
|
|
|
|
Suppose you are comparing two remark files OLD and NEW.
|
|
|
|
For each function with a **changed instruction count** in OLD and NEW,
|
|
:program:`llvm-remark-size-diff` will emit a line like below:
|
|
|
|
::
|
|
|
|
(++|--|==) (>|<) function_name, N instrs, M stack B
|
|
|
|
A breakdown of the format is below:
|
|
|
|
``(++|--|==)``
|
|
Which of OLD and NEW the ``function_name`` is present in.
|
|
|
|
* ``++``: Only in NEW. ("Added")
|
|
* ``--``: Only in OLD. ("Removed")
|
|
* ``==``: In both.
|
|
|
|
``(>|<)``
|
|
Denotes if ``function_name`` has more instructions or fewer instructions in
|
|
the second file.
|
|
|
|
* ``>``: More instructions in second file than first file.
|
|
* ``<``: Fewer instructions in second file than in first file.
|
|
|
|
``function_name``
|
|
The name of the changed function.
|
|
|
|
``N instrs``
|
|
Second file instruction count - first file instruction count.
|
|
|
|
``M stack B``
|
|
Second file stack byte count - first file stack byte count.
|
|
|
|
Summary Section
|
|
###############
|
|
|
|
:program:`llvm-remark-size-diff` will output a high-level summary after
|
|
printing all changed functions.
|
|
|
|
::
|
|
|
|
instruction count: N (inst_pct_change%)
|
|
stack byte usage: M (sb_pct_change%)
|
|
|
|
``N``
|
|
Sum of all instruction count changes between the second and first file.
|
|
|
|
``inst_pct_change%``
|
|
Percent increase or decrease in instruction count between the second and first
|
|
file.
|
|
|
|
``M``
|
|
Sum of all stack byte count changes between the second and first file.
|
|
|
|
``sb_pct_change%``
|
|
Percent increase or decrease in stack byte usage between the second and first
|
|
file.
|
|
|
|
JSON OUTPUT
|
|
-----------
|
|
|
|
High-Level view
|
|
###############
|
|
|
|
Suppose we are comparing two files, OLD and NEW.
|
|
|
|
:program:`llvm-remark-size-diff` will output JSON as follows.
|
|
|
|
::
|
|
|
|
"Files": [
|
|
"A": "path/to/OLD",
|
|
"B": "path/to/NEW"
|
|
]
|
|
|
|
"InBoth": [
|
|
...
|
|
],
|
|
|
|
"OnlyInA": [
|
|
...
|
|
],
|
|
|
|
"OnlyInB": [
|
|
...
|
|
]
|
|
|
|
|
|
``Files``
|
|
Original paths to remark files.
|
|
|
|
* ``A``: Path to the first file.
|
|
* ``B``: Path to the second file.
|
|
|
|
``InBoth``
|
|
Functions present in both files.
|
|
|
|
``OnlyInA``
|
|
Functions only present in the first file.
|
|
|
|
``OnlyInB``
|
|
Functions only present in the second file.
|
|
|
|
Function JSON
|
|
#############
|
|
|
|
The ``InBoth``, ``OnlyInA``, and ``OnlyInB`` sections contain size information
|
|
for each function in the input remark files.
|
|
|
|
::
|
|
|
|
{
|
|
"FunctionName" : "function_name"
|
|
"InstCount": [
|
|
INST_COUNT_A,
|
|
INST_COUNT_B
|
|
],
|
|
"StackSize": [
|
|
STACK_BYTES_A,
|
|
STACK_BYTES_B
|
|
],
|
|
}
|
|
|
|
``FunctionName``
|
|
Name of the function.
|
|
|
|
``InstCount``
|
|
Instruction counts for the function.
|
|
|
|
* ``INST_COUNT_A``: Instruction count in OLD.
|
|
* ``INST_COUNT_B``: Instruction count in NEW.
|
|
|
|
``StackSize``
|
|
Stack byte counts for the function.
|
|
|
|
* ``STACK_BYTES_A``: Stack bytes in OLD.
|
|
* ``STACK_BYTES_B``: Stack bytes in NEW.
|
|
|
|
Computing Diffs From Function JSON
|
|
**********************************
|
|
|
|
Function JSON does not contain the diffs. Tools consuming JSON output from
|
|
:program:`llvm-remark-size-diff` are responsible for computing the diffs
|
|
separately.
|
|
|
|
**To compute the diffs:**
|
|
|
|
* Instruction count diff: ``INST_COUNT_B - INST_COUNT_A``
|
|
* Stack byte count diff: ``STACK_BYTES_B - STACK_BYTES_A``
|
|
|
|
EXIT STATUS
|
|
-----------
|
|
|
|
:program:`llvm-remark-size-diff` returns 0 on success, and a non-zero value
|
|
otherwise.
|