Hi, PR 84947 shows that when we LTO calls with type-mismatches, we can end up doing undefined shifts because we try to work with precision of types which do not have any.
Fixed basically in the same way as Martin proposed in Bugzilla, the patch below also updates the comment and dump message to reflect that there is another reason to bail out early. LTO-bootstrapped and tested on x86_64-linux, OK for trunk? Thanks, Martin 2018-03-29 Martin Liska <mli...@suse.cz> Martin Jambor <mjam...@suse.cz> PR ipa/84947 * ipa-cp.c (propagate_bits_across_jump_function): Bail out if param_type is not an integral or pointer type. --- gcc/ipa-cp.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index ee41a8d55b7..ec216010f2f 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -1811,14 +1811,16 @@ propagate_bits_across_jump_function (cgraph_edge *cs, int idx, struct ipa_node_params *callee_info = IPA_NODE_REF (callee); tree parm_type = ipa_get_type (callee_info, idx); - /* For K&R C programs, ipa_get_type() could return NULL_TREE. - Avoid the transform for these cases. */ - if (!parm_type) + /* For K&R C programs, ipa_get_type() could return NULL_TREE. Avoid the + transform for these cases. Similarly, we can have bad type mismatches + with LTO, avoid doing anything with those too. */ + if (!parm_type + || (!INTEGRAL_TYPE_P (parm_type) && !POINTER_TYPE_P (parm_type))) { if (dump_file && (dump_flags & TDF_DETAILS)) - fprintf (dump_file, "Setting dest_lattice to bottom, because" - " param %i type is NULL for %s\n", idx, - cs->callee->name ()); + fprintf (dump_file, "Setting dest_lattice to bottom, because type of " + "param %i of %s is NULL or unsuitable for bits propagation\n", + idx, cs->callee->name ()); return dest_lattice->set_to_bottom (); } -- 2.16.2