irouts.h 4.42 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

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

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

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

47
48
49
50
/**
 * Get the User and its input position from the Def-Use edge of def
 * at position pos.
 */
Matthias Braun's avatar
Matthias Braun committed
51
ir_node *get_irn_out_ex(const ir_node *def, int pos, int *in_pos);
52
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
 */
void     set_irn_out(ir_node *def, int pos, ir_node *use, int in_pos);
62

Götz Lindenmaier's avatar
Götz Lindenmaier committed
63
64
/* 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
65

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

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

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

75
/** Access predecessor n, honor keep-alives. */
Matthias Braun's avatar
Matthias Braun committed
76
ir_node *get_Block_cfg_out_ka(const ir_node *node, int pos);
77

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

Michael Beck's avatar
Michael Beck committed
84
/** Walks only over Block nodes in the graph.  Has it's 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.  */
87
void irg_out_block_walk(ir_node *node,
Michael Beck's avatar
Michael Beck committed
88
89
                        irg_walk_func *pre, irg_walk_func *post,
                        void *env);
90

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

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

Michael Beck's avatar
Michael Beck committed
102
/** Computes the out edges.  Sets a flag in irg to "outs_consistent".  If the
Michael Beck's avatar
Michael Beck committed
103
104
    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
105
   "op_pin_state_floats".   Optimizes Tuple nodes. */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
106
107
void compute_irg_outs(ir_graph *irg);
void compute_irp_outs(void);
Michael Beck's avatar
Michael Beck committed
108
109
110

void assure_irg_outs(ir_graph *irg);

111
#ifdef INTERPROCEDURAL_VIEW
112
/** Computes the out edges in interprocedural view */
Götz Lindenmaier's avatar
bugfix    
Götz Lindenmaier committed
113
void compute_ip_outs(void);
114
/** Frees the out datastructures.  Sets the flag in irg to "outs_none". */
115
void free_ip_outs(void);
116
117
#endif

Götz Lindenmaier's avatar
Götz Lindenmaier committed
118
119
void free_irg_outs(ir_graph *irg);
void free_irp_outs(void);
120

Matthias Braun's avatar
Matthias Braun committed
121
#endif