On 2020/12/11 15:47, Richard Biener wrote:
>> Note that the add/sub sequence is different for (3) and (4) since
>> -funsafe-math-optimizations is implicitly true. "fp-contract=fast" in
>> (1) and (2) could avoid Inf as fmads could handle float overflow (verified
>> it on Power, not sure other targets support this), but without float
>> value-range info, it is unsafe to change computation from double to
>> float even for only add/sub expressions.
> Yes. As said it's difficult to second guess the programmer here.
> The existing cases doing promotion look at unary functions,
> doing exp->expf when arguments are promoted floats and the
> return value is casted back to float. That's also a common programmer
> "error" not knowing expf or assuming some kind of magic overloading.
Yes, that is "(float) fabs (float)" -> "(float) fabsf (float)" as (1),
that seems should be done in front end to generate fabsf or "warning" to
programmer?
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=22326#c4, refused by Andew and
Joseph,
reason is front end shouldn't do any optimization there.)
Currently, gimple code already generates below code(though no ABSF_EXPR or
EXPF_EXPR),
but due to ABS_EXPR return double, many double conversions are also produced
for the MUL and ADD operations, and that why I propose to do it in match.pd.
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=22326#c9, also refused by you due
to
complex static pattern matching, also it will cause potential Inf issue like
last mail.)
1) cat liv.c.006t.gimple
__attribute__((noinline))
foo (float x, float y, float z)
{
float D.4356;
_1 = ABS_EXPR <x>;
_2 = (double) _1;
_3 = (double) y;
_4 = _2 * _3;
_5 = (double) z;
_6 = _4 + _5;
D.4356 = (float) _6;
return D.4356;
}
For "(float) fabs (double)" like (2), it is not quite reasonable to do fabs ->
fabsf.
2) cat liv.c.006t.gimple
__attribute__((noinline))
foo (double x, float y, float z)
{
float D.4356;
_1 = ABS_EXPR <x>;
_2 = (double) y;
_3 = _1 * _2;
_4 = (double) z;
_5 = _3 + _4;
D.4356 = (float) _5;
return D.4356;
}
>
> So I'm not entirely convinced such transform is a good idea, at least
> by default with -ffast-math. Maybe have a -fassume-float-limited-range
> or so documented as that we assume that double or long double values
> used fit in floats?
Thanks for the idea, just to confirm where should this option work, In match.pd
or gimple pass for only abs/exp to absf/expf, etc? Even with the option, I am
afraid the option is still not effective for computation? :)
Thanks,
Xionghu