Le 05/05/2015 08:25, Thomas Koenig a écrit :
> Hello world,
> 
> this is an update of the matmul inline patch.  The only difference to
> the last version is that it has the ubound simplification taken out.

Sorry, I delayed this, but it wasn't (yet) forgotten.

Below a few answers to
https://gcc.gnu.org/ml/gcc-patches/2015-04/msg01247.html
and documentation fixes.


>       * simplify.c (simplify_bound):  Simplify the case of the
>       lower bound of an assumed-shape argument.
Entry to be removed. ;-)


>>> Index: fortran/array.c
>>> ===================================================================
>>> --- fortran/array.c (Revision 222218)
>>> +++ fortran/array.c (Arbeitskopie)
>>> @@ -338,6 +338,9 @@ gfc_resolve_array_spec (gfc_array_spec *as, int ch
>>>    if (as == NULL)
>>>      return true;
>>>  
>>> +  if (as->resolved)
>>> +    return true;
>>> +
>> Why this?
> 
> Because you get regressions otherwise.  Not resolving an array spec
> twice should do no harm, and resolving it twice does so - I hit the
> error message in check_restricted.  I'm not sure what is wrong, maybe
> PR 23466 was not fully fixed, but this works.
> 
Hum, it seems to work without it here.  Can you double check?

>>> @@ -524,29 +542,11 @@ constant_string_length (gfc_expr *e)
>>>  
>>>  }
>>>  
>>> -/* Returns a new expression (a variable) to be used in place of the old 
>>> one,
>>> -   with an assignment statement before the current statement to set
>>> -   the value of the variable. Creates a new BLOCK for the statement if
>>> -   that hasn't already been done and puts the statement, plus the
>>> -   newly created variables, in that block.  Special cases:  If the
>>> -   expression is constant or a temporary which has already
>>> -   been created, just copy it.  */
>>> -
>>> -static gfc_expr*
>>> -create_var (gfc_expr * e)
>> Keep a comment here.
> 
> Still exists, further down.
> 
I don't mind the comment being moved around together with create_var. :-)
I was asking for a comment for the new function insert_block.


> 
>>> +         gfc_simplify_expr (ar->start[i], 0);
>>> +       }
>>> +     else if (was_fullref)
>>> +       {
>>> +         ar->dimen_type[i] = DIMEN_RANGE;
>>> +         ar->start[i] = NULL;
>>> +         ar->end[i] = NULL;
>>> +         ar->stride[i] = NULL;
>>> +       }
>> Is this reachable ?
> 
> Not in the current incarnation, I wanted to keep it around for
> a full segment later.  I can also remove this.
> 
At least add an assert, a comment, something telling that it's not used.
I would rather remove it until it's actually used, but I can live with
it, if it becomes used shortly.

>>
>> [...]
>>
>>> Index: fortran/options.c
>>> ===================================================================
>>> --- fortran/options.c       (Revision 222218)
>>> +++ fortran/options.c       (Arbeitskopie)
[...]
>>> +
>>> +  if (flag_external_blas && flag_inline_matmul_limit < 0)
>>> +    flag_inline_matmul_limit = flag_blas_matmul_limit;
>> Hum, shouldn't we do something for flag_inline_matmul_limit > 0 as well?
> 
> 
> This is done automatically, by the options machinery.  That is cool 
> 
Huh? is it?
I was talking about this:
Using -fblas-matmul-limit=10, one gets inlining until 10.
Using -fblas-matmul-limit=10 -finline-matmul-limit=20 the inlining limit
is _increased_ to 20.

It is of course questionable for a user to specify a low limit for blas
being lower than the high limit for inlining, so that we have a
contradictory specification for the matrix sizes in between.
But I think it would make more sense to have blas take precedence, that
is have flag_inline_matmul_limit clamped to flag_blas_matmul_limit, even
for flag_inline_matmul_limit > 0.
Is this done by the options machinery?

Either way, I don't mind too much, this is a corner case.


> Index: invoke.texi
> ===================================================================
> --- invoke.texi       (Revision 222218)
> +++ invoke.texi       (Arbeitskopie)
> @@ -1537,6 +1538,20 @@ geometric mean of the dimensions of the argument a
>  
>  The default value for @var{n} is 30.
>  
> +@item -finline-matmul-limit=@var{n}
> +@opindex @code{finline-matmul-limit}
> +When front-end optimiztion is active,
optimization
> some calls to the @code{MATMUL}
> +intrinsic function will be inlined.
s/some calls ... inlined/calls ... inlined for small matrix sizes/
or something like that.

>  Setting
> +@code{-finline-matmul-limit=0} will disable inlining in all cases.

> +Setting this option it to a specified value will call the library
> +routines for matrices with size larger than @var{n}. 
s/it //
Setting ... value @var{n} will produce inline code for matrix sizes up
to @var{n}; the library routines will be called for bigger matrices.

Maybe add something about code bloat here.  Suggestion:

This may result in code size increase if the matrix size can't be
determined at compile time, as code for both cases is generated.

> If the matrices
> +involved are not square, the size comparison is performed using the
> +geometric mean of the dimensions of the argument and result matrices.
> +
> +The default value for @var{n} is the value specified for
> +@code{-fblas-matmul-limit} if this option is specified, or unlimitited
unlimitted
> +otherwise.
> +
>  @item -frecursive
>  @opindex @code{frecursive}
>  Allow indirect recursion by forcing all local arrays to be allocated



With the resolved thing removed, the comment before insert_block and the
doc fixes, the patch is OK.
The rest is up to you.  Thanks.

Mikael

Reply via email to