libFirm
|
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) |
Replaces Offsets and TypeConsts by a real constant if possible. More... | |
void | lower_const_code (void) |
does the same as lower_highlevel for all nodes on 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_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. 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... | |
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).
struct i_call_record |
An intrinsic call record.
Definition at line 160 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 |
struct i_instr_record |
An intrinsic instruction record.
Definition at line 169 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. |
union i_record |
An intrinsic record.
Definition at line 178 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 int( i_mapper_func)(ir_node *node) |
An intrinsic mapper function.
node | the IR-node that will be mapped |
Definition at line 148 of file lowering.h.
typedef struct ir_intrinsics_map ir_intrinsics_map |
Definition at line 184 of file lowering.h.
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.
mux | The mux node that may be lowered. |
Definition at line 130 of file lowering.h.
enum ikind |
kind of an instruction record
Enumerator | |
---|---|
INTRINSIC_CALL |
the record represents an intrinsic call |
INTRINSIC_INSTR |
the record represents an intrinsic instruction |
Definition at line 152 of file lowering.h.
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.
int i_mapper_acos | ( | ir_node * | call | ) |
A mapper for the floating point acos(a): floattype acos(floattype a);.
int i_mapper_asin | ( | ir_node * | call | ) |
A mapper for the floating point asin(a): floattype asin(floattype a);.
int i_mapper_atan | ( | ir_node * | call | ) |
A mapper for the floating point atan(a): floattype atan(floattype a);.
int i_mapper_cbrt | ( | ir_node * | call | ) |
A mapper for the floating point cbrt(v): floattype sqrt(floattype v);.
int i_mapper_cos | ( | ir_node * | call | ) |
A mapper for the floating point sin(a): floattype cos(floattype a);.
int i_mapper_cosh | ( | ir_node * | call | ) |
A mapper for the floating point cosh(a): floattype cosh(floattype a);.
int i_mapper_exp | ( | ir_node * | call | ) |
A mapper for the floating point exp(a): floattype exp(floattype a);.
int i_mapper_exp10 | ( | ir_node * | call | ) |
A mapper for the floating point exp10(a): floattype exp10(floattype a);.
int i_mapper_exp2 | ( | ir_node * | call | ) |
A mapper for the floating point exp2(a): floattype exp2(floattype a);.
int i_mapper_log | ( | ir_node * | call | ) |
A mapper for the floating point log(a): floattype log(floattype a);.
int i_mapper_log10 | ( | ir_node * | call | ) |
A mapper for the floating point log(a): floattype log(floattype a);.
int i_mapper_log2 | ( | ir_node * | call | ) |
A mapper for the floating point log(a): floattype log(floattype a);.
int i_mapper_memcmp | ( | ir_node * | call | ) |
A mapper for the strncmp-Function: inttype memcmp(void pointer a, void pointer b, inttype len);.
int i_mapper_memcpy | ( | ir_node * | call | ) |
A mapper for the memcpy-Function: void pointer memcpy(void pointer d, void pointer s, inttype c);.
int i_mapper_memmove | ( | ir_node * | call | ) |
A mapper for the memmove-Function: void pointer memmove(void pointer d, void pointer s, inttype c);.
int i_mapper_memset | ( | ir_node * | call | ) |
A mapper for the memset-Function: void pointer memset(void pointer d, inttype C, inttype len);.
int i_mapper_pow | ( | ir_node * | call | ) |
A mapper for the floating point pow(a, b): floattype pow(floattype a, floattype b);.
int i_mapper_sin | ( | ir_node * | call | ) |
A mapper for the floating point sin(a): floattype sin(floattype a);.
int i_mapper_sinh | ( | ir_node * | call | ) |
A mapper for the floating point sinh(a): floattype sinh(floattype a);.
int i_mapper_sqrt | ( | ir_node * | call | ) |
A mapper for the floating point sqrt(v): floattype sqrt(floattype v);.
int i_mapper_strcmp | ( | ir_node * | call | ) |
A mapper for the strcmp-Function: inttype strcmp(char pointer a, char pointer b);.
int i_mapper_strcpy | ( | ir_node * | call | ) |
A mapper for the strcpy-Function: char pointer strcpy(char pointer a, char pointer b);.
int i_mapper_strlen | ( | ir_node * | call | ) |
A mapper for the strlen-Function: inttype strlen(char pointer a);.
int i_mapper_strncmp | ( | ir_node * | call | ) |
A mapper for the strncmp-Function: inttype strncmp(char pointer a, char pointer b, inttype len);.
int i_mapper_tan | ( | ir_node * | call | ) |
A mapper for the floating point tan(a): floattype tan(floattype a);.
int i_mapper_tanh | ( | ir_node * | call | ) |
A mapper for the floating point tanh(a): floattype tanh(floattype a);.
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.
list | an array of intrinsic map records |
length | the length of the array |
part_block_used | set to 1 if part_block() is used by one of the lowering functions. |
void ir_free_intrinsics_map | ( | ir_intrinsics_map * | map | ) |
Frees resources occupied by an intrisics_map created by ir_create_intrinsics_map().
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.
void lower_const_code | ( | void | ) |
does the same as lower_highlevel for all nodes on the const code irg
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:
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
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.
irg | The graph to be lowered. |
max_small_size | The maximum number of bytes for a CopyB node so that it is still considered 'small'. |
min_large_size | The minimum number of bytes for a CopyB node so that it is regarded as 'large'. |
allow_misalignments | Backend can handle misaligned loads and stores. |
void lower_highlevel | ( | void | ) |
Replaces Offsets and TypeConsts by a real constant if possible.
Replaces Sel nodes by address computation. Also resolves array access. Handle bit fields by added And/Or calculations. Lowers all graphs.
void lower_highlevel_graph | ( | ir_graph * | irg | ) |
Replaces Offsets and TypeConsts by a real constant if possible.
Replaces Sel nodes by address computation. Also resolves array access. Handle bit fields by added And/Or calculations.
irg | the graph to lower |
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.
irg | The graph to lower mux nodes in. |
cb_func | The callback function for mux selection. Can be NULL, to lower all mux nodes. |
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.
irg | The ir graph to be lowered. |
small_switch | If switch has <= cases then change it to an if-cascade. |
spare_size | Allowed spare size for table switches in machine words. (Default in edgfe: 128) |
selector_mode | mode which must be used for Switch selector |