irouts.h 4.34 KB
Newer Older
Götz Lindenmaier's avatar
Götz Lindenmaier committed
1
/*
Michael Beck's avatar
Michael Beck committed
2
 * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
Matthias Braun's avatar
Matthias Braun committed
3
4
 *
 * This file is part of libFirm.
Michael Beck's avatar
Michael Beck committed
5
 *
Matthias Braun's avatar
Matthias Braun committed
6
7
8
9
 * This file may be distributed and/or modified under the terms of the
 * GNU General Public License version 2 as published by the Free Software
 * Foundation and appearing in the file LICENSE.GPL included in the
 * packaging of this file.
Michael Beck's avatar
Michael Beck committed
10
 *
Matthias Braun's avatar
Matthias Braun committed
11
12
13
 * Licensees holding valid libFirm Professional Edition licenses may use
 * this file in accordance with the libFirm Commercial License.
 * Agreement provided with the Software.
Michael Beck's avatar
Michael Beck committed
14
 *
Matthias Braun's avatar
Matthias Braun committed
15
16
17
18
19
20
21
22
23
24
25
 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE.
 */

/**
 * @file
 * @brief    Compute and access out edges (also called def-use edges).
 * @author   Goetz Lindenmaier, Michael Beck
 * @date     1.2002
 * @version  $Id$
Michael Beck's avatar
Michael Beck committed
26
 */
Matthias Braun's avatar
Matthias Braun committed
27
28
#ifndef FIRM_ANA_IROUTS_H
#define FIRM_ANA_IROUTS_H
29

Michael Beck's avatar
Michael Beck committed
30
#include "firm_types.h"
31
#include "begin.h"
32

Michael Beck's avatar
Michael Beck committed
33
34
35
36
37
/*------------------------------------------------------------------*/
/* Accessing the out datastructures.                                */
/* These routines only work properly if the ir_graph is in state    */
/* outs_consistent or outs_inconsistent.                            */
/*------------------------------------------------------------------*/
38

Michael Beck's avatar
Michael Beck committed
39
/** To iterate through the successors iterate from 0 to i < get_irn_outs(). No
40
   order of successors guaranteed.  Will return edges from block to floating
41
   nodes even if irgraph is in state "op_pin_state_floats". */
42
/* returns the number of successors of the node: */
Michael Beck's avatar
Michael Beck committed
43
FIRM_API int get_irn_n_outs(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
44

45
/** Get the User of a node from the Def-Use edge at position pos. */
Michael Beck's avatar
Michael Beck committed
46
FIRM_API ir_node *get_irn_out(const ir_node *def, int pos);
Michael Beck's avatar
Michael Beck committed
47

48
49
50
51
/**
 * Get the User and its input position from the Def-Use edge of def
 * at position pos.
 */
Michael Beck's avatar
Michael Beck committed
52
FIRM_API ir_node *get_irn_out_ex(const ir_node *def, int pos, int *in_pos);
53
54
55
56
57
58
59
60
61

/**
 * Set the User at position pos.
 *
 * @param def     the Def node
 * @param pos     the number of the Def-Use edge tat is modified
 * @param use     the Use node
 * @param in_pos  the number of the corresponding Use-Def edge in the use node in array
 */
Michael Beck's avatar
Michael Beck committed
62
FIRM_API void set_irn_out(ir_node *def, int pos, ir_node *use, int in_pos);
63

Götz Lindenmaier's avatar
Götz Lindenmaier committed
64
65
/* Methods to iterate through the control flow graph. Iterate from 0 to
   i < get_Block_cfg_outs(block). No order of successors guaranteed. */
Michael Beck's avatar
Michael Beck committed
66

67
/** Return the number of control flow successors, ignore keep-alives. */
Michael Beck's avatar
Michael Beck committed
68
FIRM_API int get_Block_n_cfg_outs(const ir_node *node);
69
70

/** Return the number of control flow successors, honor keep-alives. */
Michael Beck's avatar
Michael Beck committed
71
FIRM_API int get_Block_n_cfg_outs_ka(const ir_node *node);
72
73

/** Access predecessor n, ignore keep-alives. */
Michael Beck's avatar
Michael Beck committed
74
FIRM_API ir_node *get_Block_cfg_out(const ir_node *node, int pos);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
75

76
/** Access predecessor n, honor keep-alives. */
Michael Beck's avatar
Michael Beck committed
77
FIRM_API ir_node *get_Block_cfg_out_ka(const ir_node *node, int pos);
78

Michael Beck's avatar
Michael Beck committed
79
/** Walks over the graph starting at node.  Walks also if graph is in state
80
   "outs_inconsistent".  Assumes current_ir_graph is set properly. */
Michael Beck's avatar
Michael Beck committed
81
FIRM_API void irg_out_walk(ir_node *node, irg_walk_func *pre,
82
                           irg_walk_func *post, void *env);
83

84
/** Walks only over Block nodes in the graph.  Has its own visited
85
   flag, so that it can be interleaved with the other walker.
Götz Lindenmaier's avatar
Götz Lindenmaier committed
86
   node must be either op_Block or mode_X.  */
Michael Beck's avatar
Michael Beck committed
87
FIRM_API void irg_out_block_walk(ir_node *node, irg_walk_func *pre,
88
                                 irg_walk_func *post, void *env);
89

90
91
92
/**
 * returns 1 if outs have been computed for a node, 0 otherwise.
 *
Christoph Mallon's avatar
Christoph Mallon committed
93
 *  this is useful to detect newly created nodes that have no outs set yet
94
 */
Michael Beck's avatar
Michael Beck committed
95
FIRM_API int get_irn_outs_computed(const ir_node *node);
96

Michael Beck's avatar
Michael Beck committed
97
/*------------------------------------------------------------------*/
Michael Beck's avatar
Michael Beck committed
98
/* Building and Removing the out datastructure                      */
Michael Beck's avatar
Michael Beck committed
99
/*------------------------------------------------------------------*/
100

Michael Beck's avatar
Michael Beck committed
101
/** Computes the out edges.  Sets a flag in irg to "outs_consistent".  If the
Michael Beck's avatar
Michael Beck committed
102
103
    graph is changed this flag must be set to "outs_inconsistent".  Computes
    out edges from block to floating nodes even if graph is in state
104
   "op_pin_state_floats".   Optimizes Tuple nodes. */
Michael Beck's avatar
Michael Beck committed
105
106
FIRM_API void compute_irg_outs(ir_graph *irg);
FIRM_API void compute_irp_outs(void);
Michael Beck's avatar
Michael Beck committed
107

Michael Beck's avatar
Michael Beck committed
108
FIRM_API void assure_irg_outs(ir_graph *irg);
Michael Beck's avatar
Michael Beck committed
109

Michael Beck's avatar
Michael Beck committed
110
111
FIRM_API void free_irg_outs(ir_graph *irg);
FIRM_API void free_irp_outs(void);
112
113

#include "end.h"
114

Matthias Braun's avatar
Matthias Braun committed
115
#endif