[llvm] 312932a - [globalisel][docs] Add KnownBits Analysis documentation
Daniel Sanders via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 5 09:57:00 PST 2019
Author: Daniel Sanders
Date: 2019-11-05T09:55:33-08:00
New Revision: 312932a33463c6636e2217556400351bdec9d8cf
URL: https://github.com/llvm/llvm-project/commit/312932a33463c6636e2217556400351bdec9d8cf
DIFF: https://github.com/llvm/llvm-project/commit/312932a33463c6636e2217556400351bdec9d8cf.diff
LOG: [globalisel][docs] Add KnownBits Analysis documentation
Summary:
This is largely based off of the slides from the keynote
Depends on D69545
Reviewers: volkan, rovka, arsenm
Subscribers: wdng, arphaman, Petar.Avramovic, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D69644
Added:
llvm/docs/GlobalISel/KnownBits.rst
Modified:
llvm/docs/GlobalISel/index.rst
Removed:
################################################################################
diff --git a/llvm/docs/GlobalISel/KnownBits.rst b/llvm/docs/GlobalISel/KnownBits.rst
new file mode 100644
index 000000000000..49989f9c9c69
--- /dev/null
+++ b/llvm/docs/GlobalISel/KnownBits.rst
@@ -0,0 +1,100 @@
+Known Bits Analysis
+===================
+
+The Known Bits Analysis pass makes information about the known values of bits
+available to other passes to enable transformations like those in the examples
+below. The information is lazily computed so you should only pay for what you
+use.
+
+Examples
+--------
+
+A simple example is that transforming::
+
+ a + 1
+
+into::
+
+ a | 1
+
+is only valid when the addition doesn't carry. In other words it's only valid
+if ``a & 1`` is zero.
+
+Another example is:
+
+.. code-block:: none
+
+ %1:(s32) = G_CONSTANT i32 0xFF0
+ %2:(s32) = G_AND %0, %1
+ %3:(s32) = G_CONSTANT i32 0x0FF
+ %4:(s32) = G_AND %2, %3
+
+We can use the constants and the definition of ``G_AND`` to determine the known
+bits:
+
+.. code-block:: none
+
+ ; %0 = 0x????????
+ %1:(s32) = G_CONSTANT i32 0xFF0 ; %1 = 0x00000FF0
+ %2:(s32) = G_AND %0, %1 ; %2 = 0x00000??0
+ %3:(s32) = G_CONSTANT i32 0x0FF ; %3 = 0x000000FF
+ %4:(s32) = G_AND %2, %3 ; %4 = 0x000000?0
+
+and then use this to simplify the expression:
+
+.. code-block:: none
+
+ ; %0 = 0x????????
+ %5:(s32) = G_CONSTANT i32 0x0F0 ; %5 = 0x00000FF0
+ %4:(s32) = G_AND %0, %5 ; %4 = 0x000000?0
+
+Note that ``%4`` still has the same known bits as before the transformation.
+Many transformations share this property. The main exception being when the
+transform causes undefined bits to become defined to either zero, one, or
+defined but unknown.
+
+Usage
+-----
+
+To use Known Bits Analysis in a pass, first include the header and register the
+dependency with ``INITIALIZE_PASS_DEPENDENCY``.
+
+.. code-block:: c++
+
+ #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
+
+ ...
+
+ INITIALIZE_PASS_BEGIN(...)
+ INITIALIZE_PASS_DEPENDENCY(GISelKnownBitsAnalysis)
+ INITIALIZE_PASS_END(...)
+
+and require the pass in ``getAnalysisUsage``.
+
+.. code-block:: c++
+
+ void MyPass::getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.addRequired<GISelKnownBitsAnalysis>();
+ // Optional: If your pass preserves known bits analysis (many do) then
+ // indicate that it's preserved for re-use by another pass here.
+ AU.addPreserved<GISelKnownBitsAnalysis>();
+ }
+
+Then it's just a matter of fetching the analysis and using it:
+
+.. code-block:: c++
+
+ bool MyPass::runOnMachineFunction(MachineFunction &MF) {
+ ...
+ GISelKnownBits &KB = getAnalysis<GISelKnownBitsAnalysis>().get(MF);
+ ...
+ MachineInstr *MI = ...;
+ KnownBits Known = KB->getKnownBits(MI->getOperand(0).getReg());
+ if (Known.Zeros & 1) {
+ // Bit 0 is known to be zero
+ }
+ ...
+ }
+
+There are many more API's beyond ``getKnownBits()``. See the `API reference
+<http://llvm.org/doxygen>`_ for more information
diff --git a/llvm/docs/GlobalISel/index.rst b/llvm/docs/GlobalISel/index.rst
index 27964614a653..2a3d0ca39b62 100644
--- a/llvm/docs/GlobalISel/index.rst
+++ b/llvm/docs/GlobalISel/index.rst
@@ -63,6 +63,7 @@ More information on specific passes can be found in the following sections:
Legalizer
RegBankSelect
InstructionSelect
+ KnownBits
.. _progress:
More information about the llvm-commits
mailing list