Make get_binop_left as fast as get_OP_left etc...
[r2646]
node->attr.callbegin.call = call;
}
-INLINE ir_node *
-get_Add_left (ir_node *node) {
- assert (node->op == op_Add);
- return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Add_left (ir_node *node, ir_node *left) {
- assert (node->op == op_Add);
- set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Add_right (ir_node *node) {
- assert (node->op == op_Add);
- return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Add_right (ir_node *node, ir_node *right) {
- assert (node->op == op_Add);
- set_irn_n(node, 1, right);
-}
-
-INLINE ir_node *
-get_Sub_left (ir_node *node) {
- assert (node->op == op_Sub);
- return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Sub_left (ir_node *node, ir_node *left) {
- assert (node->op == op_Sub);
- set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Sub_right (ir_node *node) {
- assert (node->op == op_Sub);
- return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Sub_right (ir_node *node, ir_node *right) {
- assert (node->op == op_Sub);
- set_irn_n(node, 1, right);
-}
-
-
-INLINE ir_node *
-get_Minus_op (ir_node *node) {
- assert (node->op == op_Minus);
- return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Minus_op (ir_node *node, ir_node *op) {
- assert (node->op == op_Minus);
- set_irn_n(node, 0, op);
-}
-
-
-INLINE ir_node *
-get_Mul_left (ir_node *node) {
- assert (node->op == op_Mul);
- return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Mul_left (ir_node *node, ir_node *left) {
- assert (node->op == op_Mul);
- set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Mul_right (ir_node *node) {
- assert (node->op == op_Mul);
- return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Mul_right (ir_node *node, ir_node *right) {
- assert (node->op == op_Mul);
- set_irn_n(node, 1, right);
-}
-
-INLINE ir_node *
-get_Quot_left (ir_node *node) {
- assert (node->op == op_Quot);
- return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Quot_left (ir_node *node, ir_node *left) {
- assert (node->op == op_Quot);
- set_irn_n(node, 1, left);
-}
-
-INLINE ir_node *
-get_Quot_right (ir_node *node) {
- assert (node->op == op_Quot);
- return get_irn_n(node, 2);
-}
-
-INLINE void
-set_Quot_right (ir_node *node, ir_node *right) {
- assert (node->op == op_Quot);
- set_irn_n(node, 2, right);
-}
+#define BINOP(OP) \
+ir_node * get_##OP##_left(ir_node *node) { \
+ assert(node->op == op_##OP); \
+ return get_irn_n(node, node->op->op_index); \
+} \
+void set_##OP##_left(ir_node *node, ir_node *left) { \
+ assert(node->op == op_##OP); \
+ set_irn_n(node, node->op->op_index, left); \
+} \
+ir_node *get_##OP##_right(ir_node *node) { \
+ assert(node->op == op_##OP); \
+ return get_irn_n(node, node->op->op_index + 1); \
+} \
+void set_##OP##_right(ir_node *node, ir_node *right) { \
+ assert(node->op == op_##OP); \
+ set_irn_n(node, node->op->op_index + 1, right); \
+}
+
+#define UNOP(OP) \
+ir_node *get_##OP##_op(ir_node *node) { \
+ assert(node->op == op_##OP); \
+ return get_irn_n(node, node->op->op_index); \
+} \
+void set_##OP##_op (ir_node *node, ir_node *op) { \
+ assert(node->op == op_##OP); \
+ set_irn_n(node, node->op->op_index, op); \
+}
+
+BINOP(Add)
+BINOP(Sub)
+UNOP(Minus)
+BINOP(Mul)
+BINOP(Quot)
INLINE ir_node *
get_Quot_mem (ir_node *node) {
set_irn_n(node, 0, mem);
}
-INLINE ir_node *
-get_DivMod_left (ir_node *node) {
- assert (node->op == op_DivMod);
- return get_irn_n(node, 1);
-}
-
-INLINE void
-set_DivMod_left (ir_node *node, ir_node *left) {
- assert (node->op == op_DivMod);
- set_irn_n(node, 1, left);
-}
-
-INLINE ir_node *
-get_DivMod_right (ir_node *node) {
- assert (node->op == op_DivMod);
- return get_irn_n(node, 2);
-}
-
-INLINE void
-set_DivMod_right (ir_node *node, ir_node *right) {
- assert (node->op == op_DivMod);
- set_irn_n(node, 2, right);
-}
+BINOP(DivMod)
INLINE ir_node *
get_DivMod_mem (ir_node *node) {
set_irn_n(node, 0, mem);
}
-INLINE ir_node *
-get_Div_left (ir_node *node) {
- assert (node->op == op_Div);
- return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Div_left (ir_node *node, ir_node *left) {
- assert (node->op == op_Div);
- set_irn_n(node, 1, left);
-}
-
-INLINE ir_node *
-get_Div_right (ir_node *node) {
- assert (node->op == op_Div);
- return get_irn_n(node, 2);
-}
-
-INLINE void
-set_Div_right (ir_node *node, ir_node *right) {
- assert (node->op == op_Div);
- set_irn_n(node, 2, right);
-}
+BINOP(Div)
INLINE ir_node *
get_Div_mem (ir_node *node) {
set_irn_n(node, 0, mem);
}
-INLINE ir_node *
-get_Mod_left (ir_node *node) {
- assert (node->op == op_Mod);
- return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Mod_left (ir_node *node, ir_node *left) {
- assert (node->op == op_Mod);
- set_irn_n(node, 1, left);
-}
-
-INLINE ir_node *
-get_Mod_right (ir_node *node) {
- assert (node->op == op_Mod);
- return get_irn_n(node, 2);
-}
-
-INLINE void
-set_Mod_right (ir_node *node, ir_node *right) {
- assert (node->op == op_Mod);
- set_irn_n(node, 2, right);
-}
+BINOP(Mod)
INLINE ir_node *
get_Mod_mem (ir_node *node) {
set_irn_n(node, 0, mem);
}
-INLINE ir_node *
-get_Abs_op (ir_node *node) {
- assert (node->op == op_Abs);
- return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Abs_op (ir_node *node, ir_node *op) {
- assert (node->op == op_Abs);
- set_irn_n(node, 0, op);
-}
-
-INLINE ir_node *
-get_And_left (ir_node *node) {
- assert (node->op == op_And);
- return get_irn_n(node, 0);
-}
-
-INLINE void
-set_And_left (ir_node *node, ir_node *left) {
- assert (node->op == op_And);
- set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_And_right (ir_node *node) {
- assert (node->op == op_And);
- return get_irn_n(node, 1);
-}
-
-INLINE void
-set_And_right (ir_node *node, ir_node *right) {
- assert (node->op == op_And);
- set_irn_n(node, 1, right);
-}
-
-INLINE ir_node *
-get_Or_left (ir_node *node) {
- assert (node->op == op_Or);
- return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Or_left (ir_node *node, ir_node *left) {
- assert (node->op == op_Or);
- set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Or_right (ir_node *node) {
- assert (node->op == op_Or);
- return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Or_right (ir_node *node, ir_node *right) {
- assert (node->op == op_Or);
- set_irn_n(node, 1, right);
-}
-
-INLINE ir_node *
-get_Eor_left (ir_node *node) {
- assert (node->op == op_Eor);
- return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Eor_left (ir_node *node, ir_node *left) {
- assert (node->op == op_Eor);
- set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Eor_right (ir_node *node) {
- assert (node->op == op_Eor);
- return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Eor_right (ir_node *node, ir_node *right) {
- assert (node->op == op_Eor);
- set_irn_n(node, 1, right);
-}
-
-
-INLINE ir_node *
-get_Not_op (ir_node *node) {
- assert (node->op == op_Not);
- return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Not_op (ir_node *node, ir_node *op) {
- assert (node->op == op_Not);
- set_irn_n(node, 0, op);
-}
-
-
-INLINE ir_node *
-get_Shl_left (ir_node *node) {
- assert (node->op == op_Shl);
- return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Shl_left (ir_node *node, ir_node *left) {
- assert (node->op == op_Shl);
- set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Shl_right (ir_node *node) {
- assert (node->op == op_Shl);
- return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Shl_right (ir_node *node, ir_node *right) {
- assert (node->op == op_Shl);
- set_irn_n(node, 1, right);
-}
-
-INLINE ir_node *
-get_Shr_left (ir_node *node) {
- assert (node->op == op_Shr);
- return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Shr_left (ir_node *node, ir_node *left) {
- assert (node->op == op_Shr);
- set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Shr_right (ir_node *node) {
- assert (node->op == op_Shr);
- return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Shr_right (ir_node *node, ir_node *right) {
- assert (node->op == op_Shr);
- set_irn_n(node, 1, right);
-}
-
-INLINE ir_node *
-get_Shrs_left (ir_node *node) {
- assert (node->op == op_Shrs);
- return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Shrs_left (ir_node *node, ir_node *left) {
- assert (node->op == op_Shrs);
- set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Shrs_right (ir_node *node) {
- assert (node->op == op_Shrs);
- return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Shrs_right (ir_node *node, ir_node *right) {
- assert (node->op == op_Shrs);
- set_irn_n(node, 1, right);
-}
-
-INLINE ir_node *
-get_Rot_left (ir_node *node) {
- assert (node->op == op_Rot);
- return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Rot_left (ir_node *node, ir_node *left) {
- assert (node->op == op_Rot);
- set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Rot_right (ir_node *node) {
- assert (node->op == op_Rot);
- return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Rot_right (ir_node *node, ir_node *right) {
- assert (node->op == op_Rot);
- set_irn_n(node, 1, right);
-}
-
-INLINE ir_node *
-get_Cmp_left (ir_node *node) {
- assert (node->op == op_Cmp);
- return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Cmp_left (ir_node *node, ir_node *left) {
- assert (node->op == op_Cmp);
- set_irn_n(node, 0, left);
-}
-
-INLINE ir_node *
-get_Cmp_right (ir_node *node) {
- assert (node->op == op_Cmp);
- return get_irn_n(node, 1);
-}
-
-INLINE void
-set_Cmp_right (ir_node *node, ir_node *right) {
- assert (node->op == op_Cmp);
- set_irn_n(node, 1, right);
-}
-
-INLINE ir_node *
-get_Conv_op (ir_node *node) {
- assert (node->op == op_Conv);
- return get_irn_n(node, 0);
-}
-
-INLINE void
-set_Conv_op (ir_node *node, ir_node *op) {
- assert (node->op == op_Conv);
- 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);
-}
+UNOP(Abs)
+BINOP(And)
+BINOP(Or)
+BINOP(Eor)
+UNOP(Not)
+BINOP(Shl)
+BINOP(Shr)
+BINOP(Shrs)
+BINOP(Rot)
+BINOP(Cmp)
+UNOP(Conv)
+UNOP(Cast)
INLINE type *
get_Cast_type (ir_node *node) {
INLINE ir_node *
get_unop_op (ir_node *node) {
- 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;
- }
+ if (node->op->opar == oparity_unary)
+ return get_irn_n(node, node->op->op_index);
+
+ assert(node->op->opar == oparity_unary);
+ return NULL;
}
INLINE void
set_unop_op (ir_node *node, ir_node *op) {
- 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: ;
- }
+ if (node->op->opar == oparity_unary)
+ set_irn_n(node, node->op->op_index, op);
+ assert(node->op->opar == oparity_unary);
}
int
is_binop (ir_node *node) {
return (node->op->opar == oparity_binary);
- /* return (node->op == op_Add ||
- node->op == op_Cmp ||
- node->op == op_Sub ||
- node->op == op_Mul ||
- node->op == op_Quot ||
- node->op == op_DivMod ||
- node->op == op_Div ||
- node->op == op_Mod ||
- node->op == op_And ||
- node->op == op_Or ||
- node->op == op_Eor ||
- node->op == op_Shl ||
- node->op == op_Shr ||
- node->op == op_Shrs ||
- node->op == op_Rot );
- */
}
INLINE ir_node *
get_binop_left (ir_node *node) {
- assert (node->op->opar == oparity_binary);
+ if (node->op->opar == oparity_binary)
+ return get_irn_n(node, node->op->op_index);
- switch (get_irn_opcode (node)) {
- case iro_Add : return get_Add_left(node); break;
- case iro_Sub : return get_Sub_left(node); break;
- case iro_Mul : return get_Mul_left(node); break;
- case iro_Quot : return get_Quot_left(node); break;
- case iro_DivMod: return get_DivMod_left(node); break;
- case iro_Div : return get_Div_left(node); break;
- case iro_Mod : return get_Mod_left(node); break;
- case iro_And : return get_And_left(node); break;
- case iro_Or : return get_Or_left(node); break;
- case iro_Eor : return get_Eor_left(node); break;
- case iro_Shl : return get_Shl_left(node); break;
- case iro_Shr : return get_Shr_left(node); break;
- case iro_Shrs : return get_Shrs_left(node); break;
- case iro_Rot : return get_Rot_left(node); break;
- case iro_Cmp : return get_Cmp_left(node); break;
- default: return NULL;
- };
+ assert(node->op->opar == oparity_binary);
+ return NULL;
}
INLINE void
set_binop_left (ir_node *node, ir_node *left) {
- assert (node->op->opar == oparity_binary);
+ if (node->op->opar == oparity_binary)
+ set_irn_n(node, node->op->op_index, left);
- switch (get_irn_opcode (node)) {
- case iro_Add : set_Add_left(node, left); break;
- case iro_Sub : set_Sub_left(node, left); break;
- case iro_Mul : set_Mul_left(node, left); break;
- case iro_Quot : set_Quot_left(node, left); break;
- case iro_DivMod: set_DivMod_left(node, left); break;
- case iro_Div : set_Div_left(node, left); break;
- case iro_Mod : set_Mod_left(node, left); break;
- case iro_And : set_And_left(node, left); break;
- case iro_Or : set_Or_left(node, left); break;
- case iro_Eor : set_Eor_left(node, left); break;
- case iro_Shl : set_Shl_left(node, left); break;
- case iro_Shr : set_Shr_left(node, left); break;
- case iro_Shrs : set_Shrs_left(node, left); break;
- case iro_Rot : set_Rot_left(node, left); break;
- case iro_Cmp : set_Cmp_left(node, left); break;
- default: ;
- };
+ assert (node->op->opar == oparity_binary);
}
INLINE ir_node *
get_binop_right (ir_node *node) {
- assert (node->op->opar == oparity_binary);
+ if (node->op->opar == oparity_binary)
+ return get_irn_n(node, node->op->op_index + 1);
- switch (get_irn_opcode (node)) {
- case iro_Add : return get_Add_right(node); break;
- case iro_Sub : return get_Sub_right(node); break;
- case iro_Mul : return get_Mul_right(node); break;
- case iro_Quot : return get_Quot_right(node); break;
- case iro_DivMod: return get_DivMod_right(node); break;
- case iro_Div : return get_Div_right(node); break;
- case iro_Mod : return get_Mod_right(node); break;
- case iro_And : return get_And_right(node); break;
- case iro_Or : return get_Or_right(node); break;
- case iro_Eor : return get_Eor_right(node); break;
- case iro_Shl : return get_Shl_right(node); break;
- case iro_Shr : return get_Shr_right(node); break;
- case iro_Shrs : return get_Shrs_right(node); break;
- case iro_Rot : return get_Rot_right(node); break;
- case iro_Cmp : return get_Cmp_right(node); break;
- default: return NULL;
- };
+ assert(node->op->opar == oparity_binary);
+ return NULL;
}
INLINE void
set_binop_right (ir_node *node, ir_node *right) {
- assert (node->op->opar == oparity_binary);
+ if (node->op->opar == oparity_binary)
+ set_irn_n(node, node->op->op_index + 1, right);
- switch (get_irn_opcode (node)) {
- case iro_Add : set_Add_right(node, right); break;
- case iro_Sub : set_Sub_right(node, right); break;
- case iro_Mul : set_Mul_right(node, right); break;
- case iro_Quot : set_Quot_right(node, right); break;
- case iro_DivMod: set_DivMod_right(node, right); break;
- case iro_Div : set_Div_right(node, right); break;
- case iro_Mod : set_Mod_right(node, right); break;
- case iro_And : set_And_right(node, right); break;
- case iro_Or : set_Or_right(node, right); break;
- case iro_Eor : set_Eor_right(node, right); break;
- case iro_Shl : set_Shl_right(node, right); break;
- case iro_Shr : set_Shr_right(node, right); break;
- case iro_Shrs : set_Shrs_right(node, right); break;
- case iro_Rot : set_Rot_right(node, right); break;
- case iro_Cmp : set_Cmp_right(node, right); break;
- default: ;
- };
+ assert (node->op->opar == oparity_binary);
}
INLINE int is_Phi (ir_node *n) {
+ ir_op *op;
+
assert(n);
- return ((get_irn_op(n) == op_Phi) ||
- (get_irn_op(n) == op_Filter && interprocedural_view));
+ op = get_irn_op(n);
+ return (op == op_Phi) || (op == op_Filter && interprocedural_view);
}
INLINE ir_node **
}
-/******************************************************************/
+/*----------------------------------------------------------------*/
/* Auxiliary routines */
-/******************************************************************/
+/*----------------------------------------------------------------*/
INLINE ir_node *
skip_Proj (ir_node *node) {
of an exception. */
int
is_fragile_op(ir_node *node) {
- return ( (get_irn_opcode(node) == iro_Call)
- || (get_irn_opcode(node) == iro_Quot)
- || (get_irn_opcode(node) == iro_DivMod)
- || (get_irn_opcode(node) == iro_Div)
- || (get_irn_opcode(node) == iro_Mod)
- || (get_irn_opcode(node) == iro_Load)
- || (get_irn_opcode(node) == iro_Store)
- || (get_irn_opcode(node) == iro_Alloc)
- || (get_irn_opcode(node) == iro_Bad)
- || (get_irn_opcode(node) == iro_Unknown));
+ return is_op_fragile(get_irn_op(node));
}
-
/* Returns the memory operand of fragile operations. */
ir_node *get_fragile_op_mem(ir_node *node) {
assert(node && is_fragile_op(node));
# include "xmalloc.h"
-ir_op *op_Block; ir_op *get_op_Block () { return op_Block; }
-
-ir_op *op_Start; ir_op *get_op_Start () { return op_Start; }
-ir_op *op_End; ir_op *get_op_End () { return op_End; }
-ir_op *op_Jmp; ir_op *get_op_Jmp () { return op_Jmp; }
-ir_op *op_Cond; ir_op *get_op_Cond () { return op_Cond; }
-ir_op *op_Return; ir_op *get_op_Return () { return op_Return; }
-ir_op *op_Raise; ir_op *get_op_Raise () { return op_Raise; }
-
-ir_op *op_Sel; ir_op *get_op_Sel () { return op_Sel; }
-ir_op *op_InstOf; ir_op *get_op_InstOf () { return op_InstOf; }
-
-ir_op *op_Const; ir_op *get_op_Const () { return op_Const; }
-ir_op *op_SymConst; ir_op *get_op_SymConst () { return op_SymConst; }
-
-ir_op *op_Call; ir_op *get_op_Call () { return op_Call; }
-ir_op *op_Add; ir_op *get_op_Add () { return op_Add; }
-ir_op *op_Sub; ir_op *get_op_Sub () { return op_Sub; }
-ir_op *op_Minus; ir_op *get_op_Minus () { return op_Minus; }
-ir_op *op_Mul; ir_op *get_op_Mul () { return op_Mul; }
-ir_op *op_Quot; ir_op *get_op_Quot () { return op_Quot; }
-ir_op *op_DivMod; ir_op *get_op_DivMod () { return op_DivMod; }
-ir_op *op_Div; ir_op *get_op_Div () { return op_Div; }
-ir_op *op_Mod; ir_op *get_op_Mod () { return op_Mod; }
-ir_op *op_Abs; ir_op *get_op_Abs () { return op_Abs; }
-ir_op *op_And; ir_op *get_op_And () { return op_And; }
-ir_op *op_Or; ir_op *get_op_Or () { return op_Or; }
-ir_op *op_Eor; ir_op *get_op_Eor () { return op_Eor; }
-ir_op *op_Not; ir_op *get_op_Not () { return op_Not; }
-ir_op *op_Cmp; ir_op *get_op_Cmp () { return op_Cmp; }
-ir_op *op_Shl; ir_op *get_op_Shl () { return op_Shl; }
-ir_op *op_Shr; ir_op *get_op_Shr () { return op_Shr; }
-ir_op *op_Shrs; ir_op *get_op_Shrs () { return op_Shrs; }
-ir_op *op_Rot; ir_op *get_op_Rot () { return op_Rot; }
-ir_op *op_Conv; ir_op *get_op_Conv () { return op_Conv; }
-ir_op *op_Cast; ir_op *get_op_Cast () { return op_Cast; }
-
-ir_op *op_Phi; ir_op *get_op_Phi () { return op_Phi; }
-
-ir_op *op_Load; ir_op *get_op_Load () { return op_Load; }
-ir_op *op_Store; ir_op *get_op_Store () { return op_Store; }
-ir_op *op_Alloc; ir_op *get_op_Alloc () { return op_Alloc; }
-ir_op *op_Free; ir_op *get_op_Free () { return op_Free; }
-ir_op *op_Sync; ir_op *get_op_Sync () { return op_Sync; }
-
-ir_op *op_Tuple; ir_op *get_op_Tuple () { return op_Tuple; }
-ir_op *op_Proj; ir_op *get_op_Proj () { return op_Proj; }
-ir_op *op_Id; ir_op *get_op_Id () { return op_Id; }
-ir_op *op_Bad; ir_op *get_op_Bad () { return op_Bad; }
-ir_op *op_Confirm; ir_op *get_op_Confirm () { return op_Confirm; }
-
-ir_op *op_Unknown; ir_op *get_op_Unknown () { return op_Unknown; }
-ir_op *op_Filter; ir_op *get_op_Filter () { return op_Filter; }
-ir_op *op_Break; ir_op *get_op_Break () { return op_Break; }
-ir_op *op_CallBegin; ir_op *get_op_CallBegin () { return op_CallBegin; }
-ir_op *op_EndReg; ir_op *get_op_EndReg () { return op_EndReg; }
-ir_op *op_EndExcept; ir_op *get_op_EndExcept () { return op_EndExcept; }
-
-ir_op *op_FuncCall; ir_op *get_op_FuncCall () { return op_FuncCall; }
+ir_op *op_Block; ir_op *get_op_Block (void) { return op_Block; }
+
+ir_op *op_Start; ir_op *get_op_Start (void) { return op_Start; }
+ir_op *op_End; ir_op *get_op_End (void) { return op_End; }
+ir_op *op_Jmp; ir_op *get_op_Jmp (void) { return op_Jmp; }
+ir_op *op_Cond; ir_op *get_op_Cond (void) { return op_Cond; }
+ir_op *op_Return; ir_op *get_op_Return (void) { return op_Return; }
+ir_op *op_Raise; ir_op *get_op_Raise (void) { return op_Raise; }
+
+ir_op *op_Sel; ir_op *get_op_Sel (void) { return op_Sel; }
+ir_op *op_InstOf; ir_op *get_op_InstOf (void) { return op_InstOf; }
+
+ir_op *op_Const; ir_op *get_op_Const (void) { return op_Const; }
+ir_op *op_SymConst; ir_op *get_op_SymConst (void) { return op_SymConst; }
+
+ir_op *op_Call; ir_op *get_op_Call (void) { return op_Call; }
+ir_op *op_Add; ir_op *get_op_Add (void) { return op_Add; }
+ir_op *op_Sub; ir_op *get_op_Sub (void) { return op_Sub; }
+ir_op *op_Minus; ir_op *get_op_Minus (void) { return op_Minus; }
+ir_op *op_Mul; ir_op *get_op_Mul (void) { return op_Mul; }
+ir_op *op_Quot; ir_op *get_op_Quot (void) { return op_Quot; }
+ir_op *op_DivMod; ir_op *get_op_DivMod (void) { return op_DivMod; }
+ir_op *op_Div; ir_op *get_op_Div (void) { return op_Div; }
+ir_op *op_Mod; ir_op *get_op_Mod (void) { return op_Mod; }
+ir_op *op_Abs; ir_op *get_op_Abs (void) { return op_Abs; }
+ir_op *op_And; ir_op *get_op_And (void) { return op_And; }
+ir_op *op_Or; ir_op *get_op_Or (void) { return op_Or; }
+ir_op *op_Eor; ir_op *get_op_Eor (void) { return op_Eor; }
+ir_op *op_Not; ir_op *get_op_Not (void) { return op_Not; }
+ir_op *op_Cmp; ir_op *get_op_Cmp (void) { return op_Cmp; }
+ir_op *op_Shl; ir_op *get_op_Shl (void) { return op_Shl; }
+ir_op *op_Shr; ir_op *get_op_Shr (void) { return op_Shr; }
+ir_op *op_Shrs; ir_op *get_op_Shrs (void) { return op_Shrs; }
+ir_op *op_Rot; ir_op *get_op_Rot (void) { return op_Rot; }
+ir_op *op_Conv; ir_op *get_op_Conv (void) { return op_Conv; }
+ir_op *op_Cast; ir_op *get_op_Cast (void) { return op_Cast; }
+
+ir_op *op_Phi; ir_op *get_op_Phi (void) { return op_Phi; }
+
+ir_op *op_Load; ir_op *get_op_Load (void) { return op_Load; }
+ir_op *op_Store; ir_op *get_op_Store (void) { return op_Store; }
+ir_op *op_Alloc; ir_op *get_op_Alloc (void) { return op_Alloc; }
+ir_op *op_Free; ir_op *get_op_Free (void) { return op_Free; }
+ir_op *op_Sync; ir_op *get_op_Sync (void) { return op_Sync; }
+
+ir_op *op_Tuple; ir_op *get_op_Tuple (void) { return op_Tuple; }
+ir_op *op_Proj; ir_op *get_op_Proj (void) { return op_Proj; }
+ir_op *op_Id; ir_op *get_op_Id (void) { return op_Id; }
+ir_op *op_Bad; ir_op *get_op_Bad (void) { return op_Bad; }
+ir_op *op_Confirm; ir_op *get_op_Confirm (void) { return op_Confirm; }
+
+ir_op *op_Unknown; ir_op *get_op_Unknown (void) { return op_Unknown; }
+ir_op *op_Filter; ir_op *get_op_Filter (void) { return op_Filter; }
+ir_op *op_Break; ir_op *get_op_Break (void) { return op_Break; }
+ir_op *op_CallBegin; ir_op *get_op_CallBegin (void) { return op_CallBegin; }
+ir_op *op_EndReg; ir_op *get_op_EndReg (void) { return op_EndReg; }
+ir_op *op_EndExcept; ir_op *get_op_EndExcept (void) { return op_EndExcept; }
+
+ir_op *op_FuncCall; ir_op *get_op_FuncCall (void) { return op_FuncCall; }
ir_op *
-new_ir_op (opcode code, const char *name, op_pinned p, int labeled, op_arity opar, size_t attr_size)
+new_ir_op(opcode code, const char *name, op_pinned p, unsigned flags, op_arity opar, int op_index, size_t attr_size)
{
ir_op *res;
res = (ir_op *) xmalloc (sizeof (ir_op));
- res->code = code;
- res->name = id_from_str(name, strlen(name));
- res->pinned = p;
+ res->code = code;
+ res->name = id_from_str(name, strlen(name));
+ res->pinned = p;
res->attr_size = attr_size;
- res->labeled = labeled; /* For vcg dumping.
- Set labeled = 1 if the edges should be
- enumarated in vcg output, otherwise set
- labeled = 0. */
- res->opar = opar;
+ res->flags = flags;
+ res->opar = opar;
+ res->op_index = op_index;
return res;
}
-void free_ir_op (ir_op *code) {
+void free_ir_op(ir_op *code) {
free(code);
}
void
init_op(void)
{
- op_Block = new_ir_op (iro_Block, "Block", pinned, 1, oparity_variable, sizeof (block_attr));
-
- op_Start = new_ir_op (iro_Start, "Start", pinned, 0, oparity_zero, sizeof (start_attr));
- op_End = new_ir_op (iro_End, "End", pinned, 0, oparity_dynamic, 0);
- op_Jmp = new_ir_op (iro_Jmp, "Jmp", pinned, 0, oparity_zero, 0);
- op_Cond = new_ir_op (iro_Cond, "Cond", pinned, 1, oparity_any, sizeof(cond_attr));
- op_Return = new_ir_op (iro_Return, "Return", pinned, 1, oparity_zero, 0);
- op_Raise = new_ir_op (iro_Raise, "Raise", pinned, 1, oparity_any, 0);
-
- op_Const = new_ir_op (iro_Const, "Const", floats, 0, oparity_zero, sizeof (const_attr));
- op_SymConst = new_ir_op (iro_SymConst, "SymConst", floats, 0, oparity_zero, sizeof (symconst_attr));
-
- op_Sel = new_ir_op (iro_Sel, "Sel", floats, 1, oparity_any, sizeof (sel_attr));
- op_InstOf = new_ir_op (iro_InstOf, "InstOf", floats, 1, oparity_any, sizeof (sel_attr));
-
- op_Call = new_ir_op (iro_Call, "Call", pinned, 1, oparity_variable, sizeof (call_attr));
- op_Add = new_ir_op (iro_Add, "Add", floats, 0, oparity_binary, 0);
- op_Minus = new_ir_op (iro_Minus, "Minus", floats, 0, oparity_unary, 0);
- op_Sub = new_ir_op (iro_Sub, "Sub", floats, 1, oparity_binary, 0);
- op_Mul = new_ir_op (iro_Mul, "Mul", floats, 0, oparity_binary, 0);
- op_Quot = new_ir_op (iro_Quot, "Quot", pinned, 1, oparity_binary, sizeof(struct irnode **));
- op_DivMod = new_ir_op (iro_DivMod, "DivMod", pinned, 1, oparity_binary, sizeof(struct irnode **));
- op_Div = new_ir_op (iro_Div, "Div", pinned, 1, oparity_binary, sizeof(struct irnode **));
- op_Mod = new_ir_op (iro_Mod, "Mod", pinned, 1, oparity_binary, sizeof(struct irnode **));
- op_Abs = new_ir_op (iro_Abs, "Abs", floats, 0, oparity_unary, 0);
- op_And = new_ir_op (iro_And, "And", floats, 0, oparity_binary, 0);
- op_Or = new_ir_op (iro_Or, "Or", floats, 0, oparity_binary, 0);
- op_Eor = new_ir_op (iro_Eor, "Eor", floats, 0, oparity_binary, 0);
- op_Not = new_ir_op (iro_Not, "Not", floats, 0, oparity_unary, 0);
- op_Cmp = new_ir_op (iro_Cmp, "Cmp", floats, 1, oparity_binary, 0);
- op_Shl = new_ir_op (iro_Shl, "Shl", floats, 1, oparity_binary, 0);
- op_Shr = new_ir_op (iro_Shr, "Shr", floats, 1, oparity_binary, 0);
- op_Shrs = new_ir_op (iro_Shrs, "Shrs", floats, 1, oparity_binary, 0);
- op_Rot = new_ir_op (iro_Rot, "Rot", floats, 1, oparity_binary, 0);
- op_Conv = new_ir_op (iro_Conv, "Conv", floats, 0, oparity_unary, 0);
- op_Cast = new_ir_op (iro_Cast, "Cast", floats, 0, oparity_unary, sizeof (cast_attr));
-
- op_Phi = new_ir_op (iro_Phi, "Phi", pinned, 1, oparity_variable, sizeof (int));
-
- op_Load = new_ir_op (iro_Load, "Load", pinned, 1, oparity_any, sizeof(struct irnode **));
- op_Store = new_ir_op (iro_Store, "Store", pinned, 1, oparity_any, sizeof(struct irnode **));
- op_Alloc = new_ir_op (iro_Alloc, "Alloc", pinned, 1, oparity_any, sizeof (alloc_attr));
- op_Free = new_ir_op (iro_Free, "Free", pinned, 1, oparity_any, sizeof (type *));
- op_Sync = new_ir_op (iro_Sync, "Sync", pinned, 0, oparity_any, 0);
-
- op_Proj = new_ir_op (iro_Proj, "Proj", floats, 0, oparity_any, sizeof (long));
- op_Tuple = new_ir_op (iro_Tuple, "Tuple", floats, 1, oparity_variable, 0);
- op_Id = new_ir_op (iro_Id, "Id", floats, 0, oparity_any, 0);
- op_Bad = new_ir_op (iro_Bad, "Bad", floats, 0, oparity_zero, 0);
- op_Confirm = new_ir_op (iro_Confirm, "Confirm", floats, 1, oparity_any, sizeof (confirm_attr));
-
- op_Unknown = new_ir_op (iro_Unknown, "Unknown", floats, 0, oparity_zero, 0);
- op_Filter = new_ir_op (iro_Filter, "Filter", pinned, 1, oparity_variable, sizeof(filter_attr));
- op_Break = new_ir_op (iro_Break, "Break", pinned, 0, oparity_zero, 0);
- op_CallBegin = new_ir_op (iro_CallBegin, "CallBegin", pinned, 0, oparity_any, sizeof(callbegin_attr));
- op_EndReg = new_ir_op (iro_EndReg, "EndReg", pinned, 0, oparity_any, sizeof(end_attr));
- op_EndExcept = new_ir_op (iro_EndExcept, "EndExcept", pinned, 0, oparity_any, sizeof(end_attr));
-
- op_FuncCall = new_ir_op (iro_FuncCall, "FuncCall", floats, 1, oparity_any, sizeof (call_attr));
+#define L irop_flag_labeled
+#define C irop_flag_commutative
+#define X irop_flag_cfopcode
+#define I irop_flag_ip_cfopcode
+#define F irop_flag_fragile
+
+ op_Block = new_ir_op(iro_Block, "Block", pinned, L, oparity_variable, -1, sizeof(block_attr));
+
+ op_Start = new_ir_op(iro_Start, "Start", pinned, X, oparity_zero, -1, sizeof(start_attr));
+ op_End = new_ir_op(iro_End, "End", pinned, X, oparity_dynamic, -1, 0);
+ op_Jmp = new_ir_op(iro_Jmp, "Jmp", pinned, X, oparity_zero, -1, 0);
+ op_Cond = new_ir_op(iro_Cond, "Cond", pinned, L|X, oparity_any, -1, sizeof(cond_attr));
+ op_Return = new_ir_op(iro_Return, "Return", pinned, L|X, oparity_zero, -1, 0);
+ op_Raise = new_ir_op(iro_Raise, "Raise", pinned, L|X, oparity_any, -1, 0);
+
+ op_Const = new_ir_op(iro_Const, "Const", floats, 0, oparity_zero, -1, sizeof(const_attr));
+ op_SymConst = new_ir_op(iro_SymConst, "SymConst", floats, 0, oparity_zero, -1, sizeof(symconst_attr));
+
+ op_Sel = new_ir_op(iro_Sel, "Sel", floats, L, oparity_any, -1, sizeof(sel_attr));
+ op_InstOf = new_ir_op(iro_InstOf, "InstOf", floats, L, oparity_any, -1, sizeof(sel_attr));
+
+ op_Call = new_ir_op(iro_Call, "Call", pinned, L|F, oparity_variable, -1, sizeof(call_attr));
+ op_Add = new_ir_op(iro_Add, "Add", floats, C, oparity_binary, 0, 0);
+ op_Minus = new_ir_op(iro_Minus, "Minus", floats, 0, oparity_unary, 0, 0);
+ op_Sub = new_ir_op(iro_Sub, "Sub", floats, L, oparity_binary, 0, 0);
+ op_Mul = new_ir_op(iro_Mul, "Mul", floats, C, oparity_binary, 0, 0);
+ op_Quot = new_ir_op(iro_Quot, "Quot", pinned, L|F, oparity_binary, 1, sizeof(struct irnode **));
+ op_DivMod = new_ir_op(iro_DivMod, "DivMod", pinned, L|F, oparity_binary, 1, sizeof(struct irnode **));
+ op_Div = new_ir_op(iro_Div, "Div", pinned, L|F, oparity_binary, 1, sizeof(struct irnode **));
+ op_Mod = new_ir_op(iro_Mod, "Mod", pinned, L|F, oparity_binary, 1, sizeof(struct irnode **));
+ op_Abs = new_ir_op(iro_Abs, "Abs", floats, 0, oparity_unary, 0, 0);
+ op_And = new_ir_op(iro_And, "And", floats, C, oparity_binary, 0, 0);
+ op_Or = new_ir_op(iro_Or, "Or", floats, C, oparity_binary, 0, 0);
+ op_Eor = new_ir_op(iro_Eor, "Eor", floats, C, oparity_binary, 0, 0);
+ op_Not = new_ir_op(iro_Not, "Not", floats, 0, oparity_unary, 0, 0);
+ op_Cmp = new_ir_op(iro_Cmp, "Cmp", floats, L, oparity_binary, 0, 0);
+ op_Shl = new_ir_op(iro_Shl, "Shl", floats, L, oparity_binary, 0, 0);
+ op_Shr = new_ir_op(iro_Shr, "Shr", floats, L, oparity_binary, 0, 0);
+ op_Shrs = new_ir_op(iro_Shrs, "Shrs", floats, L, oparity_binary, 0, 0);
+ op_Rot = new_ir_op(iro_Rot, "Rot", floats, L, oparity_binary, 0, 0);
+ op_Conv = new_ir_op(iro_Conv, "Conv", floats, 0, oparity_unary, 0, 0);
+ op_Cast = new_ir_op(iro_Cast, "Cast", floats, 0, oparity_unary, 0, sizeof(cast_attr));
+
+ op_Phi = new_ir_op(iro_Phi, "Phi", pinned, L, oparity_variable, -1, sizeof(int));
+
+ op_Load = new_ir_op(iro_Load, "Load", pinned, L|F, oparity_any, -1, sizeof(struct irnode **));
+ op_Store = new_ir_op(iro_Store, "Store", pinned, L|F, oparity_any, -1, sizeof(struct irnode **));
+ op_Alloc = new_ir_op(iro_Alloc, "Alloc", pinned, L|F, oparity_any, -1, sizeof(alloc_attr));
+ op_Free = new_ir_op(iro_Free, "Free", pinned, L, oparity_any, -1, sizeof(type *));
+ op_Sync = new_ir_op(iro_Sync, "Sync", pinned, 0, oparity_any, -1, 0);
+
+ op_Proj = new_ir_op(iro_Proj, "Proj", floats, 0, oparity_any, -1, sizeof(long));
+ op_Tuple = new_ir_op(iro_Tuple, "Tuple", floats, L, oparity_variable, -1, 0);
+ op_Id = new_ir_op(iro_Id, "Id", floats, 0, oparity_any, -1, 0);
+ op_Bad = new_ir_op(iro_Bad, "Bad", floats, X|F, oparity_zero, -1, 0);
+ op_Confirm = new_ir_op(iro_Confirm, "Confirm", floats, L, oparity_any, -1, sizeof(confirm_attr));
+
+ op_Unknown = new_ir_op(iro_Unknown, "Unknown", floats, X|F, oparity_zero, -1, 0);
+ op_Filter = new_ir_op(iro_Filter, "Filter", pinned, L, oparity_variable, -1, sizeof(filter_attr));
+ op_Break = new_ir_op(iro_Break, "Break", pinned, X, oparity_zero, -1, 0);
+ op_CallBegin = new_ir_op(iro_CallBegin, "CallBegin", pinned, X|I, oparity_any, -1, sizeof(callbegin_attr));
+ op_EndReg = new_ir_op(iro_EndReg, "EndReg", pinned, X|I, oparity_any, -1, sizeof(end_attr));
+ op_EndExcept = new_ir_op(iro_EndExcept, "EndExcept", pinned, X|I, oparity_any, -1, sizeof(end_attr));
+
+ op_FuncCall = new_ir_op(iro_FuncCall, "FuncCall", floats, L, oparity_any, -1, sizeof(call_attr));
+
+#undef F
+#undef I
+#undef X
+#undef C
+#undef L
}
/* free memory used by irop module. */
-void finish_op() {
- free_ir_op (op_Block); op_Block = NULL;
+void finish_op(void) {
+ free_ir_op (op_Block ); op_Block = NULL;
free_ir_op (op_Start ); op_Start = NULL;
free_ir_op (op_End ); op_End = NULL;
free_ir_op (op_CallBegin); op_CallBegin = NULL;
free_ir_op (op_EndReg ); op_EndReg = NULL;
free_ir_op (op_EndExcept); op_EndExcept = NULL;
+
+ free_ir_op (op_FuncCall ); op_FuncCall = NULL;
}
/* Returns the string for the opcode. */
if (op == op_Block || op == op_Phi || is_cfopcode(op)) return;
op->pinned = pinned;
}
-
-
-/* returns the attribute size of the operator. */
-int get_op_attr_size (const ir_op *op) {
- return op->attr_size;
-}
-
-int is_cfopcode(const ir_op *op) {
- return ((op == op_Start)
- || (op == op_Jmp)
- || (op == op_Cond)
- || (op == op_Return)
- || (op == op_Raise)
- || (op == op_Bad)
- || (op == op_End)
- || (op == op_Unknown)
- || (op == op_Break)
- || (op == op_CallBegin)
- || (op == op_EndReg)
- || (op == op_EndExcept));
-}
-
-/* Returns true if the operation manipulates interprocedural control flow:
- CallBegin, EndReg, EndExcept */
-int is_ip_cfopcode(const ir_op *op) {
- return ((op == op_CallBegin)
- || (op == op_EndReg)
- || (op == op_EndExcept));
-}
for Block, Phi and control flow nodes. */
void set_op_pinned(ir_op *op, op_pinned pinned);
-/** Returns true if op is one of Start, End, Jmp, Cond, Return, Raise or Bad. */
-int is_cfopcode(const ir_op *op);
-
-/** Returns true if the operation manipulates interprocedural control flow:
- CallBegin, EndReg, EndExcept */
-int is_ip_cfopcode(const ir_op *op);
-
-/** Returns the attribute size of nodes of this opcode.
- @note Use not encouraged, internal feature. */
-int get_op_attr_size (const ir_op *op);
-
# endif /* _IROP_H_ */
# include "irop.h"
+/** The allowed parities */
typedef enum {
oparity_invalid = 0,
oparity_unary, /**< an unary operator -- considering 'numeric' arguments. */
} op_arity;
+/** The irop flags */
+typedef enum {
+ irop_flag_labeled = 0x00000001, /**< if set, Output edge labels on in-edges in vcg graph */
+ irop_flag_commutative = 0x00000002, /**< operation is commutative */
+ irop_flag_cfopcode = 0x00000004, /**< is a control flow operation */
+ irop_flag_ip_cfopcode = 0x00000008, /**< operation manipulates interprocedural control flow */
+ irop_flag_fragile = 0x00000010, /**< set if the operation can change the control flow because
+ of an exception */
+} irop_flags;
+
+
/** the type of an ir_op */
struct ir_op {
opcode code; /**< the unique opcode of the op */
ident *name; /**< the name of the op */
size_t attr_size; /**< Space needed in memory for private attributes */
- int labeled; /**< Output edge labels on in-edges in vcg graph */
op_pinned pinned; /**< How to deal with the node in cse, pre. */
op_arity opar; /**< arity of operator. */
+ int op_index; /**< the index of the first data operand, 0 for most cases, 1 for Div etc. */
+ unsigned flags; /**< flags describing the behavior of the ir_op, a bitmaks of irop_flags */
};
/**
- * Create a new ir operation.
+ * Creates a new ir operation.
*
- * @param code the opcode, one of type \c opcode
- * @param name the printable name of this opcode
- * @param p wheater operations of this opcode are pinned or floating
- * @param labeled if set, output edge labels on in-edges in vcg graph wil be generated
+ * @param code the opcode, one of type \c opcode
+ * @param name the printable name of this opcode
+ * @param p wheater operations of this opcode are pinned or floating
+ * @param flags a bitmask of irop_flags describing the behavior of the ir operation
+ * @param opar the parity of this ir operation
+ * @param op_index if the parity is oparity_unary, oparity_binary or oparity_trinary the index
+ * of the left operand
+ * @param attr_size attribute size for this ir operation
*
* @return The genenerated ir operation.
*/
-ir_op * new_ir_op (opcode code, const char *name, op_pinned p,
- int labeled, op_arity opar, size_t attr_size);
+ir_op * new_ir_op(opcode code, const char *name, op_pinned p,
+ unsigned flags, op_arity opar, int op_index, size_t attr_size);
+
+/**
+ * Frees a newly created ir operation.
+ */
+void free_ir_op(ir_op *code);
/** Initialize the irop module. */
-void init_op (void);
+void init_op(void);
/** Free memory used by irop module. */
void finish_op(void);
+/** Returns the attribute size of nodes of this opcode.
+ @note Use not encouraged, internal feature. */
+static INLINE int get_op_attr_size (const ir_op *op) {
+ return op->attr_size;
+}
+
+/** Returns non-zero if op is one of Start, End, Jmp, Cond, Return, Raise or Bad. */
+static INLINE int is_cfopcode(const ir_op *op) {
+ return op->flags & irop_flag_cfopcode;
+}
+
+/** Returns true if the operation manipulates interprocedural control flow:
+ CallBegin, EndReg, EndExcept */
+static INLINE int is_ip_cfopcode(const ir_op *op) {
+ return op->flags & irop_flag_ip_cfopcode;
+}
+
+/* Returns non-zero if operation is commutative */
+static INLINE int is_op_commutative(const ir_op *op) {
+ return op->flags & irop_flag_commutative;
+}
+
+/* Returns non-zero if operation is fragile */
+static INLINE int is_op_fragile(const ir_op *op) {
+ return op->flags & irop_flag_fragile;
+}
+
#endif /* _IROP_T_H_ */
/* TODO: use a generic commutative attribute */
if (get_opt_reassociation()) {
- switch (get_irn_opcode (n)) {
- case iro_Add:
- case iro_Mul:
- case iro_Or:
- case iro_And:
- case iro_Eor:
- {
- /* for commutative operators perform a OP b == b OP a */
- if (get_binop_left(n) > get_binop_right(n)) {
- ir_node *h = get_binop_left(n);
- set_binop_left(n, get_binop_right(n));
- set_binop_right(n, h);
- }
+ if (is_op_commutative(get_irn_op(n))) {
+ /* for commutative operators perform a OP b == b OP a */
+ if (get_binop_left(n) > get_binop_right(n)) {
+ ir_node *h = get_binop_left(n);
+ set_binop_left(n, get_binop_right(n));
+ set_binop_right(n, h);
}
- break;
- default: break;
}
}