|  | =================== | 
|  | Misexpect | 
|  | =================== | 
|  | .. contents:: | 
|  |  | 
|  | .. toctree:: | 
|  | :maxdepth: 1 | 
|  |  | 
|  | When developers use ``llvm.expect`` intrinsics, i.e., through use of | 
|  | ``__builtin_expect(...)``, they are trying to communicate how their code is | 
|  | expected to behave at runtime to the optimizer. These annotations, however, can | 
|  | be incorrect for a variety of reasons: changes to the code base invalidate them | 
|  | silently, the developer mis-annotated them (e.g., using ``LIKELY`` instead of | 
|  | ``UNLIKELY``), or perhaps they assumed something incorrectly when they wrote | 
|  | the annotation. Regardless of why, it is useful to detect these situations so | 
|  | that the optimizer can make more useful decisions about the code. | 
|  |  | 
|  | MisExpect diagnostics are intended to help developers identify and address | 
|  | these situations, by comparing the branch weights added by the ``llvm.expect`` | 
|  | intrinsic to those collected through profiling. Whenever these values are | 
|  | mismatched, a diagnostic is surfaced to the user. Details on how the checks | 
|  | operate in the LLVM backed can be found in LLVM's documentation. | 
|  |  | 
|  | By default MisExpect checking is quite strict, because the use of the | 
|  | ``llvm.expect`` intrinsic is designed for specialized cases, where the outcome | 
|  | of a condition is severely skewed. As a result, the optimizer can be extremely | 
|  | aggressive, which can result in performance degradation if the outcome is less | 
|  | predictable than the annotation suggests. Even when the annotation is correct | 
|  | 90% of the time, it may be beneficial to either remove the annotation or to use | 
|  | a different intrinsic that can communicate the probability more directly. | 
|  |  | 
|  | Because this may be too strict, MisExpect diagnostics are not enabled by | 
|  | default, and support an additional flag to tolerate some deviation from the | 
|  | exact thresholds. The ``-fdiagnostic-misexpect-tolerance=N`` accepts | 
|  | deviations when comparing branch weights within ``N%`` of the expected values. | 
|  | So passing ``-fdiagnostic-misexpect-tolerance=5`` will not report diagnostic messages | 
|  | if the branch weight from the profile is within 5% of the weight added by | 
|  | the ``llvm.expect`` intrinsic. | 
|  |  | 
|  | MisExpect diagnostics are also available in the form of optimization remarks, | 
|  | which can be serialized and processed through the ``opt-viewer.py`` | 
|  | scripts in LLVM. | 
|  |  | 
|  | .. option:: -Rpass=misexpect | 
|  |  | 
|  | Enables optimization remarks for misexpect when profiling data conflicts with | 
|  | use of ``llvm.expect`` intrinsics. | 
|  |  | 
|  |  | 
|  | .. option:: -Wmisexpect | 
|  |  | 
|  | Enables misexpect warnings when profiling data conflicts with use of | 
|  | ``llvm.expect`` intrinsics. | 
|  |  | 
|  | .. option:: -fdiagnostic-misexpect-tolerance=N | 
|  |  | 
|  | Relaxes misexpect checking to tolerate profiling values within N% of the | 
|  | expected branch weight. e.g., a value of ``N=5`` allows misexpect to check against | 
|  | ``0.95 * Threshold`` | 
|  |  | 
|  | LLVM supports 4 types of profile formats: Frontend, IR, CS-IR, and | 
|  | Sampling. MisExpect Diagnostics are compatible with all Profiling formats. | 
|  |  | 
|  | +----------------+--------------------------------------------------------------------------------------+ | 
|  | | Profile Type   | Description                                                                          | | 
|  | +================+======================================================================================+ | 
|  | | Frontend       | Profiling instrumentation added during compilation by the frontend, i.e. ``clang``   | | 
|  | +----------------+--------------------------------------------------------------------------------------+ | 
|  | | IR             | Profiling instrumentation added during by the LLVM backend                           | | 
|  | +----------------+--------------------------------------------------------------------------------------+ | 
|  | | CS-IR          | Context Sensitive IR based profiles                                                  | | 
|  | +----------------+--------------------------------------------------------------------------------------+ | 
|  | | Sampling       | Profiles collected through sampling with external tools, such as ``perf`` on Linux   | | 
|  | +----------------+--------------------------------------------------------------------------------------+ |