# The LLVM Target-Independent Code Generator


```{raw} html
<style>
  .unknown { background-color: #C0C0C0; text-align: center; }
  .unknown:before { content: "?" }
  .no { background-color: #C11B17 }
  .no:before { content: "N" }
  .partial { background-color: #F88017 }
  .yes { background-color: #0F0; }
  .yes:before { content: "Y" }
  .na { background-color: #6666FF; }
  .na:before { content: "N/A" }
</style>
```

```{contents}
:local:
```

```{warning}
This is a work in progress.
```
## Introduction

The LLVM target-independent code generator is a framework that provides a suite
of reusable components for translating the LLVM internal representation to the
machine code for a specified target---either in assembly form (suitable for a
static compiler) or in binary machine code format (usable for a JIT
compiler). The LLVM target-independent code generator consists of six main
components:

1. {ref}`Abstract target description <Abstract target description>` interfaces which capture important properties
   about various aspects of the machine, independently of how they will be used.
   These interfaces are defined in `include/llvm/Target/`.

2. Classes used to represent the {ref}`code being generated <code being generated>` for a target.  These
   classes are intended to be abstract enough to represent the machine code for
   *any* target machine.  These classes are defined in
   `include/llvm/CodeGen/`. At this level, concepts like "constant pool
   entries" and "jump tables" are explicitly exposed.

3. Classes and algorithms used to represent code at the object file level, the
   {ref}`MC Layer <MC Layer>`.  These classes represent assembly level constructs like labels,
   sections, and instructions.  At this level, concepts like "constant pool
   entries" and "jump tables" don't exist.

4. {ref}`Target-independent algorithms <Target-independent algorithms>` used to implement various phases of native
   code generation (register allocation, scheduling, stack frame representation,
   etc).  This code lives in `lib/CodeGen/`.

5. {ref}`Implementations of the abstract target description interfaces <Implementations of the abstract target description interfaces>` for
   particular targets.  These machine descriptions make use of the components
   provided by LLVM, and can optionally provide custom target-specific passes,
   to build complete code generators for a specific target.  Target descriptions
   live in `lib/Target/`.

6. The target-independent JIT components.  The LLVM JIT is completely target
   independent (it uses the `TargetJITInfo` structure to interface for
   target-specific issues.  The code for the target-independent JIT lives in
   `lib/ExecutionEngine/JIT`.

Depending on which part of the code generator you are interested in working on,
different pieces of this will be useful to you.  In any case, you should be
familiar with the {ref}`target description <target description>` and {ref}`machine code representation <machine code representation>`
classes.  If you want to add a backend for a new target, you will need to
{ref}`implement the target description <implement the target description>` classes for your new target and understand
the {doc}`LLVM code representation <LangRef>`.  If you are interested in
implementing a new {ref}`code generation algorithm <code generation algorithm>`, it should only depend on the
target-description and machine code representation classes, ensuring that it is
portable.

### Required components in the code generator

The two pieces of the LLVM code generator are the high-level interface to the
code generator and the set of reusable components that can be used to build
target-specific backends.  The two most important interfaces (
{ref}`TargetMachine <TargetMachine>` and {ref}`DataLayout <DataLayout>`
) are the only ones that are required to be defined for a
backend to fit into the LLVM system, but the others must be defined if the
reusable code generator components are going to be used.

This design has two important implications.  The first is that LLVM can support
completely non-traditional code generation targets.  For example, the C backend
does not require register allocation, instruction selection, or any of the other
standard components provided by the system.  As such, it only implements these
two interfaces, and does its own thing. Note that the C backend was removed from the
trunk in the LLVM 3.1 release. Another example of a code generator like this is a
(purely hypothetical) backend that converts LLVM to the GCC RTL form and uses
GCC to emit machine code for a target.

This design also implies that it is possible to design and implement radically
different code generators in the LLVM system that do not make use of any of the
built-in components.  Doing so is not recommended at all, but could be required
for radically different targets that do not fit into the LLVM machine
description model: FPGAs for example.

(high-level design of the code generator)=

### The high-level design of the code generator

The LLVM target-independent code generator is designed to support efficient and
quality code generation for standard register-based microprocessors.  Code
generation in this model is divided into the following stages:

1. {ref}`Instruction Selection <Instruction Selection>` --- This phase determines an efficient way to
   express the input LLVM code in the target instruction set.  This stage
   produces the initial code for the program in the target instruction set, then
   makes use of virtual registers in SSA form and physical registers that
   represent any required register assignments due to target constraints or
   calling conventions.  This step turns the LLVM code into a DAG of target
   instructions.

2. {ref}`Scheduling and Formation <Scheduling and Formation>` --- This phase takes the DAG of target
   instructions produced by the instruction selection phase, determines an
   ordering of the instructions, then emits the instructions as
   {ref}`MachineInstr <MachineInstr>`s with that ordering.  Note that we
   describe this in the {ref}`instruction selection section <instruction selection section>` because it operates on
   a {ref}`SelectionDAG <SelectionDAG>`.

3. {ref}`SSA-based Machine Code Optimizations <SSA-based Machine Code Optimizations>` --- This optional stage consists of a
   series of machine-code optimizations that operate on the SSA-form produced by
   the instruction selector.  Optimizations like modulo-scheduling or peephole
   optimization work here.

4. {ref}`Register Allocation <Register Allocation>` --- The target code is transformed from an infinite
   virtual register file in SSA form to the concrete register file used by the
   target.  This phase introduces spill code and eliminates all virtual register
   references from the program.

5. {ref}`Prolog/Epilog Code Insertion <Prolog/Epilog Code Insertion>` --- Once the machine code has been generated
   for the function and the amount of stack space required is known (used for
   LLVM alloca's and spill slots), the prolog and epilog code for the function
   can be inserted and "abstract stack location references" can be eliminated.
   This stage is responsible for implementing optimizations like frame-pointer
   elimination and stack packing.

6. {ref}`Late Machine Code Optimizations <Late Machine Code Optimizations>` --- Optimizations that operate on "final"
   machine code can go here, such as spill code scheduling and peephole
   optimizations.

7. {ref}`Code Emission <Code Emission>` --- The final stage actually puts out the code for the
   current function, either in the target assembler format or in machine
   code.

The code generator is based on the assumption that the instruction selector will
use an optimal pattern matching selector to create high-quality sequences of
native instructions.  Alternative code generator designs based on pattern
expansion and aggressive iterative peephole optimization are much slower.  This
design permits efficient compilation (important for JIT environments) and
aggressive optimization (used when generating code offline) by allowing
components of varying levels of sophistication to be used for any step of
compilation.

In addition to these stages, target implementations can insert arbitrary
target-specific passes into the flow.  For example, the X86 target uses a
special pass to handle the 80x87 floating point stack architecture.  Other
targets with unusual requirements can be supported with custom passes as needed.

### Using TableGen for target description

The target description classes require a detailed description of the target
architecture.  These target descriptions often have a large amount of common
information (e.g., an `add` instruction is almost identical to a `sub`
instruction).  In order to allow the maximum amount of commonality to be
factored out, the LLVM code generator uses the
{doc}`TableGen/index` tool to describe big chunks of the
target machine, which allows the use of domain-specific and target-specific
abstractions to reduce the amount of repetition.

As LLVM continues to be developed and refined, we plan to move more and more of
the target description to the `.td` form.  Doing so gives us a number of
advantages.  The most important is that it makes it easier to port LLVM because
it reduces the amount of C++ code that has to be written, and the surface area
of the code generator that needs to be understood before someone can get
something working.  Second, it makes it easier to change things. In particular,
if tables and other things are all emitted by `tblgen`, we only need a change
in one place (`tblgen`) to update all of the targets to a new interface.

(Abstract target description)=
(target description)=

## Target description classes

The LLVM target description classes (located in the `include/llvm/Target`
directory) provide an abstract description of the target machine independent of
any particular client.  These classes are designed to capture the *abstract*
properties of the target (such as the instructions and registers it has), and do
not incorporate any particular pieces of code generation algorithms.

All of the target description classes (except the {ref}`DataLayout <DataLayout>`
class) are designed to be subclassed by the concrete target
implementation, and have virtual methods implemented.  To get to these
implementations, the {ref}`TargetMachine <TargetMachine>` class
provides accessors that should be implemented by the target.

(TargetMachine)=

### The `TargetMachine` class

The `TargetMachine` class provides virtual methods that are used to access the
target-specific implementations of the various target description classes via
the `get*Info` methods (`getInstrInfo`, `getRegisterInfo`,
`getFrameInfo`, etc.).  This class is designed to be specialized by a concrete
target implementation (e.g., `X86TargetMachine`) which implements the various
virtual methods.  The only required target description class is the
{ref}`DataLayout <DataLayout>` class, but if the code
generator components are to be used, the other interfaces should be implemented
as well.

(DataLayout)=

### The `DataLayout` class

The `DataLayout` class is the only required target description class, and it
is the only class that is not extensible (you cannot derive a new class from
it).  `DataLayout` specifies information about how the target lays out memory
for structures, the alignment requirements for various data types, the size of
pointers in the target, and whether the target is little-endian or
big-endian.

(TargetLowering)=

### The `TargetLowering` class

The `TargetLowering` class is used by SelectionDAG based instruction selectors
primarily to describe how LLVM code should be lowered to SelectionDAG
operations.  Among other things, this class indicates:

* an initial register class to use for various `ValueType`s,

* which operations are natively supported by the target machine,

* the return type of `setcc` operations,

* the type to use for shift amounts, and

* various high-level characteristics, like whether it is profitable to turn
  division by a constant into a multiplication sequence.

(TargetRegisterInfo)=

### The `TargetRegisterInfo` class

The `TargetRegisterInfo` class is used to describe the register file of the
target and any interactions between the registers.

Registers are represented in the code generator by unsigned integers.  Physical
registers (those that actually exist in the target description) are unique
small numbers, and virtual registers are generally large.  Note that
register `#0` is reserved as a flag value.

Each register in the processor description has an associated
`TargetRegisterDesc` entry, which provides a textual name for the register
(used for assembly output and debugging dumps) and a set of aliases (used to
indicate whether one register overlaps with another).

In addition to the per-register description, the `TargetRegisterInfo` class
exposes a set of processor-specific register classes (instances of the
`TargetRegisterClass` class).  Each register class contains sets of registers
that have the same properties (for example, they are all 32-bit integer
registers).  Each SSA virtual register created by the instruction selector has
an associated register class.  When the register allocator runs, it replaces
virtual registers with a physical register in the set.

The target-specific implementations of these classes is auto-generated from a
{doc}`TableGen/index` description of the register file.

(TargetInstrInfo)=

### The `TargetInstrInfo` class

The `TargetInstrInfo` class is used to describe the machine instructions
supported by the target.  Descriptions define things like the mnemonic for
the opcode, the number of operands, the list of implicit register uses and defs,
whether the instruction has certain target-independent properties (accesses
memory, is commutable, etc), and holds any target-specific flags.

### The `TargetFrameLowering` class

The `TargetFrameLowering` class is used to provide information about the stack
frame layout of the target. It holds the direction of stack growth, the known
stack alignment on entry to each function, and the offset to the local area.
The offset to the local area is the offset from the stack pointer on function
entry to the first location where function data (local variables, spill
locations) can be stored.

### The `TargetSubtarget` class

The `TargetSubtarget` class is used to provide information about the specific
chip set being targeted.  A sub-target informs code generation of which
instructions are supported, instruction latencies and instruction execution
itinerary; i.e., which processing units are used, in what order, and for how
long.

### The `TargetJITInfo` class

The `TargetJITInfo` class exposes an abstract interface used by the
Just-In-Time code generator to perform target-specific activities, such as
emitting stubs.  If a `TargetMachine` supports JIT code generation, it should
provide one of these objects through the `getJITInfo` method.

(code being generated)=
(machine code representation)=

## Machine code description classes

At the high-level, LLVM code is translated to a machine-specific representation
formed out of {ref}`MachineFunction <MachineFunction>`,
{ref}`MachineBasicBlock <MachineBasicBlock>`, and
{ref}`MachineInstr <MachineInstr>` instances (defined in
`include/llvm/CodeGen`).  This representation is completely target agnostic,
representing instructions in their most abstract form: an opcode and a series of
operands.  This representation is designed to support both an SSA representation
for machine code, as well as a register allocated, non-SSA form.

(MachineInstr)=

### The `MachineInstr` class

Target machine instructions are represented as instances of the `MachineInstr`
class.  This class is an extremely abstract way of representing machine
instructions.  In particular, it only keeps track of an opcode number and a set
of operands.

The opcode number is a simple unsigned integer that only has meaning to a
specific backend.  All of the instructions for a target should be defined in the
`*InstrInfo.td` file for the target. The opcode enum values are auto-generated
from this description.  The `MachineInstr` class does not have any information
about how to interpret the instruction (i.e., what the semantics of the
instruction are); for that you must refer to the
{ref}`TargetInstrInfo <TargetInstrInfo>` class.

The operands of a machine instruction can be of several different types: a
register reference, a constant integer, a basic block reference, etc.  In
addition, a machine operand should be marked as a def or a use of the value
(though only registers are allowed to be defs).

By convention, the LLVM code generator orders instruction operands so that all
register definitions come before the register uses, even on architectures that
are normally printed in other orders.  For example, the SPARC add instruction:
"`add %i1, %i2, %i3`" adds the "%i1", and "%i2" registers and stores the
result into the "%i3" register.  In the LLVM code generator, the operands should
be stored as "`%i3, %i1, %i2`": with the destination first.

Keeping destination (definition) operands at the beginning of the operand list
has several advantages.  In particular, the debugging printer will print the
instruction like this:

```llvm
%r3 = add %i1, %i2
```
Also if the first operand is a def, it is easier to {ref}`create instructions <create instructions>` whose
only def is the first operand.

(create instructions)=

#### Using the `MachineInstrBuilder.h` functions

Machine instructions are created by using the `BuildMI` functions, located in
the `include/llvm/CodeGen/MachineInstrBuilder.h` file.  The `BuildMI`
functions make it easy to build arbitrary machine instructions.  Usage of the
`BuildMI` functions look like this:

```c++
// Create a 'DestReg = mov 42' (rendered in X86 assembly as 'mov DestReg, 42')
// instruction and insert it at the end of the given MachineBasicBlock.
const TargetInstrInfo &TII = ...
MachineBasicBlock &MBB = ...
DebugLoc DL;
MachineInstr *MI = BuildMI(MBB, DL, TII.get(X86::MOV32ri), DestReg).addImm(42);

// Create the same instr, but insert it before a specified iterator point.
MachineBasicBlock::iterator MBBI = ...
BuildMI(MBB, MBBI, DL, TII.get(X86::MOV32ri), DestReg).addImm(42);

// Create a 'cmp Reg, 0' instruction, no destination reg.
MI = BuildMI(MBB, DL, TII.get(X86::CMP32ri8)).addReg(Reg).addImm(42);

// Create an 'sahf' instruction which takes no operands and stores nothing.
MI = BuildMI(MBB, DL, TII.get(X86::SAHF));

// Create a self looping branch instruction.
BuildMI(MBB, DL, TII.get(X86::JNE)).addMBB(&MBB);
```
If you need to add a definition operand (other than the optional destination
register), you must explicitly mark it as such:

```c++
MI.addReg(Reg, RegState::Define);
```
#### Fixed (preassigned) registers

One important issue that the code generator needs to be aware of is the presence
of fixed registers.  In particular, there are often places in the instruction
stream where the register allocator *must* arrange for a particular value to be
in a particular register.  This can occur due to limitations of the instruction
set (e.g., the X86 can only do a 32-bit divide with the `EAX`/`EDX`
registers), or external factors like calling conventions.  In any case, the
instruction selector should emit code that copies a virtual register into or out
of a physical register when needed.

For example, consider this simple LLVM example:

```llvm
define i32 @test(i32 %X, i32 %Y) {
  %Z = sdiv i32 %X, %Y
  ret i32 %Z
}
```
The X86 instruction selector might produce this machine code for the `div` and
`ret`:

```text
;; Start of div
%EAX = mov %reg1024           ;; Copy X (in reg1024) into EAX
%reg1027 = sar %reg1024, 31
%EDX = mov %reg1027           ;; Sign extend X into EDX
idiv %reg1025                 ;; Divide by Y (in reg1025)
%reg1026 = mov %EAX           ;; Read the result (Z) out of EAX

;; Start of ret
%EAX = mov %reg1026           ;; 32-bit return value goes in EAX
ret
```
By the end of code generation, the register allocator would coalesce the
registers and delete the resultant identity moves producing the following
code:

```text
;; X is in EAX, Y is in ECX
mov %EAX, %EDX
sar %EDX, 31
idiv %ECX
ret
```
This approach is extremely general (if it can handle the X86 architecture, it
can handle anything!) and allows all of the target-specific knowledge about the
instruction stream to be isolated in the instruction selector.  Note that
physical registers should have a short lifetime for good code generation, and
all physical registers are assumed dead on entry to and exit from basic blocks
(before register allocation).  Thus, if you need a value to be live across basic
block boundaries, it *must* live in a virtual register.

#### Call-clobbered registers

Some machine instructions, like calls, clobber a large number of physical
registers.  Rather than adding `<def,dead>` operands for all of them, it is
possible to use an `MO_RegisterMask` operand instead.  The register mask
operand holds a bit mask of preserved registers, and everything else is
considered to be clobbered by the instruction.

#### Machine code in SSA form

`MachineInstr`'s are initially selected in SSA-form, and are maintained in
SSA-form until register allocation happens.  For the most part, this is
trivially simple since LLVM is already in SSA form; LLVM PHI nodes become
machine code PHI nodes, and virtual registers are only allowed to have a single
definition.

After register allocation, machine code is no longer in SSA-form because there
are no virtual registers left in the code.

(MachineBasicBlock)=

### The `MachineBasicBlock` class

The `MachineBasicBlock` class contains a list of machine instructions
( {ref}`MachineInstr <MachineInstr>`  instances).  It roughly
corresponds to the LLVM code input to the instruction selector, but there can be
a one-to-many mapping (i.e., one LLVM basic block can map to multiple machine
basic blocks). The `MachineBasicBlock` class has a "`getBasicBlock`" method,
which returns the LLVM basic block that it comes from.

(MachineFunction)=

### The `MachineFunction` class

The `MachineFunction` class contains a list of machine basic blocks
( {ref}`MachineBasicBlock <MachineBasicBlock>`  instances).  It
corresponds one-to-one with the LLVM function input to the instruction selector.
In addition to a list of basic blocks, the `MachineFunction` contains a
`MachineConstantPool`, a `MachineFrameInfo`, a `MachineFunctionInfo`, and
a `MachineRegisterInfo`.  See `include/llvm/CodeGen/MachineFunction.h` for
more information.

### `MachineInstr Bundles`

LLVM code generator can model sequences of instructions as MachineInstr
bundles. A MI bundle can model a VLIW group / pack which contains an arbitrary
number of parallel instructions. It can also be used to model a sequential list
of instructions (potentially with data dependencies) that cannot be legally
separated (e.g., ARM Thumb2 IT blocks).

Conceptually a MI bundle is a MI with a number of other MIs nested within:

```
--------------
|   Bundle   | ---------
--------------          \
       |           ----------------
       |           |      MI      |
       |           ----------------
       |                   |
       |           ----------------
       |           |      MI      |
       |           ----------------
       |                   |
       |           ----------------
       |           |      MI      |
       |           ----------------
       |
--------------
|   Bundle   | --------
--------------         \
       |           ----------------
       |           |      MI      |
       |           ----------------
       |                   |
       |           ----------------
       |           |      MI      |
       |           ----------------
       |                   |
       |                  ...
       |
--------------
|   Bundle   | --------
--------------         \
       |
      ...
```

MI bundle support does not change the physical representations of
MachineBasicBlock and MachineInstr. All the MIs (including top level and nested
ones) are stored as sequential list of MIs. The "bundled" MIs are marked with
the 'InsideBundle' flag. A top-level MI with the special BUNDLE opcode is used
to represent the start of a bundle. It's legal to mix BUNDLE MIs with individual
MIs that are not inside bundles nor represent bundles.

MachineInstr passes should operate on a MI bundle as a single unit. Member
methods have been taught to correctly handle bundles and MIs inside bundles.
The MachineBasicBlock iterator has been modified to skip over bundled MIs to
enforce the bundle-as-a-single-unit concept. An alternative iterator
instr_iterator has been added to MachineBasicBlock to allow passes to iterate
over all of the MIs in a MachineBasicBlock, including those which are nested
inside bundles. The top-level BUNDLE instruction must have the correct set of
register MachineOperand's that represent the cumulative inputs and outputs of
the bundled MIs.

Packing / bundling of MachineInstrs for VLIW architectures should
generally be done as part of the register allocation super-pass. More
specifically, the pass which determines what MIs should be bundled
together should be done after code generator exits SSA form
(i.e., after two-address pass, PHI elimination, and copy coalescing).
Such bundles should be finalized (i.e., adding BUNDLE MIs and input and
output register MachineOperands) after virtual registers have been
rewritten into physical registers. This eliminates the need to add
virtual register operands to BUNDLE instructions which would
effectively double the virtual register def and use lists. Bundles may
use virtual registers and be formed in SSA form, but may not be
appropriate for all use cases.

(MC Layer)=

## The "MC" Layer

The MC Layer is used to represent and process code at the raw machine code
level, devoid of "high level" information like "constant pools", "jump tables",
"global variables" or anything like that.  At this level, LLVM handles things
like label names, machine instructions, and sections in the object file.  The
code in this layer is used for a number of important purposes: the tail end of
the code generator uses it to write a `.s` or `.o` file, and it is also used by the
llvm-mc tool to implement standalone machine code assemblers and disassemblers.

This section describes some of the important classes.  There are also a number
of important subsystems that interact at this layer, they are described later in
this manual.

(MCStreamer)=

### The `MCStreamer` API

MCStreamer is best thought of as an assembler API.  It is an abstract API which
is *implemented* in different ways (e.g., to output a `.s` file, output an ELF `.o`
file, etc) but whose API corresponds directly to what you see in a `.s` file.
MCStreamer has one method per directive, such as EmitLabel, EmitSymbolAttribute,
switchSection, emitValue (for .byte, .word), etc, which directly correspond to
assembly level directives.  It also has an EmitInstruction method, which is used
to output an MCInst to the streamer.

This API is most important for two clients: the llvm-mc stand-alone assembler is
effectively a parser that parses a line, then invokes a method on MCStreamer. In
the code generator, the {ref}`Code Emission <Code Emission>` phase of the code generator lowers
higher level LLVM IR and Machine* constructs down to the MC layer, emitting
directives through MCStreamer.

On the implementation side of MCStreamer, there are two major implementations:
one for writing out a `.s` file (MCAsmStreamer), and one for writing out a `.o`
file (MCObjectStreamer).  MCAsmStreamer is a straightforward implementation
that prints out a directive for each method (e.g., `EmitValue -> .byte`), but
MCObjectStreamer implements a full assembler.

For target-specific directives, the MCStreamer has a MCTargetStreamer instance.
Each target that needs it defines a class that inherits from it and is a lot
like MCStreamer itself: It has one method per directive and two classes that
inherit from it, a target object streamer and a target asm streamer. The target
asm streamer just prints it (`emitFnStart -> .fnstart`), and the object
streamer implements the assembler logic for it.

To make llvm use these classes, the target initialization must call
TargetRegistry::RegisterAsmStreamer and TargetRegistry::RegisterMCObjectStreamer
passing callbacks that allocate the corresponding target streamer and pass it
to createAsmStreamer or to the appropriate object streamer constructor.

### The `MCContext` class

The MCContext class is the owner of a variety of uniqued data structures at the
MC layer, including symbols, sections, etc.  As such, this is the class that you
interact with to create symbols and sections.  This class can not be subclassed.

### The `MCSymbol` class

The MCSymbol class represents a symbol (aka label) in the assembly file.  There
are two interesting kinds of symbols: assembler temporary symbols, and normal
symbols.  Assembler temporary symbols are used and processed by the assembler
but are discarded when the object file is produced.  The distinction is usually
represented by adding a prefix to the label, for example "L" labels are
assembler temporary labels in MachO.

MCSymbols are created by MCContext and uniqued there.  This means that MCSymbols
can be compared for pointer equivalence to find out if they are the same symbol.
Note that pointer inequality does not guarantee the labels will end up at
different addresses though.  It's perfectly legal to output something like this
to the `.s` file:

```
foo:
bar:
  .byte 4
```

In this case, both the foo and bar symbols will have the same address.

### The `MCSection` class

The `MCSection` class represents an object-file specific section. It is
subclassed by object file specific implementations (e.g., `MCSectionMachO`,
`MCSectionCOFF`, `MCSectionELF`) and these are created and uniqued by
MCContext.  The MCStreamer has a notion of the current section, which can be
changed with the SwitchToSection method (which corresponds to a ".section"
directive in a `.s` file).

(MCInst)=

### The `MCInst` class

The `MCInst` class is a target-independent representation of an instruction.
It is a simple class (much more so than {ref}`MachineInstr <MachineInstr>`) that holds a
target-specific opcode and a vector of MCOperands.  MCOperand, in turn, is a
simple discriminated union of three cases: 1) a simple immediate, 2) a target
register ID, 3) a symbolic expression (e.g., "`Lfoo-Lbar+42`") as an MCExpr.

MCInst is the common currency used to represent machine instructions at the MC
layer.  It is the type used by the instruction encoder, the instruction printer,
and the type generated by the assembly parser and disassembler.

(ObjectFormats)=

### Object File Format

The MC layer's object writers support a variety of object formats. Because of
target-specific aspects of object formats each target only supports a subset of
the formats supported by the MC layer. Most targets support emitting ELF
objects. Other vendor-specific objects are generally supported only on targets
that are supported by that vendor (i.e., MachO is only supported on targets
supported by Darwin, and XCOFF is only supported on targets that support AIX).
Additionally some targets have their own object formats (i.e., DirectX, SPIR-V
and WebAssembly).

The table below captures a snapshot of object file support in LLVM:

```{table} Object File Formats
| Format | Supported Targets |
| --- | --- |
| `COFF` | AArch64, ARM, X86 |
| `DXContainer` | DirectX |
| `ELF` | AArch64, AMDGPU, ARM, AVR, BPF, CSKY, Hexagon, Lanai, LoongArch, M86k, MSP430, MIPS, PowerPC, RISCV, SPARC, SystemZ, VE, X86 |
| `GOFF` | SystemZ |
| `MachO` | AArch64, ARM, X86 |
| `SPIR-V` | SPIRV |
| `WASM` | WebAssembly |
| `XCOFF` | PowerPC |
```
(Target-independent algorithms)=
(code generation algorithm)=

## Target-independent code generation algorithms

This section documents the phases described in the
{ref}`high-level design of the code generator <high-level design of the code generator>`.
It explains how they work and some of the rationale behind their design.

(Instruction Selection)=
(instruction selection section)=

### Instruction Selection

Instruction Selection is the process of translating LLVM code presented to the
code generator into target-specific machine instructions.  There are several
well-known ways to do this in the literature.  LLVM uses a SelectionDAG based
instruction selector.

Portions of the DAG instruction selector are generated from the target
description (`*.td`) files.  Our goal is for the entire instruction selector
to be generated from these `.td` files, though currently there are still
things that require custom C++ code.

[GlobalISel](https://llvm.org/docs/GlobalISel/index.html) is another
instruction selection framework.

(SelectionDAG)=

#### Introduction to SelectionDAGs

The SelectionDAG provides an abstraction for code representation in a way that
is amenable to instruction selection using automatic techniques
(e.g., dynamic-programming based optimal pattern matching selectors). It is also
well-suited to other phases of code generation; in particular, instruction
scheduling (SelectionDAG's are very close to scheduling DAGs post-selection).
Additionally, the SelectionDAG provides a host representation where a large
variety of very-low-level (but target-independent) {ref}`optimizations <optimizations>` may be
performed; ones which require extensive information about the instructions
efficiently supported by the target.

The SelectionDAG is a Directed-Acyclic-Graph whose nodes are instances of the
`SDNode` class.  The primary payload of the `SDNode` is its operation code
(Opcode) that indicates what operation the node performs and the operands to the
operation.  The various operation node types are described at the top of the
`include/llvm/CodeGen/ISDOpcodes.h` file.

Although most operations define a single value, each node in the graph may
define multiple values.  For example, a combined div/rem operation will define
both the dividend and the remainder. Many other situations require multiple
values as well.  Each node also has some number of operands, which are edges to
the node defining the used value.  Because nodes may define multiple values,
edges are represented by instances of the `SDValue` class, which is a
`<SDNode, unsigned>` pair, indicating the node and result value being used,
respectively.  Each value produced by an `SDNode` has an associated `MVT`
(Machine Value Type) indicating what the type of the value is.

SelectionDAGs contain two different kinds of values: those that represent data
flow and those that represent control flow dependencies.  Data values are simple
edges with an integer or floating point value type.  Control edges are
represented as "chain" edges which are of type `MVT::Other`.  These edges
provide an ordering between nodes that have side effects (such as loads, stores,
calls, returns, etc).  All nodes that have side effects should take a token
chain as input and produce a new one as output.  By convention, token chain
inputs are always operand #0, and chain results are always the last value
produced by an operation. However, after instruction selection, the
machine nodes have their chain after the instruction's operands, and
may be followed by glue nodes.

A SelectionDAG has designated "Entry" and "Root" nodes.  The Entry node is
always a marker node with an Opcode of `ISD::EntryToken`.  The Root node is
the final side-effecting node in the token chain. For example, in a single basic
block function it would be the return node.

One important concept for SelectionDAGs is the notion of a "legal" vs.
"illegal" DAG.  A legal DAG for a target is one that only uses supported
operations and supported types.  On a 32-bit PowerPC, for example, a DAG with a
value of type i1, i8, i16, or i64 would be illegal, as would a DAG that uses a
SREM or UREM operation.  The {ref}`legalize types <legalize types>` and {ref}`legalize operations <legalize operations>` phases
are responsible for turning an illegal DAG into a legal DAG.

(SelectionDAG-Process)=

#### SelectionDAG Instruction Selection Process

SelectionDAG-based instruction selection consists of the following steps:

1. {ref}`Build initial DAG <Build initial DAG>` --- This stage performs a simple translation from the
   input LLVM code to an illegal SelectionDAG.

1. {ref}`Optimize SelectionDAG <Optimize SelectionDAG>` --- This stage performs simple optimizations on the
   SelectionDAG to simplify it, and recognize meta instructions (like rotates
   and `div`/`rem` pairs) for targets that support these meta operations.
   This makes the resultant code more efficient and the
   {ref}`select instructions from DAG <Select instructions from DAG>` phase
   (below) simpler.

1. {ref}`Legalize SelectionDAG Types <Legalize SelectionDAG Types>` --- This stage transforms SelectionDAG nodes
   to eliminate any types that are unsupported on the target.

1. {ref}`Optimize SelectionDAG <Optimize SelectionDAG>` --- The SelectionDAG optimizer is run to clean up
   redundancies exposed by type legalization.

1. {ref}`Legalize SelectionDAG Ops <Legalize SelectionDAG Ops>` --- This stage transforms SelectionDAG nodes to
   eliminate any operations that are unsupported on the target.

1. {ref}`Optimize SelectionDAG <Optimize SelectionDAG>` --- The SelectionDAG optimizer is run to eliminate
   inefficiencies introduced by operation legalization.

1. {ref}`Select instructions from DAG <Select instructions from DAG>` --- Finally, the target instruction selector
   matches the DAG operations to target instructions.  This process translates
   the target-independent input DAG into another DAG of target instructions.

1. {ref}`SelectionDAG Scheduling and Formation <SelectionDAG Scheduling and Formation>` --- The last phase assigns a linear
   order to the instructions in the target-instruction DAG and emits them into
   the MachineFunction being compiled.  This step uses traditional prepass
   scheduling techniques.

After all of these steps are complete, the SelectionDAG is destroyed and the
rest of the code generation passes are run.

One of the most common ways to debug these steps is using `-debug-only=isel`,
which prints out the DAG, along with other information like debug info,
after each of these steps. Alternatively, `-debug-only=isel-dump` shows only
the DAG dumps, but the results can be filtered by function names using
`-filter-print-funcs=<function names>`.

One great way to visualize what is going on here is to take advantage of a few
LLC command line options.  The following options pop up a window displaying the
SelectionDAG at specific times (if you only get errors printed to the console
while using this, you probably {ref}`need to configure your system <ViewGraph>`
to add support for it).

* `-view-dag-combine1-dags` displays the DAG after being built, before the
  first optimization pass.

* `-view-legalize-dags` displays the DAG before Legalization.

* `-view-dag-combine2-dags` displays the DAG before the second optimization
  pass.

* `-view-isel-dags` displays the DAG before the Select phase.

* `-view-sched-dags` displays the DAG before Scheduling.

The `-view-sunit-dags` displays the Scheduler's dependency graph.  This graph
is based on the final SelectionDAG, with nodes that must be scheduled together
bundled into a single scheduling-unit node, and with immediate operands and
other nodes that aren't relevant for scheduling omitted.

The option `-filter-view-dags` allows to select the name of the basic block
that you are interested in visualizing and filters all the previous
`view-*-dags` options.

(Build initial DAG)=

#### Initial SelectionDAG Construction

The initial SelectionDAG is na&iuml;vely peephole expanded from
the LLVM input by the `SelectionDAGBuilder` class.  The intent of this pass
is to expose as much low-level, target-specific details to the SelectionDAG as
possible.  This pass is mostly hard-coded (e.g., an LLVM `add` turns into an
`SDNode add` while a `getelementptr` is expanded into the obvious
arithmetic). This pass requires target-specific hooks to lower calls, returns,
varargs, etc.  For these features, the  {ref}`TargetLowering <TargetLowering>`
 interface is used.

(legalize types)=
(Legalize SelectionDAG Types)=
(Legalize SelectionDAG Ops)=

#### SelectionDAG LegalizeTypes Phase

The Legalize phase is in charge of converting a DAG to only use the types that
are natively supported by the target.

There are two main ways of converting values of unsupported scalar types to
values of supported types: converting small types to larger types ("promoting"),
and breaking up large integer types into smaller ones ("expanding").  For
example, a target might require that all f32 values are promoted to f64 and that
all i1/i8/i16 values are promoted to i32.  The same target might require that
all i64 values be expanded into pairs of i32 values.  These changes can insert
sign and zero extensions as needed to make sure that the final code has the same
behavior as the input.

There are two main ways of converting values of unsupported vector types to
value of supported types: splitting vector types, multiple times if necessary,
until a legal type is found, and extending vector types by adding elements to
the end to round them out to legal types ("widening").  If a vector gets split
all the way down to single-element parts with no supported vector type being
found, the elements are converted to scalars ("scalarizing").

A target implementation tells the legalizer which types are supported (and which
register class to use for them) by calling the `addRegisterClass` method in
its `TargetLowering` constructor.

(legalize operations)=
(Legalizer)=

#### SelectionDAG Legalize Phase

The Legalize phase is in charge of converting a DAG to only use the operations
that are natively supported by the target.

Targets often have weird constraints, such as not supporting every operation on
every supported data type (e.g., X86 does not support byte conditional moves and
PowerPC does not support sign-extending loads from a 16-bit memory location).
Legalize takes care of this by open-coding another sequence of operations to
emulate the operation ("expansion"), by promoting one type to a larger type that
supports the operation ("promotion"), or by using a target-specific hook to
implement the legalization ("custom").

A target implementation tells the legalizer which operations are not supported
(and which of the above three actions to take) by calling the
`setOperationAction` method in its `TargetLowering` constructor.

If a target has legal vector types, it is expected to produce efficient machine
code for common forms of the shufflevector IR instruction using those types.
This may require custom legalization for SelectionDAG vector operations that
are created from the shufflevector IR. The shufflevector forms that should be
handled include:

* Vector select --- Each element of the vector is chosen from either of the
  corresponding elements of the 2 input vectors. This operation may also be
  known as a "blend" or "bitwise select" in target assembly. This type of shuffle
  maps directly to the `shuffle_vector` SelectionDAG node.

* Insert subvector --- A vector is placed into a longer vector type starting
  at index 0. This type of shuffle maps directly to the `insert_subvector`
  SelectionDAG node with the `index` operand set to 0.

* Extract subvector --- A vector is pulled from a longer vector type starting
  at index 0. This type of shuffle maps directly to the `extract_subvector`
  SelectionDAG node with the `index` operand set to 0.

* Splat --- All elements of the vector have identical scalar elements. This
  operation may also be known as a "broadcast" or "duplicate" in target assembly.
  The shufflevector IR instruction may change the vector length, so this operation
  may map to multiple SelectionDAG nodes including `shuffle_vector`,
  `concat_vectors`, `insert_subvector`, and `extract_subvector`.

Prior to the existence of the Legalize passes, we required that every target
{ref}`selector <selector>` supported and handled every operator and type even if they are not
natively supported.  The introduction of the Legalize phases allows all of the
canonicalization patterns to be shared across targets, and makes it very easy to
optimize the canonicalized code because it is still in the form of a DAG.

(optimizations)=
(Optimize SelectionDAG)=
(selector)=

#### SelectionDAG Optimization Phase: the DAG Combiner

The SelectionDAG optimization phase is run multiple times for code generation,
immediately after the DAG is built and once after each legalization.  The first
run of the pass allows the initial code to be cleaned up (e.g., performing
optimizations that depend on knowing that the operators have restricted type
inputs).  Subsequent runs of the pass clean up the messy code generated by the
Legalize passes, which allows Legalize to be very simple (it can focus on making
code legal instead of focusing on generating *good* and legal code).

One important class of optimizations performed is optimizing inserted sign and
zero extension instructions.  We currently use ad-hoc techniques, but could move
to more rigorous techniques in the future.  Here are some good papers on the
subject:

"[Widening integer arithmetic](http://www.eecs.harvard.edu/~nr/pubs/widen-abstract.html)" \
Kevin Redwine and Norman Ramsey \
International Conference on Compiler Construction (CC) 2004

"[Effective sign extension elimination](http://portal.acm.org/citation.cfm?doid=512529.512552)"  \
Motohiro Kawahito, Hideaki Komatsu, and Toshio Nakatani \
Proceedings of the ACM SIGPLAN 2002 Conference on Programming Language Design
and Implementation.

(Select instructions from DAG)=

#### SelectionDAG Select Phase

The Select phase is the bulk of the target-specific code for instruction
selection.  This phase takes a legal SelectionDAG as input, pattern matches the
instructions supported by the target to this DAG, and produces a new DAG of
target code.  For example, consider the following LLVM fragment:

```llvm
%t1 = fadd float %W, %X
%t2 = fmul float %t1, %Y
%t3 = fadd float %t2, %Z
```
This LLVM code corresponds to a SelectionDAG that looks basically like this:

```text
(fadd:f32 (fmul:f32 (fadd:f32 W, X), Y), Z)
```
If a target supports floating point multiply-and-add (FMA) operations, one of
the adds can be merged with the multiply.  On the PowerPC, for example, the
output of the instruction selector might look like this DAG:

```
(FMADDS (FADDS W, X), Y, Z)
```

The `FMADDS` instruction is a ternary instruction that multiplies its first
two operands and adds the third (as single-precision floating-point numbers).
The `FADDS` instruction is a simple binary single-precision add instruction.
To perform this pattern match, the PowerPC backend includes the following
instruction definitions:

```{code-block} text
:emphasize-lines: 4-5,9

def FMADDS : AForm_1<59, 29,
                    (ops F4RC:$FRT, F4RC:$FRA, F4RC:$FRC, F4RC:$FRB),
                    "fmadds $FRT, $FRA, $FRC, $FRB",
                    [(set F4RC:$FRT, (fadd (fmul F4RC:$FRA, F4RC:$FRC),
                                           F4RC:$FRB))]>;
def FADDS : AForm_2<59, 21,
                    (ops F4RC:$FRT, F4RC:$FRA, F4RC:$FRB),
                    "fadds $FRT, $FRA, $FRB",
                    [(set F4RC:$FRT, (fadd F4RC:$FRA, F4RC:$FRB))]>;
```
The highlighted portion of the instruction definitions indicates the pattern
used to match the instructions. The DAG operators (like `fmul`/`fadd`)
are defined in the `include/llvm/Target/TargetSelectionDAG.td` file.
"`F4RC`" is the register class of the input and result values.

The TableGen DAG instruction selector generator reads the instruction patterns
in the `.td` file and automatically builds parts of the pattern matching code
for your target.  It has the following strengths:

* At compiler-compile time, it analyzes your instruction patterns and tells you
  if your patterns make sense or not.

* It can handle arbitrary constraints on operands for the pattern match.  In
  particular, it is straightforward to say things like "match any immediate
  that is a 13-bit sign-extended value".  For examples, see the `immSExt16`
  and related `tblgen` classes in the PowerPC backend.

* It knows several important identities for the patterns defined.  For example,
  it knows that addition is commutative, so it allows the `FMADDS` pattern
  above to match "`(fadd X, (fmul Y, Z))`" as well as
  "`(fadd (fmul X, Y), Z)`", without the target author having to specially
  handle this case.

* It has a full-featured type-inferencing system.  In particular, you should
  rarely have to explicitly tell the system what type parts of your patterns
  are.  In the `FMADDS` case above, we didn't have to tell `tblgen` that all
  of the nodes in the pattern are of type 'f32'.  It was able to infer and
  propagate this knowledge from the fact that `F4RC` has type 'f32'.

* Targets can define their own (and rely on built-in) "pattern fragments".
  Pattern fragments are chunks of reusable patterns that get inlined into your
  patterns during compiler-compile time.  For example, the integer "`(not x)`"
  operation is actually defined as a pattern fragment that expands as
  "`(xor x, -1)`", since the SelectionDAG does not have a native '`not`'
  operation.  Targets can define their own short-hand fragments as they see fit.
  See the definition of '`not`' and '`ineg`' for examples.

* In addition to instructions, targets can specify arbitrary patterns that map
  to one or more instructions using the 'Pat' class.  For example, the PowerPC
  has no way to load an arbitrary integer immediate into a register in one
  instruction. To tell tblgen how to do this, it defines:

  ```
  // Arbitrary immediate support.  Implement in terms of LIS/ORI.
  def : Pat<(i32 imm:$imm),
            (ORI (LIS (HI16 imm:$imm)), (LO16 imm:$imm))>;
  ```

  If none of the single-instruction patterns for loading an immediate into a
  register match, this will be used.  This rule says "match an arbitrary i32
  immediate, turning it into an `ORI` ('or a 16-bit immediate') and an `LIS`
  ('load 16-bit immediate, where the immediate is shifted to the left 16 bits')
  instruction".  To make this work, the `LO16`/`HI16` node transformations
  are used to manipulate the input immediate (in this case, take the high or low
  16-bits of the immediate).

* When using the 'Pat' class to map a pattern to an instruction that has one
  or more complex operands (like e.g., {ref}`X86 addressing mode <X86 addressing mode>`), the pattern may
  either specify the operand as a whole using a `ComplexPattern`, or else it
  may specify the components of the complex operand separately.  The latter is
  done e.g., for pre-increment instructions by the PowerPC back end:

  ```
  def STWU  : DForm_1<37, (outs ptr_rc:$ea_res), (ins GPRC:$rS, memri:$dst),
                  "stwu $rS, $dst", LdStStoreUpd, []>,
                  RegConstraint<"$dst.reg = $ea_res">;

  def : Pat<(pre_store GPRC:$rS, ptr_rc:$ptrreg, iaddroff:$ptroff),
            (STWU GPRC:$rS, iaddroff:$ptroff, ptr_rc:$ptrreg)>;
  ```

  Here, the pair of `ptroff` and `ptrreg` operands is matched onto the
  complex operand `dst` of class `memri` in the `STWU` instruction.

* While the system does automate a lot, it still allows you to write custom C++
  code to match special cases if there is something that is hard to
  express.

While it has many strengths, the system currently has some limitations,
primarily because it is a work in progress and is not yet finished:

* Overall, there is no way to define or match SelectionDAG nodes that define
  multiple values (e.g., `SMUL_LOHI`, `LOAD`, `CALL`, etc).  This is the
  biggest reason that you currently still *have to* write custom C++ code
  for your instruction selector.

* There is no great way to support matching complex addressing modes yet.  In
  the future, we will extend pattern fragments to allow them to define multiple
  values (e.g., the four operands of the {ref}`X86 addressing mode <X86 addressing mode>`, which are
  currently matched with custom C++ code).  In addition, we'll extend fragments
  so that a fragment can match multiple different patterns.

* We don't automatically infer flags like `isStore`/`isLoad` yet.

* We don't automatically generate the set of supported registers and operations
  for the {ref}`Legalizer <Legalizer>` yet.

* We don't have a way of tying in custom legalized nodes yet.

Despite these limitations, the instruction selector generator is still quite
useful for most of the binary and logical operations in typical instruction
sets.  If you run into any problems or can't figure out how to do something,
please let Chris know!

(Scheduling and Formation)=
(SelectionDAG Scheduling and Formation)=

#### SelectionDAG Scheduling and Formation Phase

The scheduling phase takes the DAG of target instructions from the selection
phase and assigns an order.  The scheduler can pick an order depending on
various constraints of the machines (i.e., order for minimal register pressure or
try to cover instruction latencies).  Once an order is established, the DAG is
converted to a list of  {ref}`MachineInstr <MachineInstr>`s  and
the SelectionDAG is destroyed.

Note that this phase is logically separate from the instruction selection phase,
but is tied to it closely in the code because it operates on SelectionDAGs.

#### Future directions for the SelectionDAG

1. Optional function-at-a-time selection.

1. Auto-generate entire selector from `.td` file.

(SSA-based Machine Code Optimizations)=

### SSA-based Machine Code Optimizations

To Be Written

### Live Intervals

Live Intervals are the ranges (intervals) where a variable is *live*.  They are
used by some {ref}`register allocator <register allocator>` passes to determine if two or more virtual
registers which require the same physical register are live at the same point in
the program (i.e., they conflict).  When this situation occurs, one virtual
register must be *spilled*.

#### Live Variable Analysis

The first step in determining the live intervals of variables is to calculate
the set of registers that are immediately dead after the instruction (i.e., the
instruction calculates the value, but it is never used) and the set of registers
that are used by the instruction, but are never used after the instruction
(i.e., they are killed). Live variable information is computed for
each *virtual* register and *register allocatable* physical register
in the function.  This is done in a very efficient manner because it uses SSA to
sparsely compute lifetime information for virtual registers (which are in SSA
form) and only has to track physical registers within a block.  Before register
allocation, LLVM can assume that physical registers are only live within a
single basic block.  This allows it to do a single, local analysis to resolve
physical register lifetimes within each basic block. If a physical register is
not register allocatable (e.g., a stack pointer or condition codes), it is not
tracked.

Physical registers may be live in to or out of a function. Live in values are
typically arguments in registers. Live out values are typically return values in
registers. Live in values are marked as such, and are given a dummy "defining"
instruction during live intervals analysis. If the last basic block of a
function is a `return`, then it's marked as using all live out values in the
function.

`PHI` nodes need to be handled specially, because the calculation of the live
variable information from a depth first traversal of the CFG of the function
won't guarantee that a virtual register used by the `PHI` node is defined
before it's used. When a `PHI` node is encountered, only the definition is
handled, because the uses will be handled in other basic blocks.

For each `PHI` node of the current basic block, we simulate an assignment at
the end of the current basic block and traverse the successor basic blocks. If a
successor basic block has a `PHI` node and one of the `PHI` node's operands
is coming from the current basic block, then the variable is marked as *alive*
within the current basic block and all of its predecessor basic blocks, until
the basic block with the defining instruction is encountered.

#### Live Intervals Analysis

We now have the information available to perform the live intervals analysis and
build the live intervals themselves.  We start off by numbering the basic blocks
and machine instructions.  We then handle the "live-in" values.  These are in
physical registers, so the physical register is assumed to be killed by the end
of the basic block.  Live intervals for virtual registers are computed for some
ordering of the machine instructions `[1, N]`.  A live interval is an interval
`[i, j)`, where `1 >= i >= j > N`, for which a variable is live.

```{note}
More to come...
```
(Register Allocation)=
(register allocator)=

### Register Allocation

The *Register Allocation problem* consists in mapping a program
P{sub}`v`, that can use an unbounded
number of virtual registers, to a program P{sub}`p` that contains a finite (possibly small) number of physical
registers. Each target architecture has a different number of physical
registers. If the number of physical registers is not enough to accommodate all
the virtual registers, some of them will have to be mapped into memory. These
virtuals are called *spilled virtuals*.

#### How registers are represented in LLVM

In LLVM, physical registers are denoted by integer numbers that normally range
from 1 to 1023. To see how this numbering is defined for a particular
architecture, you can read the `GenRegisterNames.inc` file for that
architecture. For instance, by inspecting
`lib/Target/X86/X86GenRegisterInfo.inc` we see that the 32-bit register
`EAX` is denoted by 43, and the MMX register `MM0` is mapped to 65.

Some architectures contain registers that share the same physical location. A
notable example is the X86 platform. For instance, in the X86 architecture, the
registers `EAX`, `AX` and `AL` share the first eight bits. These physical
registers are marked as *aliased* in LLVM. Given a particular architecture, you
can check which registers are aliased by inspecting its `RegisterInfo.td`
file. Moreover, the class `MCRegAliasIterator` enumerates all the physical
registers aliased to a register.

Physical registers, in LLVM, are grouped in *Register Classes*.  Elements in the
same register class are functionally equivalent, and can be interchangeably
used. Each virtual register can only be mapped to physical registers of a
particular class. For instance, in the X86 architecture, some virtuals can only
be allocated to 8-bit registers.  A register class is described by
`TargetRegisterClass` objects.  To discover if a virtual register is
compatible with a given physical, this code can be used:

```c++
bool RegMapping_Fer::compatible_class(MachineFunction &mf,
                                      unsigned v_reg,
                                      unsigned p_reg) {
  assert(TargetRegisterInfo::isPhysicalRegister(p_reg) &&
         "Target register must be physical");
  const TargetRegisterClass *trc = mf.getRegInfo().getRegClass(v_reg);
  return trc->contains(p_reg);
}
```
Sometimes, mostly for debugging purposes, it is useful to change the number of
physical registers available in the target architecture. This must be done
statically, inside the `TargetRegisterInfo.td` file. Just `grep` for
`RegisterClass`, the last parameter of which is a list of registers. Just
commenting some out is one simple way to avoid them being used. A more polite
way is to explicitly exclude some registers from the *allocation order*. See the
definition of the `GR8` register class in
`lib/Target/X86/X86RegisterInfo.td` for an example of this.

Virtual registers are also denoted by integer numbers. Contrary to physical
registers, different virtual registers never share the same number. Whereas
physical registers are statically defined in a `TargetRegisterInfo.td` file
and cannot be created by the application developer, that is not the case with
virtual registers. In order to create new virtual registers, use the method
`MachineRegisterInfo::createVirtualRegister()`. This method will return a new
virtual register. Use an `IndexedMap<Foo, VirtReg2IndexFunctor>` to hold
information per virtual register. If you need to enumerate all virtual
registers, use the function `TargetRegisterInfo::index2VirtReg()` to find the
virtual register numbers:

```c++
  for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
    unsigned VirtReg = TargetRegisterInfo::index2VirtReg(i);
    stuff(VirtReg);
  }
```
Before register allocation, the operands of an instruction are mostly virtual
registers, although physical registers may also be used. In order to check if a
given machine operand is a register, use the boolean function
`MachineOperand::isRegister()`. To obtain the integer code of a register, use
`MachineOperand::getReg()`. An instruction may define or use a register. For
instance, `ADD reg:1026 := reg:1025 reg:1024` defines the registers 1024, and
uses registers 1025 and 1026. Given a register operand, the method
`MachineOperand::isUse()` informs if that register is being used by the
instruction. The method `MachineOperand::isDef()` informs if that registers is
being defined.

We will call physical registers present in the LLVM bitcode before register
allocation *pre-colored registers*. Pre-colored registers are used in many
different situations, for instance, to pass parameters of functions calls, and
to store results of particular instructions. There are two types of pre-colored
registers: the ones *implicitly* defined, and those *explicitly*
defined. Explicitly defined registers are normal operands, and can be accessed
with `MachineInstr::getOperand(int)::getReg()`.  In order to check which
registers are implicitly defined by an instruction, use the
`TargetInstrInfo::get(opcode)::ImplicitDefs`, where `opcode` is the opcode
of the target instruction. One important difference between explicit and
implicit physical registers is that the latter are defined statically for each
instruction, whereas the former may vary depending on the program being
compiled. For example, an instruction that represents a function call will
always implicitly define or use the same set of physical registers. To read the
registers implicitly used by an instruction, use
`TargetInstrInfo::get(opcode)::ImplicitUses`. Pre-colored registers impose
constraints on any register allocation algorithm. The register allocator must
make sure that none of them are overwritten by the values of virtual registers
while still alive.

#### Mapping virtual registers to physical registers

There are two ways to map virtual registers to physical registers (or to memory
slots). The first way, that we will call *direct mapping*, is based on the use
of methods of the classes `TargetRegisterInfo`, and `MachineOperand`. The
second way, that we will call *indirect mapping*, relies on the `VirtRegMap`
class in order to insert loads and stores sending and getting values to and from
memory.

The direct mapping provides more flexibility to the developer of the register
allocator; however, it is more error prone, and demands more implementation
work.  Basically, the programmer will have to specify where load and store
instructions should be inserted in the target function being compiled in order
to get and store values in memory. To assign a physical register to a virtual
register present in a given operand, use `MachineOperand::setReg(p_reg)`. To
insert a store instruction, use `TargetInstrInfo::storeRegToStackSlot(...)`,
and to insert a load instruction, use `TargetInstrInfo::loadRegFromStackSlot`.

The indirect mapping shields the application developer from the complexities of
inserting load and store instructions. In order to map a virtual register to a
physical one, use `VirtRegMap::assignVirt2Phys(vreg, preg)`.  In order to map
a certain virtual register to memory, use
`VirtRegMap::assignVirt2StackSlot(vreg)`. This method will return the stack
slot where `vreg`'s value will be located.  If it is necessary to map another
virtual register to the same stack slot, use
`VirtRegMap::assignVirt2StackSlot(vreg, stack_location)`. One important point
to consider when using the indirect mapping, is that even if a virtual register
is mapped to memory, it still needs to be mapped to a physical register. This
physical register is the location where the virtual register is supposed to be
found before being stored or after being reloaded.

If the indirect strategy is used, after all the virtual registers have been
mapped to physical registers or stack slots, it is necessary to use a spiller
object to place load and store instructions in the code. Every virtual that has
been mapped to a stack slot will be stored to memory after being defined and will
be loaded before being used. The implementation of the spiller tries to recycle
load/store instructions, avoiding unnecessary instructions. For an example of
how to invoke the spiller, see `RegAllocLinearScan::runOnMachineFunction` in
`lib/CodeGen/RegAllocLinearScan.cpp`.

#### Handling two address instructions

With very rare exceptions (e.g., function calls), the LLVM machine code
instructions are three address instructions. That is, each instruction is
expected to define at most one register, and to use at most two registers.
However, some architectures use two address instructions. In this case, the
defined register is also one of the used registers. For instance, an instruction
such as `ADD %EAX, %EBX`, in X86 is actually equivalent to
`%EAX = %EAX + %EBX`.

In order to produce correct code, LLVM must convert three address instructions
that represent two address instructions into true two address instructions. LLVM
provides the pass `TwoAddressInstructionPass` for this specific purpose. It
must be run before register allocation takes place. After its execution, the
resulting code may no longer be in SSA form. This happens, for instance, in
situations where an instruction such as `%a = ADD %b %c` is converted to two
instructions such as:

```
%a = MOVE %b
%a = ADD %a %c
```

Notice that, internally, the second instruction is represented as
`ADD %a[def/use] %c`. I.e., the register operand `%a` is both used and defined by
the instruction.

#### The SSA deconstruction phase

An important transformation that happens during register allocation is called
the *SSA Deconstruction Phase*. The SSA form simplifies many analyses that are
performed on the control flow graph of programs. However, traditional
instruction sets do not implement PHI instructions. Thus, in order to generate
executable code, compilers must replace PHI instructions with other instructions
that preserve their semantics.

There are many ways in which PHI instructions can safely be removed from the
target code. The most traditional PHI deconstruction algorithm replaces PHI
instructions with copy instructions. That is the strategy adopted by LLVM. The
SSA deconstruction algorithm is implemented in
`lib/CodeGen/PHIElimination.cpp`. In order to invoke this pass, the identifier
`PHIEliminationID` must be marked as required in the code of the register
allocator.

#### Instruction folding

*Instruction folding* is an optimization performed during register allocation
that removes unnecessary copy instructions. For instance, a sequence of
instructions such as:

```
%EBX = LOAD %mem_address
%EAX = COPY %EBX
```

can be safely substituted by the single instruction:

```
%EAX = LOAD %mem_address
```

Instructions can be folded with the
`TargetRegisterInfo::foldMemoryOperand(...)` method. Care must be taken when
folding instructions; a folded instruction can be quite different from the
original instruction. See `LiveIntervals::addIntervalsForSpills` in
`lib/CodeGen/LiveIntervalAnalysis.cpp` for an example of its use.

#### Built in register allocators

The LLVM infrastructure provides the application developer with three different
register allocators:

* *Fast* --- This register allocator is the default for debug builds. It
  allocates registers on a basic block level, attempting to keep values in
  registers and reusing registers as appropriate.

* *Basic* --- This is an incremental approach to register allocation. Live
  ranges are assigned to registers one at a time in an order that is driven by
  heuristics. Since code can be rewritten on-the-fly during allocation, this
  framework allows interesting allocators to be developed as extensions. It is
  not itself a production register allocator but is a potentially useful
  stand-alone mode for triaging bugs and as a performance baseline.

* *Greedy* --- *The default allocator*. This is a highly tuned implementation of
  the *Basic* allocator that incorporates global live range splitting. This
  allocator works hard to minimize the cost of spill code.

* *PBQP* --- A Partitioned Boolean Quadratic Programming (PBQP) based register
  allocator. This allocator works by constructing a PBQP problem representing
  the register allocation problem under consideration, solving this using a PBQP
  solver, and mapping the solution back to a register assignment.

The type of register allocator used in `llc` can be chosen with the command
line option `-regalloc=...`:

```bash
$ llc -regalloc=linearscan file.bc -o ln.s
$ llc -regalloc=fast file.bc -o fa.s
$ llc -regalloc=pbqp file.bc -o pbqp.s
```
(Prolog/Epilog Code Insertion)=

### Prolog/Epilog Code Insertion

```{note}
To Be Written
```
### Compact Unwind

Throwing an exception requires *unwinding* out of a function. The information on
how to unwind a given function is traditionally expressed in DWARF unwind
(a.k.a. frame) info. But that format was originally developed for debuggers to
backtrace, and each Frame Description Entry (FDE) requires ~20-30 bytes per
function. There is also the cost of mapping from an address in a function to the
corresponding FDE at runtime. An alternative unwind encoding is called *compact
unwind* and requires just 4-bytes per function.

The compact unwind encoding is a 32-bit value, which is encoded in an
architecture-specific way. It specifies which registers to restore and from
where, and how to unwind out of the function. When the linker creates a final
linked image, it will create a `__TEXT,__unwind_info` section. This section is
a small and fast way for the runtime to access unwind info for any given
function. If we emit compact unwind info for the function, that compact unwind
info will be encoded in the `__TEXT,__unwind_info` section. If we emit DWARF
unwind info, the `__TEXT,__unwind_info` section will contain the offset of the
FDE in the `__TEXT,__eh_frame` section in the final linked image.

For X86, there are three modes for the compact unwind encoding:

*Function with a Frame Pointer (`EBP` or `RBP`)*

`EBP/RBP`-based frame, where `EBP/RBP` is pushed onto the stack
immediately after the return address, then `ESP/RSP` is moved to
`EBP/RBP`. Thus to unwind, `ESP/RSP` is restored with the current
`EBP/RBP` value, then `EBP/RBP` is restored by popping the stack, and the
return is done by popping the stack once more into the PC. All non-volatile
registers that need to be restored must have been saved in a small range on
the stack that starts `EBP-4` to `EBP-1020` (`RBP-8` to
`RBP-1020`). The offset (divided by 4 in 32-bit mode and 8 in 64-bit mode)
is encoded in bits 16-23 (mask: `0x00FF0000`).  The registers saved are
encoded in bits 0-14 (mask: `0x00007FFF`) as five 3-bit entries from the
following table:

| Compact Number | i386 Register | x86-64 Register |
| --- | --- | --- |
| 1 | `EBX` | `RBX` |
| 2 | `ECX` | `R12` |
| 3 | `EDX` | `R13` |
| 4 | `EDI` | `R14` |
| 5 | `ESI` | `R15` |
| 6 | `EBP` | `RBP` |

*Frameless with a Small Constant Stack Size (`EBP` or `RBP` is not used as a frame pointer)*

To return, a constant (encoded in the compact unwind encoding) is added to the
`ESP/RSP`.  Then the return is done by popping the stack into the PC. All
non-volatile registers that need to be restored must have been saved on the
stack immediately after the return address. The stack size (divided by 4 in
32-bit mode and 8 in 64-bit mode) is encoded in bits 16-23 (mask:
`0x00FF0000`). There is a maximum stack size of 1024 bytes in 32-bit mode
and 2048 in 64-bit mode. The number of registers saved is encoded in bits 9-12
(mask: `0x00001C00`). Bits 0-9 (mask: `0x000003FF`) contain which
registers were saved and their order. (See the
`encodeCompactUnwindRegistersWithoutFrame()` function in
`lib/Target/X86FrameLowering.cpp` for the encoding algorithm.)

*Frameless with a Large Constant Stack Size (`EBP` or `RBP` is not used as a frame pointer)*

This case is like the "Frameless with a Small Constant Stack Size" case, but
the stack size is too large to encode in the compact unwind encoding. Instead
it requires that the function contains "`subl $nnnnnn, %esp`" in its
prolog. The compact encoding contains the offset to the `$nnnnnn` value in
the function in bits 9-12 (mask: `0x00001C00`).

(Late Machine Code Optimizations)=

### Late Machine Code Optimizations

```{note}
To Be Written
```
(Code Emission)=

### Code Emission

The code emission step of code generation is responsible for lowering from the
code generator abstractions (like {ref}`MachineFunction <MachineFunction>`, {ref}`MachineInstr <MachineInstr>`, etc) down
to the abstractions used by the MC layer ({ref}`MCInst <MCInst>`, {ref}`MCStreamer <MCStreamer>`, etc).  This
is done with a combination of several different classes: the (misnamed)
target-independent AsmPrinter class, target-specific subclasses of AsmPrinter
(such as SparcAsmPrinter), and the TargetLoweringObjectFile class.

Since the MC layer works at the level of abstraction of object files, it doesn't
have a notion of functions, global variables etc.  Instead, it thinks about
labels, directives, and instructions.  A key class used at this time is the
MCStreamer class.  This is an abstract API that is implemented in different ways
(e.g., to output a `.s` file, output an ELF `.o` file, etc) that is effectively an
"assembler API".  MCStreamer has one method per directive, such as EmitLabel,
EmitSymbolAttribute, switchSection, etc, which directly correspond to assembly
level directives.

If you are interested in implementing a code generator for a target, there are
three important things that you have to implement for your target:

1. First, you need a subclass of AsmPrinter for your target.  This class
   implements the general lowering process converting MachineFunction's into MC
   label constructs.  The AsmPrinter base class provides a number of useful
   methods and routines, and also allows you to override the lowering process in
   some important ways.  You should get much of the lowering for free if you are
   implementing an ELF, COFF, or MachO target, because the
   TargetLoweringObjectFile class implements much of the common logic.

1. Second, you need to implement an instruction printer for your target.  The
   instruction printer takes an {ref}`MCInst <MCInst>` and renders it to a raw_ostream as
   text.  Most of this is automatically generated from the .td file (when you
   specify something like "`add $dst, $src1, $src2`" in the instructions), but
   you need to implement routines to print operands.

1. Third, you need to implement code that lowers a {ref}`MachineInstr <MachineInstr>` to an MCInst,
   usually implemented in `<target>MCInstLower.cpp`.  This lowering process is
   often target specific, and is responsible for turning jump table entries,
   constant pool indices, global variable addresses, etc into MCLabels as
   appropriate.  This translation layer is also responsible for expanding pseudo
   ops used by the code generator into the actual machine instructions they
   correspond to. The MCInsts that are generated by this are fed into the
   instruction printer or the encoder.

Finally, at your choosing, you can also implement a subclass of MCCodeEmitter
which lowers MCInst's into machine code bytes and relocations.  This is
important if you want to support direct `.o` file emission, or would like to
implement an assembler for your target.

#### Emitting function stack size information

A section containing metadata on function stack sizes will be emitted when
`TargetLoweringObjectFile::StackSizesSection` is not null, and
`TargetOptions::EmitStackSizeSection` is set (-stack-size-section). The
section will contain an array of pairs of function symbol values (pointer size)
and stack sizes (unsigned LEB128). The stack size values only include the space
allocated in the function prologue. Functions with dynamic stack allocations are
not included.

#### Emitting function call graph information

A section containing metadata on function call graph will be emitted when
`TargetOptions::EmitCallGraphSection` is set (--call-graph-section). Layout of
this section is documented in detail at {doc}`CallGraphSection`.

### VLIW Packetizer

In a Very Long Instruction Word (VLIW) architecture, the compiler is responsible
for mapping instructions to functional-units available on the architecture. To
that end, the compiler creates groups of instructions called *packets* or
*bundles*. The VLIW packetizer in LLVM is a target-independent mechanism to
enable the packetization of machine instructions.

#### Mapping from instructions to functional units

Instructions in a VLIW target can typically be mapped to multiple functional
units. During the process of packetizing, the compiler must be able to reason
about whether an instruction can be added to a packet. This decision can be
complex since the compiler has to examine all possible mappings of instructions
to functional units. Therefore, to alleviate compilation-time complexity, the
VLIW packetizer parses the instruction classes of a target and generates tables
at compiler build time. These tables can then be queried by the provided
machine-independent API to determine if an instruction can be accommodated in a
packet.

#### How the packetization tables are generated and used

The packetizer reads instruction classes from a target's itineraries and creates
a deterministic finite automaton (DFA) to represent the state of a packet. A DFA
consists of three major elements: inputs, states, and transitions. The set of
inputs for the generated DFA represents the instruction being added to a
packet. The states represent the possible consumption of functional units by
instructions in a packet. In the DFA, transitions from one state to another
occur on the addition of an instruction to an existing packet. If there is a
legal mapping of functional units to instructions, then the DFA contains a
corresponding transition. The absence of a transition indicates that a legal
mapping does not exist and that the instruction cannot be added to the packet.

To generate tables for a VLIW target, add *Target*GenDFAPacketizer.inc as a
target to the Makefile in the target directory. The exported API provides three
functions: `DFAPacketizer::clearResources()`,
`DFAPacketizer::reserveResources(MachineInstr *MI)`, and
`DFAPacketizer::canReserveResources(MachineInstr *MI)`. These functions allow
a target packetizer to add an instruction to an existing packet and to check
whether an instruction can be added to a packet. See
`llvm/CodeGen/DFAPacketizer.h` for more information.

## Implementing a Native Assembler

Though you're probably reading this because you want to write or maintain a
compiler backend, LLVM also fully supports building a native assembler.
We've tried hard to automate the generation of the assembler from the .td files
(in particular the instruction syntax and encodings), which means that a large
part of the manual and repetitive data entry can be factored and shared with the
compiler.

### Instruction Parsing

```{note}
To Be Written
```
### Instruction Alias Processing

Once the instruction is parsed, it enters the MatchInstructionImpl function.
The MatchInstructionImpl function performs alias processing and then performs actual
matching.

Alias processing is the phase that canonicalizes different lexical forms of the
same instructions down to one representation.  There are several different kinds
of alias that are possible to implement and they are listed below in the order
that they are processed (which is in order from simplest/weakest to most
complex/powerful).  Generally you want to use the first alias mechanism that
meets the needs of your instruction, because it will allow a more concise
description.

#### Mnemonic Aliases

The first phase of alias processing is simple instruction mnemonic remapping for
classes of instructions which are allowed with two different mnemonics.  This
phase is a simple and unconditionally remapping from one input mnemonic to one
output mnemonic.  It isn't possible for this form of alias to look at the
operands at all, so the remapping must apply for all forms of a given mnemonic.
Mnemonic aliases are defined simply, for example X86 has:

```
def : MnemonicAlias<"cbw",     "cbtw">;
def : MnemonicAlias<"smovq",   "movsq">;
def : MnemonicAlias<"fldcww",  "fldcw">;
def : MnemonicAlias<"fucompi", "fucomip">;
def : MnemonicAlias<"ud2a",    "ud2">;
```

... and many others.  With a MnemonicAlias definition, the mnemonic is remapped
simply and directly.  Though MnemonicAlias's can't look at any aspect of the
instruction (such as the operands) they can depend on global modes (the same
ones supported by the matcher), through a Requires clause:

```
def : MnemonicAlias<"pushf", "pushfq">, Requires<[In64BitMode]>;
def : MnemonicAlias<"pushf", "pushfl">, Requires<[In32BitMode]>;
```

In this example, the mnemonic gets mapped into a different one depending on
the current instruction set.

#### Instruction Aliases

The most general phase of alias processing occurs while matching is happening:
it provides new forms for the matcher to match along with a specific instruction
to generate.  An instruction alias has two parts: the string to match and the
instruction to generate.  For example:

```
def : InstAlias<"movsx $src, $dst", (MOVSX16rr8W GR16:$dst, GR8  :$src)>;
def : InstAlias<"movsx $src, $dst", (MOVSX16rm8W GR16:$dst, i8mem:$src)>;
def : InstAlias<"movsx $src, $dst", (MOVSX32rr8  GR32:$dst, GR8  :$src)>;
def : InstAlias<"movsx $src, $dst", (MOVSX32rr16 GR32:$dst, GR16 :$src)>;
def : InstAlias<"movsx $src, $dst", (MOVSX64rr8  GR64:$dst, GR8  :$src)>;
def : InstAlias<"movsx $src, $dst", (MOVSX64rr16 GR64:$dst, GR16 :$src)>;
def : InstAlias<"movsx $src, $dst", (MOVSX64rr32 GR64:$dst, GR32 :$src)>;
```

This shows a powerful example of the instruction aliases, matching the same
mnemonic in multiple different ways depending on what operands are present in
the assembly.  The result of instruction aliases can include operands in a
different order than the destination instruction, and can use an input multiple
times, for example:

```
def : InstAlias<"clrb $reg", (XOR8rr  GR8 :$reg, GR8 :$reg)>;
def : InstAlias<"clrw $reg", (XOR16rr GR16:$reg, GR16:$reg)>;
def : InstAlias<"clrl $reg", (XOR32rr GR32:$reg, GR32:$reg)>;
def : InstAlias<"clrq $reg", (XOR64rr GR64:$reg, GR64:$reg)>;
```

This example also shows that tied operands are only listed once.  In the X86
backend, XOR8rr has two input GR8's and one output GR8 (where an input is tied
to the output).  InstAliases take a flattened operand list without duplicates
for tied operands.  The result of an instruction alias can also use immediates
and fixed physical registers which are added as simple immediate operands in the
result, for example:

```
// Fixed Immediate operand.
def : InstAlias<"aad", (AAD8i8 10)>;

// Fixed register operand.
def : InstAlias<"fcomi", (COM_FIr ST1)>;

// Simple alias.
def : InstAlias<"fcomi $reg", (COM_FIr RST:$reg)>;
```

Instruction aliases can also have a Requires clause to make them subtarget
specific.

If the back-end supports it, the instruction printer can automatically emit the
alias rather than what's being aliased. It typically leads to better, more
readable code. If it's better to print out what's being aliased, then pass a '0'
as the third parameter to the InstAlias definition.

### Instruction Matching

```{note}
To Be Written
```
(Implementations of the abstract target description interfaces)=
(implement the target description)=

## Target-specific Implementation Notes

This section of the document explains features or design decisions that are
specific to the code generator for a particular target.

(tail call section)=

### Tail call optimization

Tail call optimization, callee reusing the stack of the caller, is currently
supported on x86/x86-64, PowerPC, AArch64, and WebAssembly. It is performed on
x86/x86-64, PowerPC, and AArch64 if:

* Caller and callee have the calling convention `fastcc`, `cc 10` (GHC
  calling convention), `cc 11` (HiPE calling convention), `tailcc`, or
  `swifttailcc`.

* The call is a tail call - in tail position (ret immediately follows call and
  ret uses value of call or is void).

* Option `-tailcallopt` is enabled or the calling convention is `tailcc`.

* Platform-specific constraints are met.

x86/x86-64 constraints:

* No variable argument lists are used.

* On x86-64 when generating GOT/PIC code only module-local calls (visibility =
  hidden or protected) are supported.

PowerPC constraints:

* No variable argument lists are used.

* No byval parameters are used.

* On ppc32/64 GOT/PIC only module-local calls (visibility = hidden or protected)
  are supported.

WebAssembly constraints:

* No variable argument lists are used

* The 'tail-call' target attribute is enabled.

* The caller and callee's return types must match. The caller cannot
  be void unless the callee is, too.

AArch64 constraints:

* No variable argument lists are used.

Example:

Call as `llc -tailcallopt test.ll`.

```llvm
declare fastcc i32 @tailcallee(i32 inreg %a1, i32 inreg %a2, i32 %a3, i32 %a4)

define fastcc i32 @tailcaller(i32 %in1, i32 %in2) {
  %l1 = add i32 %in1, %in2
  %tmp = tail call fastcc i32 @tailcallee(i32 inreg %in1, i32 inreg %in2, i32 %in1, i32 %l1)
  ret i32 %tmp
}
```
Implications of `-tailcallopt`:

To support tail call optimization in situations where the callee has more
arguments than the caller a 'callee pops arguments' convention is used. This
currently causes each `fastcc` call that is not tail call optimized (because
one or more of above constraints are not met) to be followed by a readjustment
of the stack. So performance might be worse in such cases.

### Sibling call optimization

Sibling call optimization is a restricted form of tail call optimization.
Unlike tail call optimization described in the previous section, it can be
performed automatically on any tail calls when `-tailcallopt` option is not
specified.

Sibling call optimization is currently performed on x86/x86-64 when the
following constraints are met:

* Caller and callee have the same calling convention. It can be either `c` or
  `fastcc`.

* The call is a tail call - in tail position (ret immediately follows call and
  ret uses value of call or is void).

* Caller and callee have matching return type or the callee result is not used.

* If any of the callee arguments are being passed on the stack, they must be
  available in caller's own incoming argument stack and the frame offsets must
  be the same.

Example:

```llvm
declare i32 @bar(i32, i32)

define i32 @foo(i32 %a, i32 %b, i32 %c) {
entry:
  %0 = tail call i32 @bar(i32 %a, i32 %b)
  ret i32 %0
}
```
### The X86 backend

The X86 code generator lives in the `lib/Target/X86` directory.  This code
generator is capable of targeting a variety of x86-32 and x86-64 processors, and
includes support for ISA extensions such as MMX and SSE.

#### X86 Target Triples supported

The following are the known target triples that are supported by the X86
backend.  This is not an exhaustive list, and it would be useful to add those
that people test.

* **i686-pc-linux-gnu** --- Linux

* **i386-unknown-freebsd5.3** --- FreeBSD 5.3

* **i686-pc-cygwin** --- Cygwin on Win32

* **i686-pc-mingw32** --- MingW on Win32

* **i386-pc-mingw32msvc** --- MingW crosscompiler on Linux

* **i686-apple-darwin*** --- Apple Darwin on X86

* **x86_64-unknown-linux-gnu** --- Linux

#### X86 Calling Conventions supported

The following target-specific calling conventions are known to backend:

* **x86_StdCall** --- stdcall calling convention seen on Microsoft Windows
  platform (CC ID = 64).

* **x86_FastCall** --- fastcall calling convention seen on Microsoft Windows
  platform (CC ID = 65).

* **x86_ThisCall** --- Similar to X86_StdCall. Passes first argument in ECX,
  others via stack. Callee is responsible for stack cleaning. This convention is
  used by MSVC by default for methods in its ABI (CC ID = 70).

(X86 addressing mode)=

#### Representing X86 addressing modes in MachineInstrs

The x86 has a very flexible way of accessing memory.  It is capable of forming
memory addresses of the following expression directly in integer instructions
(which use ModR/M addressing):

```
SegmentReg: Base + [1,2,4,8] * IndexReg + Disp32
```

In order to represent this, LLVM tracks no less than 5 operands for each memory
operand of this form.  This means that the "load" form of '`mov`' has the
following `MachineOperand`s in this order:

```
Index:        0     |    1        2       3           4          5
Meaning:   DestReg, | BaseReg,  Scale, IndexReg, Displacement Segment
OperandTy: VirtReg, | VirtReg, UnsImm, VirtReg,   SignExtImm  PhysReg
```

Stores, and all other instructions, treat the four memory operands in the same
way and in the same order.  If the segment register is unspecified (regno = 0),
then no segment override is generated.  "Lea" operations do not have a segment
register specified, so they only have 4 operands for their memory reference.

#### X86 address spaces supported

x86 has a feature which provides the ability to perform loads and stores to
different address spaces via the x86 segment registers.  A segment override
prefix byte on an instruction causes the instruction's memory access to go to
the specified segment.  LLVM address space 0 is the default address space, which
includes the stack, and any unqualified memory accesses in a program.  Address
spaces 1-255 are currently reserved for user-defined code.  The GS-segment is
represented by address space 256, the FS-segment is represented by address space
257, and the SS-segment is represented by address space 258. Other x86 segments
have yet to be allocated address space numbers.

While these address spaces may seem similar to TLS via the `thread_local`
keyword, and often use the same underlying hardware, there are some fundamental
differences.

The `thread_local` keyword applies to global variables and specifies that they
are to be allocated in thread-local memory. There are no type qualifiers
involved, and these variables can be pointed to with normal pointers and
accessed with normal loads and stores.  The `thread_local` keyword is
target-independent at the LLVM IR level (though LLVM doesn't yet have
implementations of it for some configurations)

Special address spaces, in contrast, apply to static types. Every load and store
has a particular address space in its address operand type, and this is what
determines which address space is accessed.  LLVM ignores these special address
space qualifiers on global variables, and does not provide a way to directly
allocate storage in them.  At the LLVM IR level, the behavior of these special
address spaces depends in part on the underlying OS or runtime environment, and
they are specific to x86 (and LLVM doesn't yet handle them correctly in some
cases).

Some operating systems and runtime environments use (or may in the future use)
the FS/GS-segment registers for various low-level purposes, so care should be
taken when considering them.

#### Instruction naming

An instruction name consists of the base name, a default operand size, and a
character per operand with an optional special size. For example:

```
ADD8rr      -> add, 8-bit register, 8-bit register
IMUL16rmi   -> imul, 16-bit register, 16-bit memory, 16-bit immediate
IMUL16rmi8  -> imul, 16-bit register, 16-bit memory, 8-bit immediate
MOVSX32rm16 -> movsx, 32-bit register, 16-bit memory
```

### The PowerPC backend

The PowerPC code generator lives in the `lib/Target/PowerPC` directory.  The code
generation is retargetable to several variations or *subtargets* of the PowerPC
ISA; including ppc32, ppc64 and altivec.

#### LLVM PowerPC ABI

LLVM follows the AIX PowerPC ABI, with two deviations. LLVM uses a PC relative
(PIC) or static addressing for accessing global values, so no TOC (r2) is
used. Second, r31 is used as a frame pointer to allow dynamic growth of a stack
frame.  LLVM takes advantage of having no TOC to provide space to save the frame
pointer in the PowerPC linkage area of the caller frame.  Other details of
PowerPC ABI can be found at [PowerPC ABI](http://developer.apple.com/documentation/DeveloperTools/Conceptual/LowLevelABI/Articles/32bitPowerPC.html). Note: This link describes the 32-bit ABI.  The 64-bit ABI is similar except
space for GPRs are 8 bytes wide (not 4) and r13 is reserved for system use.

#### Frame Layout

The size of a PowerPC frame is usually fixed for the duration of a function's
invocation.  Since the frame is fixed size, all references into the frame can be
accessed via fixed offsets from the stack pointer.  The exception to this is
when dynamic alloca or variable sized arrays are present, then a base pointer
(r31) is used as a proxy for the stack pointer and stack pointer is free to grow
or shrink.  A base pointer is also used if llvm-gcc is not passed the
-fomit-frame-pointer flag. The stack pointer is always aligned to 16 bytes, so
that space allocated for altivec vectors will be properly aligned.

An invocation frame is laid out as follows (low memory at top):

| Stack frame area |
| --- |
| Linkage |
| Parameter area |
| Dynamic area |
| Locals area |
| Saved registers area |
|  |
| Previous Frame |

The *linkage* area is used by a callee to save special registers prior to
allocating its own frame.  Only three entries are relevant to LLVM. The first
entry is the previous stack pointer (sp), aka link.  This allows probing tools
like gdb or exception handlers to quickly scan the frames in the stack.  A
function epilog can also use the link to pop the frame from the stack.  The
third entry in the linkage area is used to save the return address from the lr
register. Finally, as mentioned above, the last entry is used to save the
previous frame pointer (r31.)  The entries in the linkage area are the size of a
GPR, thus the linkage area is 24 bytes long in 32-bit mode and 48 bytes in
64-bit mode.

32-bit linkage area:

| Offset | Contents |
| --- | --- |
| 0 | Saved SP (r1) |
| 4 | Saved CR |
| 8 | Saved LR |
| 12 | Reserved |
| 16 | Reserved |
| 20 | Saved FP (r31) |

64-bit linkage area:

| Offset | Contents |
| --- | --- |
| 0 | Saved SP (r1) |
| 8 | Saved CR |
| 16 | Saved LR |
| 24 | Reserved |
| 32 | Reserved |
| 40 | Saved FP (r31) |

The *parameter area* is used to store arguments being passed to a callee
function.  Following the PowerPC ABI, the first few arguments are actually
passed in registers, with the space in the parameter area unused.  However, if
there are not enough registers or the callee is a thunk or vararg function,
these register arguments can be spilled into the parameter area.  Thus, the
parameter area must be large enough to store all the parameters for the largest
call sequence made by the caller.  The size must also be minimally large enough
to spill registers r3-r10.  This allows callees blind to the call signature,
such as thunks and vararg functions, enough space to cache the argument
registers.  Therefore, the parameter area is minimally 32 bytes (64 bytes in
64-bit mode.)  Also note that since the parameter area is a fixed offset from the
top of the frame, that a callee can access its split arguments using fixed
offsets from the stack pointer (or base pointer.)

Combining the information about the linkage, parameter areas and alignment. A
stack frame is minimally 64 bytes in 32-bit mode and 128 bytes in 64-bit mode.

The *dynamic area* starts out as size zero.  If a function uses dynamic alloca
then space is added to the stack, the linkage and parameter areas are shifted to
top of stack, and the new space is available immediately below the linkage and
parameter areas.  The cost of shifting the linkage and parameter areas is minor
since only the link value needs to be copied.  The link value can be easily
fetched by adding the original frame size to the base pointer.  Note that
allocations in the dynamic space need to observe 16-byte alignment.

The *locals area* is where the llvm compiler reserves space for local variables.

The *saved registers area* is where the llvm compiler spills callee saved
registers on entry to the callee.

#### Prolog/Epilog

The llvm prolog and epilog are the same as described in the PowerPC ABI, with
the following exceptions.  Callee saved registers are spilled after the frame is
created.  This allows the llvm epilog/prolog support to be common with other
targets.  The base pointer callee saved register r31 is saved in the TOC slot of
linkage area.  This simplifies allocation of space for the base pointer and
makes it convenient to locate programmatically and during debugging.

#### Dynamic Allocation

```{note}
TODO - More to come.
```
### The NVPTX backend

The NVPTX code generator under lib/Target/NVPTX is an open-source version of
the NVIDIA NVPTX code generator for LLVM.  It is contributed by NVIDIA and is
a port of the code generator used in the CUDA compiler (nvcc).  It targets the
PTX 3.0/3.1 ISA and can target any compute capability greater than or equal to
2.0 (Fermi).

This target is of production quality and should be completely compatible with
the official NVIDIA toolchain.

Code Generator Options:

| Option | Description |
| --- | --- |
| sm_20 | Set shader model/compute capability to 2.0 |
| sm_21 | Set shader model/compute capability to 2.1 |
| sm_30 | Set shader model/compute capability to 3.0 |
| sm_35 | Set shader model/compute capability to 3.5 |
| ptx30 | Target PTX 3.0 |
| ptx31 | Target PTX 3.1 |

### The extended Berkeley Packet Filter (eBPF) backend

Extended BPF (or eBPF) is similar to the original ("classic") BPF (cBPF) used
to filter network packets.  The
[bpf() system call](http://man7.org/linux/man-pages/man2/bpf.2.html)
performs a range of operations related to eBPF.  For both cBPF and eBPF
programs, the Linux kernel statically analyzes the programs before loading
them, in order to ensure that they cannot harm the running system.  eBPF is
a 64-bit RISC instruction set designed for one to one mapping to 64-bit CPUs.
Opcodes are 8-bit encoded, and 87 instructions are defined.  There are 10
registers, grouped by function as outlined below.

```
R0        return value from in-kernel functions; exit value for eBPF program
R1 - R5   function call arguments to in-kernel functions
R6 - R9   callee-saved registers preserved by in-kernel functions
R10       stack frame pointer (read only)
```

#### Instruction encoding (arithmetic and jump)
eBPF is reusing most of the opcode encoding from classic to simplify conversion
of classic BPF to eBPF.  For arithmetic and jump instructions the 8-bit 'code'
field is divided into three parts:

```
+----------------+--------+--------------------+
|   4 bits       |  1 bit |   3 bits           |
| operation code | source | instruction class  |
+----------------+--------+--------------------+
(MSB)                                      (LSB)
```

Three LSB bits store instruction class which is one of:

```
BPF_LD     0x0
BPF_LDX    0x1
BPF_ST     0x2
BPF_STX    0x3
BPF_ALU    0x4
BPF_JMP    0x5
(unused)   0x6
BPF_ALU64  0x7
```

When BPF_CLASS(code) == BPF_ALU or BPF_ALU64 or BPF_JMP,
4th bit encodes source operand

```
BPF_X     0x1  use src_reg register as source operand
BPF_K     0x0  use 32-bit immediate as source operand
```

and four MSB bits store operation code

```
BPF_ADD   0x0  add
BPF_SUB   0x1  subtract
BPF_MUL   0x2  multiply
BPF_DIV   0x3  divide
BPF_OR    0x4  bitwise logical OR
BPF_AND   0x5  bitwise logical AND
BPF_LSH   0x6  left shift
BPF_RSH   0x7  right shift (zero extended)
BPF_NEG   0x8  arithmetic negation
BPF_MOD   0x9  modulo
BPF_XOR   0xa  bitwise logical XOR
BPF_MOV   0xb  move register to register
BPF_ARSH  0xc  right shift (sign extended)
BPF_END   0xd  endianness conversion
```

If BPF_CLASS(code) == BPF_JMP, BPF_OP(code) is one of

```
BPF_JA    0x0  unconditional jump
BPF_JEQ   0x1  jump ==
BPF_JGT   0x2  jump >
BPF_JGE   0x3  jump >=
BPF_JSET  0x4  jump if (DST & SRC)
BPF_JNE   0x5  jump !=
BPF_JSGT  0x6  jump signed >
BPF_JSGE  0x7  jump signed >=
BPF_CALL  0x8  function call
BPF_EXIT  0x9  function return
```

#### Instruction encoding (load, store)
For load and store instructions the 8-bit 'code' field is divided as:

```
+--------+--------+-------------------+
| 3 bits | 2 bits |   3 bits          |
|  mode  |  size  | instruction class |
+--------+--------+-------------------+
(MSB)                             (LSB)
```

Size modifier is one of

```
BPF_W       0x0  word
BPF_H       0x1  half word
BPF_B       0x2  byte
BPF_DW      0x3  double word
```

Mode modifier is one of

```
BPF_IMM     0x0  immediate
BPF_ABS     0x1  used to access packet data
BPF_IND     0x2  used to access packet data
BPF_MEM     0x3  memory
(reserved)  0x4
(reserved)  0x5
BPF_XADD    0x6  exclusive add
```


#### Packet data access (BPF_ABS, BPF_IND)

Two non-generic instructions: (`BPF_ABS | <size> | BPF_LD`) and
(`BPF_IND | <size> | BPF_LD`) which are used to access packet data.
Register R6 is an implicit input that must contain pointer to sk_buff.
Register R0 is an implicit output which contains the data fetched
from the packet.  Registers R1-R5 are scratch registers and must not
be used to store the data across `BPF_ABS | BPF_LD` or `BPF_IND | BPF_LD`
instructions.  These instructions have implicit program exit condition
as well.  When eBPF program is trying to access the data beyond
the packet boundary, the interpreter will abort the execution of the program.

`BPF_IND | BPF_W | BPF_LD` is equivalent to:

```
R0 = ntohl(*(u32 *) (((struct sk_buff *) R6)->data + src_reg + imm32))
```

#### eBPF maps

eBPF maps are provided for sharing data between kernel and user-space.
Currently implemented types are hash and array, with potential extension to
support bloom filters, radix trees, etc.  A map is defined by its type,
maximum number of elements, key size and value size in bytes.  eBPF syscall
supports create, update, find and delete functions on maps.

#### Function calls

Function call arguments are passed using up to five registers (R1 - R5).
The return value is passed in a dedicated register (R0).  Four additional
registers (R6 - R9) are callee-saved, and the values in these registers
are preserved within kernel functions.  R0 - R5 are scratch registers within
kernel functions, and eBPF programs must therefor store/restore values in
these registers if needed across function calls.  The stack can be accessed
using the read-only frame pointer R10.  eBPF registers map 1:1 to hardware
registers on x86_64 and other 64-bit architectures.  For example, x86_64
in-kernel JIT maps them as

```
R0 - rax
R1 - rdi
R2 - rsi
R3 - rdx
R4 - rcx
R5 - r8
R6 - rbx
R7 - r13
R8 - r14
R9 - r15
R10 - rbp
```

since x86_64 ABI mandates rdi, rsi, rdx, rcx, r8, r9 for argument passing
and rbx, r12 - r15 are callee saved.

#### Program start

An eBPF program receives a single argument and contains
a single eBPF main routine; the program does not contain eBPF functions.
Function calls are limited to a predefined set of kernel functions.  The size
of a program is limited to 4K instructions:  this ensures fast termination and
a limited number of kernel function calls.  Prior to running an eBPF program,
a verifier performs static analysis to prevent loops in the code and
to ensure valid register usage and operand types.

### The AMDGPU backend

The AMDGPU code generator lives in the `lib/Target/AMDGPU`
directory. This code generator is capable of targeting a variety of
AMD GPU processors. Refer to {doc}`AMDGPUUsage` for more information.

### The Lightweight Fault Isolation (LFI) sub-architecture

LFI is a sub-architecture available for certain backends that allows programs
compiled for the target to run in a sandboxed environment that is within the
same address space as host code. Refer to {doc}`LFI` for more information about
LFI.
