X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firgmod.h;h=9bcf5325d2e93d2b12728f58ed014a03a87a3d5b;hb=346dfddce9be4420855b06ea40d2bf21dad9bc88;hp=513a0114d81d57093bbcf675a75263c4dcbb92ea;hpb=efbeaff549fcc6015da255ed4d453a95937ff0fd;p=libfirm diff --git a/ir/ir/irgmod.h b/ir/ir/irgmod.h index 513a0114d..9bcf5325d 100644 --- a/ir/ir/irgmod.h +++ b/ir/ir/irgmod.h @@ -1,53 +1,72 @@ -/* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe -** All rights reserved. -** -** Authors: Martin Trapp, Christian Schaefer -** -** irgmod.h: ir graph modification*/ - -# include "irgraph.h" -# include "ircons.h" -# include "array.h" -# include "misc.h" - -/* ir_node *arg_access (ir_mode *mode, long proj); */ - - -inline ir_node *get_r_value_internal (ir_node *block, int pos, ir_mode *mode); - - -/** Needed only during ir_graph construction. Should all go into - ircons.ch **/ - -/* Read a store. - Use this function to get the most recent version of the store (type M). - Internally it does the same as get_value. */ -ir_node *get_store (void); - -/* write a store */ -void set_store (ir_node *store); - -/* add a control flow edge */ -void add_in_edge (ir_node *block, ir_node *jmp); - -/* read a value from the array with the local variables */ -ir_node *get_value (int pos, ir_mode *mode); - -/* write a value in the array with the local variables */ -void set_value (int pos, ir_node *value); - -/* fixes the number of predecessors of a block. */ -void mature_block (ir_node *block); - -/* sets current block */ -void switch_block (ir_node *target); - - -/** always useful, e.g. for optimizations. **/ -/* turns a node into a tuple. The tuples predecessors have to be - set by hand. */ +/* + * Project: libFIRM + * File name: ir/ir/irgmod.h + * Purpose: Support for ir graph modification. + * Author: Martin Trapp, Christian Schaefer + * Modified by: Goetz Lindenmaier + * Created: + * CVS-ID: $Id$ + * Copyright: (c) 1998-2003 Universität Karlsruhe + * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. + */ + +/** + * + * @file irgmod.h + * + * ir graph modification. + * + * @author Martin Trapp, Christian Schaefer + */ + + +# ifndef _IRGMOD_H_ +# define _IRGMOD_H_ + +# include "irnode.h" + +/** Exchanges two nodes by conserving edges leaving old (i.e., + pointers pointing to old). Turns the old node into an Id. */ +void exchange (ir_node *old, ir_node *nw); + +/** Turns a node into a "useless" Tuple. + * + * Turns a node into a "useless" Tuple. The Tuple node just forms a tuple + * from several inputs. The predecessors of the tuple have to be + * set by hand. The block predecessor automatically remains the same. + * This is useful if a node returning a tuple is removed, but the Projs + * extracting values from the tuple are not available. + * + * @param node The node to be turned into a tuple. + * @param arity The number of values formed into a Tuple. + */ void turn_into_tuple (ir_node *node, int arity); -/* exchanges two nodes by conserving edges leaving old (i.e., pointers - pointing to old. */ -inline void exchange (ir_node *old, ir_node *new); +/** Walks over the passed ir graph and collects all Phi nodes as a + * list built with the link field in their corresponding block. + * Further it collects all Proj nodes in a list of the node producing + * the tuple. In case of nested tuples the Projs are collected in the + * node producing the outermost Tuple. + */ +void collect_phiprojs(ir_graph *irg); + +/** Parts a block into two. This is useful to insert other blocks within a + * given block. + * + * Adds a new block (new_block) in the control flow before the block + * (old_block) of node. Moves node and its predecessors from old_block to + * new_block. Moves all Projs that depend on moved nodes and are in old_block + * to new_block. Moves all Phi nodes from old_block to new_block. To achieve + * this the routine assumes that all Phi nodes are in a list (using the link + * field) in the link field of old_block. Further it assumes that all Proj nodes + * are accessible by the link field of the nodes producing the Tuple. This + * can be established by collect_phiprojs(). part_block conserves this property. + * Adds a Jmp node to new_block that jumps to old_block. + * Assumes that node is contained in current_ir_graph. Sets current_block in + * this ir_graph to new_block. + * + * @param node The node were to break the block + */ +void part_block(ir_node *node); + +#endif /* ifndef _IRGMOD_H_ */