diff options
author | Jakub Jelinek <jakub@redhat.com> | 2005-07-11 09:34:33 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2005-07-11 09:34:33 +0200 |
commit | fcf3be37e2200181983c150fa36c2fd2ba249b8e (patch) | |
tree | 304263e35f8e8851ead0d4913524902184a6ab73 /gcc/fortran/trans-stmt.c | |
parent | 15362b89f0016748c7c060b46280d5373e43e4f7 (diff) | |
download | gcc-fcf3be37e2200181983c150fa36c2fd2ba249b8e.zip gcc-fcf3be37e2200181983c150fa36c2fd2ba249b8e.tar.gz gcc-fcf3be37e2200181983c150fa36c2fd2ba249b8e.tar.bz2 |
trans-stmt.c (gfc_trans_forall_loop): Clear maskindex before the outermost loop.
* trans-stmt.c (gfc_trans_forall_loop): Clear maskindex before
the outermost loop.
(gfc_trans_assign_need_temp, gfc_trans_pointer_assign_need_temp,
gfc_trans_forall_1, gfc_evaluate_where_mask, gfc_trans_where_2):
Don't clear maskindexes here.
* gfortran.fortran-torture/execute/forall_7.f90: New test.
From-SVN: r101865
Diffstat (limited to 'gcc/fortran/trans-stmt.c')
-rw-r--r-- | gcc/fortran/trans-stmt.c | 134 |
1 files changed, 16 insertions, 118 deletions
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index 8fda557..0ec029f 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -1331,7 +1331,7 @@ gfc_trans_forall_loop (forall_info *forall_tmp, int nvar, tree body, int mask_fl stmtblock_t block; tree exit_label; tree count; - tree var, start, end, step, mask, maskindex; + tree var, start, end, step; iter_info *iter; iter = forall_tmp->this_loop; @@ -1366,17 +1366,14 @@ gfc_trans_forall_loop (forall_info *forall_tmp, int nvar, tree body, int mask_fl /* Advance to the next mask element. Only do this for the innermost loop. */ - if (n == 0 && mask_flag) - { - mask = forall_tmp->mask; - maskindex = forall_tmp->maskindex; - if (mask) - { - tmp = build2 (PLUS_EXPR, gfc_array_index_type, - maskindex, gfc_index_one_node); - gfc_add_modify_expr (&block, maskindex, tmp); - } - } + if (n == 0 && mask_flag && forall_tmp->mask) + { + tree maskindex = forall_tmp->maskindex; + tmp = build2 (PLUS_EXPR, gfc_array_index_type, + maskindex, gfc_index_one_node); + gfc_add_modify_expr (&block, maskindex, tmp); + } + /* Decrement the loop counter. */ tmp = build2 (MINUS_EXPR, TREE_TYPE (var), count, gfc_index_one_node); gfc_add_modify_expr (&block, count, tmp); @@ -1387,6 +1384,12 @@ gfc_trans_forall_loop (forall_info *forall_tmp, int nvar, tree body, int mask_fl gfc_init_block (&block); gfc_add_modify_expr (&block, var, start); + /* Initialize maskindex counter. Only do this before the + outermost loop. */ + if (n == nvar - 1 && mask_flag && forall_tmp->mask) + gfc_add_modify_expr (&block, forall_tmp->maskindex, + gfc_index_zero_node); + /* Initialize the loop counter. */ tmp = fold_build2 (MINUS_EXPR, TREE_TYPE (var), step, start); tmp = fold_build2 (PLUS_EXPR, TREE_TYPE (var), end, tmp); @@ -1930,8 +1933,6 @@ gfc_trans_assign_need_temp (gfc_expr * expr1, gfc_expr * expr2, tree wheremask, tree count, count1; tree tmp, tmp1; tree ptemp1; - tree mask, maskindex; - forall_info *forall_tmp; stmtblock_t inner_size_body; /* Create vars. count1 is the current iterator number of the nested @@ -1964,17 +1965,6 @@ gfc_trans_assign_need_temp (gfc_expr * expr1, gfc_expr * expr2, tree wheremask, tmp1 = allocate_temp_for_forall_nest (nested_forall_info, type, inner_size, &inner_size_body, block, &ptemp1); - /* Initialize the maskindexes. */ - forall_tmp = nested_forall_info; - while (forall_tmp != NULL) - { - mask = forall_tmp->mask; - maskindex = forall_tmp->maskindex; - if (mask) - gfc_add_modify_expr (block, maskindex, gfc_index_zero_node); - forall_tmp = forall_tmp->next_nest; - } - /* Generate codes to copy rhs to the temporary . */ tmp = generate_loop_for_rhs_to_temp (expr2, tmp1, count, count1, lss, rss, wheremask); @@ -1987,17 +1977,6 @@ gfc_trans_assign_need_temp (gfc_expr * expr1, gfc_expr * expr2, tree wheremask, /* Reset count1. */ gfc_add_modify_expr (block, count1, gfc_index_zero_node); - /* Reset maskindexed. */ - forall_tmp = nested_forall_info; - while (forall_tmp != NULL) - { - mask = forall_tmp->mask; - maskindex = forall_tmp->maskindex; - if (mask) - gfc_add_modify_expr (block, maskindex, gfc_index_zero_node); - forall_tmp = forall_tmp->next_nest; - } - /* Reset count. */ if (wheremask) gfc_add_modify_expr (block, count, gfc_index_zero_node); @@ -2040,8 +2019,6 @@ gfc_trans_pointer_assign_need_temp (gfc_expr * expr1, gfc_expr * expr2, stmtblock_t body; tree count; tree tmp, tmp1, ptemp1; - tree mask, maskindex; - forall_info *forall_tmp; count = gfc_create_var (gfc_array_index_type, "count"); gfc_add_modify_expr (block, count, gfc_index_zero_node); @@ -2075,17 +2052,6 @@ gfc_trans_pointer_assign_need_temp (gfc_expr * expr1, gfc_expr * expr2, tmp = gfc_finish_block (&body); - /* Initialize the maskindexes. */ - forall_tmp = nested_forall_info; - while (forall_tmp != NULL) - { - mask = forall_tmp->mask; - maskindex = forall_tmp->maskindex; - if (mask) - gfc_add_modify_expr (block, maskindex, gfc_index_zero_node); - forall_tmp = forall_tmp->next_nest; - } - /* Generate body and loops according to the information in nested_forall_info. */ tmp = gfc_trans_nested_forall_loop (nested_forall_info, tmp, 1, 1); @@ -2094,16 +2060,6 @@ gfc_trans_pointer_assign_need_temp (gfc_expr * expr1, gfc_expr * expr2, /* Reset count. */ gfc_add_modify_expr (block, count, gfc_index_zero_node); - /* Reset maskindexes. */ - forall_tmp = nested_forall_info; - while (forall_tmp != NULL) - { - mask = forall_tmp->mask; - maskindex = forall_tmp->maskindex; - if (mask) - gfc_add_modify_expr (block, maskindex, gfc_index_zero_node); - forall_tmp = forall_tmp->next_nest; - } gfc_start_block (&body); gfc_init_se (&lse, NULL); gfc_init_se (&rse, NULL); @@ -2164,17 +2120,6 @@ gfc_trans_pointer_assign_need_temp (gfc_expr * expr1, gfc_expr * expr2, tmp = gfc_finish_block (&body); - /* Initialize the maskindexes. */ - forall_tmp = nested_forall_info; - while (forall_tmp != NULL) - { - mask = forall_tmp->mask; - maskindex = forall_tmp->maskindex; - if (mask) - gfc_add_modify_expr (block, maskindex, gfc_index_zero_node); - forall_tmp = forall_tmp->next_nest; - } - /* Generate body and loops according to the information in nested_forall_info. */ tmp = gfc_trans_nested_forall_loop (nested_forall_info, tmp, 1, 1); @@ -2183,16 +2128,6 @@ gfc_trans_pointer_assign_need_temp (gfc_expr * expr1, gfc_expr * expr2, /* Reset count. */ gfc_add_modify_expr (block, count, gfc_index_zero_node); - /* Reset maskindexes. */ - forall_tmp = nested_forall_info; - while (forall_tmp != NULL) - { - mask = forall_tmp->mask; - maskindex = forall_tmp->maskindex; - if (mask) - gfc_add_modify_expr (block, maskindex, gfc_index_zero_node); - forall_tmp = forall_tmp->next_nest; - } parm = gfc_build_array_ref (tmp1, count); lss = gfc_walk_expr (expr1); gfc_init_se (&lse, NULL); @@ -2487,10 +2422,6 @@ gfc_trans_forall_1 (gfc_code * code, forall_info * nested_forall_info) /* Use the normal assignment copying routines. */ assign = gfc_trans_assignment (c->expr, c->expr2); - /* Reset the mask index. */ - if (mask) - gfc_add_modify_expr (&block, maskindex, gfc_index_zero_node); - /* Generate body and loops. */ tmp = gfc_trans_nested_forall_loop (nested_forall_info, assign, 1, 1); gfc_add_expr_to_block (&block, tmp); @@ -2532,10 +2463,6 @@ gfc_trans_forall_1 (gfc_code * code, forall_info * nested_forall_info) /* Use the normal assignment copying routines. */ assign = gfc_trans_pointer_assignment (c->expr, c->expr2); - /* Reset the mask index. */ - if (mask) - gfc_add_modify_expr (&block, maskindex, gfc_index_zero_node); - /* Generate body and loops. */ tmp = gfc_trans_nested_forall_loop (nested_forall_info, assign, 1, 1); @@ -2723,22 +2650,7 @@ gfc_evaluate_where_mask (gfc_expr * me, forall_info * nested_forall_info, tmp1 = gfc_finish_block (&body); /* If the WHERE construct is inside FORALL, fill the full temporary. */ if (nested_forall_info != NULL) - { - forall_info *forall_tmp; - tree maskindex; - - /* Initialize the maskindexes. */ - forall_tmp = nested_forall_info; - while (forall_tmp != NULL) - { - maskindex = forall_tmp->maskindex; - if (forall_tmp->mask) - gfc_add_modify_expr (block, maskindex, gfc_index_zero_node); - forall_tmp = forall_tmp->next_nest; - } - - tmp1 = gfc_trans_nested_forall_loop (nested_forall_info, tmp1, 1, 1); - } + tmp1 = gfc_trans_nested_forall_loop (nested_forall_info, tmp1, 1, 1); gfc_add_expr_to_block (block, tmp1); @@ -3059,9 +2971,6 @@ gfc_trans_where_2 (gfc_code * code, tree mask, tree pmask, nested_forall_info, block); else { - forall_info *forall_tmp; - tree maskindex; - /* Variables to control maskexpr. */ count1 = gfc_create_var (gfc_array_index_type, "count1"); count2 = gfc_create_var (gfc_array_index_type, "count2"); @@ -3071,17 +2980,6 @@ gfc_trans_where_2 (gfc_code * code, tree mask, tree pmask, tmp = gfc_trans_where_assign (expr1, expr2, mask, count1, count2); - /* Initialize the maskindexes. */ - forall_tmp = nested_forall_info; - while (forall_tmp != NULL) - { - maskindex = forall_tmp->maskindex; - if (forall_tmp->mask) - gfc_add_modify_expr (block, maskindex, - gfc_index_zero_node); - forall_tmp = forall_tmp->next_nest; - } - tmp = gfc_trans_nested_forall_loop (nested_forall_info, tmp, 1, 1); gfc_add_expr_to_block (block, tmp); |