re PR fortran/52865 (GCC can't vectorize fortran loop but able to vectorize similar...
authorJakub Jelinek <jakub@redhat.com>
Wed, 16 Jan 2013 16:05:27 +0000 (17:05 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 16 Jan 2013 16:05:27 +0000 (17:05 +0100)
PR fortran/52865
* trans-stmt.c (gfc_trans_do): Put countm1-- before conditional
and use value of countm1 before the decrement in the condition.

From-SVN: r195241

gcc/fortran/ChangeLog
gcc/fortran/trans-stmt.c

index f297deb93adde5f6b86e9f23fdc0b8c72cfeb588..c7f2001f85a164ee12a162e2a21c14d08be5e455 100644 (file)
@@ -1,3 +1,9 @@
+2013-01-16  Jakub Jelinek  <jakub@redhat.com>
+
+       PR fortran/52865
+       * trans-stmt.c (gfc_trans_do): Put countm1-- before conditional
+       and use value of countm1 before the decrement in the condition.
+
 2013-01-15  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/54286
index 3aabd287f99e6512c2372ae7c9ab93654843eff6..1d240cb7ef5114d0c30b899c9d0c0cb04ded6d4d 100644 (file)
@@ -1518,8 +1518,9 @@ gfc_trans_simple_do (gfc_code * code, stmtblock_t *pblock, tree dovar,
        body;
 cycle_label:
        dovar += step
-       if (countm1 ==0) goto exit_label;
+       countm1t = countm1;
        countm1--;
+       if (countm1t == 0) goto exit_label;
      }
 exit_label:
 
@@ -1739,19 +1740,23 @@ gfc_trans_do (gfc_code * code, tree exit_cond)
   if (gfc_option.rtcheck & GFC_RTCHECK_DO)
     gfc_add_modify_loc (loc, &body, saved_dovar, dovar);
 
-  /* End with the loop condition.  Loop until countm1 == 0.  */
-  cond = fold_build2_loc (loc, EQ_EXPR, boolean_type_node, countm1,
-                         build_int_cst (utype, 0));
-  tmp = fold_build1_loc (loc, GOTO_EXPR, void_type_node, exit_label);
-  tmp = fold_build3_loc (loc, COND_EXPR, void_type_node,
-                        cond, tmp, build_empty_stmt (loc));
-  gfc_add_expr_to_block (&body, tmp);
+  /* Initialize countm1t.  */
+  tree countm1t = gfc_create_var (utype, "countm1t");
+  gfc_add_modify_loc (loc, &body, countm1t, countm1);
 
   /* Decrement the loop count.  */
   tmp = fold_build2_loc (loc, MINUS_EXPR, utype, countm1,
                         build_int_cst (utype, 1));
   gfc_add_modify_loc (loc, &body, countm1, tmp);
 
+  /* End with the loop condition.  Loop until countm1t == 0.  */
+  cond = fold_build2_loc (loc, EQ_EXPR, boolean_type_node, countm1t,
+                         build_int_cst (utype, 0));
+  tmp = fold_build1_loc (loc, GOTO_EXPR, void_type_node, exit_label);
+  tmp = fold_build3_loc (loc, COND_EXPR, void_type_node,
+                        cond, tmp, build_empty_stmt (loc));
+  gfc_add_expr_to_block (&body, tmp);
+
   /* End of loop body.  */
   tmp = gfc_finish_block (&body);