Hi Kewen,
On 10/11/21 1:30 AM, Kewen.Lin wrote:
> Hi Segher,
>
> Thanks for the comments.
>
> on 2021/10/1 上午6:13, Segher Boessenkool wrote:
>> Hi!
>>
>> On Thu, Sep 30, 2021 at 11:06:50AM +0800, Kewen.Lin wrote:
>>
>> [ huge snip ]
>>
>>> Based on the understanding and testing, I think it's safe to adopt this
>>> patch.
>>> Do both Peter and you agree the rs6000_expand_builtin will catch the
>>> invalid built-in?
>>> Is there some special case which probably escapes out?
>> The function rs6000_builtin_decl has a terribly generic name. Where all
>> is it called from? Do all such places allow the change in semantics?
>> Do any comments or other documentation need to change? Is the function
>> name still good?
>
> % grep -rE "\<builtin_decl\> \(" .
> ./gcc/config/avr/avr-c.c: fold = targetm.builtin_decl (id, true);
> ./gcc/config/avr/avr-c.c: fold = targetm.builtin_decl (id, true);
> ./gcc/config/avr/avr-c.c: fold = targetm.builtin_decl (id, true);
> ./gcc/config/aarch64/aarch64.c: return aarch64_sve::builtin_decl
> (subcode, initialize_p);
> ./gcc/config/aarch64/aarch64-protos.h: tree builtin_decl (unsigned, bool);
> ./gcc/config/aarch64/aarch64-sve-builtins.cc:builtin_decl (unsigned int code,
> bool)
> ./gcc/tree-streamer-in.c: tree result = targetm.builtin_decl (fcode,
> true);
>
> % grep -rE "\<rs6000_builtin_decl\> \(" .
> ./gcc/config/rs6000/rs6000-c.c: if (rs6000_builtin_decl
> (instance->bifid, false) != error_mark_node
> ./gcc/config/rs6000/rs6000-c.c: if (rs6000_builtin_decl
> (instance->bifid, false) != error_mark_node
> ./gcc/config/rs6000/rs6000-c.c: if (rs6000_builtin_decl
> (instance->bifid, false) != error_mark_node
> ./gcc/config/rs6000/rs6000-gen-builtins.c: "extern tree
> rs6000_builtin_decl (unsigned, "
> ./gcc/config/rs6000/rs6000-call.c:rs6000_builtin_decl (unsigned code, bool
> initialize_p ATTRIBUTE_UNUSED)
> ./gcc/config/rs6000/rs6000-internal.h:extern tree rs6000_builtin_decl
> (unsigned code,
>
> As above, the call sites are mainly in
> 1) function unpack_ts_function_decl_value_fields in gcc/tree-streamer-in.c
> 2) function altivec_resolve_new_overloaded_builtin in
> gcc/config/rs6000/rs6000-c.c
>
> 2) is newly introduced by Bill's bif rewriting patch series, all uses in it
> are
> along with rs6000_new_builtin_is_supported which adopts a new way to check bif
> supported or not (the old rs6000_builtin_is_supported_p uses builtin mask), so
> I think the builtin mask checking is useless (unexpected?) for these uses.
Things are a bit confused because we are part way through the patch series.
rs6000_builtin_decl will be changed to redirect to rs6000_new_builtin_decl when
using the new builtin support. That function will be:
static tree
rs6000_new_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
{
rs6000_gen_builtins fcode = (rs6000_gen_builtins) code;
if (fcode >= RS6000_OVLD_MAX)
return error_mark_node;
if (!rs6000_new_builtin_is_supported (fcode))
{
rs6000_invalid_new_builtin (fcode);
return error_mark_node;
}
return rs6000_builtin_decls_x[code];
}
So, as you surmise, this will be using the new method of testing for builtin
validity.
You can ignore the rs6000-c.c and rs6000-gen-builtins.c references of
rs6000_builtin_decl
for purposes of fixing the existing way of doing things.
>
> Besides, the description for this hook:
>
> "tree TARGET_BUILTIN_DECL (unsigned code, bool initialize_p) [Target Hook]
> Define this hook if you have any machine-specific built-in functions that
> need to be
> defined. It should be a function that returns the builtin function
> declaration for the
> builtin function code code. If there is no such builtin and it cannot be
> initialized at
> this time if initialize p is true the function should return NULL_TREE. If
> code is out
> of range the function should return error_mark_node."
>
> It would only return error_mark_node when the code is out of range. The
> current
> rs6000_builtin_decl returns error_mark_node not only for "out of range", it
> looks
> inconsistent and this patch also revise it.
>
> The hook was introduced by commit e9e4b3a892d0d19418f23bb17bdeac33f9a8bfd2,
> it meant to ensure the bif function_decl is valid (check if bif code in the
> range and the corresponding entry in bif table is not NULL). May be better
> with name check_and_get_builtin_decl? CC Richi, he may have more insights.
>
>>> By the way, I tested the bif rewriting patch series V5, it couldn't make
>>> the original
>>> case in PR (S5) pass, I may miss something or the used series isn't
>>> up-to-date. Could
>>> you help to have a try? I agree with Peter, if the rewriting can fix this
>>> issue, then
>>> we don't need this patch for trunk any more, I'm happy to abandon this. :)
>> (Mail lines are 70 or so chars max, so that they can be quoted a few
>> levels).
>>
> ah, OK, thanks. :)
>
>> If we do need a band-aid for 10 and 11 (and we do as far as I can see),
>> I'd like to see one for just MMA there, and let all other badness fade
>> into history. Unless you can convince me (in the patch / commit
>> message) that this is safe :-)
> Just to fix for MMA seems incomplete to me since we can simply
> construct one non-MMA but failed case. I questioned in the other
> thread, is there any possibility for one invalid target specific
> bif to escape from the function rs6000_expand_builtin? (note that
> folding won't handle invalid bifs, so invalid bifs won't get folded
> early.) If no, I think it would be safe.
Yes, looking at what you wrote in the other thread about your investigations
with -DEXPECT_ERROR, the existing rs6000_expand_builtin logic makes the
patch safe from my perspective. Thank you for digging in and checking!
>
>> Whichever way you choose, it is likely best to do the same on 10 and 11
>> as on trunk, since it will all be replaced on trunk soon anyway.
>>
> OK, will see Bill's reply (he should be back from vacation soon). :)
I am back! :) Agree with Segher that backporting this after a sensible
interval would be appropriate. We have been fixing these things
piecemeal for too long, so if we have a solid general fix, I'm a fan.
Going forward with 12 and later we can rip off the band-aid and do things
right.
Thanks!
Bill
>
> BR,
> Kewen