- /* sort the arguments */
- qsort(args, n_args, sizeof(ir_node*), compare_node_ptr);
-
- /* build new tree */
- last = args[n_args-1];
- mode = get_irn_mode(last);
- for (i = n_args-2; i >= 0; --i) {
- ir_mode *mode_right;
- ir_node *new_node;
- ir_node *in[2];
-
- in[0] = last;
- in[1] = args[i];
-
- /* AddP violates the assumption that all modes in args are equal...
- * we need some hacks to cope with this */
- mode_right = get_irn_mode(in[1]);
- if (mode_is_reference(mode_right)) {
- assert(is_Add(node) && mode_is_reference(get_irn_mode(node)));
- mode = get_irn_mode(in[1]);
- }
- if (mode_right != mode) {
- assert(is_Add(node) && mode_is_reference(get_irn_mode(node)));
- in[1] = new_r_Conv(current_ir_graph, commutative_block,in[1], mode);