The problem should be fixed after my value range patches being accepted.
[PATCH-1v3] Value Range: Add range op for builtin isinf
https://gcc.gnu.org/pipermail/gcc-patches/2024-May/653096.html
[PATCH-2v4] Value Range: Add range op for builtin isfinite
https://gcc.gnu.org/pipermail/gcc-patches/2024-May/653094.html
[PATCH-3v2] Value Range: Add range op for builtin isnormal
https://gcc.gnu.org/pipermail/gcc-patches/2024-May/653095.html
在 2024/6/29 9:35, Vineet Gupta 写道:
>
>
> On 6/28/24 17:53, Vineet Gupta wrote:
>> Currently isfinite and isnormal use float compare instructions with fp
>> flags save/restored around them. Our perf team complained this could be
>> costly in uarch. RV Base ISA already has FCLASS.{d,s,h} instruction to
>> do FP compares w/o disturbing FP exception flags.
>>
>> Coincidently, upstream ijust few days back got support for the
>> corresponding optabs. All that is needed is to wire these up in the
>> backend.
>>
>> I was also hoping to get __builtin_inf() done but unforutnately it
>> requires little more rtl foo/bar to implement a tri-modal return.
>>
>> Currently going thru CI testing.
>
> My local testing spotted one additional failure.
>
> FAIL: g++.dg/opt/pr107569.C -std=gnu++20 scan-tree-dump-times vrp1
> "return 1;" 2
>
> The reason being
>
> bool
> bar (double x)
> {
> [[assume (std::isfinite (x))]];
> return std::isfinite (x);
> }
>
> generating the new seq
>
> .LFB4:
> fclass.d a0,fa0
> andi a0,a0,126
> snez a0,a0
> ret
>
> vs.
>
> li a0,1
> ret
>
> I have a hunch this requires the pending value range patch from Hao Chen
> GUI.
>
> Thx,
> -Vineet
>
> [1] https://gcc.gnu.org/pipermail/gcc-patches/2024-May/653094.html