Next: , Up: GIMPLE   [Contents][Index]


11.1 Tuple representation

GIMPLE instructions are tuples of variable size divided in two groups: a header describing the instruction and its locations, and a variable length body with all the operands. Tuples are organized into a hierarchy with 3 main classes of tuples.

11.1.1 gimple_statement_base (gsbase)

This is the root of the hierarchy, it holds basic information needed by most GIMPLE statements. There are some fields that may not be relevant to every GIMPLE statement, but those were moved into the base structure to take advantage of holes left by other fields (thus making the structure more compact). The structure takes 4 words (32 bytes) on 64 bit hosts:

FieldSize (bits)
code8
subcode16
no_warning1
visited1
nontemporal_move1
plf2
modified1
has_volatile_ops1
references_memory_p1
uid32
location32
num_ops32
bb64
block63
Total size32 bytes

11.1.2 gimple_statement_with_ops

This tuple is actually split in two: gimple_statement_with_ops_base and gimple_statement_with_ops. This is needed to accommodate the way the operand vector is allocated. The operand vector is defined to be an array of 1 element. So, to allocate a dynamic number of operands, the memory allocator (gimple_alloc) simply allocates enough memory to hold the structure itself plus N - 1 operands which run “off the end” of the structure. For example, to allocate space for a tuple with 3 operands, gimple_alloc reserves sizeof (struct gimple_statement_with_ops) + 2 * sizeof (tree) bytes.

On the other hand, several fields in this tuple need to be shared with the gimple_statement_with_memory_ops tuple. So, these common fields are placed in gimple_statement_with_ops_base which is then inherited from the other two tuples.

gsbase256
def_ops64
use_ops64
opnum_ops * 64
Total size48 + 8 * num_ops bytes

11.1.3 gimple_statement_with_memory_ops

This tuple is essentially identical to gimple_statement_with_ops, except that it contains 4 additional fields to hold vectors related memory stores and loads. Similar to the previous case, the structure is split in two to accommodate for the operand vector (gimple_statement_with_memory_ops_base and gimple_statement_with_memory_ops).

FieldSize (bits)
gsbase256
def_ops64
use_ops64
vdef_ops64
vuse_ops64
stores64
loads64
opnum_ops * 64
Total size80 + 8 * num_ops bytes

All the other tuples are defined in terms of these three basic ones. Each tuple will add some fields.

The following diagram shows the C++ inheritance hierarchy of statement kinds, along with their relationships to GSS_ values (layouts) and GIMPLE_ values (codes):

+- gimple_statement_base
     |    layout: GSS_BASE
     |    used for 4 codes: GIMPLE_ERROR_MARK
     |                      GIMPLE_NOP
     |                      GIMPLE_OMP_SECTIONS_SWITCH
     |                      GIMPLE_PREDICT
     |
     + gimple_statement_with_ops_base
     |   |    (no GSS layout)
     |   |
     |   + gimple_statement_with_ops
     |   |        layout: GSS_WITH_OPS
     |   |        Used for 5 codes: GIMPLE_COND
     |   |                          GIMPLE_DEBUG
     |   |                          GIMPLE_GOTO
     |   |                          GIMPLE_LABEL
     |   |                          GIMPLE_SWITCH
     |   |
     |   + gimple_statement_with_memory_ops_base
     |       |    layout: GSS_WITH_MEM_OPS_BASE
     |       |
     |       + gimple_statement_with_memory_ops
     |       |        layout: GSS_WITH_MEM_OPS.
     |       |        used for codes GIMPLE_ASSIGN and GIMPLE_RETURN.
     |       |
     |       + gimple_statement_call
     |       |        layout: GSS_CALL, code: GIMPLE_CALL
     |       |
     |       + gimple_statement_asm
     |       |        layout: GSS_ASM, code: GIMPLE_ASM
     |       |
     |       + gimple_statement_transaction
     |                layout: GSS_TRANSACTION, code: GIMPLE_TRANSACTION
     |
     + gimple_statement_omp
     |   |    layout: GSS_OMP.  Used for code GIMPLE_OMP_SECTION
     |   |
     |   + gimple_statement_omp_critical
     |   |        layout: GSS_OMP_CRITICAL, code: GIMPLE_OMP_CRITICAL
     |   |
     |   + gimple_statement_omp_for
     |   |        layout: GSS_OMP_FOR, code: GIMPLE_OMP_FOR
     |   |
     |   + gimple_statement_omp_parallel_layout
     |   |   |    layout: GSS_OMP_PARALLEL_LAYOUT
     |   |   |
     |   |   + gimple_statement_omp_taskreg
     |   |   |   |
     |   |   |   + gimple_statement_omp_parallel
     |   |   |   |        code: GIMPLE_OMP_PARALLEL
     |   |   |   |
     |   |   |   + gimple_statement_omp_task
     |   |   |            code: GIMPLE_OMP_TASK
     |   |   |
     |   |   + gimple_statement_omp_target
     |   |            code: GIMPLE_OMP_TARGET
     |   |
     |   + gimple_statement_omp_sections
     |   |        layout: GSS_OMP_SECTIONS, code: GIMPLE_OMP_SECTIONS
     |   |
     |   + gimple_statement_omp_single_layout
     |       |    layout: GSS_OMP_SINGLE_LAYOUT
     |       |
     |       + gimple_statement_omp_single
     |       |        code: GIMPLE_OMP_SINGLE
     |       |
     |       + gimple_statement_omp_teams
     |                code: GIMPLE_OMP_TEAMS
     |
     + gimple_statement_bind
     |        layout: GSS_BIND, code: GIMPLE_BIND
     |
     + gimple_statement_catch
     |        layout: GSS_CATCH, code: GIMPLE_CATCH
     |
     + gimple_statement_eh_filter
     |        layout: GSS_EH_FILTER, code: GIMPLE_EH_FILTER
     |
     + gimple_statement_eh_else
     |        layout: GSS_EH_ELSE, code: GIMPLE_EH_ELSE
     |
     + gimple_statement_eh_mnt
     |        layout: GSS_EH_MNT, code: GIMPLE_EH_MUST_NOT_THROW
     |
     + gimple_statement_phi
     |        layout: GSS_PHI, code: GIMPLE_PHI
     |
     + gimple_statement_eh_ctrl
     |   |    layout: GSS_EH_CTRL
     |   |
     |   + gimple_statement_resx
     |   |        code: GIMPLE_RESX
     |   |
     |   + gimple_statement_eh_dispatch
     |            code: GIMPLE_EH_DISPATCH
     |
     + gimple_statement_try
     |        layout: GSS_TRY, code: GIMPLE_TRY
     |
     + gimple_statement_wce
     |        layout: GSS_WCE, code: GIMPLE_WITH_CLEANUP_EXPR
     |
     + gimple_statement_omp_continue
     |        layout: GSS_OMP_CONTINUE, code: GIMPLE_OMP_CONTINUE
     |
     + gimple_statement_omp_atomic_load
     |        layout: GSS_OMP_ATOMIC_LOAD, code: GIMPLE_OMP_ATOMIC_LOAD
     |
     + gimple_statement_omp_atomic_store_layout
         |    layout: GSS_OMP_ATOMIC_STORE_LAYOUT,
         |    code: GIMPLE_OMP_ATOMIC_STORE
         |
         + gimple_statement_omp_atomic_store
         |        code: GIMPLE_OMP_ATOMIC_STORE
         |
         + gimple_statement_omp_return
                  code: GIMPLE_OMP_RETURN

Next: , Up: GIMPLE   [Contents][Index]