libFirm
Loops

Data Structures

union  loop_element
 Loop elements: loop nodes and ir nodes. More...

Typedefs

typedef struct ir_loop ir_loop
 Loop.

Functions

int is_backedge (const ir_node *n, int pos)
 Returns non-zero if the predecessor pos is a backedge.
void set_backedge (ir_node *n, int pos)
 Marks edge pos as a backedge.
void set_not_backedge (ir_node *n, int pos)
 Marks edge pos as a non-backedge.
int has_backedges (const ir_node *n)
 Returns non-zero if n has backedges.
void clear_backedges (ir_node *n)
 Clears all backedge information.
int is_ir_loop (const void *thing)
 Tests whether a given pointer points to a loop.
void set_irg_loop (ir_graph *irg, ir_loop *l)
 Sets the outermost loop in ir graph as basic access to loop tree.
ir_loopget_irg_loop (const ir_graph *irg)
 Returns the root loop info (if exists) for an irg.
ir_loopget_irn_loop (const ir_node *n)
 Returns the loop n is contained in.
ir_loopget_loop_outer_loop (const ir_loop *loop)
 Returns outer loop, itself if outermost.
unsigned get_loop_depth (const ir_loop *loop)
 Returns nesting depth of this loop.
size_t get_loop_n_elements (const ir_loop *loop)
 Returns the number of elements contained in loop.
loop_element get_loop_element (const ir_loop *loop, size_t pos)
 Returns a loop element.
long get_loop_loop_nr (const ir_loop *loop)
 
Returns a unique node number for the loop node to make output

readable.

void set_loop_link (ir_loop *loop, void *link)
 A field to connect additional information to a loop.
void * get_loop_link (const ir_loop *loop)
 Returns field with additional loop information.
int construct_backedges (ir_graph *irg)
 Constructs backedge information and loop tree for a graph.
int construct_cf_backedges (ir_graph *irg)
 Construct Intra-procedural control flow loop tree for a IR-graph.
void assure_loopinfo (ir_graph *irg)
 Computes Intra-procedural control flow loop tree on demand.
void free_loop_information (ir_graph *irg)
 Removes all loop information.
void free_all_loop_information (void)
 Removes loop information from all graphs in the current program.
int is_loop_invariant (const ir_node *n, const ir_node *block)
 Tests whether a value is loop invariant.

Detailed Description

Typedef Documentation

typedef struct ir_loop ir_loop

Loop.

Definition at line 93 of file firm_types.h.

Function Documentation

void assure_loopinfo ( ir_graph irg)

Computes Intra-procedural control flow loop tree on demand.

Parameters
irgthe graph
void clear_backedges ( ir_node n)

Clears all backedge information.

int construct_backedges ( ir_graph irg)

Constructs backedge information and loop tree for a graph.

The algorithm views the program representation as a pure graph. It assumes that only block and phi nodes may be loop headers. The resulting loop tree is a possible visiting order for dataflow analysis.

This algorithm destoyes the link field of block nodes.

Returns
Maximal depth of loop tree.
Remarks
One assumes, the Phi nodes in a block with a backedge have backedges at the same positions as the block. This is not the case, as the scc algorithms does not respect the program semantics in this case. Take a swap in a loop (t = i; i = j; j = t;) This results in two Phi nodes. They form a cycle. Once the scc algorithm deleted one of the edges, the cycle is removed. The second Phi node does not get a backedge!
int construct_cf_backedges ( ir_graph irg)

Construct Intra-procedural control flow loop tree for a IR-graph.

This constructs loop information resembling the program structure. It is useful for loop optimizations and analyses, as, e.g., finding iteration variables or loop invariant code motion.

This algorithm computes only back edge information for Block nodes, not for Phi nodes.

This algorithm destroyes the link field of block nodes.

Parameters
irgthe graph
Returns
Maximal depth of loop tree.
void free_all_loop_information ( void  )

Removes loop information from all graphs in the current program.

void free_loop_information ( ir_graph irg)

Removes all loop information.

Resets all backedges. Works for any construction algorithm.

ir_loop* get_irg_loop ( const ir_graph irg)

Returns the root loop info (if exists) for an irg.

ir_loop* get_irn_loop ( const ir_node n)

Returns the loop n is contained in.

NULL if node is in no loop.

unsigned get_loop_depth ( const ir_loop loop)

Returns nesting depth of this loop.

loop_element get_loop_element ( const ir_loop loop,
size_t  pos 
)

Returns a loop element.

A loop element can be interpreted as a kind pointer, an ir_node* or an ir_loop*.

void* get_loop_link ( const ir_loop loop)

Returns field with additional loop information.

See Also
set_loop_link()
long get_loop_loop_nr ( const ir_loop loop)

Returns a unique node number for the loop node to make output

readable.

If libfirm_debug is not set it returns the loop cast to int.

size_t get_loop_n_elements ( const ir_loop loop)

Returns the number of elements contained in loop.

ir_loop* get_loop_outer_loop ( const ir_loop loop)

Returns outer loop, itself if outermost.

int has_backedges ( const ir_node n)

Returns non-zero if n has backedges.

int is_backedge ( const ir_node n,
int  pos 
)

Returns non-zero if the predecessor pos is a backedge.

int is_ir_loop ( const void *  thing)

Tests whether a given pointer points to a loop.

Note
only works reliably if thing points to something with a firm_kind header
int is_loop_invariant ( const ir_node n,
const ir_node block 
)

Tests whether a value is loop invariant.

Parameters
nThe node to be tested.
blockA block node.

Returns non-zero, if the node n is not changed in the loop block belongs to or in inner loops of this block.

void set_backedge ( ir_node n,
int  pos 
)

Marks edge pos as a backedge.

void set_irg_loop ( ir_graph irg,
ir_loop l 
)

Sets the outermost loop in ir graph as basic access to loop tree.

void set_loop_link ( ir_loop loop,
void *  link 
)

A field to connect additional information to a loop.

void set_not_backedge ( ir_node n,
int  pos 
)

Marks edge pos as a non-backedge.