X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=docs%2FCodeGenerator.html;h=32a3a971a32e088cc89c883362b6b01ba701f236;hb=d3c9d9447ed7b5b8d3800b871ff162ae2df9fd5b;hp=4f762dc956ad26083a001c239458b32db2db4172;hpb=6805b56e7786f754756526e82e5a29bc77d97e9e;p=oota-llvm.git diff --git a/docs/CodeGenerator.html b/docs/CodeGenerator.html index 4f762dc956a..32a3a971a32 100644 --- a/docs/CodeGenerator.html +++ b/docs/CodeGenerator.html @@ -50,6 +50,7 @@
  • The MachineBasicBlock class
  • The MachineFunction class
  • +
  • MachineInstr Bundles
  • The "MC" Layer @@ -706,6 +707,21 @@ ret + +

    + 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 @@ -761,6 +777,88 @@ ret + +

    + 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 indiviual 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 MachineInstr's should be done as part of the register + allocation super-pass. More specifically, the pass which determines what + MIs should be bundled together must be done after code generator exits SSA + form (i.e. after two-address pass, PHI elimination, and copy coalescing). + Bundles should only be finalized (i.e. adding BUNDLE MIs and input and + output register MachineOperands) after virtual registers have been + rewritten into physical registers. This requirement eliminates the need to + add virtual register operands to BUNDLE instructions which would effectively + double the virtual register def and use lists.

    +
    @@ -2288,6 +2386,7 @@ is the key:

    Feature ARM CellSPU + Hexagon MBlaze MSP430 Mips @@ -2302,6 +2401,7 @@ is the key:

    is generally reliable + @@ -2316,6 +2416,7 @@ is the key:

    assembly parser + @@ -2330,6 +2431,7 @@ is the key:

    disassembler + @@ -2344,6 +2446,7 @@ is the key:

    inline asm + @@ -2358,6 +2461,7 @@ is the key:

    jit * + @@ -2372,6 +2476,7 @@ is the key:

    .o file writing + @@ -2386,6 +2491,7 @@ is the key:

    tail calls + @@ -2400,6 +2506,7 @@ is the key:

    segmented stacks +