[llvm-dev] Basic Jump indirect
Krzysztof Parzyszek via llvm-dev
llvm-dev at lists.llvm.org
Mon Sep 5 18:48:16 PDT 2016
On 9/5/2016 2:39 PM, Gschwandtner Georg - S1310567008 via llvm-dev wrote:
> I clearly do not understand how the concept for loading an address to a
> register works in LLVM.
> For some insights I would be very thankful.
In order to have a value in a register, it needs to have a type that the
given register can contain. The b_target from your first definition is
likely not of any type that can end up in a register. The patterns you
defined later only work for tglobaladdr and texternalsym, neither of
which represents a target of a typical branch in the IR. If your target
only supports indirect branches, you'd need to "legalize" all branches
from "br bb:$block" to something like "brind (blockaddress $block)".
If you want the instruction selection to assign a value to a register,
that value must already exist in the program. Basic blocks are not
referred to via their addresses, so in order to obtain an address of a
basic block you need to insert code that will generate it. Branches to
global addresses are, by definition, branches where the target is
already given as an address. The pattern matching only matches the
expression tree (well, a piece of a DAG, to be precise) to a given
instruction definition and it will generate a register if it matches an
instruction that expects an operand in a register. (Strictly speaking, a
register which can hold that type of a value: addresses may be of type
i32 or i64, and so the instruction's input register must be from a
register class associated with i32 or i64 respectively).
More information about the llvm-dev