New patch after the update. Cheers
2014-09-09 0:30 GMT-06:00 Tobias Burnus <bur...@net-b.de>: > Alessandro Fanfarillo wrote: >> >> This email follows the previous without subject (sorry about that). > > > I think I'd prefer the following patch, which avoids a temporary if none is > required. "value" is a pointer if the kind is the same (see kind check > before) and if it is not a literal. Otherwise, it isn't a pointer and one > needs to generate a temporary. > > I do not quite understand why the current check doesn't work as both are > integer(kind=4) but for some reasons one has a variant. > > Additionally, I wonder whether one should add a test case – one probably > should do – and of which kind (run test + fdump-tree-original?). > > Tobias > > --- a/gcc/fortran/trans-intrinsic.c > +++ b/gcc/fortran/trans-intrinsic.c > @@ -8398,3 +8398,3 @@ conv_intrinsic_atomic_op (gfc_code *code) > > - if (TREE_TYPE (TREE_TYPE (atom)) != TREE_TYPE (TREE_TYPE (value))) > + if (!POINTER_TYPE_P (TREE_TYPE (value))) > > { > > > > >> The attached patch solves the problem raised by the following code: >> >> program atomic >> use iso_fortran_env >> implicit none >> >> integer :: me >> integer(atomic_int_kind) :: atom[*] >> me = this_image() >> call atomic_define(atom[1],0) >> sync all >> call ATOMIC_ADD (atom[1], me) >> if(me == 1) call atomic_ref(me,atom[1]) >> sync all >> write(*,*) me >> >> end program >> >> >> Ok for trunk? > >
2014-09-15 Alessandro Fanfarillo <fanfarillo....@gmail.com> Tobias Burnus <bur...@net-b.de> * trans-intrinsic.c (conv_intrinsic_atomic_op): Check for indirect reference for caf_atomic_op value. diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c index a13b113..2d7241a 100644 --- a/gcc/fortran/trans-intrinsic.c +++ b/gcc/fortran/trans-intrinsic.c @@ -8396,9 +8396,11 @@ conv_intrinsic_atomic_op (gfc_code *code) else image_index = integer_zero_node; - if (TREE_TYPE (TREE_TYPE (atom)) != TREE_TYPE (TREE_TYPE (value))) + if (!POINTER_TYPE_P (TREE_TYPE (value))) { tmp = gfc_create_var (TREE_TYPE (TREE_TYPE (atom)), "value"); + if (POINTER_TYPE_P (TREE_TYPE (value))) + value = build_fold_indirect_ref_loc (input_location, value); gfc_add_modify (&block, tmp, fold_convert (TREE_TYPE (tmp), value)); value = gfc_build_addr_expr (NULL_TREE, tmp); }