static char _x;
static void *NODE_VISITED = &_x;
-/* Walk over the successors of the loop iteration varialbe and
- * decided if the loop a count loop is.
+/**
+ * Walk over the successors of the loop iteration variable and
+ * decided if the loop a count loop is.
*
* @param *node A ir node.
* @param *loop_head The head of the loop that be checked.
/* The start position is reached.*/
if(get_irn_link(succ) == NODE_VISITED)
return 1;
- /* The iteration varible musn't be chanched aside the iteration and the loop mussn't have
+ /* The iteration variable musn't be changed aside the iteration and the loop mussn't have
a break.*/
if ((is_loop_invariant(succ, loop_head) && get_irn_op(node) == op_Proj) ||
- (get_irn_op(succ) == op_Phi && !is_loop_invariant(succ, loop_head)))
+ (get_irn_op(succ) == op_Phi && !is_loop_invariant(succ, loop_head)))
return 0;
- else
- if(get_irn_link(succ) != NODE_VISITED)
- res = is_count_loop(succ, loop_head);
+ else if(get_irn_link(succ) != NODE_VISITED)
+ res = is_count_loop(succ, loop_head);
}
return res;
}
+
+#define is_Add(irn) (get_irn_op(irn) == op_Add)
+#define is_Sub(irn) (get_irn_op(irn) == op_Sub)
+
/**
- * Compute the end value, that be reached from the interation.
+ * Compute the end value, that be reached from the iteration.
*
* @param *loop_start The loop's start value.
* @param *loop_end The loop's end, that "cmp" node have as parameter.
- * @param *loop_step The value, with that inductan variable is (in|de)cremented.
- * @param *is_endlessloop A integer to set of 1, if the loop is endlees in mathematic mean.
- * @param *is_untroddenloop A integer to set of 1, if the loop is dead, that mean the loop can't be trodden.
+ * @param *loop_step The value, with that induction variable is (in|de)cremented.
+ * @param *is_endlessloop A integer to set of 1, if the loop is endless in mathematic mean.
+ * @param *is_nonentered_loop A integer to set of 1, if the loop is dead, that mean the loop can't be trodden.
* @param *info A struct, that contain loop information.
*/
static void compute_loop_end(tarval *loop_start, tarval *loop_end, tarval *loop_step,
- int *is_endlessloop, int *is_untroddenloop, induct_var_info *info)
+ int *is_endlessloop, int *is_nonentered_loop, induct_var_info *info)
{
ir_node *cmp_out;
- int cmp_typ;
+ pn_Cmp pnc;
tarval *tarval_one, *diff;
tarval_one = get_tarval_one(get_tarval_mode(loop_step));
- cmp_out = get_irn_out(info->cmp, 0);
- cmp_typ = get_Proj_proj(cmp_out);
- if((tarval_is_negative(loop_start) && tarval_is_negative(loop_end)) ||
- (!tarval_is_negative(loop_start) && !tarval_is_negative(loop_end)) ||
- (tarval_is_null(loop_start) || tarval_is_null(loop_end)))
+ /* a compare should only have one Proj, but CSE might disturb that ... */
+ assert(get_irn_n_outs(info->cmp) == 1);
+ cmp_out = get_irn_out(info->cmp, 0);
+ pnc = get_Proj_proj(cmp_out);
+ if (tarval_is_negative(loop_start) == tarval_is_negative(loop_end))
diff = tarval_abs(tarval_sub(loop_end, loop_start));
else
diff = tarval_add(tarval_abs(loop_end),tarval_abs(loop_start));
diff = tarval_mod(diff, loop_step);
- if(get_irn_op(info->op) == op_Add && !tarval_is_negative(loop_step)){
+ if (is_Add(info->op) && !tarval_is_negative(loop_step)) {
/* iterator < loop_end*/
- if(cmp_typ == pn_Cmp_Lt){
+ if (pnc == pn_Cmp_Lt) {
/* A loop that can't be entered as for(i = 10; i < 5; i++) */
if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq ||
- tarval_cmp(loop_start, loop_end) == pn_Cmp_Gt){
- *is_untroddenloop = 1;
- return;
+ tarval_cmp(loop_start, loop_end) == pn_Cmp_Gt){
+ *is_nonentered_loop = 1;
+ return;
}
- if(diff == get_tarval_null(get_tarval_mode(loop_start)))
- diff = loop_step;
+ if (diff == get_tarval_null(get_tarval_mode(loop_start)))
+ diff = loop_step;
info->l_itervar_phi->loop_iter_end = tarval_sub(loop_end, diff);
- }else
- if(cmp_typ == pn_Cmp_Lg){
- /* A loop that can't be entered as for(i = 5; i != 5; i++) */
- if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq){
- *is_untroddenloop = 1;
- return;
- }
- if(tarval_cmp(loop_start, tarval_sub(get_mode_max(get_tarval_mode(loop_step)), loop_step)) == pn_Cmp_Gt){
- info->l_itervar_phi->flags |= loop_downto_loop;
- loop_step = tarval_sub(loop_start, tarval_add(loop_step, loop_start));
- info->l_itervar_phi->loop_iter_end = tarval_add(loop_end, loop_step);
- }else
- info->l_itervar_phi->loop_iter_end = tarval_sub(loop_end, loop_step);
+ } else
+ if(pnc == pn_Cmp_Lg){
+ /* A loop that can't be entered as for(i = 5; i != 5; i++) */
+ if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq){
+ *is_nonentered_loop = 1;
+ return;
+ }
+ if(tarval_cmp(loop_start, tarval_sub(get_mode_max(get_tarval_mode(loop_step)), loop_step)) == pn_Cmp_Gt){
+ info->l_itervar_phi->flags |= loop_downto_loop;
+ loop_step = tarval_sub(loop_start, tarval_add(loop_step, loop_start));
+ info->l_itervar_phi->loop_iter_end = tarval_add(loop_end, loop_step);
+ }else
+ info->l_itervar_phi->loop_iter_end = tarval_sub(loop_end, loop_step);
}else
- /* iterator <= loop_end*/
- if(cmp_typ == pn_Cmp_Le){
- /* A loop that can't be entered as for(i = 10; i <= 5; i++) */
- if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Gt){
- *is_untroddenloop = 1;
- return;
- }
- /* A endless loop as for(i = 10; i <= 0xFFFFFFFF; i++) */
- if (tarval_cmp(loop_end, get_mode_max(get_tarval_mode(loop_start))) == pn_Cmp_Eq){
- info->l_itervar_phi->flags |= loop_is_endless;
- return;
- }
- if (tarval_cmp(loop_end, tarval_sub(get_mode_max(get_tarval_mode(loop_start)), tarval_one)) == pn_Cmp_Eq)
- if(tarval_cmp(loop_step, tarval_one) == pn_Cmp_Gt)
- info->l_itervar_phi->flags |= loop_end_false;
- info->l_itervar_phi->loop_iter_end = tarval_sub(loop_end, diff);
- }else{
- /* iterator > loop_end*/
- if(cmp_typ == pn_Cmp_Gt){
- /* A endless loop in mathematic mean that iterate until 0xFFFFFFFF as for(i = 10; i > 5; i++) */
- if(tarval_cmp(loop_start, tarval_sub(get_mode_max(get_tarval_mode(loop_step)), loop_step)) == pn_Cmp_Gt){
- if(tarval_cmp(loop_start, loop_end) == pn_Cmp_Gt ){
- info->l_itervar_phi->flags |= loop_downto_loop;
- loop_step = tarval_sub(loop_start, tarval_add(loop_step, loop_start));
- diff = tarval_sub(loop_start, loop_end);
- diff = tarval_mod(diff, loop_step);
- if(diff == get_tarval_null(get_tarval_mode(loop_start)))
- diff = loop_step;
- info->l_itervar_phi->loop_iter_end = tarval_add(loop_end, diff);
- }else
- /* A loop that can't be entered as for(i = 4; i > 5; i++) */
- *is_untroddenloop = 1;
- }else
- if(tarval_cmp(loop_start, loop_end) == pn_Cmp_Gt )
- *is_endlessloop = 1;
- else
- /* A loop that can't be entered as for(i = 4; i > 5; i++) */
- *is_untroddenloop = 1;
- /* iterator >= loop_end*/
- }else{
- /* Test if the cmp is after the incrementation and add to loop start one.*/
- if(get_irn_link(info->cmp_const) != NULL)
- loop_start = tarval_add(loop_start, loop_step);
- /* A endless loop in mathematic mean that iterate until 0xFFFFFFFF as for(i = 10; i > 5; i++) */
- if(tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq ||
- tarval_cmp(loop_start, loop_end) == pn_Cmp_Gt)
- *is_endlessloop = 1;
- else
- /* A loop that can't be entered as for(i = 4; i >= 5; i++) */
- *is_untroddenloop = 1;
- }
- }
+ /* iterator <= loop_end*/
+ if(pnc == pn_Cmp_Le){
+ /* A loop that can't be entered as for(i = 10; i <= 5; i++) */
+ if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Gt){
+ *is_nonentered_loop = 1;
+ return;
+ }
+ /* A endless loop as for(i = 10; i <= 0xFFFFFFFF; i++) */
+ if (tarval_cmp(loop_end, get_mode_max(get_tarval_mode(loop_start))) == pn_Cmp_Eq){
+ info->l_itervar_phi->flags |= loop_is_endless;
+ return;
+ }
+ if (tarval_cmp(loop_end, tarval_sub(get_mode_max(get_tarval_mode(loop_start)), tarval_one)) == pn_Cmp_Eq)
+ if(tarval_cmp(loop_step, tarval_one) == pn_Cmp_Gt)
+ info->l_itervar_phi->flags |= loop_end_false;
+ info->l_itervar_phi->loop_iter_end = tarval_sub(loop_end, diff);
+ }else{
+ /* iterator > loop_end*/
+ if(pnc == pn_Cmp_Gt){
+ /* A endless loop in mathematic mean that iterate until 0xFFFFFFFF as for(i = 10; i > 5; i++) */
+ if(tarval_cmp(loop_start, tarval_sub(get_mode_max(get_tarval_mode(loop_step)), loop_step)) == pn_Cmp_Gt){
+ if(tarval_cmp(loop_start, loop_end) == pn_Cmp_Gt ){
+ info->l_itervar_phi->flags |= loop_downto_loop;
+ loop_step = tarval_sub(loop_start, tarval_add(loop_step, loop_start));
+ diff = tarval_sub(loop_start, loop_end);
+ diff = tarval_mod(diff, loop_step);
+ if(diff == get_tarval_null(get_tarval_mode(loop_start)))
+ diff = loop_step;
+ info->l_itervar_phi->loop_iter_end = tarval_add(loop_end, diff);
+ }else
+ /* A loop that can't be entered as for(i = 4; i > 5; i++) */
+ *is_nonentered_loop = 1;
+ }else
+ if(tarval_cmp(loop_start, loop_end) == pn_Cmp_Gt )
+ *is_endlessloop = 1;
+ else
+ /* A loop that can't be entered as for(i = 4; i > 5; i++) */
+ *is_nonentered_loop = 1;
+ /* iterator >= loop_end*/
+ }else{
+ /* Test if the cmp is after the incrementation and add to loop start one.*/
+ if(get_irn_link(info->cmp_const) != NULL)
+ loop_start = tarval_add(loop_start, loop_step);
+ /* A endless loop in mathematic mean that iterate until 0xFFFFFFFF as for(i = 10; i > 5; i++) */
+ if(tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq ||
+ tarval_cmp(loop_start, loop_end) == pn_Cmp_Gt)
+ *is_endlessloop = 1;
+ else
+ /* A loop that can't be entered as for(i = 4; i >= 5; i++) */
+ *is_nonentered_loop = 1;
+ }
+ }
}else
/* The loop iterate downto.*/
- if(get_irn_op(info->op) == op_Add && tarval_is_negative(loop_step)){
+ if(is_Add(info->op) && tarval_is_negative(loop_step)){
info->l_itervar_phi->flags |= loop_downto_loop;
/* iterator > loop_end*/
- if(cmp_typ == pn_Cmp_Gt){
- /* A loop that can't be entered as for(i = 4; i > 5; i = i+(-1)) */
- if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq ||
- tarval_cmp(loop_start, loop_end) == pn_Cmp_Lt ){
- *is_untroddenloop = 1;
- return;
- }
- if(diff == get_tarval_null(get_tarval_mode(loop_start)))
- diff = tarval_abs(loop_step);
- info->l_itervar_phi->loop_iter_end = tarval_add(loop_end, diff);
- }else
- if(cmp_typ == pn_Cmp_Lg){
- /* A loop that can't be entered as for(i = 5; i != 5; i--) */
- if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq)
- *is_untroddenloop = 1;
+ if(pnc == pn_Cmp_Gt){
+ /* A loop that can't be entered as for(i = 4; i > 5; i = i+(-1)) */
+ if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq ||
+ tarval_cmp(loop_start, loop_end) == pn_Cmp_Lt ){
+ *is_nonentered_loop = 1;
+ return;
+ }
+ if(diff == get_tarval_null(get_tarval_mode(loop_start)))
+ diff = tarval_abs(loop_step);
+ info->l_itervar_phi->loop_iter_end = tarval_add(loop_end, diff);
+ }else
+ if(pnc == pn_Cmp_Lg){
+ /* A loop that can't be entered as for(i = 5; i != 5; i--) */
+ if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq)
+ *is_nonentered_loop = 1;
- info->l_itervar_phi->loop_iter_end = tarval_sub(loop_end, loop_step);
- }else
- /* iterator >= loop_end*/
- if(cmp_typ == pn_Cmp_Ge){
- /* Test if the cmp is after the incrementation and add to loop start the loop step.*/
- if(get_irn_link(info->cmp_const) != NULL)
- loop_start = tarval_add(loop_start, loop_step);
- /* A loop that can't be entered as for(i = 4; i >= 5; i--) */
- if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Lt){
- *is_untroddenloop = 1;
- return;
- }
- /* A endless loop as for(i = 10; i >=(int)0x0; i--) */
- if (tarval_cmp(loop_end, get_mode_min(get_tarval_mode(loop_start))) == pn_Cmp_Eq){
- info->l_itervar_phi->flags |= loop_is_endless;
- return;
- }
- if (tarval_cmp(loop_end, tarval_add(get_mode_min(get_tarval_mode(loop_start)), tarval_one)) == pn_Cmp_Eq)
- if(tarval_cmp(tarval_abs(loop_step), tarval_one) == pn_Cmp_Gt)
- info->l_itervar_phi->flags |= loop_end_false;
- info->l_itervar_phi->loop_iter_end = tarval_add(loop_end, diff);;
- } else
- /* iterator < loop_end*/
- if(cmp_typ == pn_Cmp_Lt){
- /* A loop that can't be entered as for(i = 6; i < 5; i--) */
- if(tarval_cmp(loop_start, loop_end) == pn_Cmp_Gt ||
- tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq)
- *is_untroddenloop = 1;
- else
- /* A endless loop in mathematic mean that iterate until 0xFFFFFFFF as for(i = 4; i < 5; i--) */
- *is_endlessloop = 1;
- }else{
- /* A loop that can't be entered as for(i = 6; i <= 5; i = i+(-1)) */
- if(tarval_cmp(loop_start, loop_end) == pn_Cmp_Gt)
- *is_untroddenloop = 1;
- else
- /* A endless loop in mathematic mean that iterate until 0xFFFFFFFF as for(i = 4; i < 5; i--) */
- *is_endlessloop = 1;
- }
+ info->l_itervar_phi->loop_iter_end = tarval_sub(loop_end, loop_step);
+ }else
+ /* iterator >= loop_end*/
+ if(pnc == pn_Cmp_Ge){
+ /* Test if the cmp is after the incrementation and add to loop start the loop step.*/
+ if(get_irn_link(info->cmp_const) != NULL)
+ loop_start = tarval_add(loop_start, loop_step);
+ /* A loop that can't be entered as for(i = 4; i >= 5; i--) */
+ if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Lt){
+ *is_nonentered_loop = 1;
+ return;
+ }
+ /* A endless loop as for(i = 10; i >=(int)0x0; i--) */
+ if (tarval_cmp(loop_end, get_mode_min(get_tarval_mode(loop_start))) == pn_Cmp_Eq){
+ info->l_itervar_phi->flags |= loop_is_endless;
+ return;
+ }
+ if (tarval_cmp(loop_end, tarval_add(get_mode_min(get_tarval_mode(loop_start)), tarval_one)) == pn_Cmp_Eq)
+ if(tarval_cmp(tarval_abs(loop_step), tarval_one) == pn_Cmp_Gt)
+ info->l_itervar_phi->flags |= loop_end_false;
+ info->l_itervar_phi->loop_iter_end = tarval_add(loop_end, diff);;
+ } else
+ /* iterator < loop_end*/
+ if(pnc == pn_Cmp_Lt){
+ /* A loop that can't be entered as for(i = 6; i < 5; i--) */
+ if(tarval_cmp(loop_start, loop_end) == pn_Cmp_Gt ||
+ tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq)
+ *is_nonentered_loop = 1;
+ else
+ /* A endless loop in mathematic mean that iterate until 0xFFFFFFFF as for(i = 4; i < 5; i--) */
+ *is_endlessloop = 1;
+ }else{
+ /* A loop that can't be entered as for(i = 6; i <= 5; i = i+(-1)) */
+ if(tarval_cmp(loop_start, loop_end) == pn_Cmp_Gt)
+ *is_nonentered_loop = 1;
+ else
+ /* A endless loop in mathematic mean that iterate until 0xFFFFFFFF as for(i = 4; i < 5; i--) */
+ *is_endlessloop = 1;
+ }
}else
- if(get_irn_op(info->op) == op_Sub && !tarval_is_negative(loop_step)){
- info->l_itervar_phi->flags |= loop_downto_loop;
- if(cmp_typ == pn_Cmp_Lg){
- /* A loop that can't be entered as for(i = 5; i != 5; i++) */
- if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq)
- *is_untroddenloop = 1;
+ if (is_Sub(info->op) && !tarval_is_negative(loop_step)){
+ info->l_itervar_phi->flags |= loop_downto_loop;
+ if(pnc == pn_Cmp_Lg){
+ /* A loop that can't be entered as for(i = 5; i != 5; i++) */
+ if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq)
+ *is_nonentered_loop = 1;
- info->l_itervar_phi->loop_iter_end = tarval_add(loop_end, loop_step);
- }else
- if(cmp_typ == pn_Cmp_Gt){
- /*A loop that can't be entered as for(i = 10; i < 5; i++)*/
- if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq ||
- tarval_cmp(loop_start, loop_end) == pn_Cmp_Lt){
- *is_untroddenloop = 1;
- return;
- }
- if(diff == get_tarval_null(get_tarval_mode(loop_start)))
- diff = loop_step;
- info->l_itervar_phi->loop_iter_end = tarval_add(loop_end, diff);
- }else
- /* iterator <= loop_end*/
- if(cmp_typ == pn_Cmp_Ge){
- /* A loop that can't be entered as for(i = 10; i <= 5; i++) */
- if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Lt){
- *is_untroddenloop = 1;
- return;
- }
- /* A endless loop as for((unsigned)i = 10; i >= 0x0; i--) */
- if (tarval_cmp(loop_end, get_mode_min(get_tarval_mode(loop_start))) == pn_Cmp_Eq){
- info->l_itervar_phi->flags |= loop_is_endless;
- return;
- }
- if (tarval_cmp(loop_end, tarval_add(get_mode_min(get_tarval_mode(loop_start)), tarval_one)) == pn_Cmp_Eq)
- if(tarval_cmp(loop_step, tarval_one) == pn_Cmp_Gt)
- info->l_itervar_phi->flags |= loop_end_false;
- info->l_itervar_phi->loop_iter_end = tarval_add(loop_end, diff);
- }else{
- /* iterator < loop_end*/
- if(cmp_typ == pn_Cmp_Lt){
- /* A endless loop in mathematic mean that iterate until 0x0 as for(i = 5; i <= 10; i--) */
- if(tarval_cmp(loop_start, loop_end) == pn_Cmp_Lt )
- *is_endlessloop = 1;
- else
- /* A loop that can't be entered as for(i = 4; i > 5; i++) */
- *is_untroddenloop = 1;
- /* iterator >= loop_end*/
- }else{
- /* Test if the cmp is after the (in|de)crementation and sub to loop start one.*/
- if(get_irn_link(info->cmp_const) != NULL)
- loop_start = tarval_sub(loop_start, loop_step);
- /* A endless loop in mathematic mean that iterate until 0x0 as for(i = 5; i <= 10; i--) */
- if(tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq ||
- tarval_cmp(loop_start, loop_end) == pn_Cmp_Lt)
- *is_endlessloop = 1;
- else
- /* A loop that can't be entered as for(i = 4; i >= 5; i++) */
- *is_untroddenloop = 1;
- }
- }
+ info->l_itervar_phi->loop_iter_end = tarval_add(loop_end, loop_step);
+ }else
+ if(pnc == pn_Cmp_Gt){
+ /*A loop that can't be entered as for(i = 10; i < 5; i++)*/
+ if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq ||
+ tarval_cmp(loop_start, loop_end) == pn_Cmp_Lt){
+ *is_nonentered_loop = 1;
+ return;
+ }
+ if(diff == get_tarval_null(get_tarval_mode(loop_start)))
+ diff = loop_step;
+ info->l_itervar_phi->loop_iter_end = tarval_add(loop_end, diff);
+ }else
+ /* iterator <= loop_end*/
+ if(pnc == pn_Cmp_Ge){
+ /* A loop that can't be entered as for(i = 10; i <= 5; i++) */
+ if (tarval_cmp(loop_start, loop_end) == pn_Cmp_Lt){
+ *is_nonentered_loop = 1;
+ return;
+ }
+ /* A endless loop as for((unsigned)i = 10; i >= 0x0; i--) */
+ if (tarval_cmp(loop_end, get_mode_min(get_tarval_mode(loop_start))) == pn_Cmp_Eq){
+ info->l_itervar_phi->flags |= loop_is_endless;
+ return;
+ }
+ if (tarval_cmp(loop_end, tarval_add(get_mode_min(get_tarval_mode(loop_start)), tarval_one)) == pn_Cmp_Eq)
+ if(tarval_cmp(loop_step, tarval_one) == pn_Cmp_Gt)
+ info->l_itervar_phi->flags |= loop_end_false;
+ info->l_itervar_phi->loop_iter_end = tarval_add(loop_end, diff);
+ }else{
+ /* iterator < loop_end*/
+ if(pnc == pn_Cmp_Lt){
+ /* A endless loop in mathematic mean that iterate until 0x0 as for(i = 5; i <= 10; i--) */
+ if(tarval_cmp(loop_start, loop_end) == pn_Cmp_Lt )
+ *is_endlessloop = 1;
+ else
+ /* A loop that can't be entered as for(i = 4; i > 5; i++) */
+ *is_nonentered_loop = 1;
+ /* iterator >= loop_end*/
+ }else{
+ /* Test if the cmp is after the (in|de)crementation and sub to loop start one.*/
+ if(get_irn_link(info->cmp_const) != NULL)
+ loop_start = tarval_sub(loop_start, loop_step);
+ /* A endless loop in mathematic mean that iterate until 0x0 as for(i = 5; i <= 10; i--) */
+ if(tarval_cmp(loop_start, loop_end) == pn_Cmp_Eq ||
+ tarval_cmp(loop_start, loop_end) == pn_Cmp_Lt)
+ *is_endlessloop = 1;
+ else
+ /* A loop that can't be entered as for(i = 4; i >= 5; i++) */
+ *is_nonentered_loop = 1;
+ }
+ }
}
}
+
int is_do_loop(induct_var_info *info)
{
ir_node *cmp_pred_0, *cmp_pred_1;
* set the loop end if the loop couldn't be computed from the function "compute_loop_end",
* the loop is endless in mathematic mean or the loop is dead.
* @param is_endlessloop A integer, that is set to 1, if the loop is endlees in mathematic mean.
- * @param is_untroddenloop A integer, that is set to 1, if the loop is dead, that mean the loop can't be trodden.
+ * @param is_nonentered_loop A integer, that is set to 1, if the loop is dead, that mean the loop can't be trodden.
* @param *info A struct, that contain loop information.
*/
-static void set_loop_end(int is_endlessloop, int is_untroddenloop, induct_var_info *info)
+static void set_loop_end(int is_endlessloop, int is_nonentered_loop, induct_var_info *info)
{
- if(is_endlessloop){
- if(info->l_itervar_phi->flags & loop_downto_loop)
- info->l_itervar_phi->loop_iter_end = get_mode_min(get_tarval_mode(get_Const_tarval(info->cmp_const)));
- else
- info->l_itervar_phi->loop_iter_end = get_mode_max(get_tarval_mode(get_Const_tarval(info->cmp_const)));
- }else
- if(is_untroddenloop || info->l_itervar_phi->loop_iter_end == NULL)
- info->l_itervar_phi->loop_iter_end = get_Const_tarval(info->cmp_const);
+ if (is_endlessloop) {
+ if (info->l_itervar_phi->flags & loop_downto_loop)
+ info->l_itervar_phi->loop_iter_end = get_mode_min(get_tarval_mode(get_Const_tarval(info->cmp_const)));
+ else
+ info->l_itervar_phi->loop_iter_end = get_mode_max(get_tarval_mode(get_Const_tarval(info->cmp_const)));
+ } else if (is_nonentered_loop || info->l_itervar_phi->loop_iter_end == NULL)
+ info->l_itervar_phi->loop_iter_end = get_Const_tarval(info->cmp_const);
}
+
/**
* Walker: checks every phi node for a induction variable and
* compute some loop information.
{
tarval *loop_end;
induct_var_info info;
- int is_endlessloop = 0 , is_untroddenloop = 0;
+ int is_endlessloop = 0 , is_nonentered_loop = 0;
+
/* The IR node must be a induction variable. */
if (get_irn_op(n) != op_Phi)
return;
info.l_itervar_phi->loop_iter_variable = info.itervar_phi;
compute_loop_end(info.l_itervar_phi->loop_iter_start, loop_end, info.l_itervar_phi->loop_iter_increment,
- &is_endlessloop, &is_untroddenloop, &info);
+ &is_endlessloop, &is_nonentered_loop, &info);
if(is_endlessloop)
info.l_itervar_phi->flags |= loop_wrap_around;
- if(is_untroddenloop){
+ if(is_nonentered_loop){
if(info.l_itervar_phi->flags & do_loop)
info.l_itervar_phi->flags |= once;
else
info.l_itervar_phi->flags |= loop_is_dead;
}
- /* The loop ist a count loop and the information is computed.*/
+ /* The loop is a count loop and the information is computed.*/
info.l_itervar_phi->flags |= loop_is_count_loop;
- set_loop_end(is_endlessloop, is_untroddenloop, &info);
+ set_loop_end(is_endlessloop, is_nonentered_loop, &info);
}
{
/* Call algorithm that computes the out edges */
compute_irg_outs(irg);
+
/* Call algorithm that computes the loop information */
construct_cf_backedges(irg);