> 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