https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111922
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- I don't know the IPA code enough to know whether different operand_type vs. param_type (in the !types_compatible_p sense) means just user bug (in that case returning VARYING is perfectly fine), or if it can happen also on valid code, where say caller has one type of argument and callee a different and there is an implicit (or explicit) cast in between the two. The latter case would be nice to get handled without giving up. I mean something like void foo (int x) { asm volatile ("" : "+r" (x)); } void bar (long x) { foo (x); } void baz (long x) { if (x < -42 || x >= 185) return; bar (x); } kind of thing (but making sure we don't inline and IPA-VRP tries to propagate something etc.).