From 675816614886714d11b7f6ebe30a52077f7e2101 Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Tue, 13 Apr 2004 12:19:03 +0000 Subject: [PATCH] Added flags to irop determining the behaviour, this saves some switches. Make get_binop_left as fast as get_OP_left etc... [r2646] --- ir/ir/irnode.c | 621 ++++++------------------------------------------- ir/ir/irop.c | 301 +++++++++++------------- ir/ir/irop.h | 11 - ir/ir/irop_t.h | 67 +++++- ir/ir/iropt.c | 21 +- 5 files changed, 283 insertions(+), 738 deletions(-) diff --git a/ir/ir/irnode.c b/ir/ir/irnode.c index a2f26d5f3..064b2307e 100644 --- a/ir/ir/irnode.c +++ b/ir/ir/irnode.c @@ -1209,115 +1209,39 @@ void set_CallBegin_call (ir_node *node, ir_node *call) { 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) { @@ -1331,29 +1255,7 @@ set_Quot_mem (ir_node *node, ir_node *mem) { 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) { @@ -1367,29 +1269,7 @@ set_DivMod_mem (ir_node *node, ir_node *mem) { 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) { @@ -1403,29 +1283,7 @@ set_Div_mem (ir_node *node, ir_node *mem) { 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) { @@ -1439,247 +1297,18 @@ set_Mod_mem (ir_node *node, ir_node *mem) { 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) { @@ -1700,152 +1329,66 @@ is_unop (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 ** @@ -2227,9 +1770,9 @@ get_irn_irg(ir_node *node) { } -/******************************************************************/ +/*----------------------------------------------------------------*/ /* Auxiliary routines */ -/******************************************************************/ +/*----------------------------------------------------------------*/ INLINE ir_node * skip_Proj (ir_node *node) { @@ -2381,19 +1924,9 @@ ir_graph *get_ip_cfop_irg(ir_node *n) { 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)); diff --git a/ir/ir/irop.c b/ir/ir/irop.c index c7b16b34c..36a795255 100644 --- a/ir/ir/irop.c +++ b/ir/ir/irop.c @@ -21,157 +21,167 @@ # 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; @@ -228,6 +238,8 @@ void finish_op() { 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. */ @@ -253,32 +265,3 @@ void set_op_pinned(ir_op *op, op_pinned pinned) { 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)); -} diff --git a/ir/ir/irop.h b/ir/ir/irop.h index b69897ddc..61129692d 100644 --- a/ir/ir/irop.h +++ b/ir/ir/irop.h @@ -127,15 +127,4 @@ op_pinned get_op_pinned(const ir_op *op); 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_ */ diff --git a/ir/ir/irop_t.h b/ir/ir/irop_t.h index a7fc38ceb..05a77fbbc 100644 --- a/ir/ir/irop_t.h +++ b/ir/ir/irop_t.h @@ -16,6 +16,7 @@ # include "irop.h" +/** The allowed parities */ typedef enum { oparity_invalid = 0, oparity_unary, /**< an unary operator -- considering 'numeric' arguments. */ @@ -31,33 +32,81 @@ typedef enum { } 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_ */ diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index 8b7bf3838..8bf789292 100644 --- a/ir/ir/iropt.c +++ b/ir/ir/iropt.c @@ -1026,22 +1026,13 @@ identify (pset *value_table, ir_node *n) /* 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; } } -- 2.20.1