[globalisel][docs] Rewrite the IRTranslator documentation

Summary:
I haven't refreshed the Function Calls section as I don't feel I have
sufficient knowledge of that area. It would be appreciated if someone could
review that section.

Note: I'm aware that pygments doesn't support 'mir' as used in one of the
code-block directives. This currently emits a warning and I decided to
keep it to enable finding them later. Maybe we can teach pygments to
support it.

Depends on D69456

Reviewers: volkan, aditya_nandakumar

Subscribers: rovka, Petar.Avramovic, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D69457
This commit is contained in:
Daniel Sanders 2019-10-25 19:54:01 -07:00
parent 52590319a2
commit 6f665fc786
1 changed files with 65 additions and 27 deletions

View File

@ -1,30 +1,71 @@
.. _irtranslator:
IRTranslator
------------
============
This pass translates the input LLVM IR ``Function`` to a GMIR
``MachineFunction``.
.. contents::
:local:
``TODO``:
This currently doesn't support the more complex instructions, in particular
those involving control flow (``switch``, ``invoke``, ...).
For ``switch`` in particular, we can initially use the ``LowerSwitch`` pass.
This pass translates the input LLVM-IR ``Function`` to a GMIR
``MachineFunction``. This is typically a direct translation but does
occasionally get a bit more involved. For example:
.. _api-calllowering:
.. code-block:: llvm
API: CallLowering
^^^^^^^^^^^^^^^^^
%2 = add i32 %0, %1
The ``IRTranslator`` (using the ``CallLowering`` target-provided utility) also
implements the ABI's calling convention by lowering calls, returns, and
arguments to the appropriate physical register usage and instruction sequences.
becomes:
.. code-block:: mir
%2:_(s32) = G_ADD %0:_(s32), %1:_(s32)
whereas
.. code-block:: llvm
call i32 @puts(i8* %cast210)
is translated according to the ABI rules of the target.
.. note::
The currently implemented portion of the :doc:`../LangRef` is sufficient for
many compilations but it is not 100% complete. Users seeking to compile
LLVM-IR containing some of the rarer features may need to implement the
translation.
Target Intrinsics
-----------------
There has been some (off-list) debate about whether to add target hooks for
translating target intrinsics. Among those who discussed it, it was generally
agreed that the IRTranslator should be able to lower target intrinsics in a
customizable way but no work has happened to implement this at the time of
writing.
.. _translator-call-lower:
Translating Function Calls
--------------------------
The ``IRTranslator`` also implements the ABI's calling convention by lowering
calls, returns, and arguments to the appropriate physical register usage and
instruction sequences. This is achieved using the ``CallLowering``
implementation,
.. _irtranslator-aggregates:
Aggregates
^^^^^^^^^^
.. caution::
This has changed since it was written and is no longer accurate. It has not
been refreshed in this pass of improving the documentation as I haven't
worked much in this part of the codebase and it should have attention from
someone more knowledgeable about it.
Aggregates are lowered to a single scalar vreg.
This differs from SelectionDAG's multiple vregs via ``GetValueVTs``.
@ -37,21 +78,18 @@ IR to MachineInstr translation for aggregate type
.. _irtranslator-constants:
Constant Lowering
^^^^^^^^^^^^^^^^^
Translation of Constants
------------------------
The ``IRTranslator`` lowers ``Constant`` operands into uses of gvregs defined
by ``G_CONSTANT`` or ``G_FCONSTANT`` instructions.
Currently, these instructions are always emitted in the entry basic block.
In a ``MachineFunction``, each ``Constant`` is materialized by a single gvreg.
Constant operands are translated as a use of a virtual register that is defined
by a ``G_CONSTANT`` or ``G_FCONSTANT`` instruction. These instructions are
placed in the entry block to allow them to be subject to the continuous CSE
implementation (``CSEMIRBuilder``). Their debug location information is removed
to prevent this from confusing debuggers.
This is beneficial as it allows us to fold constants into immediate operands
during :ref:`instructionselect`, while still avoiding redundant materializations
for expensive non-foldable constants.
However, this can lead to unnecessary spills and reloads in an -O0 pipeline, as
these vregs can have long live ranges.
``TODO``:
We're investigating better placement of these instructions, in fast and
optimized modes.
for expensive non-foldable constants. However, this can lead to unnecessary
spills and reloads in an -O0 pipeline, as these virtual registers can have long
live ranges. This can be mitigated by running a `localizer <https://github.com/llvm/llvm-project/blob/master/llvm/lib/CodeGen/GlobalISel/Localizer.cpp>`_
after the translator.