- /* The predecessors of the phi node. */
- phi_pred_0 = get_Phi_pred(info->itervar_phi, 0);
- phi_pred_1 = get_Phi_pred(info->itervar_phi, 1);
-
- /*The operation of the predecessors. */
- phi_pred_0_op = get_irn_op(phi_pred_0);
- phi_pred_1_op = get_irn_op(phi_pred_1);
-
- /*Compute if the induction variable is added or substracted wiht a constant . */
- if (phi_pred_0_op == op_Add){
- info->operation_code = op_Add;
- add_l = get_Add_left(phi_pred_0);
- add_r = get_Add_right(phi_pred_0);
- info->op_pred_pos = 0;
- info->init_pred_pos = 1;
- if (add_l == info->itervar_phi){
- info->increment = add_r;
- } else if (add_r == info->itervar_phi){
- info->increment = add_l;
- } else return NULL;
- } else if (phi_pred_1_op == op_Add){
- info->operation_code = op_Add ;
- add_l = get_Add_left(phi_pred_1);
- add_r = get_Add_right(phi_pred_1);
- info->op_pred_pos = 1;
- info->init_pred_pos = 0;
- if (add_l == info->itervar_phi){
- info->increment = add_r;
- } else if (add_r == info->itervar_phi){
- info->increment = add_l;
- } else return NULL;
- } else if (phi_pred_0_op == op_Sub){
- info->operation_code = op_Sub;
- sub_r = get_Sub_right(phi_pred_0);
- sub_l = get_Sub_left(phi_pred_0);
- info->op_pred_pos = 0;
- info->init_pred_pos = 1;
- if (sub_l == info->itervar_phi){
- info->increment = sub_r;
- } else if (sub_r == info->itervar_phi){
- info->increment = sub_l;
- } else return NULL;
- } else if (phi_pred_1_op == op_Sub){
- info->operation_code = op_Sub;
- sub_r = get_Sub_right(phi_pred_1);
- sub_l = get_Sub_left(phi_pred_1);
- info->op_pred_pos = 1;
- info->init_pred_pos = 0;
- if (sub_l == info->itervar_phi){
- info->increment = sub_r;
- } else return NULL;
- } else
+ for (i = 0; i < 2; ++i) {
+ ir_node *pred = get_Phi_pred(info->itervar_phi, i);
+ ir_op *op = get_irn_op(pred);
+
+ /* Compute if the induction variable is added or substracted with a constant . */
+ if (op == op_Add || op == op_Sub) {
+ ir_node *n_l = get_binop_left(pred);
+ ir_node *n_r = get_binop_right(pred);
+
+ if (n_l == info->itervar_phi) {
+ info->operation_code = op;
+ info->increment = n_r;
+ info->op_pred_pos = i;
+ info->init_pred_pos = i ^ 1;
+ break;
+ }
+ else if (n_r == info->itervar_phi) {
+ info->operation_code = op;
+ info->increment = n_l;
+ info->op_pred_pos = i;
+ info->init_pred_pos = i ^ 1;
+ break;
+ }
+ }
+ }
+ /* check if we found something */
+ if (! info->operation_code)