Thomas Koenig wrote:
below is a patch which improves dependency checking for array
assignments and calculation of string lengths.

Talking about dependencies, I wonder whether you would be interested implementing the function
   bool gfc_simply_noncontiguous (gfc_expr *);
or something similarly named.

It should return true, if the expression is known to be noncontiguous. Such a function has many uses: - Diagnostic to reject invalid code such as "contiguous_ptr => noncontiguous_target",* passing a noncontiguous expression to c_loc, and possibly more - Compile-time simplification for the IS_CONTIGUOUS intrinsic (not yet implemented) - If we pass a noncontiguous array to a contiguous dummy argument (i.e. assumed-size, explicit-size or contiguous attribute), there is the check if(new_array != old_array) { unpack(old_array,new_array);free(new_array) }. If one knows that the array is noncontiguous, the "if(new_array!=old_array) check could be removed (missed optimization)
- Potentially some more uses

Additionally, gfc_simply_noncontiguous has some bugs (both false positive and false negative) - especially for BT_CLASS and for ref-array/ref-substring handling (esp. when combined).

Actually, for
  type t
    integer i
  end type t
type(t) :: foo(5)
is_contiguous(foo(:)%i), it depends on the aligning. (I think one needs to call gfc_target_expr_size for "foo(:)" and compare it with the storage size of foo(1)%i.) Of course, if there multiple components, foo(:)%i is obviously noncontiguous. (For gfc_simply_contiguous, see the Fortran standard for the exact definition of "simply contiguous", which should be used with strict==true).


If you will work on it, please tell me - otherwise, I might start to work on it. (It is not on top of my agenda, but for Fortran 2008's IS_CONTIGUOUS() and for diagnostic reasons, I like to have it.)


 * * *


But now, a bit belated, to your patch.

On 25.03.2013 16:43, Thomas Koenig wrote:
OK for trunk?

OK - except for the following three minor coding convention nits.


+}
+/* Return the difference between two expressions.  Integer expressions of

Two empty lines before the comment.

+}
+
  /* Returns 1 if the two ranges are the same and 0 if they are not (or if the

This time only one empty line is missing.

-      mpz_clear (tmp);
+      mpz_clear (tmp); /* gfc_dep_difference returned true, so tmp was 
initialized.  */

I am not sure whether the comment is needed - but if you want to keep it: The line is too long ;-)


Tobias

* Example for that
pointer, contiguous :: ptr
target :: tgt(5)
ptr => tgt(::2)

Reply via email to