irnode_t.h 30.7 KB
Newer Older
Götz Lindenmaier's avatar
Götz Lindenmaier committed
1
2
3
4
5
/*
 * Project:     libFIRM
 * File name:   ir/ir/irnode_t.h
 * Purpose:     Representation of an intermediate operation -- private header.
 * Author:      Martin Trapp, Christian Schaefer
6
 * Modified by: Goetz Lindenmaier, Michael Beck
Götz Lindenmaier's avatar
Götz Lindenmaier committed
7
8
9
10
11
12
 * Created:
 * CVS-ID:      $Id$
 * Copyright:   (c) 1998-2003 Universität Karlsruhe
 * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
 */

Michael Beck's avatar
Michael Beck committed
13
14
15
16
17
18
19
/**
 * @file irnode_t.h
 *
 * Declarations of an ir node.
 *
 * @author Martin Trapp, Christian Schaefer
 */
20
21
#ifndef _IRNODE_T_H_
#define _IRNODE_T_H_
Götz Lindenmaier's avatar
Götz Lindenmaier committed
22

23
24
25
26
27
28
29
30
31
#include "firm_config.h"
#include "irnode.h"
#include "irop_t.h"
#include "irgraph_t.h"
#include "irflag_t.h"
#include "firm_common_t.h"
#include "irdom_t.h" /* For size of struct dom_info. */
#include "dbginfo.h"
#include "irloop.h"
Sebastian Hack's avatar
Sebastian Hack committed
32
#include "iredgekinds.h"
33
#include "array.h"
Götz Lindenmaier's avatar
Götz Lindenmaier committed
34

Beyhan's avatar
Beyhan committed
35
#include "set.h"
Sebastian Hack's avatar
Sebastian Hack committed
36
#include "list.h"
Beyhan's avatar
Beyhan committed
37
38
#include "entity_t.h"
#include "type_t.h"
Sebastian Hack's avatar
Sebastian Hack committed
39
#include "tv_t.h"
40
#include "irextbb_t.h"
Sebastian Hack's avatar
Sebastian Hack committed
41

Sebastian Hack's avatar
Sebastian Hack committed
42

43
/** ir node attributes **/
Götz Lindenmaier's avatar
Götz Lindenmaier committed
44

Michael Beck's avatar
Michael Beck committed
45
/** Block attributes */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
46
typedef struct {
47
48
  /* General attributes */
  ir_graph *irg;
Michael Beck's avatar
Michael Beck committed
49
  unsigned long block_visited;  /**< for the walker that walks over all blocks. */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
50
  /* Attributes private to construction: */
51
52
  unsigned matured:1;         /**< if set, all in-nodes of the block are fixed */
  unsigned dead:1;            /**< if set, the block is dead (and could be replace by a Bad */
Michael Beck's avatar
Michael Beck committed
53
  ir_node **graph_arr;        /**< array to store all parameters */
54
  /* Attributes holding analyses information */
Michael Beck's avatar
Michael Beck committed
55
56
57
58
59
60
  dom_info dom;               /**< Datastructure that holds information about dominators.
                                   @@@ @todo
                                   Eventually overlay with graph_arr as only valid
                                   in different phases.  Eventually inline the whole
                                   datastructure. */
  dom_info pdom;              /**< Datastructure that holds information about post-dominators. */
Michael Beck's avatar
Michael Beck committed
61
  ir_node ** in_cg;           /**< array with predecessors in
Michael Beck's avatar
Michael Beck committed
62
63
                               * interprocedural_view, if they differ
                               * from intraprocedural predecessors */
Michael Beck's avatar
Michael Beck committed
64
  int *backedge;              /**< Field n set to true if pred n is backedge.
Michael Beck's avatar
Michael Beck committed
65
                                   @@@ @todo Ev. replace by bit field! */
Michael Beck's avatar
Michael Beck committed
66
  int *cg_backedge;           /**< Field n set to true if pred n is interprocedural backedge.
Michael Beck's avatar
Michael Beck committed
67
                                   @@@ @todo Ev. replace by bit field! */
68
69
  ir_extblk *extblk;          /**< the extended basic block this block belongs to */

70
71
  struct list_head succ_head; /**< A list head for all successor edges of a block. */

Götz Lindenmaier's avatar
Götz Lindenmaier committed
72
73
} block_attr;

74
/** Cond attributes. */
75
typedef struct {
76
77
78
  cond_kind kind;           /**< flavor of Cond */
  long default_proj;        /**< only for non-binary Conds: biggest Proj number, i.e. the one used for default. */
  cond_jmp_predicate pred;  /**< only for binary Conds: The jump predication. */
79
80
} cond_attr;

81
/** Const attributes. */
82
typedef struct {
Michael Beck's avatar
Michael Beck committed
83
84
  tarval  *tv;       /**< the target value */
  ir_type *tp;       /**< the source type, for analyses. default: type_unknown. */
85
86
} const_attr;

87
/** SymConst attributes. */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
88
typedef struct {
Beyhan's avatar
Beyhan committed
89
  symconst_symbol sym;  // old tori
Götz Lindenmaier's avatar
Götz Lindenmaier committed
90
  symconst_kind num;
Michael Beck's avatar
Michael Beck committed
91
  ir_type *tp;       /**< the source type, for analyses. default: type_unknown. */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
92
93
} symconst_attr;

94
/** Sel attributes. */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
95
typedef struct {
Michael Beck's avatar
Michael Beck committed
96
  entity *ent;          /**< entity to select */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
97
98
} sel_attr;

99
/** Exception attributes. */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
100
typedef struct {
101
102
103
  op_pin_state   pin_state;     /**< the pin state for operations that might generate a exception:
                                     If it's know that no exception will be generated, could be set to
                                     op_pin_state_floats. */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
104
#if PRECISE_EXC_CONTEXT
Michael Beck's avatar
Michael Beck committed
105
  struct ir_node **frag_arr;    /**< For Phi node construction in case of exception */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
106
#endif
Michael Beck's avatar
Michael Beck committed
107
108
} except_attr;

109
/** Call attributes. */
Michael Beck's avatar
Michael Beck committed
110
111
typedef struct {
  except_attr    exc;           /**< the exception attribute. MUST be the first one. */
Michael Beck's avatar
Michael Beck committed
112
  ir_type *cld_tp;              /**< type of called procedure */
Michael Beck's avatar
Michael Beck committed
113
  entity ** callee_arr;         /**< result of callee analysis */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
114
115
} call_attr;

116
/** Alloc attributes. */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
117
typedef struct {
Michael Beck's avatar
Michael Beck committed
118
  except_attr    exc;           /**< the exception attribute. MUST be the first one. */
Michael Beck's avatar
Michael Beck committed
119
  ir_type *type;                /**< Type of the allocated object.  */
Michael Beck's avatar
Michael Beck committed
120
  where_alloc where;            /**< stack, heap or other managed part of memory */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
121
122
} alloc_attr;

123
/** Free attributes. */
Michael Beck's avatar
Michael Beck committed
124
typedef struct {
Michael Beck's avatar
Michael Beck committed
125
  ir_type *type;                /**< Type of the allocated object.  */
Michael Beck's avatar
Michael Beck committed
126
127
128
  where_alloc where;            /**< stack, heap or other managed part of memory */
} free_attr;

129
/** InstOf attributes. */
Michael Beck's avatar
Michael Beck committed
130
typedef struct {
131
132
  except_attr    exc;           /**< the exception attribute. MUST be the first one. */
  ir_type *type;                /**< the type of which the object pointer must be */
133
134
} io_attr;

135
/** Filter attributes. */
136
typedef struct {
Michael Beck's avatar
Michael Beck committed
137
138
139
  long proj;                 /**< contains the result position to project (Proj) */
  ir_node ** in_cg;          /**< array with interprocedural predecessors (Phi) */
  int *backedge;              /**< Field n set to true if pred n is backedge.
140
                     @todo Ev. replace by bitfield! */
141
142
} filter_attr;

143
/** EndReg/EndExcept attributes. */
144
typedef struct {
145
  char dummy;
146
147
} end_attr;

148
/** CallBegin attributes. */
149
typedef struct {
150
  ir_node * call;               /**< Associated Call-operation. */
151
152
} callbegin_attr;

153
/** Cast attributes. */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
154
typedef struct {
155
  ir_type *totype;              /**< Type of the casted node. */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
156
157
} cast_attr;

158
/** Load attributes. */
159
typedef struct {
160
161
  except_attr    exc;           /**< The exception attribute. MUST be the first one. */
  ir_mode        *load_mode;    /**< The mode of this Load operation. */
162
  ir_volatility volatility;	  /**< The volatility of a Load/Store operation. */
163
164
} load_attr;

165
/** Store attributes. */
166
typedef struct {
Michael Beck's avatar
Michael Beck committed
167
  except_attr    exc;           /**< the exception attribute. MUST be the first one. */
168
  ir_volatility volatility;	  /**< the volatility of a Store operation */
169
170
} store_attr;

Michael Beck's avatar
Michael Beck committed
171
typedef pn_Cmp confirm_attr;    /**< Attribute to hold compare operation */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
172

173
/** CopyB attribute. */
Michael Beck's avatar
Michael Beck committed
174
typedef struct {
175
176
  except_attr    exc;           /**< The exception attribute. MUST be the first one. */
  ir_type        *data_type;    /**< Type of the copied entity. */
Michael Beck's avatar
Michael Beck committed
177
178
} copyb_attr;

179
/** Bound attribute. */
Michael Beck's avatar
Michael Beck committed
180
typedef struct {
181
  except_attr    exc;           /**< The exception attribute. MUST be the first one. */
Michael Beck's avatar
Michael Beck committed
182
183
} bound_attr;

184
185
186
187
188
/** Conv attribute. */
typedef struct {
  char           strict;        /**< If set, this is a strict Conv that cannot be removed. */
} conv_attr;

Michael Beck's avatar
Michael Beck committed
189
/** Some IR-nodes just have one attribute, these are stored here,
Götz Lindenmaier's avatar
Götz Lindenmaier committed
190
191
   some have more. Their name is 'irnodename_attr' */
typedef union {
192
193
194
195
196
197
  block_attr     block;   /**< For Block: Fields needed to construct it */
  cond_attr      cond;    /**< For Cond. */
  const_attr     con;     /**< For Const: contains the value of the constant and a type */
  symconst_attr  symc;    /**< For SymConst. */
  sel_attr       sel;     /**< For Sel. */
  call_attr      call;    /**< For Call: pointer to the type of the method to call */
Michael Beck's avatar
Michael Beck committed
198
  callbegin_attr callbegin; /**< For CallBegin */
199
200
201
202
203
  alloc_attr     alloc;  /**< For Alloc. */
  free_attr      free;   /**< For Free. */
  io_attr        instof; /**< For InstOf */
  cast_attr      cast;   /**< For Cast. */
  load_attr      load;   /**< For Load. */
204
  store_attr     store;  /**< For Store. */
Michael Beck's avatar
Michael Beck committed
205
  int            phi0_pos;  /**< For Phi. Used to remember the value defined by
206
207
208
209
210
                   this Phi node.  Needed when the Phi is completed
                   to call get_r_internal_value to find the
                   predecessors. If this attribute is set, the Phi
                   node takes the role of the obsolete Phi0 node,
                   therefore the name. */
Michael Beck's avatar
Michael Beck committed
211
  int *phi_backedge;    /**< For Phi after construction.
Götz Lindenmaier's avatar
Götz Lindenmaier committed
212
213
			   Field n set to true if pred n is backedge.
			   @todo Ev. replace by bitfield! */
Michael Beck's avatar
Michael Beck committed
214
  long           proj;          /**< For Proj: contains the result position to project */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
215
  confirm_attr   confirm_cmp;   /**< For Confirm: compare operation */
Michael Beck's avatar
Michael Beck committed
216
217
218
219
  filter_attr    filter;        /**< For Filter */
  end_attr       end;           /**< For EndReg, EndExcept */
  except_attr    except;        /**< For Phi node construction in case of exceptions */
  copyb_attr     copyb;         /**< For CopyB operation */
Michael Beck's avatar
Michael Beck committed
220
  bound_attr     bound;         /**< For Bound operation */
221
  conv_attr      conv;          /**< For Conv operation */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
222
223
} attr;

Sebastian Hack's avatar
Sebastian Hack committed
224
225
226
227
228
229
230
231
232
/**
* Edge info to put into an irn.
*/
typedef struct _irn_edge_kind_info_t {
	struct list_head outs_head;  /**< The list of all outs. */
	int out_count;               /**< Number of outs in the list. */
} irn_edge_info_t;

typedef irn_edge_info_t irn_edges_info_t[EDGE_KIND_LAST];
Götz Lindenmaier's avatar
Götz Lindenmaier committed
233

Michael Beck's avatar
Michael Beck committed
234
235
/** common structure of an irnode
    if the node has some attributes, they are stored in attr */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
236
struct ir_node {
Michael Beck's avatar
Michael Beck committed
237
238
239
240
  /* ------- Basics of the representation  ------- */
  firm_kind kind;          /**< distinguishes this node from others */
  ir_op *op;               /**< Opcode of this node. */
  ir_mode *mode;           /**< Mode of this node. */
241
242
243
244
  struct ir_node **in;     /**< The array of predecessors / operands. */
  unsigned long visited;   /**< Visited counter for walks of the graph. */
  unsigned node_idx;       /**< The node index of this node in its graph. */
  void *link;              /**< To attach additional information to the node, e.g.
Götz Lindenmaier's avatar
Götz Lindenmaier committed
245
                              used while construction to link Phi0 nodes and
246
247
                              during optimization to link to nodes that
                              shall replace a node. */
Michael Beck's avatar
Michael Beck committed
248
  /* ------- Fields for optimizations / analysis information ------- */
Sebastian Hack's avatar
Sebastian Hack committed
249
  struct ir_node **out;    /**< @deprecated array of out edges. */
Michael Beck's avatar
Michael Beck committed
250
251
  struct dbg_info* dbi;    /**< A pointer to information for debug support. */
  /* ------- For debugging ------- */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
252
#ifdef DEBUG_libfirm
253
  int out_valid;
254
255
  long node_nr;            /**< A unique node number for each node to make output
                                readable. */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
256
#endif
Götz Lindenmaier's avatar
Götz Lindenmaier committed
257
258
  /* ------- For analyses -------- */
  ir_loop *loop;           /**< the loop the node is in. Access routines in irloop.h */
259
#ifdef DO_HEAPANALYSIS
Michael Beck's avatar
Michael Beck committed
260
  struct abstval *av;      /**< the abstract value of this node */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
261
  struct section *sec;
Sebastian Hack's avatar
Sebastian Hack committed
262
#endif
Sebastian Hack's avatar
Sebastian Hack committed
263
264
  struct ir_node **deps;   /**< Additional dependencies induced by state. */
  irn_edges_info_t edge_info;  /**< everlasting out edges */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
265
  /* ------- Opcode depending fields -------- */
Michael Beck's avatar
Michael Beck committed
266
267
  attr attr;               /**< attribute of this node. Depends on opcode.
                              Must be last field of struct ir_node. */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
268
269
};

Götz Lindenmaier's avatar
Götz Lindenmaier committed
270

271
272
273
274
275
276
/**
 * Returns the array with the ins.  The content of the array may not be
 * changed.
 * Note that this function returns the whole in array including the
 * block predecessor. So, it is NOT symmetric with set_irn_in().
 */
277
ir_node     **get_irn_in            (const ir_node *node);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
278

Michael Beck's avatar
Michael Beck committed
279
/** @{ */
Michael Beck's avatar
Michael Beck committed
280
/** access attributes directly */
281
282
283
const_attr    get_irn_const_attr    (ir_node *node);
long          get_irn_proj_attr     (ir_node *node);
alloc_attr    get_irn_alloc_attr    (ir_node *node);
Michael Beck's avatar
Michael Beck committed
284
free_attr     get_irn_free_attr     (ir_node *node);
285
symconst_attr get_irn_symconst_attr (ir_node *node);
Michael Beck's avatar
Michael Beck committed
286
287
ir_type      *get_irn_call_attr     (ir_node *node);
ir_type      *get_irn_funccall_attr (ir_node *node);
288
289
290
291
292
293
sel_attr      get_irn_sel_attr      (ir_node *node);
int           get_irn_phi_attr      (ir_node *node);
block_attr    get_irn_block_attr    (ir_node *node);
load_attr     get_irn_load_attr     (ir_node *node);
store_attr    get_irn_store_attr    (ir_node *node);
except_attr   get_irn_except_attr   (ir_node *node);
Michael Beck's avatar
Michael Beck committed
294
/** @} */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
295

296
/**
297
298
299
300
 * The amount of additional space for custom data to be allocated upon creating a new node.
 */
extern unsigned firm_add_node_size;

Michael Beck's avatar
Michael Beck committed
301
302
303
304
305
306
307
308
309
310
/**
 * Sets the get_type operation for an ir_op_ops.
 *
 * @param code   the opcode for the default operation
 * @param ops    the operations initialized
 *
 * @return
 *    The operations.
 */
ir_op_ops *firm_set_default_get_type(opcode code, ir_op_ops *ops);
311

Michael Beck's avatar
Michael Beck committed
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
/**
 * Sets the get_type_attr operation for an ir_op_ops.
 *
 * @param code   the opcode for the default operation
 * @param ops    the operations initialized
 *
 * @return
 *    The operations.
 */
ir_op_ops *firm_set_default_get_type_attr(opcode code, ir_op_ops *ops);

/**
 * Sets the get_entity_attr operation for an ir_op_ops.
 *
 * @param code   the opcode for the default operation
 * @param ops    the operations initialized
 *
 * @return
 *    The operations.
 */
ir_op_ops *firm_set_default_get_entity_attr(opcode code, ir_op_ops *ops);

Michael Beck's avatar
Michael Beck committed
334
/*-------------------------------------------------------------------*/
Götz Lindenmaier's avatar
Götz Lindenmaier committed
335
336
/*  These function are most used in libfirm.  Give them as static    */
/*  functions so they can be inlined.                                */
Michael Beck's avatar
Michael Beck committed
337
/*-------------------------------------------------------------------*/
Götz Lindenmaier's avatar
Götz Lindenmaier committed
338

339
340
341
342
343
/**
 * Checks whether a pointer points to a ir node.
 * Intern version for libFirm.
 */
static INLINE int
344
_is_ir_node(const void *thing) {
345
346
  return (get_kind(thing) == k_ir_node);
}
Götz Lindenmaier's avatar
Götz Lindenmaier committed
347

348
349
350
351
352
/**
 * Gets the op of a node.
 * Intern version for libFirm.
 */
static INLINE ir_op *
353
354
_get_irn_op(const ir_node *node) {
  assert(node);
355
356
357
  return node->op;
}

358
static INLINE void
359
360
_set_irn_op(ir_node *node, ir_op *op) {
  assert(node);
361
362
363
  node->op = op;
}

364
365
366
367
/** Copies all attributes stored in the old node  to the new node.
    Assumes both have the same opcode and sufficient size. */
static INLINE void
copy_node_attr(const ir_node *old_node, ir_node *new_node) {
368
  ir_op *op = _get_irn_op(old_node);
369
370

  /* must always exist */
Michael Beck's avatar
Michael Beck committed
371
  op->ops.copy_attr(old_node, new_node);
372
373
}

374
375
376
377
378
/**
 * Gets the opcode of a node.
 * Intern version for libFirm.
 */
static INLINE opcode
379
380
381
_get_irn_opcode(const ir_node *node) {
  assert(k_ir_node == get_kind(node));
  assert(node->op);
382
383
  return node->op->code;
}
Götz Lindenmaier's avatar
Götz Lindenmaier committed
384

Michael Beck's avatar
Michael Beck committed
385
386
387
388
/**
 * Returns the number of predecessors without the block predecessor.
 * Intern version for libFirm.
 */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
389
static INLINE int
390
_get_irn_intra_arity(const ir_node *node) {
Götz Lindenmaier's avatar
Götz Lindenmaier committed
391
392
393
394
  assert(node);
  return ARR_LEN(node->in) - 1;
}

Michael Beck's avatar
Michael Beck committed
395
396
397
398
/**
 * Returns the number of predecessors without the block predecessor.
 * Intern version for libFirm.
 */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
399
static INLINE int
400
_get_irn_inter_arity(const ir_node *node) {
Götz Lindenmaier's avatar
Götz Lindenmaier committed
401
  assert(node);
Michael Beck's avatar
Michael Beck committed
402
  if (_get_irn_op(node) == op_Filter) {
Götz Lindenmaier's avatar
Götz Lindenmaier committed
403
404
    assert(node->attr.filter.in_cg);
    return ARR_LEN(node->attr.filter.in_cg) - 1;
Michael Beck's avatar
Michael Beck committed
405
  } else if (_get_irn_op(node) == op_Block && node->attr.block.in_cg) {
Götz Lindenmaier's avatar
Götz Lindenmaier committed
406
407
    return ARR_LEN(node->attr.block.in_cg) - 1;
  }
408
  return _get_irn_intra_arity(node);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
409
410
}

Michael Beck's avatar
Michael Beck committed
411
412
413
414
/**
 * Returns the number of predecessors without the block predecessor.
 * Intern version for libFirm.
 */
415
extern int (*_get_irn_arity)(const ir_node *node);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
416

Michael Beck's avatar
Michael Beck committed
417
418
419
/**
 * Intern version for libFirm.
 */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
420
static INLINE ir_node *
421
_get_irn_intra_n(const ir_node *node, int n) {
Michael Beck's avatar
Michael Beck committed
422
423
  ir_node *nn;

424
  assert(node); assert(-1 <= n && n < _get_irn_intra_arity(node));
425

Michael Beck's avatar
Michael Beck committed
426
427
428
429
  nn = node->in[n + 1];
  if (!nn || (nn->op != op_Id)) return nn;

  return (node->in[n + 1] = skip_Id(nn));
Götz Lindenmaier's avatar
Götz Lindenmaier committed
430
431
}

Michael Beck's avatar
Michael Beck committed
432
433
434
/**
 * Intern version for libFirm.
 */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
435
static INLINE ir_node*
436
_get_irn_inter_n(const ir_node *node, int n) {
437
  assert(node); assert(-1 <= n && n < _get_irn_inter_arity(node));
438

Götz Lindenmaier's avatar
Götz Lindenmaier committed
439
  /* handle Filter and Block specially */
440
  if (_get_irn_op(node) == op_Filter) {
Götz Lindenmaier's avatar
Götz Lindenmaier committed
441
    assert(node->attr.filter.in_cg);
442
    return (node->attr.filter.in_cg[n + 1] = skip_Id(node->attr.filter.in_cg[n + 1]));
443
  } else if (_get_irn_op(node) == op_Block && node->attr.block.in_cg) {
444
    return (node->attr.block.in_cg[n + 1] = skip_Id(node->attr.block.in_cg[n + 1]));
Götz Lindenmaier's avatar
Götz Lindenmaier committed
445
446
  }

447
  return _get_irn_intra_n(node, n);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
448
449
}

Michael Beck's avatar
Michael Beck committed
450
451
/**
 * Access to the predecessors of a node.
452
 * To iterate over the operands iterate from 0 to i < get_irn_arity(),
Michael Beck's avatar
Michael Beck committed
453
454
455
456
457
 * to iterate including the Block predecessor iterate from i = -1 to
 * i < get_irn_arity.
 * If it is a block, the entry -1 is NULL.
 * Intern version for libFirm.
 */
458
extern ir_node *(*_get_irn_n)(const ir_node *node, int n);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
459

Sebastian Hack's avatar
Sebastian Hack committed
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
static INLINE int _get_irn_deps(const ir_node *node)
{
	return node->deps ? ARR_LEN(node->deps) : 0;
}

static INLINE ir_node *_get_irn_dep(const ir_node *node, int pos)
{
	assert(node->deps && "dependency array node yet allocated. use add_irn_dep()");
	assert(pos >= 0 && pos < ARR_LEN(node->deps) && "dependency index out of range");
	return node->deps[pos];
}

static INLINE void
_set_irn_dep(ir_node *node, int pos, ir_node *dep)
{
	ir_node *old;

	assert(node->deps && "dependency array node yet allocated. use add_irn_dep()");
	assert(pos >= 0 && pos < ARR_LEN(node->deps) && "dependency index out of range");
	old = node->deps[pos];
	node->deps[pos] = dep;
	edges_notify_edge_kind(node, pos, dep, old, EDGE_KIND_DEP, get_irn_irg(node));
}


static INLINE int
_get_irn_ins_or_deps(const ir_node *irn)
{
	return _get_irn_deps(irn) + _get_irn_arity(irn);
}

static INLINE ir_node *
_get_irn_in_or_dep(const ir_node *irn, int pos)
{
	int n_in = get_irn_arity(irn);
	return pos < n_in ? get_irn_n(irn, pos) : get_irn_dep(irn, pos - n_in);
}

Michael Beck's avatar
Michael Beck committed
498
499
500
501
/**
 * Gets the mode of a node.
 * Intern version for libFirm.
 */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
502
static INLINE ir_mode *
Michael Beck's avatar
Michael Beck committed
503
_get_irn_mode(const ir_node *node) {
504
  assert(node);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
505
506
507
  return node->mode;
}

Michael Beck's avatar
Michael Beck committed
508
/**
509
510
511
512
 * Sets the mode of a node.
 * Intern version of libFirm.
 */
static INLINE void
Michael Beck's avatar
Michael Beck committed
513
_set_irn_mode(ir_node *node, ir_mode *mode) {
514
  assert(node);
515
516
517
518
519
  node->mode = mode;
}

/**
 * Gets the visited counter of a node.
Michael Beck's avatar
Michael Beck committed
520
521
 * Intern version for libFirm.
 */
522
static INLINE unsigned long
Michael Beck's avatar
Michael Beck committed
523
_get_irn_visited(const ir_node *node) {
524
  assert(node);
525
  return node->visited;
Götz Lindenmaier's avatar
Götz Lindenmaier committed
526
527
}

Michael Beck's avatar
Michael Beck committed
528
/**
529
 * Sets the visited counter of a node.
Michael Beck's avatar
Michael Beck committed
530
531
 * Intern version for libFirm.
 */
532
static INLINE void
Michael Beck's avatar
Michael Beck committed
533
_set_irn_visited(ir_node *node, unsigned long visited) {
534
  assert(node);
535
536
537
538
539
540
541
542
  node->visited = visited;
}

/**
 * Mark a node as visited in a graph.
 * Intern version for libFirm.
 */
static INLINE void
Michael Beck's avatar
Michael Beck committed
543
_mark_irn_visited(ir_node *node) {
544
  assert(node);
545
546
547
548
549
550
551
552
  node->visited = current_ir_graph->visited;
}

/**
 * Returns non-zero if a node of was visited.
 * Intern version for libFirm.
 */
static INLINE int
553
_irn_visited(const ir_node *node) {
554
  assert(node);
555
  return (node->visited >= current_ir_graph->visited);
Götz Lindenmaier's avatar
Götz Lindenmaier committed
556
557
}

558
559
560
561
562
/**
 * Returns non-zero if a node of was NOT visited.
 * Intern version for libFirm.
 */
static INLINE int
563
_irn_not_visited(const ir_node *node) {
564
  assert(node);
565
566
567
568
569
570
571
572
  return (node->visited < current_ir_graph->visited);
}

/**
 * Sets the link of a node.
 * Intern version of libFirm.
 */
static INLINE void
573
_set_irn_link(ir_node *node, void *link) {
574
  assert(node);
575
576
  /* Link field is used for Phi construction and various optimizations
     in iropt. */
577
  assert(get_irg_phase_state(get_irn_irg(node)) != phase_building);
578
579
580
581
582
583
584
585
586

  node->link = link;
}

/**
 * Returns the link of a node.
 * Intern version of libFirm.
 */
static INLINE void *
587
_get_irn_link(const ir_node *node) {
588
  assert(node && _is_ir_node(node));
589
590
  return node->link;
}
Götz Lindenmaier's avatar
Götz Lindenmaier committed
591

Michael Beck's avatar
Michael Beck committed
592
/**
593
594
595
 * Returns whether the node _always_ must be pinned.
 * I.e., the node is not floating after global cse.
 *
Michael Beck's avatar
Michael Beck committed
596
597
598
 * Intern version of libFirm.
 */
static INLINE op_pin_state
599
600
601
_get_irn_pinned(const ir_node *node) {
  op_pin_state state;
  assert(node && _is_ir_node(node));
602
  /* Check opcode */
603
  state = _get_op_pinned(_get_irn_op(node));
604

605
  if (state >= op_pin_state_exc_pinned)
606
607
    return get_opt_fragile_ops() ? node->attr.except.pin_state : op_pin_state_pinned;
  return state;
Michael Beck's avatar
Michael Beck committed
608
609
}

610
611
static INLINE op_pin_state
_is_irn_pinned_in_irg(const ir_node *node) {
612
613
  if (get_irg_pinned(get_irn_irg(node)) == op_pin_state_floats)
    return get_irn_pinned(node);
614
615
616
  return op_pin_state_pinned;
}

Michael Beck's avatar
Michael Beck committed
617
static INLINE int
618
619
_is_unop(const ir_node *node) {
  assert(node && _is_ir_node(node));
Michael Beck's avatar
Michael Beck committed
620
621
622
623
  return (node->op->opar == oparity_unary);
}

static INLINE int
624
625
_is_binop(const ir_node *node) {
  assert(node && _is_ir_node(node));
Michael Beck's avatar
Michael Beck committed
626
627
628
629
  return (node->op->opar == oparity_binary);
}

static INLINE int
630
_is_Bad(const ir_node *node) {
Michael Beck's avatar
Michael Beck committed
631
  assert(node);
Michael Beck's avatar
Michael Beck committed
632
  return (_get_irn_op(node) == op_Bad);
Michael Beck's avatar
Michael Beck committed
633
634
}

Christian Würdig's avatar
Christian Würdig committed
635
636
637
638
639
640
static INLINE int
_is_Start(const ir_node *node) {
  assert(node);
  return (_get_irn_op(node) == op_Start);
}

Sebastian Hack's avatar
Sebastian Hack committed
641
642
static INLINE int
_is_Const(const ir_node *node) {
Michael Beck's avatar
Michael Beck committed
643
  assert(node);
Michael Beck's avatar
Michael Beck committed
644
  return (_get_irn_op(node) == op_Const);
Sebastian Hack's avatar
Sebastian Hack committed
645
646
}

Michael Beck's avatar
Michael Beck committed
647
static INLINE int
Michael Beck's avatar
Michael Beck committed
648
_is_Unknown(const ir_node *node) {
Michael Beck's avatar
Michael Beck committed
649
  assert(node);
Michael Beck's avatar
Michael Beck committed
650
  return (_get_irn_op(node) == op_Unknown);
Michael Beck's avatar
Michael Beck committed
651
652
}

653
static INLINE int
Michael Beck's avatar
Michael Beck committed
654
_is_Return(const ir_node *node) {
655
  assert(node);
Michael Beck's avatar
Michael Beck committed
656
  return (_get_irn_op(node) == op_Return);
657
658
659
}

static INLINE int
Michael Beck's avatar
Michael Beck committed
660
_is_Call(const ir_node *node) {
661
  assert(node);
Michael Beck's avatar
Michael Beck committed
662
  return (_get_irn_op(node) == op_Call);
663
664
665
}

static INLINE int
Michael Beck's avatar
Michael Beck committed
666
_is_Sel(const ir_node *node) {
667
  assert(node);
Michael Beck's avatar
Michael Beck committed
668
  return (_get_irn_op(node) == op_Sel);
669
670
}

Michael Beck's avatar
Michael Beck committed
671
static INLINE int
Michael Beck's avatar
Michael Beck committed
672
_is_Mux(const ir_node *node) {
Michael Beck's avatar
Michael Beck committed
673
674
675
676
677
678
679
680
  assert(node);
  if (node) {
    ir_op *op = _get_irn_op(node);
    return (op == op_Mux || ((op == op_Psi) && _get_irn_arity(node) == 3));
  }
  return 0;
}

Michael Beck's avatar
Michael Beck committed
681
static INLINE int
Michael Beck's avatar
Michael Beck committed
682
_is_Load(const ir_node *node) {
Michael Beck's avatar
Michael Beck committed
683
  assert(node);
Michael Beck's avatar
Michael Beck committed
684
  return (_get_irn_op(node) == op_Load);
Michael Beck's avatar
Michael Beck committed
685
686
687
}

static INLINE int
Michael Beck's avatar
Michael Beck committed
688
_is_Sync(const ir_node *node) {
Michael Beck's avatar
Michael Beck committed
689
  assert(node);
Michael Beck's avatar
Michael Beck committed
690
  return (_get_irn_op(node) == op_Sync);
Michael Beck's avatar
Michael Beck committed
691
692
693
}

static INLINE int
Michael Beck's avatar
Michael Beck committed
694
_is_Confirm(const ir_node *node) {
Michael Beck's avatar
Michael Beck committed
695
  assert(node);
Michael Beck's avatar
Michael Beck committed
696
  return (_get_irn_op(node) == op_Confirm);
Michael Beck's avatar
Michael Beck committed
697
698
}

Michael Beck's avatar
Michael Beck committed
699
700
701
702
703
704
static INLINE int
_is_Pin(const ir_node *node) {
  assert(node);
  return (_get_irn_op(node) == op_Pin);
}

Michael Beck's avatar
Michael Beck committed
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
static INLINE int
_is_SymConst(const ir_node *node) {
  assert(node);
  return (_get_irn_op(node) == op_SymConst);
}

static INLINE int
_is_Cond(const ir_node *node) {
  assert(node);
  return (_get_irn_op(node) == op_Cond);
}

static INLINE int
_is_Cmp(const ir_node *node) {
  assert(node);
  return (_get_irn_op(node) == op_Cmp);
}

Michael Beck's avatar
Michael Beck committed
723
724
725
726
727
728
static INLINE int
_is_Alloc(const ir_node *node) {
  assert(node);
  return (_get_irn_op(node) == op_Alloc);
}

Matthias Braun's avatar
Matthias Braun committed
729
730
731
732
733
734
static INLINE int
_is_Jmp(const ir_node *node) {
  assert(node);
  return (_get_irn_op(node) == op_Jmp);
}

Michael Beck's avatar
Michael Beck committed
735
static INLINE int
736
737
738
_is_no_Block(const ir_node *node) {
  assert(node && _is_ir_node(node));
  return (_get_irn_op(node) != op_Block);
Michael Beck's avatar
Michael Beck committed
739
740
741
}

static INLINE int
742
743
744
_is_Block(const ir_node *node) {
  assert(node && _is_ir_node(node));
  return (_get_irn_op(node) == op_Block);
Michael Beck's avatar
Michael Beck committed
745
746
}

747
static INLINE int
Christoph Mallon's avatar
Christoph Mallon committed
748
_get_Block_n_cfgpreds(const ir_node *node) {
749
750
751
752
753
  assert(_is_Block(node));
  return _get_irn_arity(node);
}

static INLINE ir_node *
Michael Beck's avatar
Michael Beck committed
754
_get_Block_cfgpred(ir_node *node, int pos) {
755
756
757
758
759
  assert(0 <= pos && pos < get_irn_arity(node));
  assert(_is_Block(node));
  return _get_irn_n(node, pos);
}

760
761
/* Get the predecessor block.
 *
762
 *  Returns the block corresponding to the predecessor pos.
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
 *
 *  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
 *    Start, but the Bad node.
 */
static INLINE ir_node  *
_get_Block_cfgpred_block(ir_node *node, int pos) {
  ir_node *res = skip_Proj(get_Block_cfgpred(node, pos));
  if (!is_Bad(res))
    res = get_nodes_block(res);
  return res;
}

Michael Beck's avatar
Michael Beck committed
779
static INLINE unsigned long
Michael Beck's avatar
Michael Beck committed
780
_get_Block_block_visited(ir_node *node) {
781
  assert(node->op == op_Block);
Michael Beck's avatar
Michael Beck committed
782
783
784
785
  return node->attr.block.block_visited;
}

static INLINE void
Michael Beck's avatar
Michael Beck committed
786
_set_Block_block_visited(ir_node *node, unsigned long visit) {
787
  assert(node->op == op_Block);
Michael Beck's avatar
Michael Beck committed
788
789
790
791
792
  node->attr.block.block_visited = visit;
}

/* For this current_ir_graph must be set. */
static INLINE void
Michael Beck's avatar
Michael Beck committed
793
_mark_Block_block_visited(ir_node *node) {
794
  assert(node->op == op_Block);
Michael Beck's avatar
Michael Beck committed
795
796
797
798
799
  node->attr.block.block_visited = get_irg_block_visited(current_ir_graph);
}

static INLINE int
_Block_not_block_visited(ir_node *node) {
800
  assert(node->op == op_Block);
Michael Beck's avatar
Michael Beck committed
801
802
803
  return (node->attr.block.block_visited < get_irg_block_visited(current_ir_graph));
}

804
static INLINE ir_node *
805
806
_set_Block_dead(ir_node *block) {
  assert(_get_irn_op(block) == op_Block);
807
808
809
810
811
  block->attr.block.dead = 1;
  return block;
}

static INLINE int
812
_is_Block_dead(const ir_node *block) {
Michael Beck's avatar
Michael Beck committed
813
  ir_op *op = _get_irn_op(block);
814
815
816
817
818
819
820
821
822

  if (op == op_Bad)
    return 1;
  else {
    assert(op == op_Block);
    return block->attr.block.dead;
  }
}

823
824
static INLINE tarval *_get_Const_tarval(ir_node *node) {
  assert(_get_irn_op(node) == op_Const);
Sebastian Hack's avatar
Sebastian Hack committed
825
826
827
  return node->attr.con.tv;
}

828
829
static INLINE cnst_classify_t _classify_Const(ir_node *node) {
  ir_op *op;
Sebastian Hack's avatar
Sebastian Hack committed
830
831
  assert(_is_ir_node(node));

832
  op = _get_irn_op(node);
Sebastian Hack's avatar
Sebastian Hack committed
833

Michael Beck's avatar
Michael Beck committed
834
  if (op == op_Const)
835
836
837
    return classify_tarval(_get_Const_tarval(node));
  else if(op == op_SymConst)
    return CNST_SYMCONST;
Sebastian Hack's avatar
Sebastian Hack committed
838

839
  return CNST_NO_CONST;
Sebastian Hack's avatar
Sebastian Hack committed
840
841
}

Michael Beck's avatar
Michael Beck committed
842
843
844
845
static INLINE int _is_irn_forking(const ir_node *node) {
  return is_op_forking(_get_irn_op(node));
}

Michael Beck's avatar
Michael Beck committed
846
static INLINE ir_type *_get_irn_type(ir_node *node) {
Michael Beck's avatar
Michael Beck committed
847
  return _get_irn_op(node)->ops.get_type(node);
848
}
Sebastian Hack's avatar
Sebastian Hack committed
849

Michael Beck's avatar
Michael Beck committed
850
static INLINE ir_type *_get_irn_type_attr(ir_node *node) {
Michael Beck's avatar
Michael Beck committed
851
852
853
  return _get_irn_op(node)->ops.get_type_attr(node);
}

Michael Beck's avatar
Michael Beck committed
854
static INLINE entity *_get_irn_entity_attr(ir_node *node) {
Michael Beck's avatar
Michael Beck committed
855
856
857
  return _get_irn_op(node)->ops.get_entity_attr(node);
}

Michael Beck's avatar
Michael Beck committed
858
859
860
861
static INLINE int _is_irn_constlike(const ir_node *node) {
  return is_op_constlike(_get_irn_op(node));
}

Michael Beck's avatar
Michael Beck committed
862
863
864
865
static INLINE int _is_irn_always_opt(const ir_node *node) {
  return is_op_always_opt(_get_irn_op(node));
}

Michael Beck's avatar
Michael Beck committed
866
867
868
869
static INLINE int _is_irn_keep(const ir_node *node) {
  return is_op_keep(_get_irn_op(node));
}

870
871
872
873
static INLINE int _is_irn_start_block_placed(const ir_node *node) {
  return is_op_start_block_placed(_get_irn_op(node));
}

874
875
876
877
878
879
880
881
882
883
884
885
static INLINE int _is_irn_machine_op(const ir_node *node) {
  return is_op_machine(_get_irn_op(node));
}

static INLINE int _is_irn_machine_operand(const ir_node *node) {
  return is_op_machine_operand(_get_irn_op(node));
}

static INLINE int _is_irn_machine_user(const ir_node *node, unsigned n) {
  return is_op_machine_user(_get_irn_op(node), n);
}

886
static INLINE cond_jmp_predicate _get_Cond_jmp_pred(ir_node *node) {
887
  assert(_get_irn_op(node) == op_Cond);
888
  return node->attr.cond.pred;
889
890
891
}

static INLINE void _set_Cond_jmp_pred(ir_node *node, cond_jmp_predicate pred) {
892
  assert(_get_irn_op(node) == op_Cond);
893
  node->attr.cond.pred = pred;
894
895
}

Michael Beck's avatar
Michael Beck committed
896
897
898
899
900
static INLINE int _get_Psi_n_conds(ir_node *node) {
  assert(_get_irn_op(node) == op_Psi);
  return _get_irn_arity(node) >> 1;
}

901
902
903
904
static INLINE unsigned _get_irn_idx(const ir_node *node) {
  return node->node_idx;
}

905
/* this section MUST contain all inline functions */
Michael Beck's avatar
Michael Beck committed
906
907
908
909
910
911
912
913
914
915
#define is_ir_node(thing)                     _is_ir_node(thing)
#define get_irn_intra_arity(node)             _get_irn_intra_arity(node)
#define get_irn_inter_arity(node)             _get_irn_inter_arity(node)
#define get_irn_arity(node)                   _get_irn_arity(node)
#define get_irn_intra_n(node, n)              _get_irn_intra_n(node, n)
#define get_irn_inter_n(node, n)              _get_irn_inter_n(node, n)
#define get_irn_n(node, n)                    _get_irn_n(node, n)
#define get_irn_mode(node)                    _get_irn_mode(node)
#define set_irn_mode(node, mode)              _set_irn_mode(node, mode)
#define get_irn_op(node)                      _get_irn_op(node)
916
#define set_irn_op(node, op)                  _set_irn_op(node, op)
Michael Beck's avatar
Michael Beck committed
917
918
919
920
921
922
923
924
#define get_irn_opcode(node)                  _get_irn_opcode(node)
#define get_irn_visited(node)                 _get_irn_visited(node)
#define set_irn_visited(node, v)              _set_irn_visited(node, v)
#define mark_irn_visited(node)                _mark_irn_visited(node)
#define irn_visited(node)                     _irn_visited(node)
#define irn_not_visited(node)                 _irn_not_visited(node)
#define set_irn_link(node, link)              _set_irn_link(node, link)
#define get_irn_link(node)                    _get_irn_link(node)
925
926
#define get_irn_pinned(node)                  _get_irn_pinned(node)
#define is_irn_pinned_in_irg(node)            _is_irn_pinned_in_irg(node)
Michael Beck's avatar
Michael Beck committed
927
928
#define is_unop(node)                         _is_unop(node)
#define is_binop(node)                        _is_binop(node)
Sebastian Hack's avatar
Sebastian Hack committed
929
#define is_Const(node)                        _is_Const(node)
Michael Beck's avatar
Michael Beck committed
930
#define is_Unknown(node)                      _is_Unknown(node)
931
932
933
#define is_Return(node)                       _is_Return(node)
#define is_Call(node)                         _is_Call(node)
#define is_Sel(node)                          _is_Sel(node)
Michael Beck's avatar
Michael Beck committed
934
#define is_Mux(node)                          _is_Mux(node)
Michael Beck's avatar
Michael Beck committed
935
936
937
#define is_Load(node)                         _is_Load(node)
#define is_Sync(node)                         _is_Sync(node)
#define is_Confirm(node)                      _is_Confirm(node)
Michael Beck's avatar
Michael Beck committed
938
#define is_Pin(node)                          _is_Pin(node)
Michael Beck's avatar
Michael Beck committed
939
940
#define is_SymConst(node)                     _is_SymConst(node)
#define is_Cond(node)                         _is_Cond(node)
Michael Beck's avatar
Michael Beck committed
941
942
#define is_Cmp(node)                          _is_Cmp(node)
#define is_Alloc(node)                        _is_Alloc(node)
Michael Beck's avatar
Michael Beck committed
943
#define is_Bad(node)                          _is_Bad(node)
Christian Würdig's avatar
Christian Würdig committed
944
#define is_Start(node)                        _is_Start(node)
Michael Beck's avatar
Michael Beck committed
945
946
#define is_no_Block(node)                     _is_no_Block(node)
#define is_Block(node)                        _is_Block(node)
947
948
#define get_Block_n_cfgpreds(node)            _get_Block_n_cfgpreds(node)
#define get_Block_cfgpred(node, pos)          _get_Block_cfgpred(node, pos)
949
#define get_Block_cfgpred_block(node, pos)    _get_Block_cfgpred_block(node, pos)
Michael Beck's avatar
Michael Beck committed
950
951
952
953
954
955
956
957
#define get_Block_block_visited(node)         _get_Block_block_visited(node)
#define set_Block_block_visited(node, visit)  _set_Block_block_visited(node, visit)
#define mark_Block_block_visited(node)        _mark_Block_block_visited(node)
#define Block_not_block_visited(node)         _Block_not_block_visited(node)
#define set_Block_dead(block)                 _set_Block_dead(block)
#define is_Block_dead(block)                  _is_Block_dead(block)
#define get_Const_tarval(node)                _get_Const_tarval(node)
#define classify_Const(node)                  _classify_Const(node)
Michael Beck's avatar
Michael Beck committed
958
#define is_irn_forking(node)                  _is_irn_forking(node)
Michael Beck's avatar
Michael Beck committed
959
#define get_irn_type(node)                    _get_irn_type(node)
Michael Beck's avatar
Michael Beck committed
960
961
#define get_irn_type_attr(node)               _get_irn_type_attr(node)
#define get_irn_entity_attr(node)             _get_irn_entity_attr(node)
Michael Beck's avatar
Michael Beck committed
962
#define is_irn_constlike(node)                _is_irn_constlike(node)
Michael Beck's avatar
Michael Beck committed
963
#define is_irn_always_opt(node)               _is_irn_always_opt(node)
Michael Beck's avatar
Michael Beck committed
964
#define is_irn_keep(node)                     _is_irn_keep(node)
965
#define is_irn_start_block_placed(node)       _is_irn_start_block_placed(node)
966
967
968
#define is_irn_machine_op(node)               _is_irn_machine_op(node)
#define is_irn_machine_operand(node)          _is_irn_machine_operand(node)
#define is_irn_machine_user(node, n)          _is_irn_machine_user(node, n)
969
970
#define get_Cond_jmp_pred(node)               _get_Cond_jmp_pred(node)
#define set_Cond_jmp_pred(node, pred)         _set_Cond_jmp_pred(node, pred)
Michael Beck's avatar
Michael Beck committed
971
#define get_Psi_n_conds(node)                 _get_Psi_n_conds(node)
972
#define get_irn_idx(node)                     _get_irn_idx(node)
Götz Lindenmaier's avatar
Götz Lindenmaier committed
973

Sebastian Hack's avatar