irnode.h 63.5 KB
Newer Older
Christian Würdig's avatar
Christian Würdig committed
1
/*
2
 * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
Christian Würdig's avatar
Christian Würdig committed
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 *
 * This file is part of libFirm.
 *
 * 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.
 *
 * Licensees holding valid libFirm Professional Edition licenses may use
 * this file in accordance with the libFirm Commercial License.
 * Agreement provided with the Software.
 *
 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE.
 */

Matthias Braun's avatar
Matthias Braun committed
20
21
22
23
24
/**
 * @file
 * @brief   Representation of an intermediate operation.
 * @author  Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Michael Beck
 * @version $Id$
Michael Beck's avatar
Michael Beck committed
25
 */
Matthias Braun's avatar
Matthias Braun committed
26
27
#ifndef FIRM_IR_IRNODE_H
#define FIRM_IR_IRNODE_H
Christian Schäfer's avatar
Christian Schäfer committed
28

29
30
#include <stddef.h>

Michael Beck's avatar
Michael Beck committed
31
#include "firm_common.h"
32
#include "typerep.h"
Michael Beck's avatar
Michael Beck committed
33
34
#include "irop.h"
#include "irmode.h"
35
#include "begin.h"
Michael Beck's avatar
Michael Beck committed
36
37
38
39

/**
 * @defgroup ir_node Declarations of an ir node.
 *
40
 * The type definition of ir_node is also in irgraph.h to resolve
Michael Beck's avatar
Michael Beck committed
41
 *  recursion between irnode.h and irgraph.h
Götz Lindenmaier's avatar
Götz Lindenmaier committed
42
 *
Michael Beck's avatar
Michael Beck committed
43
 * ir_node - a datatype representing a Firm node
Götz Lindenmaier's avatar
Götz Lindenmaier committed
44
 *
Michael Beck's avatar
Michael Beck committed
45
46
47
48
49
50
51
52
53
54
55
56
57
 *  The common fields are:
 *
 *  - arity     - The number of predecessors in the Firm graph.
 *  - in        - A list with the predecessors in the Firm graph.  There are
 *                routines to access individual elements and to obtain the
 *                array.  The method returning the array should not be used.
 *  - mode      - The mode of the node.  There are routines to get the mode
 *                but also to access the mode's fields directly.
 *  - opcode    - The opcode of the node. There are routines to get the opcode
 *                but also to access the opcode's fields directly.
 *  - node_nr   - A unique number for the node.  Available only if debugging
 *                is turned on.
 * @{
Götz Lindenmaier's avatar
Götz Lindenmaier committed
58
 */
Michael Beck's avatar
Michael Beck committed
59

Sebastian Felis's avatar
Sebastian Felis committed
60
/**
61
 * Some projection numbers must be always equal to support automatic phi construction
Michael Beck's avatar
Michael Beck committed
62
 */
63
enum pn_generic {
64
	pn_Generic_M         = 0,  /**< The memory result. */
65
66
67
68
	pn_Generic_X_regular = 1,  /**< Execution result if no exception occurred. */
	pn_Generic_X_except  = 2,  /**< The control flow result branching to the exception handler */
	pn_Generic_other     = 3   /**< First free projection number */
};
Christian Schäfer's avatar
Christian Schäfer committed
69

Sebastian Felis's avatar
Sebastian Felis committed
70
71
72
/**
 *   Checks whether a pointer points to a ir node.
 *
73
74
 *   @param thing   an arbitrary pointer
 *   @return        non-zero if the thing is a ir mode, else zero
Sebastian Felis's avatar
Sebastian Felis committed
75
 */
76
FIRM_DLL int is_ir_node (const void *thing);
Sebastian Felis's avatar
Sebastian Felis committed
77

78
79
80
81
82
/**
 * Returns the number of predecessors without the block predecessor.
 *
 * @param node   the IR-node
 */
83
84
85
FIRM_DLL int get_irn_arity      (const ir_node *node);
FIRM_DLL int get_irn_intra_arity(const ir_node *node);
FIRM_DLL int get_irn_inter_arity(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
86
87

/** Replaces the old in array by a new one that will contain the ins given in
88
   the parameters.  Conserves the block predecessor.  It copies the array passed.
89
   This function is necessary to adjust in arrays of blocks, calls and phis.
90
   Assumes that current_ir_graph is set to the graph containing "node".
91
92
   "in" must contain all predecessors except the block that are required for
   the nodes opcode. */
93
FIRM_DLL void set_irn_in(ir_node *node, int arity, ir_node *in[]);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
94

Christian Schäfer's avatar
Christian Schäfer committed
95
96
97
/* to iterate through the predecessors without touching the array. No
   order of predecessors guaranteed.
   To iterate over the operands iterate from 0 to i < get_irn_arity(),
Götz Lindenmaier's avatar
Götz Lindenmaier committed
98
   to iterate including the Block predecessor iterate from i = -1 to
Christian Schäfer's avatar
Christian Schäfer committed
99
   i < get_irn_arity. */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
100
/* Access predecessor n */
101
102
103
104

/**
 * Get the n-th predecessor of a node.
 * This function removes Id predecessors.
Michael Beck's avatar
Michael Beck committed
105
 * This function automatically handles intra- and interprocedural views.
106
 */
107
FIRM_DLL ir_node *get_irn_n(const ir_node *node, int n);
Michael Beck's avatar
Michael Beck committed
108

Sebastian Hack's avatar
Sebastian Hack committed
109
/**
110
111
112
113
114
115
116
117
118
119
 * Add a artificial dependency to the node.
 * The dependency is only inserted if it is not there already.
 * This is only allowed in phase_backend!
 *
 * @param node The node.
 * @param dep  The dependency target.
 *
 * @return The index in the array (get_irn_dep with that index returns @p dep).
 */
FIRM_DLL int add_irn_dep(ir_node *node, ir_node *dep);
Sebastian Hack's avatar
Sebastian Hack committed
120
121
122

/**
 * Copy all dependencies from a node to another.
123
124
 * This is only allowed in phase_backend!
 *
125
 * @param tgt The node which should be enriched.
Sebastian Hack's avatar
Sebastian Hack committed
126
127
 * @param src The node whose dependencies shall be copied.
 */
128
FIRM_DLL void add_irn_deps(ir_node *tgt, ir_node *src);
Sebastian Hack's avatar
Sebastian Hack committed
129
130

/**
Michael Beck's avatar
Michael Beck committed
131
132
133
134
 * Get the length of the dependency array.
 * @param node The node.
 * @return The length of the dependency array or 0 if it has not yet been allocated.
 */
135
FIRM_DLL int get_irn_deps(const ir_node *node);
Sebastian Hack's avatar
Sebastian Hack committed
136
137

/**
Michael Beck's avatar
Michael Beck committed
138
139
140
141
142
 * Get an entry of the dependency array.
 * @param node The node.
 * @param pos  The position.
 * @return The node at that position.
 */
143
FIRM_DLL ir_node *get_irn_dep(const ir_node *node, int pos);
Sebastian Hack's avatar
Sebastian Hack committed
144
145

/**
Michael Beck's avatar
Michael Beck committed
146
147
148
149
150
 * Set an entry of the dependency array.
 * @param node The node.
 * @param pos  The position.
 * @param dep  The dependency target.
 */
151
FIRM_DLL void set_irn_dep(ir_node *node, int pos, ir_node *dep);
Sebastian Hack's avatar
Sebastian Hack committed
152
153


Michael Beck's avatar
Michael Beck committed
154
155
156
157
/**
 * Get the n-th predecessor of a node in intraprocedural view.
 * Can be used always if it's know that node is not a split one.
 */
158
FIRM_DLL ir_node *get_irn_intra_n(const ir_node *node, int n);
Michael Beck's avatar
Michael Beck committed
159
160
161
162

/**
 * Get the n-th predecessor of a node in interprocedural view.
 */
163
FIRM_DLL ir_node *get_irn_inter_n(const ir_node *node, int n);
164
165

/** Replace the n-th predecessor of a node with a new one. */
166
FIRM_DLL void set_irn_n(ir_node *node, int n, ir_node *in);
167
168
169
170
171
/**
 * Appends a new predecessor to a node. This only works for nodes with
 * variable arity!
 * @returns   the number of the new input
 */
172
FIRM_DLL int add_irn_n(ir_node *node, ir_node *in);
Christoph Mallon's avatar
Christoph Mallon committed
173
/* Remove predecessor i from Sync n */
174
FIRM_DLL void del_Sync_n(ir_node *n, int i);
175
/* Sets the mode struct of node.  */
176
FIRM_DLL void set_irn_mode(ir_node *node, ir_mode *mode);
177
/** Gets the mode struct of a node.  */
178
FIRM_DLL ir_mode *get_irn_mode(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
179
/** Gets the ident for a string representation of the mode .*/
180
FIRM_DLL ident *get_irn_modeident(const ir_node *node);
181
/** Gets the string representation of the mode .*/
182
FIRM_DLL const char *get_irn_modename(const ir_node *node);
183
/** Gets the opcode struct of the node. */
184
FIRM_DLL ir_op *get_irn_op(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
185
/** Sets the opcode struct of the node. */
186
FIRM_DLL void set_irn_op(ir_node *node, ir_op *op);
Michael Beck's avatar
Michael Beck committed
187
/** Gets the opcode-enum of the node. */
188
FIRM_DLL unsigned get_irn_opcode(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
189
/** Get the string representation of the opcode. */
190
FIRM_DLL const char *get_irn_opname(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
191
/** Get the ident for a string representation of the opcode. */
192
FIRM_DLL ident *get_irn_opident(const ir_node *node);
193
/** If arg is an argument of the node, returns it's position, -1 otherwise */
194
FIRM_DLL int get_irn_pred_pos(ir_node *node, ir_node *arg);
195
/** Gets the visited counter of a node. */
196
FIRM_DLL ir_visited_t get_irn_visited(const ir_node *node);
197
/** Sets the visited counter of a node. */
198
FIRM_DLL void set_irn_visited(ir_node *node, ir_visited_t visited);
Michael Beck's avatar
Michael Beck committed
199
/** Sets visited to get_irg_visited(current_ir_graph). */
200
FIRM_DLL void mark_irn_visited(ir_node *node);
201
/** Returns 1 if visited >= get_irg_visited(current_ir_graph). */
202
FIRM_DLL int irn_visited(const ir_node *node);
203
204
/** Returns 1 if visited >= get_irg_visited(current_ir_graph). Marks the node
 * visited, if it was not. */
205
FIRM_DLL int irn_visited_else_mark(ir_node *node);
206
207
208
209
210

/**
 * Sets the link of a node.
 * Only allowed if the graph is NOT in phase_building.
 */
211
FIRM_DLL void set_irn_link(ir_node *node, void *link);
212
213

/** Returns the link of a node.  */
214
FIRM_DLL void *get_irn_link(const ir_node *node);
215

216
/** Returns the ir_graph this node belongs to. */
217
FIRM_DLL ir_graph *get_irn_irg(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
218

219
/** Outputs a unique number for this node if libFIRM is compiled for
220
221
   debugging, (configure with --enable-debug) else returns address
   of node cast to long. */
222
FIRM_DLL long get_irn_node_nr(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
223

224
225
226
227
228
229
230
/** Returns the pinned state of a node.
 *
 *  Returns whether the node _always_ must be pinned.
 *  I.e., the node is not floating after global cse.
 *
 * @returns Either state op_pin_state_pinned or op_pin_state_floats.
 */
231
FIRM_DLL op_pin_state get_irn_pinned(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
232
233

/** Set pin state for nodes with op pin state op_pin_state_exc_pinned */
234
FIRM_DLL void set_irn_pinned(ir_node *node, op_pin_state state);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
235

236
237
238
239
240
241
/** Returns whether the node is currently pinned.
 *
 * If get_irn_pinned returns op_pin_state_floats and the graph the
 * node belongs to is in state op_poin_state_floats then this function
 * returns 'floats', else 'pinned'.
 */
242
FIRM_DLL op_pin_state is_irn_pinned_in_irg(const ir_node *node);
243

Michael Beck's avatar
Michael Beck committed
244
/**
245
246
247
248
 * IR node constructor.
 * Create a new IR node in irg, with an op, mode, arity and
 * some incoming IR nodes.
 * This constructor is used in every specific IR node constructor.
249
250
251
 *
 * @param db    Debug info.
 * @param irg   IR-graph on with this new node should be constructed.
Michael Beck's avatar
Michael Beck committed
252
 * @param block The block the new node belongs to
253
254
 * @param op    The opcode of the new node.
 * @param mode  The mode of the new node.
255
 * @param arity The arity of the new node, <0 if can be changed dynamically.
256
 * @param in    An array of arity predecessor nodes.
Michael Beck's avatar
Michael Beck committed
257
 */
258
259
260
FIRM_DLL ir_node *new_ir_node(dbg_info *db, ir_graph *irg, ir_node *block,
                              ir_op *op, ir_mode *mode,
                              int arity, ir_node *in[]);
Christian Schäfer's avatar
Christian Schäfer committed
261

262
263
264
265
266
/**
 * Return the block the node belongs to.  This is only
 * possible for pinned nodes or if the graph is in pinned state.
 * Otherwise the block may be incorrect.  This condition is
 * now checked by an assertion.
Götz Lindenmaier's avatar
Götz Lindenmaier committed
267
268
269
270
271
 *
 * This works for all except Block.  It can return Blocks or the Bad node.
 *
 * To express the difference to access routines that work for all
 * nodes we use infix "nodes" and do not name this function
272
 * get_irn_block(). */
273
FIRM_DLL ir_node *get_nodes_block (const ir_node *node);
Michael Beck's avatar
Michael Beck committed
274
275

/** Sets the Block of a node. */
276
FIRM_DLL void set_nodes_block (ir_node *node, ir_node *block);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
277

Michael Beck's avatar
Michael Beck committed
278
279
280
281
282
283
284
285
286
287
288
/**
 * Return the MacroBlock the node belongs to.  This is only
 * possible for pinned nodes or if the graph is in pinned state.
 * Otherwise the MacroBlock may be incorrect.  This condition is
 * now checked by an assertion.
 *
 * This works for all except Block.  It can return Blocks or the Bad node.
 *
 * To express the difference to access routines that work for all
 * nodes we use infix "nodes" and do not name this function
 * get_irn_MacroBlock(). */
289
FIRM_DLL ir_node *get_nodes_MacroBlock(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
290

291
292
293
294
/**
 * Projection numbers for result of Start node: use for Proj nodes!
 */
typedef enum {
Michael Beck's avatar
Michael Beck committed
295
296
297
298
299
300
301
	pn_Start_X_initial_exec,   /**< Projection on the initial control flow. */
	pn_Start_M,                /**< Projection on the initial memory. */
	pn_Start_P_frame_base,     /**< Projection on the frame base pointer. */
	pn_Start_P_tls,            /**< Projection on the pointer to the thread local store
	                                segment containing _all_thread local variables. */
	pn_Start_T_args,           /**< Projection on all arguments. */
	pn_Start_max               /**< number of projections from a Start */
302
303
} pn_Start; /* Projection numbers for Start. */

304
305
306
307
/** Test whether arbitrary node is frame pointer.
 *
 * Test whether arbitrary node is frame pointer, i.e. Proj(pn_Start_P_frame_base)
 * from Start.  If so returns frame type, else Null. */
308
FIRM_DLL ir_type *is_frame_pointer(const ir_node *n);
309

310
/** Test whether arbitrary node is the thread local storage (tls) pointer.
311
312
313
 *
 * Test whether arbitrary node is tls pointer, i.e. Proj(pn_Start_P_tls)
 * from Start.  If so returns tls type, else Null. */
314
FIRM_DLL ir_type *is_tls_pointer(const ir_node *n);
315

316
/** Return the number of control flow predecessors of a block. */
317
FIRM_DLL int get_Block_n_cfgpreds(const ir_node *block);
318
/** Return the control flow predecessor of a block at a given position. */
319
FIRM_DLL ir_node *get_Block_cfgpred(const ir_node *block, int pos);
320
/** Set the control flow predecessor of a block at a given position. */
321
FIRM_DLL void set_Block_cfgpred(ir_node *block, int pos, ir_node *pred);
322
323
324
325
326
327
328
329
330
331
332
333
334
335

/**
 * Return the position of the predecessor block pred in the inputs
 * of the block block.
 *
 * @param block  the block
 * @param pred   a predecessor block of block
 *
 * @return the position of pred in block or -1
 *
 * @note When using the old extended basic block form for blocks
 * with exception exists, a predecessor block might have more
 * than one position. In that case it is not specified, with is returned.
 */
336
FIRM_DLL int get_Block_cfgpred_pos(const ir_node *block, const ir_node *pred);
337

338
339
/** Get the predecessor block.
 *
340
 *  Returns the block corresponding to the predecessor pos of block.
341
342
343
344
345
346
 *
 *  There are several ambiguities we resolve with this function:
 *  - The direct predecessor can be a Proj, which is not pinned.
 *    We walk from the predecessor to the next pinned node
 *    (skip_Proj) and return the block that node is in.
 *  - If we encounter the Bad node, this function does not return
Michael Beck's avatar
Michael Beck committed
347
 *    Start block, but the Bad node.
348
 */
349
FIRM_DLL ir_node *get_Block_cfgpred_block(const ir_node *node, int pos);
350
351

/** Return the matured flag of a block */
352
FIRM_DLL int get_Block_matured(const ir_node *block);
353
/** set the matured flag of a block. */
354
FIRM_DLL void set_Block_matured(ir_node *block, int matured);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
355
356
357

/** A visited flag only for block nodes.
 *  @see also: get_irn_visited() inc_irg_visited() inc_irg_block_visited()*/
358
359
FIRM_DLL ir_visited_t get_Block_block_visited(const ir_node *block);
FIRM_DLL void set_Block_block_visited(ir_node *block, ir_visited_t visit);
360
361
362
363
364

/**
 * Marks a block as dead but do not replace it with a Bad node.
 * Dead blocks are removed in the con
 */
365
366
FIRM_DLL ir_node *set_Block_dead(ir_node *block);
FIRM_DLL int is_Block_dead(const ir_node *block);
367

Götz Lindenmaier's avatar
Götz Lindenmaier committed
368
/* For this current_ir_graph must be set. */
369
370
FIRM_DLL void mark_Block_block_visited(ir_node *node);
FIRM_DLL int Block_block_visited(const ir_node *node);
Christian Schäfer's avatar
Christian Schäfer committed
371

372
#ifdef INTERPROCEDURAL_VIEW
373
374
/* Set and remove interprocedural predecessors. If the interprocedural
 * predecessors are removed, the node has the same predecessors in
375
376
 * both views.
 * @@@ Maybe better:  arity is zero if no cg preds. */
377
378
FIRM_DLL void set_Block_cg_cfgpred_arr(ir_node *node, int arity, ir_node *in[]);
FIRM_DLL void set_Block_cg_cfgpred(ir_node *node, int pos, ir_node *pred);
379
/* @@@ not supported */
380
FIRM_DLL ir_node **get_Block_cg_cfgpred_arr(ir_node *node);
Michael Beck's avatar
Michael Beck committed
381
/** Returns the number of interprocedural predecessors.  0 if none. */
382
FIRM_DLL int get_Block_cg_n_cfgpreds(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
383
/** Return the interprocedural predecessor at position pos. */
384
FIRM_DLL ir_node *get_Block_cg_cfgpred(const ir_node *node, int pos);
385
/** Frees the memory allocated for interprocedural predecessors. */
386
FIRM_DLL void remove_Block_cg_cfgpred_arr(ir_node *node);
387
388
#endif

389
/** Returns the extended basic block a block belongs to. */
390
FIRM_DLL ir_extblk *get_Block_extbb(const ir_node *block);
391
/** Sets the extended basic block a block belongs to. */
392
FIRM_DLL void set_Block_extbb(ir_node *block, ir_extblk *extblk);
Michael Beck's avatar
Michael Beck committed
393
/** Get the Macro Block header of a (sub-) block. */
394
FIRM_DLL ir_node *get_Block_MacroBlock(const ir_node *block);
Michael Beck's avatar
Michael Beck committed
395
/** Set the Macro Block header of a (sub-) block. */
396
FIRM_DLL void set_Block_MacroBlock(ir_node *block, ir_node *mbh);
Michael Beck's avatar
Michael Beck committed
397
/** Get the Macro Block header of a node. */
398
FIRM_DLL ir_node *get_irn_MacroBlock(const ir_node *n);
399
/** Returns the ir_graph this Block belongs to. */
400
FIRM_DLL ir_graph *get_Block_irg(const ir_node *block);
401
/** Returns non-zero if the block has an entity assigned */
402
FIRM_DLL int has_Block_entity(const ir_node *block);
403
/** Returns the entity for a Block */
404
FIRM_DLL ir_entity *get_Block_entity(const ir_node *block);
405
/** Returns the entity for a Block (creating it if necessary) */
406
FIRM_DLL ir_entity *create_Block_entity(ir_node *block);
407
/** Set a new entity for a block */
408
FIRM_DLL void set_Block_entity(ir_node *block, ir_entity *entity);
409
/** Gets the head of the Phi list for this block. */
410
FIRM_DLL ir_node *get_Block_phis(const ir_node *block);
411
/** Sets the head of the Phi list for this block. */
412
FIRM_DLL void set_Block_phis(ir_node *block, ir_node *phi);
Michael Beck's avatar
Michael Beck committed
413
/** Add a Phi node to the list of Block Phi's. */
414
FIRM_DLL void add_Block_phi(ir_node *block, ir_node *phi);
Michael Beck's avatar
Michael Beck committed
415
/** Get the Block mark (single bit). */
416
FIRM_DLL unsigned get_Block_mark(const ir_node *block);
Michael Beck's avatar
Michael Beck committed
417
/** Set the Block mark (single bit). */
418
FIRM_DLL void set_Block_mark(ir_node *block, unsigned mark);
Michael Beck's avatar
Michael Beck committed
419

Michael Beck's avatar
Michael Beck committed
420
/** Return the number of Keep alive node. */
421
FIRM_DLL int get_End_n_keepalives(const ir_node *end);
Michael Beck's avatar
Michael Beck committed
422
/** Return the Keep alive node a position pos. */
423
FIRM_DLL ir_node *get_End_keepalive(const ir_node *end, int pos);
Michael Beck's avatar
Michael Beck committed
424
/** Keep alive dedicated nodes.  These must be either PhiM or Block nodes. */
425
FIRM_DLL void add_End_keepalive(ir_node *end, ir_node *ka);
Michael Beck's avatar
Michael Beck committed
426
/** Set the Keep alive node at position pos. */
427
FIRM_DLL void set_End_keepalive(ir_node *end, int pos, ir_node *ka);
428
429
430
431
432
433

/**
 * Set new keep-alives.
 * Beware: This might be an expensive operation if dynamic edges are enabled,
 * so avoid it in the backend.
 */
434
FIRM_DLL void set_End_keepalives(ir_node *end, int n, ir_node *in[]);
435
436

/** Remove irn from the keep-alive set. */
437
FIRM_DLL void remove_End_keepalive(ir_node *end, ir_node *irn);
438

Michael Beck's avatar
Michael Beck committed
439
/* Remove Bads, NoMem and doublets from the keep-alive set. */
440
FIRM_DLL void remove_End_Bads_and_doublets(ir_node *end);
441

Michael Beck's avatar
Michael Beck committed
442
/** Some parts of the End node are allocated separately -- their memory
443
   is not recovered by dead_node_elimination if a End node is dead.
Michael Beck's avatar
Michael Beck committed
444
   free_End() frees these data structures. */
445
FIRM_DLL void free_End(ir_node *end);
446

447
/** Return the target address of an IJmp */
448
FIRM_DLL ir_node *get_IJmp_target(const ir_node *ijmp);
449
/** Sets the target address of an IJmp */
450
FIRM_DLL void set_IJmp_target(ir_node *ijmp, ir_node *tgt);
451

452
453
454
455
FIRM_DLL ir_node *get_Cond_selector(const ir_node *node);
FIRM_DLL void set_Cond_selector(ir_node *node, ir_node *selector);
FIRM_DLL long get_Cond_default_proj(const ir_node *node);
FIRM_DLL void set_Cond_default_proj(ir_node *node, long defproj);
Christian Schäfer's avatar
Christian Schäfer committed
456

457
458
459
/**
 * Projection numbers for conditions.
 */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
460
typedef enum {
Michael Beck's avatar
Michael Beck committed
461
462
463
	pn_Cond_false,    /**< Control flow if operand is "false". */
	pn_Cond_true,     /**< Control flow if operand is "true".  */
	pn_Cond_max       /**< number of projections from a Cond */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
464
465
} pn_Cond;  /* Projection numbers for Cond. */

466
467
468
469
470
471
FIRM_DLL ir_node  *get_Return_mem(const ir_node *node);
FIRM_DLL void      set_Return_mem(ir_node *node, ir_node *mem);
FIRM_DLL ir_node **get_Return_res_arr(ir_node *node);
FIRM_DLL int       get_Return_n_ress(const ir_node *node);
FIRM_DLL ir_node  *get_Return_res(const ir_node *node, int pos);
FIRM_DLL void      set_Return_res(ir_node *node, int pos, ir_node *res);
Christian Schäfer's avatar
Christian Schäfer committed
472

473
474
FIRM_DLL tarval  *get_Const_tarval(const ir_node *node);
FIRM_DLL void     set_Const_tarval(ir_node *node, tarval *con);
Michael Beck's avatar
Michael Beck committed
475

Michael Beck's avatar
Michael Beck committed
476
/** Return non-zero if the given Const node represents the 0 constant. */
477
FIRM_DLL int is_Const_null(const ir_node *node);
478

Michael Beck's avatar
Michael Beck committed
479
/** Return non-zero if the given Const node represents the 1 constant. */
480
FIRM_DLL int is_Const_one(const ir_node *node);
481

Michael Beck's avatar
Michael Beck committed
482
/** Return non-zero if the given Const node represents the constant with all bits set. */
483
FIRM_DLL int is_Const_all_one(const ir_node *node);
Sebastian Hack's avatar
Sebastian Hack committed
484

Michael Beck's avatar
Michael Beck committed
485
486
487
/** Returns the source language type of a Const node.
 * Must be an atomic type.  Mode of type must be mode of node.
 */
488
FIRM_DLL ir_type  *get_Const_type(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
489
490

/** Sets the source language type of a Const node. */
491
FIRM_DLL void     set_Const_type(ir_node *node, ir_type *tp);
Christian Schäfer's avatar
Christian Schäfer committed
492

493
494
495
496
/** Returns non-zero if s symconst kind has a type attribute */
#define SYMCONST_HAS_TYPE(kind) ((kind) <= symconst_type_align)

/** Returns non-zero if s symconst kind has an entity attribute */
497
#define SYMCONST_HAS_ENT(kind) ((kind) == symconst_addr_ent || (kind) == symconst_ofs_ent)
498

499
500
501
/** Returns non-zero if s symconst kind has an enum_const attribute */
#define SYMCONST_HAS_ENUM(kind) ((kind) == symconst_enum_const)

Michael Beck's avatar
Michael Beck committed
502
/** Get the kind of the SymConst. */
503
FIRM_DLL symconst_kind get_SymConst_kind(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
504
/** Set the kind of the SymConst. */
505
FIRM_DLL void          set_SymConst_kind(ir_node *node, symconst_kind num);
Beyhan's avatar
Beyhan committed
506
507

/** Only to access SymConst of kind type_tag or size.  Else assertion: */
508
509
FIRM_DLL ir_type  *get_SymConst_type(const ir_node *node);
FIRM_DLL void     set_SymConst_type(ir_node *node, ir_type *tp);
Beyhan's avatar
Beyhan committed
510
511

/** Only to access SymConst of kind addr_ent.  Else assertion: */
512
513
FIRM_DLL ir_entity *get_SymConst_entity(const ir_node *node);
FIRM_DLL void       set_SymConst_entity(ir_node *node, ir_entity *ent);
Beyhan's avatar
Beyhan committed
514

515
/** Only to access SymConst of kind symconst_enum_const.  Else assertion: */
516
517
FIRM_DLL ir_enum_const *get_SymConst_enum(const ir_node *node);
FIRM_DLL void           set_SymConst_enum(ir_node *node, ir_enum_const *ec);
518

Beyhan's avatar
Beyhan committed
519
520
/** Sets both: type and ptrinfo.  Needed to treat the node independent of
   its semantics.  Does a memcpy for the memory sym points to. */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
521
/* write 'union': firmjni then does not create a method... */
522
523
524
FIRM_DLL union symconst_symbol get_SymConst_symbol(const ir_node *node);
FIRM_DLL void                  set_SymConst_symbol(ir_node *node,
                                                   union symconst_symbol sym);
525

Götz Lindenmaier's avatar
Götz Lindenmaier committed
526
527
528
/** Access the type of the value represented by the SymConst.
 *
 *  Example: primitive type int for SymConst size. */
529
530
531
532
533
534
535
536
537
538
539
540
541
FIRM_DLL ir_type *get_SymConst_value_type(const ir_node *node);
FIRM_DLL void    set_SymConst_value_type(ir_node *node, ir_type *tp);

FIRM_DLL ir_node   *get_Sel_mem(const ir_node *node);
FIRM_DLL void       set_Sel_mem(ir_node *node, ir_node *mem);
FIRM_DLL ir_node   *get_Sel_ptr(const ir_node *node);
FIRM_DLL void       set_Sel_ptr(ir_node *node, ir_node *ptr);
FIRM_DLL ir_node   **get_Sel_index_arr(ir_node *node);
FIRM_DLL int        get_Sel_n_indexs(const ir_node *node);
FIRM_DLL ir_node   *get_Sel_index(const ir_node *node, int pos);
FIRM_DLL void       set_Sel_index(ir_node *node, int pos, ir_node *index);
FIRM_DLL ir_entity *get_Sel_entity(const ir_node *node);
FIRM_DLL void       set_Sel_entity (ir_node *node, ir_entity *ent);
Christian Schäfer's avatar
Christian Schäfer committed
542

543
544
545
/**
 * Projection numbers for result of Call node: use for Proj nodes!
 */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
546
typedef enum {
547
	pn_Call_M         = pn_Generic_M,         /**< The memory result. */
548
549
550
551
552
553
	pn_Call_X_regular = pn_Generic_X_regular, /**< The control flow result when no exception occurs. */
	pn_Call_X_except  = pn_Generic_X_except,  /**< The control flow result branching to the exception handler. */
	pn_Call_T_result  = pn_Generic_other,     /**< The tuple containing all (0, 1, 2, ...) results. */
	pn_Call_P_value_res_base,                 /**< A pointer to the memory region containing copied results
	                                               passed by value (for compound result types). */
	pn_Call_max                               /**< number of projections from a Call */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
554
555
} pn_Call;   /* Projection numbers for Call. */

Michael Beck's avatar
Michael Beck committed
556
/** Retrieve the memory input of a Call. */
557
FIRM_DLL ir_node *get_Call_mem(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
558
/** Set the memory input of a Call. */
559
FIRM_DLL void     set_Call_mem(ir_node *node, ir_node *mem);
Michael Beck's avatar
Michael Beck committed
560
/** Retrieve the call address of a Call. */
561
FIRM_DLL ir_node *get_Call_ptr(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
562
/** Set the call address of a Call. */
563
564
FIRM_DLL void     set_Call_ptr(ir_node *node, ir_node *ptr);
FIRM_DLL ir_node **get_Call_param_arr(ir_node *node);
Michael Beck's avatar
Michael Beck committed
565
/** Gets the number of parameters of a call. */
566
FIRM_DLL int      get_Call_n_params(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
567
/** Gets the call parameter at position pos. */
568
FIRM_DLL ir_node *get_Call_param(const ir_node *node, int pos);
Michael Beck's avatar
Michael Beck committed
569
/** Sets the call parameter at position pos. */
570
FIRM_DLL void     set_Call_param(ir_node *node, int pos, ir_node *param);
Michael Beck's avatar
Michael Beck committed
571
/** Gets the type of a call. */
572
FIRM_DLL ir_type *get_Call_type(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
573
/** Sets the type of a call. */
574
FIRM_DLL void     set_Call_type(ir_node *node, ir_type *tp);
575
/** Returns non-zero if this call can be a tail-call. */
576
FIRM_DLL unsigned get_Call_tail_call(const ir_node *node);
577
/** Sets the tail call attribute. */
578
FIRM_DLL void     set_Call_tail_call(ir_node *node, unsigned tail_call);
Michael Beck's avatar
Michael Beck committed
579
580
581
582
583

/**
 * Returns non-zero if a Call is surely a self-recursive Call.
 * Beware: if this functions returns 0, the call might be self-recursive!
 */
584
FIRM_DLL int is_self_recursive_Call(const ir_node *call);
585

586
587
588
589
/** Set, get and remove the callee information for a Call node.
 *
 *  The callee information lists all method entities that can be called
 *  from this node.  If the address expression can not be analyzed fully,
Götz Lindenmaier's avatar
Götz Lindenmaier committed
590
591
592
593
 *  e.g., as entities can be called that are not in the compilation unit,
 *  the array contains the unknown_entity.  The array contains only entities
 *  with peculiarity_existent, but with all kinds of visibility.  The entities
 *  not necessarily contain an irg.
594
595
596
597
598
599
600
601
602
 *
 *  The array is only accessible if callee information is valid.  See flag
 *  in graph.
 *
 *  The memory allocated for the array is managed automatically, i.e., it must
 *  not be freed if the Call node is removed from the graph.
 *
 *  @param node A Call node.
 */
603
604
605
FIRM_DLL int        Call_has_callees(const ir_node *node);
FIRM_DLL int        get_Call_n_callees(const ir_node *node);
FIRM_DLL ir_entity *get_Call_callee(const ir_node *node, int pos);
Michael Beck's avatar
Michael Beck committed
606

607
608
609
/** Set the full callee array.
 *
 *  The passed array is copied. Assumes current_ir_graph set properly! */
610
611
FIRM_DLL void set_Call_callee_arr(ir_node *node, const int n, ir_entity **arr);
FIRM_DLL void remove_Call_callee_arr(ir_node *node);
612

613
614
615
616
/**
 * Projection numbers for result of Builtin node: use for Proj nodes!
 */
typedef enum {
617
618
619
	pn_Builtin_M        = pn_Generic_M,     /**< The memory result. */
	pn_Builtin_1_result = pn_Generic_other, /**< first result. */
	pn_Builtin_max                          /**< number of projections from a Builtin */
620
621
} pn_Builtin;   /* Projection numbers for Builtin. */

622
623
624
625
626
FIRM_DLL ir_node         *get_Builtin_mem(const ir_node *node);
FIRM_DLL void            set_Builtin_mem(ir_node *node, ir_node *mem);
FIRM_DLL ir_builtin_kind get_Builtin_kind(const ir_node *node);
FIRM_DLL void            set_Builtin_kind(ir_node *node, ir_builtin_kind kind);
FIRM_DLL ir_node         **get_Builtin_param_arr(ir_node *node);
627
/** Gets the number of parameters of a Builtin. */
628
FIRM_DLL int             get_Builtin_n_params(const ir_node *node);
629
/** Gets the Builtin parameter at position pos. */
630
FIRM_DLL ir_node         *get_Builtin_param(const ir_node *node, int pos);
631
/** Sets the Builtin parameter at position pos. */
632
FIRM_DLL void            set_Builtin_param(ir_node *node, int pos, ir_node *param);
633
/** Gets the type of a builtin. */
634
FIRM_DLL ir_type         *get_Builtin_type(const ir_node *node);
635
/** Sets the type of a Builtin. */
636
FIRM_DLL void            set_Builtin_type(ir_node *node, ir_type *tp);
637
/** Returns a human readable string for the ir_builtin_kind. */
638
FIRM_DLL const char *get_builtin_kind_name(ir_builtin_kind kind);
639

Michael Beck's avatar
Michael Beck committed
640
/** Retrieve the call address of a CallBegin. */
641
FIRM_DLL ir_node  *get_CallBegin_ptr(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
642
/** Set the call address of a CallBegin. */
643
FIRM_DLL void      set_CallBegin_ptr(ir_node *node, ir_node *ptr);
Michael Beck's avatar
Michael Beck committed
644
/** Retrieve the original Call node of a CallBegin. */
645
FIRM_DLL ir_node  *get_CallBegin_call(const ir_node *node);
Michael Beck's avatar
Michael Beck committed
646
/** Set the original Call node of a CallBegin. */
647
FIRM_DLL void      set_CallBegin_call(ir_node *node, ir_node *call);
648

Christian Schäfer's avatar
Christian Schäfer committed
649
650
651
/* For unary and binary arithmetic operations the access to the
   operands can be factored out.  Left is the first, right the
   second arithmetic value  as listed in tech report 1999-44.
Götz Lindenmaier's avatar
Götz Lindenmaier committed
652
   unops are: Minus, Abs, Not, Conv, Cast
Christian Schäfer's avatar
Christian Schäfer committed
653
   binops are: Add, Sub, Mul, Quot, DivMod, Div, Mod, And, Or, Eor, Shl,
654
   Shr, Shrs, Rotl, Cmp */
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
FIRM_DLL int      is_unop(const ir_node *node);
FIRM_DLL ir_node *get_unop_op(const ir_node *node);
FIRM_DLL void     set_unop_op(ir_node *node, ir_node *op);
FIRM_DLL int      is_binop(const ir_node *node);
FIRM_DLL ir_node *get_binop_left(const ir_node *node);
FIRM_DLL void     set_binop_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_binop_right(const ir_node *node);
FIRM_DLL void     set_binop_right(ir_node *node, ir_node *right);

FIRM_DLL ir_node *get_Add_left(const ir_node *node);
FIRM_DLL void     set_Add_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_Add_right(const ir_node *node);
FIRM_DLL void     set_Add_right(ir_node *node, ir_node *right);

FIRM_DLL ir_node *get_Carry_left(const ir_node *node);
FIRM_DLL void     set_Carry_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_Carry_right(const ir_node *node);
FIRM_DLL void     set_Carry_right(ir_node *node, ir_node *right);

FIRM_DLL ir_node *get_Borrow_left(const ir_node *node);
FIRM_DLL void     set_Borrow_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_Borrow_right(const ir_node *node);
FIRM_DLL void     set_Borrow_right(ir_node *node, ir_node *right);

FIRM_DLL ir_node *get_Sub_left(const ir_node *node);
FIRM_DLL void     set_Sub_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_Sub_right(const ir_node *node);
FIRM_DLL void     set_Sub_right(ir_node *node, ir_node *right);

FIRM_DLL ir_node *get_Minus_op(const ir_node *node);
FIRM_DLL void     set_Minus_op(ir_node *node, ir_node *op);

FIRM_DLL ir_node *get_Mul_left(const ir_node *node);
FIRM_DLL void     set_Mul_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_Mul_right(const ir_node *node);
FIRM_DLL void     set_Mul_right(ir_node *node, ir_node *right);

FIRM_DLL ir_node *get_Mulh_left(const ir_node *node);
FIRM_DLL void     set_Mulh_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_Mulh_right(const ir_node *node);
FIRM_DLL void     set_Mulh_right(ir_node *node, ir_node *right);

FIRM_DLL ir_node *get_Quot_left(const ir_node *node);
FIRM_DLL void     set_Quot_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_Quot_right(const ir_node *node);
FIRM_DLL void     set_Quot_right(ir_node *node, ir_node *right);
FIRM_DLL ir_node *get_Quot_mem(const ir_node *node);
FIRM_DLL void     set_Quot_mem(ir_node *node, ir_node *mem);
FIRM_DLL ir_mode *get_Quot_resmode(const ir_node *node);
FIRM_DLL void     set_Quot_resmode(ir_node *node, ir_mode *mode);
705

706
707
708
/**
 * Projection numbers for Quot: use for Proj nodes!
 */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
709
typedef enum {
710
	pn_Quot_M         = pn_Generic_M,         /**< Memory result. */
711
712
713
714
	pn_Quot_X_regular = pn_Generic_X_regular, /**< Execution result if no exception occurred. */
	pn_Quot_X_except  = pn_Generic_X_except,  /**< Execution result if exception occurred. */
	pn_Quot_res       = pn_Generic_other,     /**< Result of computation. */
	pn_Quot_max                               /**< number of projections from a Quot */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
715
716
} pn_Quot;  /* Projection numbers for Quot. */

717
718
719
720
721
722
723
724
FIRM_DLL ir_node *get_DivMod_left(const ir_node *node);
FIRM_DLL void     set_DivMod_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_DivMod_right(const ir_node *node);
FIRM_DLL void     set_DivMod_right(ir_node *node, ir_node *right);
FIRM_DLL ir_node *get_DivMod_mem(const ir_node *node);
FIRM_DLL void     set_DivMod_mem(ir_node *node, ir_node *mem);
FIRM_DLL ir_mode *get_DivMod_resmode(const ir_node *node);
FIRM_DLL void     set_DivMod_resmode(ir_node *node, ir_mode *mode);
725

726
727
728
/**
 * Projection numbers for DivMod: use for Proj nodes!
 */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
729
typedef enum {
730
	pn_DivMod_M         = pn_Generic_M,         /**< Memory result. */
731
732
733
734
735
	pn_DivMod_X_regular = pn_Generic_X_regular, /**< Execution result if no exception occurred. */
	pn_DivMod_X_except  = pn_Generic_X_except,  /**< Execution result if exception occurred. */
	pn_DivMod_res_div   = pn_Generic_other,     /**< Result of computation a / b. */
	pn_DivMod_res_mod,                          /**< Result of computation a % b. */
	pn_DivMod_max                               /**< number of projections from a DivMod */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
736
737
} pn_DivMod;  /* Projection numbers for DivMod. */

738
739
740
741
742
743
744
745
746
747
FIRM_DLL ir_node *get_Div_left(const ir_node *node);
FIRM_DLL void     set_Div_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_Div_right(const ir_node *node);
FIRM_DLL void     set_Div_right(ir_node *node, ir_node *right);
FIRM_DLL ir_node *get_Div_mem(const ir_node *node);
FIRM_DLL void     set_Div_mem(ir_node *node, ir_node *mem);
FIRM_DLL ir_mode *get_Div_resmode(const ir_node *node);
FIRM_DLL void     set_Div_resmode(ir_node *node, ir_mode *mode);
FIRM_DLL int      get_Div_no_remainder(const ir_node *node);
FIRM_DLL void     set_Div_no_remainder(ir_node *node, int no_remainder);
748

749
750
751
/**
 * Projection numbers for Div: use for Proj nodes!
 */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
752
typedef enum {
753
	pn_Div_M         = pn_Generic_M,         /**< Memory result. */
754
755
756
757
	pn_Div_X_regular = pn_Generic_X_regular, /**< Execution result if no exception occurred. */
	pn_Div_X_except  = pn_Generic_X_except,  /**< Execution result if exception occurred. */
	pn_Div_res       = pn_Generic_other,     /**< Result of computation. */
	pn_Div_max                               /**< number of projections from a Div */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
758
759
} pn_Div;  /* Projection numbers for Div. */

760
761
762
763
764
765
766
767
FIRM_DLL ir_node *get_Mod_left(const ir_node *node);
FIRM_DLL void     set_Mod_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_Mod_right(const ir_node *node);
FIRM_DLL void     set_Mod_right(ir_node *node, ir_node *right);
FIRM_DLL ir_node *get_Mod_mem(const ir_node *node);
FIRM_DLL void     set_Mod_mem(ir_node *node, ir_node *mem);
FIRM_DLL ir_mode *get_Mod_resmode(const ir_node *node);
FIRM_DLL void     set_Mod_resmode(ir_node *node, ir_mode *mode);
768

769
770
771
/**
 * Projection numbers for Mod: use for Proj nodes!
 */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
772
typedef enum {
773
	pn_Mod_M         = pn_Generic_M,         /**< Memory result.    */
774
775
776
777
	pn_Mod_X_regular = pn_Generic_X_regular, /**< Execution result if no exception occurred. */
	pn_Mod_X_except  = pn_Generic_X_except,  /**< Execution result if exception occurred. */
	pn_Mod_res       = pn_Generic_other,     /**< Result of computation. */
	pn_Mod_max                               /**< number of projections from a Mod */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
778
779
} pn_Mod;  /* Projection numbers for Mod. */

780
781
FIRM_DLL ir_node *get_Abs_op(const ir_node *node);
FIRM_DLL void     set_Abs_op(ir_node *node, ir_node *op);
782

783
784
785
786
FIRM_DLL ir_node *get_And_left(const ir_node *node);
FIRM_DLL void     set_And_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_And_right(const ir_node *node);
FIRM_DLL void     set_And_right(ir_node *node, ir_node *right);
787

788
789
790
791
FIRM_DLL ir_node *get_Or_left(const ir_node *node);
FIRM_DLL void     set_Or_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_Or_right(const ir_node *node);
FIRM_DLL void     set_Or_right(ir_node *node, ir_node *right);
792

793
794
795
796
FIRM_DLL ir_node *get_Eor_left(const ir_node *node);
FIRM_DLL void     set_Eor_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_Eor_right(const ir_node *node);
FIRM_DLL void     set_Eor_right(ir_node *node, ir_node *right);
797

798
799
FIRM_DLL ir_node *get_Not_op(const ir_node *node);
FIRM_DLL void     set_Not_op(ir_node *node, ir_node *op);
Christian Schäfer's avatar
Christian Schäfer committed
800

Michael Beck's avatar
Michael Beck committed
801
/** returns the pnc name from an pnc constant */
802
FIRM_DLL const char *get_pnc_string(int pnc);
Michael Beck's avatar
Michael Beck committed
803

804
/** Calculates the negated (Complement(R)) pnc condition. */
805
FIRM_DLL pn_Cmp      get_negated_pnc(long pnc, ir_mode *mode);
Michael Beck's avatar
Michael Beck committed
806

807
/** Calculates the inversed (R^-1) pnc condition, i.e., "<" --> ">" */
808
FIRM_DLL pn_Cmp      get_inversed_pnc(long pnc);
Michael Beck's avatar
Michael Beck committed
809

810
811
812
/** An alternative name for get_inversed_pnc() that can be better memorized. */
#define get_mirrored_pnc(pnc)  get_inversed_pnc(pnc)

813
814
815
816
FIRM_DLL ir_node *get_Cmp_left(const ir_node *node);
FIRM_DLL void     set_Cmp_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_Cmp_right(const ir_node *node);
FIRM_DLL void     set_Cmp_right(ir_node *node, ir_node *right);
817

818
819
820
821
FIRM_DLL ir_node *get_Shl_left(const ir_node *node);
FIRM_DLL void     set_Shl_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_Shl_right(const ir_node *node);
FIRM_DLL void     set_Shl_right(ir_node *node, ir_node *right);
822

823
824
825
826
FIRM_DLL ir_node *get_Shr_left(const ir_node *node);
FIRM_DLL void     set_Shr_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_Shr_right(const ir_node *node);
FIRM_DLL void     set_Shr_right(ir_node *node, ir_node *right);
827

828
829
830
831
FIRM_DLL ir_node *get_Shrs_left(const ir_node *node);
FIRM_DLL void     set_Shrs_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_Shrs_right(const ir_node *node);
FIRM_DLL void     set_Shrs_right(ir_node *node, ir_node *right);
832

833
834
835
836
FIRM_DLL ir_node *get_Rotl_left(const ir_node *node);
FIRM_DLL void     set_Rotl_left(ir_node *node, ir_node *left);
FIRM_DLL ir_node *get_Rotl_right(const ir_node *node);
FIRM_DLL void     set_Rotl_right(ir_node *node, ir_node *right);
837

838
839
840
841
FIRM_DLL ir_node *get_Conv_op(const ir_node *node);
FIRM_DLL void     set_Conv_op(ir_node *node, ir_node *op);
FIRM_DLL int      get_Conv_strict(const ir_node *node);
FIRM_DLL void     set_Conv_strict(ir_node *node, int flag);
842

Götz Lindenmaier's avatar
comment    
Götz Lindenmaier committed
843
844
/* Does Cast need a mem operator?
 * Cast should only depend on the type, not on the state of an
Michael Beck's avatar
Michael Beck committed
845
 * entity.  But:  we initialize various fields after Alloc, that
Götz Lindenmaier's avatar
comment    
Götz Lindenmaier committed
846
847
848
 * are accessed in the cast.  This required some precaution, to
 * get the right memory into the Loads generated from the cast.
 */
849
850
851
852
FIRM_DLL ir_node *get_Cast_op(const ir_node *node);
FIRM_DLL void     set_Cast_op(ir_node *node, ir_node *op);
FIRM_DLL ir_type *get_Cast_type(const ir_node *node);
FIRM_DLL void     set_Cast_type(ir_node *node, ir_type *to_tp);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
853

Götz Lindenmaier's avatar
Götz Lindenmaier committed
854
855
856
857
/** Checks for upcast.
 *
 * Returns true if the Cast node casts a class type to a super type.
 * Works also for pointers to classes (recursively).
858
859
 *
 * Needs typeinfo calculated.
Götz Lindenmaier's avatar
Götz Lindenmaier committed
860
 */
861
FIRM_DLL int is_Cast_upcast(ir_node *node);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
862
863
864
865
866

/** Checks for downcast.
 *
 * Returns true if the Cast node casts a class type to a sub type.
 * Works also for pointers to classes (recursively).
867
868
 *
 * Needs typeinfo calculated.
Götz Lindenmaier's avatar
Götz Lindenmaier committed
869
 */
870
FIRM_DLL int is_Cast_downcast(ir_node *node);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
871
872


Michael Beck's avatar
Michael Beck committed
873
874
/** Returns true if n is a Phi or a Filter node in INTER-procedural view.
   Returns false if irg is in phase phase_building and the Phi has zero
Götz Lindenmaier's avatar
Götz Lindenmaier committed
875
   predecessors: it's a Phi0. */