#endif
#include <string.h>
+#include "ident.h"
#include "irnode_t.h"
#include "irgraph_t.h"
#include "irmode_t.h"
/** getting some parameters from ir_nodes **/
+int
+is_ir_node (void *thing) {
+ assert(thing);
+ if (get_kind(thing) == k_ir_node)
+ return 1;
+ else
+ return 0;
+}
+
/* returns the number of predecessors without the block predecessor. */
INLINE int
get_irn_arity (const ir_node *node) {
get_irn_opname (const ir_node *node)
{
assert(node);
- return id_to_str(node->op->name);
+ return get_id_str(node->op->name);
}
INLINE ident *
node->attr.block.in_cg = NULL;
}
+/* Start references the irg it is in. */
+INLINE ir_graph *
+get_Start_irg(ir_node *node) {
+ assert(node->op == op_Start);
+ return node->attr.start.irg;
+}
+
+INLINE void
+set_Start_irg(ir_node *node, ir_graph *irg) {
+ assert(node->op == op_Start);
+ assert(is_ir_graph(irg));
+ node->attr.start.irg = irg;
+}
+
INLINE int
get_End_n_keepalives(ir_node *end) {
assert (end->op == op_End);
INLINE ir_node *
get_Raise_mem (ir_node *node) {
- assert (node->op == op_Return);
+ assert (node->op == op_Raise);
return get_irn_n(node, 0);
}
/* 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 0999-33.
- unops are: Minus, Abs, Not, Conv
+ unops are: Minus, Abs, Not, Conv, Cast
binops are: Add, Sub, Mul, Quot, DivMod, Div, Mod, And, Or, Eor, Shl,
Shr, Shrs, Rotate, Cmp */
set_irn_n(node, 0, op);
}
+INLINE ir_node *
+get_Cast_op (ir_node *node) {
+ assert (node->op == op_Cast);
+ return get_irn_n(node, 0);
+}
+INLINE void
+set_Cast_op (ir_node *node, ir_node *op) {
+ assert (node->op == op_Cast);
+ set_irn_n(node, 0, op);
+}
-int
+INLINE type *
+get_Cast_type (ir_node *node) {
+ assert (node->op == op_Cast);
+ return node->attr.cast.totype;
+}
+
+INLINE void
+set_Cast_type (ir_node *node, type *to_tp) {
+ assert (node->op == op_Cast);
+ node->attr.cast.totype = to_tp;
+}
+
+INLINE int
is_unop (ir_node *node) {
return ( node->op == op_Minus ||
node->op == op_Abs ||
node->op == op_Not ||
- node->op == op_Conv );
+ node->op == op_Conv ||
+ node->op == op_Cast );
}
INLINE ir_node *
get_unop_op (ir_node *node) {
- assert ( node->op == op_Minus ||
- node->op == op_Abs ||
- node->op == op_Not ||
- node->op == op_Conv );
+ assert (is_unop(node));
switch (get_irn_opcode (node)) {
case iro_Minus: return get_Minus_op(node); break;
case iro_Abs: return get_Abs_op(node); break;
case iro_Not: return get_Not_op(node); break;
case iro_Conv: return get_Conv_op(node); break;
+ case iro_Cast: return get_Cast_op(node); break;
default: return NULL;
}
}
INLINE void
set_unop_op (ir_node *node, ir_node *op) {
- assert (node->op == op_Minus ||
- node->op == op_Abs ||
- node->op == op_Not ||
- node->op == op_Conv );
- switch (get_irn_opcode (node)) {
+ assert (is_unop(node));
+ switch (get_irn_opcode (node)) {
case iro_Minus: set_Minus_op(node, op); break;
case iro_Abs: set_Abs_op(node, op); break;
case iro_Not: set_Not_op(node, op); break;
case iro_Conv: set_Conv_op(node, op); break;
+ case iro_Cast: set_Cast_op(node, op); break;
default: ;
- }
+ }
}
} else if (get_irn_op(node) == op_EndReg ||
get_irn_op(node) == op_EndExcept) {
return node->attr.end.irg;
+ } else if (get_irn_op(node) == op_Start) {
+ return node->attr.start.irg;
} else {
assert(0 && "no irg attr");
return NULL;
return node;
}
+/* This should compact Id-cycles to self-cycles. It has the same (or less?) complexity
+ than any other approach, as Id chains are resolved and all point to the real node, or
+ all id's are self loops. */
INLINE ir_node *
skip_nop (ir_node *node) {
/* don't assert node !!! */
/* Don't use get_Id_pred: We get into an endless loop for
self-referencing Ids. */
if (node && (node->op == op_Id) && (node != node->in[0+1])) {
+ ir_node *rem_pred = node->in[0+1];
+ ir_node *res;
+
assert (get_irn_arity (node) > 0);
- return node->in[0+1];
+
+ node->in[0+1] = node;
+ res = skip_nop(rem_pred);
+ if (res->op == op_Id) /* self-loop */ return node;
+
+ node->in[0+1] = res;
+ return res;
} else {
return node;
}