re PR fortran/84418 (ICE with fortran OpenMP linear (ref ()) clause)

PR fortran/84418
	* trans-openmp.c (gfc_trans_omp_clauses): For OMP_CLAUSE_LINEAR_REF
	kind set OMP_CLAUSE_LINEAR_STEP to TYPE_SIZE_UNIT times last_step.

	* libgomp.fortran/pr84418-1.f90: New test.
	* libgomp.fortran/pr84418-2.f90: New test.

From-SVN: r257771
This commit is contained in:
Jakub Jelinek 2018-02-16 23:40:32 +01:00
parent 019e0ae8e0
commit 83d9be5581
5 changed files with 102 additions and 6 deletions

View File

@ -1,4 +1,10 @@
2018-02-16 Dominique d'Humieres <dominiq@gcc.gnu.org>
2018-02-16 Jakub Jelinek <jakub@redhat.com>
PR fortran/84418
* trans-openmp.c (gfc_trans_omp_clauses): For OMP_CLAUSE_LINEAR_REF
kind set OMP_CLAUSE_LINEAR_STEP to TYPE_SIZE_UNIT times last_step.
2018-02-16 Dominique d'Humieres <dominiq@gcc.gnu.org>
PR fortran/84354
* decl.c (gfc_get_pdt_instance): Replace '%qs' with %qs.
@ -390,7 +396,7 @@
* trans-io.c (get_dtio_proc): Likewise. (transfer_expr): Fix
whitespace.
2018-01-13 Thomas Koenig <tkoenig@gcc.gnu.org>
2018-01-13 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/83744
* dump-parse-tree.c (get_c_type_name): Remove extra line.
@ -414,7 +420,7 @@
* trans-array.c (is_pointer_array): Remove unconditional return
of false for -fopenmp.
2018-01-13 Thomas Koenig <tkoenig@gcc.gnu.org>
2018-01-13 Thomas Koenig <tkoenig@gcc.gnu.org>
<emsr@gcc.gnu.org>
PR fortran/83803

View File

@ -1949,9 +1949,32 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
}
else
{
tree type = gfc_typenode_for_spec (&n->sym->ts);
OMP_CLAUSE_LINEAR_STEP (node)
= fold_convert (type, last_step);
if (kind == OMP_CLAUSE_LINEAR_REF)
{
tree type;
if (n->sym->attr.flavor == FL_PROCEDURE)
{
type = gfc_get_function_type (n->sym);
type = build_pointer_type (type);
}
else
type = gfc_sym_type (n->sym);
if (POINTER_TYPE_P (type))
type = TREE_TYPE (type);
/* Otherwise to be determined what exactly
should be done. */
tree t = fold_convert (sizetype, last_step);
t = size_binop (MULT_EXPR, t,
TYPE_SIZE_UNIT (type));
OMP_CLAUSE_LINEAR_STEP (node) = t;
}
else
{
tree type
= gfc_typenode_for_spec (&n->sym->ts);
OMP_CLAUSE_LINEAR_STEP (node)
= fold_convert (type, last_step);
}
}
if (n->sym->attr.dimension || n->sym->attr.allocatable)
OMP_CLAUSE_LINEAR_ARRAY (node) = 1;

View File

@ -1,3 +1,9 @@
2018-02-16 Jakub Jelinek <jakub@redhat.com>
PR fortran/84418
* libgomp.fortran/pr84418-1.f90: New test.
* libgomp.fortran/pr84418-2.f90: New test.
2018-02-14 Jakub Jelinek <jakub@redhat.com>
PR fortran/84313

View File

@ -0,0 +1,26 @@
! PR fortran/84418
! { dg-do run { target vect_simd_clones } }
! { dg-options "-fno-inline" }
! { dg-additional-options "-msse2" { target sse2_runtime } }
! { dg-additional-options "-mavx" { target avx_runtime } }
real :: a(1024), b(1024), c(1024)
integer :: i
do i = 1, 1024
a(i) = 0.5 * i
b(i) = 1.5 * i
end do
!$omp simd
do i = 1, 1024
c(i) = foo (a(i), b(i))
end do
do i = 1, 1024
if (c(i).ne.(2 * i)) call abort
end do
contains
real function foo (x, y)
real :: x, y
!$omp declare simd linear (ref (x, y))
foo = x + y
end function
end

View File

@ -0,0 +1,35 @@
! PR fortran/84418
! { dg-do run { target vect_simd_clones } }
! { dg-options "-fno-inline" }
! { dg-additional-options "-msse2" { target sse2_runtime } }
! { dg-additional-options "-mavx" { target avx_runtime } }
type p
integer :: i, j
end type
type(p) :: a(1024)
integer :: b(4,1024), c(1024)
integer :: i
do i = 1, 1024
a(i)%i = 2 * i
a(i)%j = 3 * i
b(1,i) = 4 * i
b(2,i) = 5 * i
b(3,i) = 6 * i
b(4,i) = 7 * i
end do
!$omp simd
do i = 1, 1024
c(i) = foo (a(i), b(:,i))
end do
do i = 1, 1024
if (c(i).ne.(6 * i)) call abort
end do
contains
function foo (x, y)
type (p) :: x
integer :: y(4), foo
!$omp declare simd linear (ref (x, y))
foo = x%i + y(1)
end function
end