[RISCV] Regenerate autogen test to remove spurious diff
[llvm-project.git] / llvm / docs / CommandGuide / llvm-remarkutil.rst
blob20f2b34ce008830fffffd4787ef8c8813b8284e5
1 llvm-remarkutil - Remark utility
2 ================================
4 .. program:: llvm-remarkutil
6 SYNOPSIS
7 --------
9 :program:`llvm-remarkutil` [*subcommmand*] [*options*]
11 DESCRIPTION
12 -----------
14 Utility for displaying information from, and converting between different
15 `remark <https://llvm.org/docs/Remarks.html>`_ formats.
17 Subcommands
18 -----------
20   * :ref:`bitstream2yaml_subcommand` - Reserialize bitstream remarks to YAML.
21   * :ref:`yaml2bitstream_subcommand` - Reserialize YAML remarks to bitstream.
22   * :ref:`instruction-count_subcommand` - Output function instruction counts.
23   * :ref:`annotation-count_subcommand` - Output remark type count from annotation remarks.
24   * :ref:`size-diff_subcommand` - Compute diff in size remarks.
26 .. _bitstream2yaml_subcommand:
28 bitstream2yaml
29 ~~~~~~~~~~~~~~
31 .. program:: llvm-remarkutil bitstream2yaml
33 USAGE: :program:`llvm-remarkutil` bitstream2yaml <input file> -o <output file>
35 Summary
36 ^^^^^^^
38 Takes a bitstream remark file as input, and reserializes that file as YAML.
40 .. _yaml2bitstream_subcommand:
42 yaml2bitstream
43 ~~~~~~~~~~~~~~
45 .. program:: llvm-remarkutil yaml2bitstream
47 USAGE: :program:`llvm-remarkutil` yaml2bitstream <input file> -o <output file>
49 Summary
50 ^^^^^^^
52 Takes a YAML remark file as input, and reserializes that file in the bitstream
53 format.
55 .. _instruction-count_subcommand:
57 instruction-count
58 ~~~~~~~~~~~~~~~~~
60 .. program:: llvm-remarkutil instruction-count
62 USAGE: :program:`llvm-remarkutil` instruction-count <input file> --parser=<bitstream|yaml> [--use-debug-loc] -o <output file>
64 Summary
65 ^^^^^^^
67 Outputs instruction count remarks for every function. Instruction count remarks
68 encode the number of instructions in a function at assembly printing time.
70 Instruction count remarks require asm-printer remarks.
72 CSV format is as follows:
75   Function,InstructionCount
76   foo,123
78 if `--use-debug-loc` is passed then the CSV will include the source path, line number and column.
81   Source,Function,InstructionCount
82   path:line:column,foo,3
84 .. _annotation-count_subcommand:
86 annotation-count
87 ~~~~~~~~~~~~~~~~~
89 .. program:: llvm-remarkutil annotation-count
91 USAGE: :program:`llvm-remarkutil` annotation-count <input file> --parser=<bitstream|yaml> --annotation-type=<type>  [--use-debug-loc] -o <output file>
93 Summary
94 ^^^^^^^
96 Outputs a count for annotation-type `<type>` remark for every function. The count expresses
97 the number of remark checks inserted at the function.
99 Annotation count remarks require AnnotationRemarksPass remarks.
101 CSV format is as follows:
104   Function,Count
105   foo,123
107 if `--use-debug-loc` is passed then the CSV will include the source path, line number and column.
110   Source,Function,Count
111   path:line:column,foo,3
113 .. _count_subcommand:
115 count
116 ~~~~~
118 ..program:: llvm-remarkutil count
120 USAGE: :program:`llvm-remarkutil` count [*options*] <input file>
122 Summary
123 ^^^^^^^
125 :program:`llvm-remarkutil count` counts `remarks <https://llvm.org/docs/Remarks.html>` based on specified properties.
126 By default the tool counts remarks based on how many occur in a source file or function or total for the generated remark file.
127 The tool also supports collecting count based on specific remark arguments. The specified arguments should have an integer value to be able to report a count.
129 The tool contains utilities to filter the remark count based on remark name, pass name, argument value and remark type.
130 OPTIONS
131 -------
133 .. option:: --parser=<yaml|bitstream>
135   Select the type of input remark parser. Required.
136   * ``yaml``: The tool will parse YAML remarks.
137   * ``bitstream``: The tool will parse bitstream remarks.
139 .. option:: --count-by<value>
140   Select option to collect remarks by.
141   * ``remark-name``: count how many individual remarks exist.
142   * ``arg``: count remarks based on specified arguments passed by --(r)args. The argument value must be a number.
144 .. option:: --group-by=<value>
145   group count of remarks by property.
146   * ``source``: Count will be collected per source path. Remarks with no debug location will not be counted.
147   * ``function``: Count is collected per function.
148   * ``function-with-loc``: Count is collected per function per source. Remarks with no debug location will not be counted.
149   * ``Total``: Report a count for the provided remark file.
151 .. option:: --args[=arguments]
152   If `count-by` is set to `arg` this flag can be used to collect from specified remark arguments represented as a comma separated string.
153   The arguments must have a numeral value to be able to count remarks by
155 .. option:: --rargs[=arguments]
156   If `count-by` is set to `arg` this flag can be used to collect from specified remark arguments using regular expression.
157   The arguments must have a numeral value to be able to count remarks by
159 .. option:: --pass-name[=<string>]
160   Filter count by pass name.
162 .. option:: --rpass-name[=<string>]
163   Filter count by pass name using regular expressions.
165 .. option:: --remark-name[=<string>]
166   Filter count by remark name.
168 .. option:: --rremark-name[=<string>]
169   Filter count by remark name using regular expressions.
171 .. option:: --filter-arg-by[=<string>]
172   Filter count by argument value.
174 .. option:: --rfilter-arg-by[=<string>]
175   Filter count by argument value using regular expressions.
177 .. option:: --remark-type=<value>
178   Filter remarks by type with the following options.
179   * ``unknown``
180   * ``passed``
181   * ``missed``
182   * ``analysis``
183   * ``analysis-fp-commute``
184   * ``analysis-aliasing``
185   * ``failure``
187 .. _size-diff_subcommand:
189 size-diff
190 ~~~~~~~~~
191 .. program:: llvm-remarkutil size-diff
193 USAGE: :program:`llvm-remarkutil` size-diff [*options*] *file_a* *file_b* **--parser** *parser*
195 Summary
196 ^^^^^^^
198 :program:`llvm-remarkutil size-diff` diffs size `remarks <https://llvm.org/docs/Remarks.html>`_ in two remark files: ``file_a``
199 and ``file_b``.
201 :program:`llvm-remarkutil size-diff` can be used to gain insight into which
202 functions were impacted the most by code generation changes.
204 In most common use-cases ``file_a`` and ``file_b`` will be remarks output by
205 compiling a **fixed source** with **differing compilers** or
206 **differing optimization settings**.
208 :program:`llvm-remarkutil size-diff` handles both
209 `YAML <https://llvm.org/docs/Remarks.html#yaml-remarks>`_ and
210 `bitstream <https://llvm.org/docs/Remarks.html#llvm-bitstream-remarks>`_
211 remarks.
213 OPTIONS
214 -------
216 .. option:: --parser=<yaml|bitstream>
218   Select the type of input remark parser. Required.
219   * ``yaml``: The tool will parse YAML remarks.
220   * ``bitstream``: The tool will parse bitstream remarks.
222 .. option:: --report-style=<human|json>
224   Output style.
225   * ``human``: Human-readable textual report. Default option.
226   * ``json``: JSON report.
228 .. option:: --pretty
230   Pretty-print JSON output. Optional.
232   If output is not set to JSON, this does nothing.
234 .. option:: -o=<file>
236   Output file for the report. Outputs to stdout by default.
238 HUMAN-READABLE OUTPUT
239 ---------------------
241 The human-readable format for :program:`llvm-remarkutil size-diff` is composed of
242 two sections:
244 * Per-function changes.
245 * A high-level summary of all changes.
247 Changed Function Section
248 ~~~~~~~~~~~~~~~~~~~~~~~~
250 Suppose you are comparing two remark files OLD and NEW.
252 For each function with a **changed instruction count** in OLD and NEW,
253 :program:`llvm-remarkutil size-diff` will emit a line like below:
257   (++|--|==) (>|<) function_name, N instrs, M stack B
259 A breakdown of the format is below:
261 ``(++|--|==)``
262   Which of OLD and NEW the ``function_name`` is present in.
264   * ``++``: Only in NEW. ("Added")
265   * ``--``: Only in OLD. ("Removed")
266   * ``==``: In both.
268 ``(>|<)``
269   Denotes if ``function_name`` has more instructions or fewer instructions in
270   the second file.
272   *  ``>``: More instructions in second file than first file.
273   *  ``<``: Fewer instructions in second file than in first file.
275 ``function_name``
276   The name of the changed function.
278 ``N instrs``
279   Second file instruction count - first file instruction count.
281 ``M stack B``
282   Second file stack byte count - first file stack byte count.
284 Summary Section
285 ~~~~~~~~~~~~~~~
287 :program:`llvm-remarkutil size-diff` will output a high-level summary after
288 printing all changed functions.
292   instruction count: N (inst_pct_change%)
293   stack byte usage: M (sb_pct_change%)
295 ``N``
296   Sum of all instruction count changes between the second and first file.
298 ``inst_pct_change%``
299   Percent increase or decrease in instruction count between the second and first
300   file.
302 ``M``
303   Sum of all stack byte count changes between the second and first file.
305 ``sb_pct_change%``
306   Percent increase or decrease in stack byte usage between the second and first
307   file.
309 JSON OUTPUT
310 -----------
312 High-Level view
313 ~~~~~~~~~~~~~~~
315 Suppose we are comparing two files, OLD and NEW.
317 :program:`llvm-remarkutil size-diff` will output JSON as follows.
321   "Files": [
322     "A": "path/to/OLD",
323     "B": "path/to/NEW"
324   ]
326   "InBoth": [
327     ...
328   ],
330   "OnlyInA": [
331     ...
332   ],
334   "OnlyInB": [
335     ...
336   ]
339 ``Files``
340   Original paths to remark files.
342   * ``A``: Path to the first file.
343   * ``B``: Path to the second file.
345 ``InBoth``
346   Functions present in both files.
348 ``OnlyInA``
349   Functions only present in the first file.
351 ``OnlyInB``
352   Functions only present in the second file.
354 Function JSON
355 ~~~~~~~~~~~~~
357 The ``InBoth``, ``OnlyInA``, and ``OnlyInB`` sections contain size information
358 for each function in the input remark files.
362   {
363     "FunctionName" : "function_name"
364     "InstCount": [
365         INST_COUNT_A,
366         INST_COUNT_B
367       ],
368     "StackSize": [
369         STACK_BYTES_A,
370         STACK_BYTES_B
371       ],
372   }
374 ``FunctionName``
375   Name of the function.
377 ``InstCount``
378   Instruction counts for the function.
380   * ``INST_COUNT_A``: Instruction count in OLD.
381   * ``INST_COUNT_B``: Instruction count in NEW.
383 ``StackSize``
384   Stack byte counts for the function.
386   * ``STACK_BYTES_A``: Stack bytes in OLD.
387   *  ``STACK_BYTES_B``: Stack bytes in NEW.
389 Computing Diffs From Function JSON
390 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
392 Function JSON does not contain the diffs. Tools consuming JSON output from
393 :program:`llvm-remarkutil size-diff` are responsible for computing the diffs
394 separately.
396 **To compute the diffs:**
398 * Instruction count diff: ``INST_COUNT_B - INST_COUNT_A``
399 * Stack byte count diff: ``STACK_BYTES_B - STACK_BYTES_A``
401 EXIT STATUS
402 -----------
404 :program:`llvm-remarkutil size-diff` returns 0 on success, and a non-zero value
405 otherwise.