libFirm
Lowering

Lowering is the process of transforming a highlevel representation (a representation closer to the sourcecode) into a lower-level representation (something closer to the target machine). More...

Data Structures

struct  i_call_record
 An intrinsic call record. More...
 
struct  i_instr_record
 An intrinsic instruction record. More...
 
union  i_record
 An intrinsic record. More...
 

Typedefs

typedef int lower_mux_callback(ir_node *mux)
 Used as callback, whenever a lowerable mux is found. More...
 
typedef int() i_mapper_func(ir_node *node)
 An intrinsic mapper function. More...
 
typedef struct ir_intrinsics_map ir_intrinsics_map
 

Enumerations

enum  ikind { INTRINSIC_CALL = 0, INTRINSIC_INSTR }
 kind of an instruction record More...
 

Functions

void lower_CopyB (ir_graph *irg, unsigned max_small_size, unsigned min_large_size, int allow_misalignments)
 Lower small CopyB nodes to Load/Store nodes, preserve medium-sized CopyB nodes and replace large CopyBs by a call to memcpy, depending on the given parameters. More...
 
void lower_switch (ir_graph *irg, unsigned small_switch, unsigned spare_size, ir_mode *selector_mode)
 Lowers all Switches (Cond nodes with non-boolean mode) depending on spare_size. More...
 
void lower_highlevel_graph (ir_graph *irg)
 Replaces Offsets and TypeConsts by a real constant if possible. More...
 
void lower_highlevel (void)
 Performs lowering on all graphs. More...
 
void lower_const_code (void)
 Performs lowering on all nodes of the const code irg. More...
 
void lower_mux (ir_graph *irg, lower_mux_callback *cb_func)
 Lowers all mux nodes in the given graph. More...
 
ir_intrinsics_mapir_create_intrinsics_map (i_record *list, size_t length, int part_block_used)
 Create a new intrinsic lowering map which can be used by ir_lower_intrinsics. More...
 
void ir_free_intrinsics_map (ir_intrinsics_map *map)
 Frees resources occupied by an intrisics_map created by ir_create_intrinsics_map(). More...
 
void ir_lower_intrinsics (ir_graph *irg, ir_intrinsics_map *map)
 Go through all graphs and map calls to intrinsic functions and instructions. More...
 
int i_mapper_abs (ir_node *call)
 A mapper for the integer/float absolute value: type abs(type v). More...
 
int i_mapper_sqrt (ir_node *call)
 A mapper for the floating point sqrt(v): floattype sqrt(floattype v);. More...
 
int i_mapper_cbrt (ir_node *call)
 A mapper for the floating point cbrt(v): floattype sqrt(floattype v);. More...
 
int i_mapper_pow (ir_node *call)
 A mapper for the floating point pow(a, b): floattype pow(floattype a, floattype b);. More...
 
int i_mapper_exp (ir_node *call)
 A mapper for the floating point exp(a): floattype exp(floattype a);. More...
 
int i_mapper_exp2 (ir_node *call)
 A mapper for the floating point exp2(a): floattype exp2(floattype a);. More...
 
int i_mapper_exp10 (ir_node *call)
 A mapper for the floating point exp10(a): floattype exp10(floattype a);. More...
 
int i_mapper_log (ir_node *call)
 A mapper for the floating point log(a): floattype log(floattype a);. More...
 
int i_mapper_log2 (ir_node *call)
 A mapper for the floating point log(a): floattype log(floattype a);. More...
 
int i_mapper_log10 (ir_node *call)
 A mapper for the floating point log(a): floattype log(floattype a);. More...
 
int i_mapper_sin (ir_node *call)
 A mapper for the floating point sin(a): floattype sin(floattype a);. More...
 
int i_mapper_cos (ir_node *call)
 A mapper for the floating point sin(a): floattype cos(floattype a);. More...
 
int i_mapper_tan (ir_node *call)
 A mapper for the floating point tan(a): floattype tan(floattype a);. More...
 
int i_mapper_asin (ir_node *call)
 A mapper for the floating point asin(a): floattype asin(floattype a);. More...
 
int i_mapper_acos (ir_node *call)
 A mapper for the floating point acos(a): floattype acos(floattype a);. More...
 
int i_mapper_atan (ir_node *call)
 A mapper for the floating point atan(a): floattype atan(floattype a);. More...
 
int i_mapper_sinh (ir_node *call)
 A mapper for the floating point sinh(a): floattype sinh(floattype a);. More...
 
int i_mapper_cosh (ir_node *call)
 A mapper for the floating point cosh(a): floattype cosh(floattype a);. More...
 
int i_mapper_tanh (ir_node *call)
 A mapper for the floating point tanh(a): floattype tanh(floattype a);. More...
 
int i_mapper_strcmp (ir_node *call)
 A mapper for the strcmp-Function: inttype strcmp(char pointer a, char pointer b);. More...
 
int i_mapper_strncmp (ir_node *call)
 A mapper for the strncmp-Function: inttype strncmp(char pointer a, char pointer b, inttype len);. More...
 
int i_mapper_strcpy (ir_node *call)
 A mapper for the strcpy-Function: char pointer strcpy(char pointer a, char pointer b);. More...
 
int i_mapper_strlen (ir_node *call)
 A mapper for the strlen-Function: inttype strlen(char pointer a);. More...
 
int i_mapper_memcpy (ir_node *call)
 A mapper for the memcpy-Function: void pointer memcpy(void pointer d, void pointer s, inttype c);. More...
 
int i_mapper_memmove (ir_node *call)
 A mapper for the memmove-Function: void pointer memmove(void pointer d, void pointer s, inttype c);. More...
 
int i_mapper_memset (ir_node *call)
 A mapper for the memset-Function: void pointer memset(void pointer d, inttype C, inttype len);. More...
 
int i_mapper_memcmp (ir_node *call)
 A mapper for the strncmp-Function: inttype memcmp(void pointer a, void pointer b, inttype len);. More...
 

Detailed Description

Lowering is the process of transforming a highlevel representation (a representation closer to the sourcecode) into a lower-level representation (something closer to the target machine).


Data Structure Documentation

◆ i_call_record

struct i_call_record

An intrinsic call record.

Definition at line 152 of file lowering.h.

Data Fields
ir_entity * i_ent the entity representing an intrinsic call
i_mapper_func * i_mapper the mapper function to call
enum ikind kind must be INTRINSIC_CALL

◆ i_instr_record

struct i_instr_record

An intrinsic instruction record.

Definition at line 161 of file lowering.h.

Data Fields
i_mapper_func * i_mapper the mapper function to call
enum ikind kind must be INTRINSIC_INSTR
ir_op * op the opcode that must be mapped.

◆ i_record

union i_record

An intrinsic record.

Definition at line 170 of file lowering.h.

Data Fields
i_call_record i_call used for call records
i_instr_record i_instr used for isnstruction records
enum ikind kind kind of record

Typedef Documentation

◆ i_mapper_func

typedef int() i_mapper_func(ir_node *node)

An intrinsic mapper function.

Parameters
nodethe IR-node that will be mapped
Returns
non-zero if the call was mapped

Definition at line 140 of file lowering.h.

◆ ir_intrinsics_map

Definition at line 176 of file lowering.h.

◆ lower_mux_callback

typedef int lower_mux_callback(ir_node *mux)

Used as callback, whenever a lowerable mux is found.

The return value indicates, whether the mux should be lowered. This may be used, to lower floating point muxes, while keeping mux nodes for integers, for example.

Parameters
muxThe mux node that may be lowered.
Returns
A non-zero value indicates that the mux should be lowered.

Definition at line 122 of file lowering.h.

Enumeration Type Documentation

◆ ikind

enum ikind

kind of an instruction record

See also
i_record
Enumerator
INTRINSIC_CALL 

the record represents an intrinsic call

INTRINSIC_INSTR 

the record represents an intrinsic instruction

Definition at line 144 of file lowering.h.

Function Documentation

◆ i_mapper_abs()

int i_mapper_abs ( ir_node call)

A mapper for the integer/float absolute value: type abs(type v).

Replaces the call by a Abs node.

Returns
always 1

◆ i_mapper_acos()

int i_mapper_acos ( ir_node call)

A mapper for the floating point acos(a): floattype acos(floattype a);.

Returns
1 if the tan call was removed, 0 else.

◆ i_mapper_asin()

int i_mapper_asin ( ir_node call)

A mapper for the floating point asin(a): floattype asin(floattype a);.

Returns
1 if the asin call was removed, 0 else.

◆ i_mapper_atan()

int i_mapper_atan ( ir_node call)

A mapper for the floating point atan(a): floattype atan(floattype a);.

Returns
1 if the atan call was removed, 0 else.

◆ i_mapper_cbrt()

int i_mapper_cbrt ( ir_node call)

A mapper for the floating point cbrt(v): floattype sqrt(floattype v);.

Returns
1 if the cbrt call was removed, 0 else.

◆ i_mapper_cos()

int i_mapper_cos ( ir_node call)

A mapper for the floating point sin(a): floattype cos(floattype a);.

Returns
1 if the cos call was removed, 0 else.

◆ i_mapper_cosh()

int i_mapper_cosh ( ir_node call)

A mapper for the floating point cosh(a): floattype cosh(floattype a);.

Returns
1 if the cosh call was removed, 0 else.

◆ i_mapper_exp()

int i_mapper_exp ( ir_node call)

A mapper for the floating point exp(a): floattype exp(floattype a);.

Returns
1 if the exp call was removed, 0 else.

◆ i_mapper_exp10()

int i_mapper_exp10 ( ir_node call)

A mapper for the floating point exp10(a): floattype exp10(floattype a);.

Returns
1 if the exp call was removed, 0 else.

◆ i_mapper_exp2()

int i_mapper_exp2 ( ir_node call)

A mapper for the floating point exp2(a): floattype exp2(floattype a);.

Returns
1 if the exp call was removed, 0 else.

◆ i_mapper_log()

int i_mapper_log ( ir_node call)

A mapper for the floating point log(a): floattype log(floattype a);.

Returns
1 if the log call was removed, 0 else.

◆ i_mapper_log10()

int i_mapper_log10 ( ir_node call)

A mapper for the floating point log(a): floattype log(floattype a);.

Returns
1 if the log call was removed, 0 else.

◆ i_mapper_log2()

int i_mapper_log2 ( ir_node call)

A mapper for the floating point log(a): floattype log(floattype a);.

Returns
1 if the log call was removed, 0 else.

◆ i_mapper_memcmp()

int i_mapper_memcmp ( ir_node call)

A mapper for the strncmp-Function: inttype memcmp(void pointer a, void pointer b, inttype len);.

Returns
1 if the strncmp call was removed, 0 else.

◆ i_mapper_memcpy()

int i_mapper_memcpy ( ir_node call)

A mapper for the memcpy-Function: void pointer memcpy(void pointer d, void pointer s, inttype c);.

Returns
1 if the memcpy call was removed, 0 else.

◆ i_mapper_memmove()

int i_mapper_memmove ( ir_node call)

A mapper for the memmove-Function: void pointer memmove(void pointer d, void pointer s, inttype c);.

Returns
1 if the memmove call was removed, 0 else.

◆ i_mapper_memset()

int i_mapper_memset ( ir_node call)

A mapper for the memset-Function: void pointer memset(void pointer d, inttype C, inttype len);.

Returns
1 if the memset call was removed, 0 else.

◆ i_mapper_pow()

int i_mapper_pow ( ir_node call)

A mapper for the floating point pow(a, b): floattype pow(floattype a, floattype b);.

Returns
1 if the pow call was removed, 0 else.

◆ i_mapper_sin()

int i_mapper_sin ( ir_node call)

A mapper for the floating point sin(a): floattype sin(floattype a);.

Returns
1 if the sin call was removed, 0 else.

◆ i_mapper_sinh()

int i_mapper_sinh ( ir_node call)

A mapper for the floating point sinh(a): floattype sinh(floattype a);.

Returns
1 if the sinh call was removed, 0 else.

◆ i_mapper_sqrt()

int i_mapper_sqrt ( ir_node call)

A mapper for the floating point sqrt(v): floattype sqrt(floattype v);.

Returns
1 if the sqrt call was removed, 0 else.

◆ i_mapper_strcmp()

int i_mapper_strcmp ( ir_node call)

A mapper for the strcmp-Function: inttype strcmp(char pointer a, char pointer b);.

Returns
1 if the strcmp call was removed, 0 else.

◆ i_mapper_strcpy()

int i_mapper_strcpy ( ir_node call)

A mapper for the strcpy-Function: char pointer strcpy(char pointer a, char pointer b);.

Returns
1 if the strcpy call was removed, 0 else.

◆ i_mapper_strlen()

int i_mapper_strlen ( ir_node call)

A mapper for the strlen-Function: inttype strlen(char pointer a);.

Returns
1 if the strlen call was removed, 0 else.

◆ i_mapper_strncmp()

int i_mapper_strncmp ( ir_node call)

A mapper for the strncmp-Function: inttype strncmp(char pointer a, char pointer b, inttype len);.

Returns
1 if the strncmp call was removed, 0 else.

◆ i_mapper_tan()

int i_mapper_tan ( ir_node call)

A mapper for the floating point tan(a): floattype tan(floattype a);.

Returns
1 if the tan call was removed, 0 else.

◆ i_mapper_tanh()

int i_mapper_tanh ( ir_node call)

A mapper for the floating point tanh(a): floattype tanh(floattype a);.

Returns
1 if the tanh call was removed, 0 else.

◆ ir_create_intrinsics_map()

ir_intrinsics_map* ir_create_intrinsics_map ( i_record list,
size_t  length,
int  part_block_used 
)

Create a new intrinsic lowering map which can be used by ir_lower_intrinsics.

Parameters
listan array of intrinsic map records
lengththe length of the array
part_block_usedset to 1 if part_block() is used by one of the lowering functions.

◆ ir_free_intrinsics_map()

void ir_free_intrinsics_map ( ir_intrinsics_map map)

Frees resources occupied by an intrisics_map created by ir_create_intrinsics_map().

◆ ir_lower_intrinsics()

void ir_lower_intrinsics ( ir_graph irg,
ir_intrinsics_map map 
)

Go through all graphs and map calls to intrinsic functions and instructions.

Every call or instruction is reported to its mapper function, which is responsible for rebuilding the graph.

◆ lower_const_code()

void lower_const_code ( void  )

Performs lowering on all nodes of the const code irg.

See also
lower_highlevel_graph() This is a separate function because the nodes of the const code irg will not Code Generation found with a lower_highlevel_graph(get_const_code_irg()).

◆ lower_CopyB()

void lower_CopyB ( ir_graph irg,
unsigned  max_small_size,
unsigned  min_large_size,
int  allow_misalignments 
)

Lower small CopyB nodes to Load/Store nodes, preserve medium-sized CopyB nodes and replace large CopyBs by a call to memcpy, depending on the given parameters.

Every CopyB is assigned a size category as follows:

  • 'small' iff size <= max_small_size,
  • 'medium' iff max_small_size < size < min_large_size,
  • 'large' iff size >= min_large_size.

The idea is that each backend can apply different optimizations in each of the three categories.

For small CopyBs, the x86 backend could, e.g., emit a single SSE instruction to copy 16 bytes. Other backends might just go with a series of Load/Stores. Therefore, x86 would like to keep the small CopyB nodes around whereas other backends would not. For medium-sized CopyBs, the x86 backend might generate a rep-prefixed mov instruction. Hence, it also wants to keep the CopyBs in these cases. Other backends might handle this differently. For large CopyBs, a call to memcpy is worth the call overhead, so large CopyBs should always be lowered to memcpy calls.

The lowerer performs the following actions if the CopyB is

  • 'small': Replace it with a series of Loads/Stores
  • 'medium': Nothing.
  • 'large': Replace it with a call to memcpy.

max_small_size and min_large_size allow for a flexible configuration. For example, one backend could specify max_small_size == 0 and min_large_size == 8192 to keep all CopyB nodes smaller than 8192 and get memcpy Calls for all others. Here, the set of small CopyBs is empty. Another backend could specify max_small_size == 63 and min_large_size == 64 to lower all small CopyBs to Loads/Stores and all big CopyBs to memcpy. Hence, the set of medium-sized CopyBs is empty and this backend never sees a CopyB node at all. If memcpy is not available, min_large_size can be set to UINT_MAX to prevent the creation of calls to memcpy. Note that CopyBs whose size is UINT_MAX will still be lowered to memcpy calls because we check if the size is greater or equal to min_large_size. However, this should never occur in practice.

Parameters
irgThe graph to be lowered.
max_small_sizeThe maximum number of bytes for a CopyB node so that it is still considered 'small'.
min_large_sizeThe minimum number of bytes for a CopyB node so that it is regarded as 'large'.
allow_misalignmentsBackend can handle misaligned loads and stores.

◆ lower_highlevel()

void lower_highlevel ( void  )

Performs lowering on all graphs.

See also
lower_highlevel_graph().

◆ lower_highlevel_graph()

void lower_highlevel_graph ( ir_graph irg)

Replaces Offsets and TypeConsts by a real constant if possible.

Replaces Member and Sel nodes by address computation.

Parameters
irgthe graph to lower

◆ lower_mux()

void lower_mux ( ir_graph irg,
lower_mux_callback cb_func 
)

Lowers all mux nodes in the given graph.

A callback function may be given, to select the mux nodes to lower.

Parameters
irgThe graph to lower mux nodes in.
cb_funcThe callback function for mux selection. Can be NULL, to lower all mux nodes.

◆ lower_switch()

void lower_switch ( ir_graph irg,
unsigned  small_switch,
unsigned  spare_size,
ir_mode selector_mode 
)

Lowers all Switches (Cond nodes with non-boolean mode) depending on spare_size.

They will either remain the same or be converted into if-cascades.

Parameters
irgThe ir graph to be lowered.
small_switchIf switch has <= cases then change it to an if-cascade.
spare_sizeAllowed spare size for table switches in machine words. (Default in edgfe: 128)
selector_modemode which must be used for Switch selector