aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2013-10-24 18:30:22 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2013-10-24 18:30:22 +0200
commit2ca4e2c2296e9b0690501d80ab8cdca25c30de08 (patch)
tree6fb9115ad55e849df56321432ba9bb1c07ec3ecf
parenta2ad7995d0b9b2666ce77a310e39a29630df0747 (diff)
downloadgcc-2ca4e2c2296e9b0690501d80ab8cdca25c30de08.zip
gcc-2ca4e2c2296e9b0690501d80ab8cdca25c30de08.tar.gz
gcc-2ca4e2c2296e9b0690501d80ab8cdca25c30de08.tar.bz2
re PR fortran/44646 ([F08] Implement DO CONCURRENT)
2013-10-24 Tobias Burnus <burnus@net-b.de> PR fortran/44646 * trans-stmt.c (struct forall_info): Add do_concurrent field. (gfc_trans_forall_1): Set it for do concurrent. (gfc_trans_forall_loop): Mark those as annot_expr_ivdep_kind. 2013-10-24 Tobias Burnus <burnus@net-b.de> PR fortran/44646 * gfortran.dg/vect/vect-do-concurrent-1.f90: New. From-SVN: r204023
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/trans-stmt.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/vect/vect-do-concurrent-1.f9017
4 files changed, 36 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index f152933..80697ff 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2013-10-24 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/44646
+ * trans-stmt.c (struct forall_info): Add do_concurrent field.
+ (gfc_trans_forall_1): Set it for do concurrent.
+ (gfc_trans_forall_loop): Mark those as annot_expr_ivdep_kind.
+
2013-10-23 Tobias Burnus <burnus@net-b.de>
PR fortran/58793
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index edd2dac..62e690d 100644
--- a/gcc/fortran/trans-stmt.c
+++ b/gcc/fortran/trans-stmt.c
@@ -53,6 +53,7 @@ typedef struct forall_info
int nvar;
tree size;
struct forall_info *prev_nest;
+ bool do_concurrent;
}
forall_info;
@@ -2759,6 +2760,11 @@ gfc_trans_forall_loop (forall_info *forall_tmp, tree body,
/* The exit condition. */
cond = fold_build2_loc (input_location, LE_EXPR, boolean_type_node,
count, build_int_cst (TREE_TYPE (count), 0));
+ if (forall_tmp->do_concurrent)
+ cond = build2 (ANNOTATE_EXPR, TREE_TYPE (cond), cond,
+ build_int_cst (integer_type_node,
+ annot_expr_ivdep_kind));
+
tmp = build1_v (GOTO_EXPR, exit_label);
tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node,
cond, tmp, build_empty_stmt (input_location));
@@ -3842,6 +3848,7 @@ gfc_trans_forall_1 (gfc_code * code, forall_info * nested_forall_info)
}
tmp = gfc_finish_block (&body);
+ nested_forall_info->do_concurrent = true;
tmp = gfc_trans_nested_forall_loop (nested_forall_info, tmp, 1);
gfc_add_expr_to_block (&block, tmp);
goto done;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5694dcd..d2c2cd6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-08-24 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/44646
+ * gfortran.dg/vect/vect-do-concurrent-1.f90: New.
+
2013-10-24 Dehao Chen <dehao@google.com>
* g++.dg/opt/devirt3.C: New test.
diff --git a/gcc/testsuite/gfortran.dg/vect/vect-do-concurrent-1.f90 b/gcc/testsuite/gfortran.dg/vect/vect-do-concurrent-1.f90
new file mode 100644
index 0000000..7d56241
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/vect/vect-do-concurrent-1.f90
@@ -0,0 +1,17 @@
+! { dg-do compile }
+! { dg-require-effective-target vect_float }
+! { dg-options "-O3 -fopt-info-vec-optimized" }
+
+subroutine test(n, a, b, c)
+ integer, value :: n
+ real, contiguous, pointer :: a(:), b(:), c(:)
+ integer :: i
+ do concurrent (i = 1:n)
+ a(i) = b(i) + c(i)
+ end do
+end subroutine test
+
+! { dg-message "loop vectorized" "" { target *-*-* } 0 }
+! { dg-bogus "version" "" { target *-*-* } 0 }
+! { dg-bogus "alias" "" { target *-*-* } 0 }
+! { dg-final { cleanup-tree-dump "vect" } }