[PATCH, Fortran] Wrong invocation of caf_atomic_op

Alessandro Fanfarillo fanfarillo.gcc@gmail.com
Mon Sep 15 17:18:00 GMT 2014


New patch after the update.

Cheers

2014-09-09 0:30 GMT-06:00 Tobias Burnus <burnus@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?
>
>
-------------- next part --------------
2014-09-15  Alessandro Fanfarillo  <fanfarillo.gcc@gmail.com>
	    Tobias Burnus  <burnus@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);
 	}


More information about the Gcc-patches mailing list