https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102347

Kewen Lin <linkw at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ktkachov at gcc dot gnu.org,
                   |                            |rguenth at gcc dot gnu.org,
                   |                            |rsandifo at gcc dot gnu.org

--- Comment #8 from Kewen Lin <linkw at gcc dot gnu.org> ---
(In reply to Martin Liška from comment #6)
> Quickly looking at the rs6000 code, it fails here:
> 
> #1  0x0000000011a0993c in rs6000_invalid_builtin
> (fncode=MMA_BUILTIN_DISASSEMBLE_ACC_INTERNAL) at
> ../../gcc/config/rs6000/rs6000-call.c:11643
> #2  0x0000000011a13134 in rs6000_builtin_decl (code=1603, initialize_p=true)
> at ../../gcc/config/rs6000/rs6000-call.c:13870
> #3  0x00000000115c3900 in unpack_ts_function_decl_value_fields
> (bp=0x3fffffffe2f0, expr=0x3fffaf195700) at ../../gcc/tree-streamer-in.c:361
> #4  0x00000000115c4790 in streamer_read_tree_bitfields (ib=0x3fffffffe6a0,
> data_in=0x132d1910, expr=0x3fffaf195700) at ../../gcc/tree-streamer-in.c:528
> #5  0x0000000010deaa28 in lto_read_tree_1 (ib=0x3fffffffe6a0,
> data_in=0x132d1910, expr=0x3fffaf195700) at ../../gcc/lto-streamer-in.c:1697
> 
> which relies on rs6000_builtin_mask. Note the mask is set here:
> rs6000_builtin_mask = rs6000_builtin_mask_calculate ();
> 
> where rs6000_builtin_mask_calculate is based on TARGET_* values.
> 
> I think the mask check should be deferred later as it should be based on
> proper
> target_node that is set via rs6000_set_current_function. It should not check
> it in lto_read_tree_1.

Thanks for looking into this, Martin! I tried to investigate if we can set
target_option_node as the appropriate fndecl when doing the check, then both
rs6000 and aarch64 ports don't need to change the hook since both of them
respect target_option_node switches well.

We have streamed out those fndecls with their target_option_nodes (if they
have)
into the .gnu.lto_.decls.xxx, fndecls are built well after reading, for one
bif fndecl, if we know which function it exists in, we can set_current_function
to the corresponding fndecl when checking the bif. After some hackings, I
noticed that there are two difficulties:
  1) For one bif, we need a way to know which fndecls use it. Now there seems
no
     information easy for this right before checking the bif?
  2) One bif can sit in several functions which probably have different
     target_option_nodes, we have to iterate all of them. This seems artificial
     just for this need.

I might still miss something, but after the hacking I agree to update the
target hooks is better. For rs6000, the mask checking removal aligns with the
way that i386 uses and also some changes like r10-7462 by neglecting mask.
Later rs6000_expand_builtin will still do the check with mask. But the erroring
would be in LTRANS, WPA phase won't emit error then. Is it one concern? If so,
which place can we delay this check to?

For aarch64 port, it seems to need some more adjustments?

Reply via email to