From: Jakub Jelinek Date: Wed, 3 Jun 2015 15:31:46 +0000 (+0200) Subject: backport: re PR middle-end/65597 (ICE in build_outer_var_ref, at omp-low.c:1043) X-Git-Tag: releases/gcc-4.9.3~106 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6cbcd616961e68603d70064d663c870fba7b8e12;p=thirdparty%2Fgcc.git backport: re PR middle-end/65597 (ICE in build_outer_var_ref, at omp-low.c:1043) Backported from mainline 2015-03-30 Jakub Jelinek PR fortran/65597 * trans-openmp.c (gfc_trans_omp_do): For !simple simd with explicit linear clause for the iterator set OMP_CLAUSE_LINEAR_NO_COPYIN. For implcitly added !simple OMP_CLAUSE_LINEAR set it too. Use step 1 instead of the original step on the new iterator - count. * testsuite/libgomp.fortran/pr65597.f90: New test. From-SVN: r224090 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 589f2206d523..622fdc68425d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,14 @@ +2015-06-03 Jakub Jelinek + + Backported from mainline + 2015-03-30 Jakub Jelinek + + PR fortran/65597 + * trans-openmp.c (gfc_trans_omp_do): For !simple simd with explicit + linear clause for the iterator set OMP_CLAUSE_LINEAR_NO_COPYIN. + For implcitly added !simple OMP_CLAUSE_LINEAR set it too. Use step 1 + instead of the original step on the new iterator - count. + 2015-04-14 Mikael Morin PR fortran/56674 diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c index 3b0e6e9e9771..e9f4894e5eae 100644 --- a/gcc/fortran/trans-openmp.c +++ b/gcc/fortran/trans-openmp.c @@ -2977,6 +2977,19 @@ gfc_trans_omp_do (gfc_code *code, gfc_exec_op op, stmtblock_t *pblock, inits.safe_push (e); } + if (dovar_found == 2 + && op == EXEC_OMP_SIMD + && collapse == 1 + && !simple) + { + for (tmp = omp_clauses; tmp; tmp = OMP_CLAUSE_CHAIN (tmp)) + if (OMP_CLAUSE_CODE (tmp) == OMP_CLAUSE_LINEAR + && OMP_CLAUSE_DECL (tmp) == dovar) + { + OMP_CLAUSE_LINEAR_NO_COPYIN (tmp) = 1; + break; + } + } if (!dovar_found) { if (op == EXEC_OMP_SIMD) @@ -2985,6 +2998,7 @@ gfc_trans_omp_do (gfc_code *code, gfc_exec_op op, stmtblock_t *pblock, { tmp = build_omp_clause (input_location, OMP_CLAUSE_LINEAR); OMP_CLAUSE_LINEAR_STEP (tmp) = step; + OMP_CLAUSE_LINEAR_NO_COPYIN (tmp) = 1; } else tmp = build_omp_clause (input_location, OMP_CLAUSE_LASTPRIVATE); @@ -3052,7 +3066,7 @@ gfc_trans_omp_do (gfc_code *code, gfc_exec_op op, stmtblock_t *pblock, else if (collapse == 1) { tmp = build_omp_clause (input_location, OMP_CLAUSE_LINEAR); - OMP_CLAUSE_LINEAR_STEP (tmp) = step; + OMP_CLAUSE_LINEAR_STEP (tmp) = build_int_cst (type, 1); OMP_CLAUSE_LINEAR_NO_COPYIN (tmp) = 1; OMP_CLAUSE_LINEAR_NO_COPYOUT (tmp) = 1; } diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 20f247f1d412..2062d3c8cb82 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,6 +1,11 @@ 2015-06-03 Jakub Jelinek Backported from mainline + 2015-03-30 Jakub Jelinek + + PR fortran/65597 + * testsuite/libgomp.fortran/pr65597.f90: New test. + 2015-03-19 Jakub Jelinek * testsuite/libgomp.c/target-10.c: New test. diff --git a/libgomp/testsuite/libgomp.fortran/pr65597.f90 b/libgomp/testsuite/libgomp.fortran/pr65597.f90 new file mode 100644 index 000000000000..c19f077753d4 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/pr65597.f90 @@ -0,0 +1,21 @@ +! PR fortran/65597 +! { dg-do run } + + integer :: i, a(151) + a(:) = 0 + !$omp do simd + do i = 1, 151, 31 + a(i) = a(i) + 1 + end do + !$omp do simd linear (i: 31) + do i = 1, 151, 31 + a(i) = a(i) + 1 + end do + do i = 1, 151 + if (mod (i, 31) .eq. 1) then + if (a(i) .ne. 2) call abort + else + if (a(i) .ne. 0) call abort + end if + end do +end