Re: Local optimization options

2020-07-06 Thread Richard Biener via Gcc
On Sun, Jul 5, 2020 at 4:37 PM Marc Glisse  wrote:
>
> On Sun, 5 Jul 2020, Thomas König wrote:
>
> >
> >> Am 04.07.2020 um 19:11 schrieb Richard Biener :
> >>
> >> On July 4, 2020 11:30:05 AM GMT+02:00, "Thomas König"  
> >> wrote:
> >>>
> >>> What could be a preferred way to achieve that? Could optimization
> >>> options like -ffast-math be applied to blocks instead of functions?
> >>> Could we set flags on the TREE codes to allow certain optinizations?
> >>> Other things?
> >>
> >> The middle end can handle those things on function granularity only.
> >>
> >> Richard.
> >
> > OK, so that will not work (or not without a disproportionate
> > amount of effort).  Would it be possible to set something like a
> > TREE_FAST_MATH flag on TREEs? An operation could then be
> > optimized according to these rules iff both operands
> > had that flag, and would also have it then.
>
> In order to support various semantics on floating point operations, I was
> planning to replace some trees with internal functions, with an extra
> operand to specify various behaviors (rounding, exception, etc). Although
> at least in the beginning, I was thinking of only using those functions in
> safe mode, to avoid perf regressions.
>
> https://gcc.gnu.org/pipermail/gcc-patches/2019-August/527040.html

Note this tackles the dependency on fesetround and friends which is
of course another issue (tracking FP control and exception state).

> This may never happen now, but it sounds similar to setting flags like
> TREE_FAST_MATH that you are suggesting. I was going with functions for
> more flexibility, and to avoid all the existing assumptions about trees.
> While I guess for fast-math, the worst the assumptions could do is clear
> the flag, which would make use optimize less than possible, not so bad.

Indeed going with tree/gimple stmt flags or alternate tree codes
(PLUS_NONTRAP_EXPR?) isn't likely to scale for the myriads of
FP behavior controls we have.  So using an internal function sounds
reasonable though, given your referenced patch above, one might
want to think about that extra input (FP env) and output (FP state)
those functions will have as well.  Also extracting the important
bits from "fast-math" and thorougly documenting semantics of
what flags we use would be required.

To prevent too many bad effects on optimization one might think
of using regular PLUS_EXPR when global flags match the
specific ones on a internal-function ...

Btw, instead of using the _Complex and __real/__imag trick
for multiple defs we might want to go with more general SSA projections
or allow multiple defs on functions at least.

Richard.

> --
> Marc Glisse


Re: Local optimization options

2020-07-05 Thread Marc Glisse

On Sun, 5 Jul 2020, Thomas König wrote:




Am 04.07.2020 um 19:11 schrieb Richard Biener :

On July 4, 2020 11:30:05 AM GMT+02:00, "Thomas König"  wrote:


What could be a preferred way to achieve that? Could optimization
options like -ffast-math be applied to blocks instead of functions?
Could we set flags on the TREE codes to allow certain optinizations?
Other things?


The middle end can handle those things on function granularity only.

Richard.


OK, so that will not work (or not without a disproportionate
amount of effort).  Would it be possible to set something like a
TREE_FAST_MATH flag on TREEs? An operation could then be
optimized according to these rules iff both operands
had that flag, and would also have it then.


In order to support various semantics on floating point operations, I was 
planning to replace some trees with internal functions, with an extra 
operand to specify various behaviors (rounding, exception, etc). Although 
at least in the beginning, I was thinking of only using those functions in 
safe mode, to avoid perf regressions.


https://gcc.gnu.org/pipermail/gcc-patches/2019-August/527040.html

This may never happen now, but it sounds similar to setting flags like 
TREE_FAST_MATH that you are suggesting. I was going with functions for 
more flexibility, and to avoid all the existing assumptions about trees. 
While I guess for fast-math, the worst the assumptions could do is clear 
the flag, which would make use optimize less than possible, not so bad.


--
Marc Glisse


Re: Local optimization options

2020-07-05 Thread Richard Biener via Gcc
On July 5, 2020 12:37:58 PM GMT+02:00, "Thomas König"  wrote:
>
>> Am 04.07.2020 um 19:11 schrieb Richard Biener
>:
>> 
>> On July 4, 2020 11:30:05 AM GMT+02:00, "Thomas König"
> wrote:
>>> 
>>> What could be a preferred way to achieve that? Could optimization
>>> options like -ffast-math be applied to blocks instead of functions?
>>> Could we set flags on the TREE codes to allow certain optinizations?
>>> Other things?
>> 
>> The middle end can handle those things on function granularity only. 
>> 
>> Richard. 
>
>OK, so that will not work (or not without a disproportionate
>amount of effort).  Would it be possible to set something like a
>TREE_FAST_MATH flag on TREEs? An operation could then be
>optimized according to these rules iff both operands
>had that flag, and would also have it then.

Since -ffast-math has effects on operations (-freciprocal-math) and on
Operands (-fsignalling-nans) I think we'd need both and a single flag isn't 
enough. 

I guess parts of -ffast-math could be represented on a per stmt basis already, 
-fno-trapping-math for example could be TREE_NO_TRAP and the corresponding 
gimple flag.

And yes, it would be very desirable to have all semantics fully represented in 
the IL rather than influenced by global flags. But then also optimization 
passes have to be careful to track state on that level. 

Richard. 

>
>Regards, Thomas



Re: Local optimization options

2020-07-05 Thread Thomas König


> Am 04.07.2020 um 19:11 schrieb Richard Biener :
> 
> On July 4, 2020 11:30:05 AM GMT+02:00, "Thomas König"  
> wrote:
>> 
>> What could be a preferred way to achieve that? Could optimization
>> options like -ffast-math be applied to blocks instead of functions?
>> Could we set flags on the TREE codes to allow certain optinizations?
>> Other things?
> 
> The middle end can handle those things on function granularity only. 
> 
> Richard. 

OK, so that will not work (or not without a disproportionate
amount of effort).  Would it be possible to set something like a
TREE_FAST_MATH flag on TREEs? An operation could then be
optimized according to these rules iff both operands
had that flag, and would also have it then.

Regards, Thomas

Re: Local optimization options

2020-07-04 Thread Richard Biener via Gcc
On July 4, 2020 11:30:05 AM GMT+02:00, "Thomas König"  wrote:
>Hi,
>
>in Fortran, it would sometimes  be useful to have a different
>optimization
>depending on whether we generate inlined code for intrinsics (where we
>know when it is OK to „go wild“) or user code, where  we need to
>adhere (for example) to IEEE semantics unless otherwise instructed
>by the user.
>
>What could be a preferred way to achieve that? Could optimization
>options like -ffast-math be applied to blocks instead of functions?
>Could we set flags on the TREE codes to allow certain optinizations?
>Other things?

The middle end can handle those things on function granularity only. 

Richard. 

>Regards, Thomas



Local optimization options

2020-07-04 Thread Thomas König
Hi,

in Fortran, it would sometimes  be useful to have a different optimization
depending on whether we generate inlined code for intrinsics (where we
know when it is OK to „go wild“) or user code, where  we need to
adhere (for example) to IEEE semantics unless otherwise instructed
by the user.

What could be a preferred way to achieve that? Could optimization
options like -ffast-math be applied to blocks instead of functions?
Could we set flags on the TREE codes to allow certain optinizations?
Other things?

Regards, Thomas