mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-16 00:50:48 +08:00
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:
parent
019e0ae8e0
commit
83d9be5581
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
26
libgomp/testsuite/libgomp.fortran/pr84418-1.f90
Normal file
26
libgomp/testsuite/libgomp.fortran/pr84418-1.f90
Normal 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
|
35
libgomp/testsuite/libgomp.fortran/pr84418-2.f90
Normal file
35
libgomp/testsuite/libgomp.fortran/pr84418-2.f90
Normal 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
|
Loading…
x
Reference in New Issue
Block a user