> IPA_JF_ANCESTOR jump functions are constructed also when the formal
> parameter of the caller is first checked whether it is NULL and left
> as it is if it is NULL, to accommodate C++ casts to an ancestor class.
> 
> The jump function type was invented for devirtualization and IPA-CP
> propagation of tree constants is also careful to apply it only to
> existing DECLs(*) but as PR 103083 shows, the part propagating "known
> bits" was not careful about this, which can lead to miscompilations.
> 
> This patch introduces a flag to the ancestor jump functions which
> tells whether a NULL-check was elided when creating it and makes the
> bits propagation behave accordingly, masking any bits otherwise would
> be known to be one.  This should safely preserve alignment info, which
> is the primary ifnormation that we keep in bits for pointers.
> 
> (*) There still may remain problems when a DECL resides on address
> zero (with -fno-delete-null-pointer-checks ...I hope it cannot happen
> otherwise).  I am looking into that now but I think it will be easier
> for everyone if I do so in a follow-up patch.
> 
> gcc/ChangeLog:
> 
> 2022-02-11  Martin Jambor  <mjam...@suse.cz>
> 
>       PR ipa/103083
>       * ipa-prop.h (ipa_ancestor_jf_data): New flag keep_null;
>       (ipa_get_jf_ancestor_keep_null): New function.
>       * ipa-prop.c (ipa_set_ancestor_jf): Initialize keep_null field of the
>       ancestor function.
>       (compute_complex_assign_jump_func): Pass false to keep_null
>       parameter of ipa_set_ancestor_jf.
>       (compute_complex_ancestor_jump_func): Pass true to keep_null
>       parameter of ipa_set_ancestor_jf.
>       (update_jump_functions_after_inlining): Carry over keep_null from the
>       original ancestor jump-function or merge them.
>       (ipa_write_jump_function): Stream keep_null flag.
>       (ipa_read_jump_function): Likewise.
>       (ipa_print_node_jump_functions_for_edge): Print the new flag.
>       * ipa-cp.c (class ipcp_bits_lattice): Make various getters const.  New
>       member function known_nonzero_p.
>       (ipcp_bits_lattice::known_nonzero_p): New.
>       (ipcp_bits_lattice::meet_with_1): New parameter drop_all_ones,
>       observe it.
>       (ipcp_bits_lattice::meet_with): Likewise.
>       (propagate_bits_across_jump_function): Simplify.  Pass true in
>       drop_all_ones when it is necessary.
>       (propagate_aggs_across_jump_function): Take care of keep_null
>       flag.
>       (ipa_get_jf_ancestor_result): Propagate NULL accross keep_null
>       jump functions.
> 
> gcc/testsuite/ChangeLog:
> 
> 2021-11-25  Martin Jambor  <mjam...@suse.cz>
> 
>       * gcc.dg/ipa/pr103083-1.c: New test.
>       * gcc.dg/ipa/pr103083-2.c: Likewise.

OK,
thanks!
Honza

Reply via email to