https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96482
--- Comment #20 from CVS Commits <cvs-commit at gcc dot gnu.org> --- The releases/gcc-10 branch has been updated by Martin Liska <mar...@gcc.gnu.org>: https://gcc.gnu.org/g:66780083a0e79e5cb7c3acc8665aa47be4084a67 commit r10-8614-g66780083a0e79e5cb7c3acc8665aa47be4084a67 Author: Martin Liska <mli...@suse.cz> Date: Wed Aug 12 09:21:51 2020 +0200 ipa: fix bit CPP when combined with IPA bit CP As mentioned in the PR, let's consider the following example: int __attribute__((noinline)) foo(int arg) { if (arg == 3) return 1; if (arg == 4) return 123; __builtin_unreachable (); } during WPA we find all calls of the function (yes the call with value 5 is UBSAN): Node: foo/0: param [0]: 5 [loc_time: 4, loc_size: 2, prop_time: 0, prop_size: 0] 3 [loc_time: 3, loc_size: 3, prop_time: 0, prop_size: 0] ctxs: VARIABLE Bits: value = 0x5, mask = 0x6 in LTRANS we have the following VRP info: # RANGE [3, 3] NONZERO 3 when we AND masks in get_default_value we end up with 6 & 3 = 2 (0x010). That means the only second (least significant bit) is unknown and value (5 = 0x101) & ~mask gives us either 7 (0x111) or 5 (0x101). That's why if (arg_2(D) == 3) gets optimized to false. gcc/ChangeLog: PR ipa/96482 * ipa-cp.c (ipcp_bits_lattice::meet_with_1): Drop value bits for bits that are unknown. (ipcp_bits_lattice::set_to_constant): Likewise. * tree-ssa-ccp.c (get_default_value): Add sanity check that IPA CP bit info has all bits set to zero in bits that are unknown. gcc/testsuite/ChangeLog: PR ipa/96482 * gcc.dg/ipa/pr96482.c: New test. (cherry picked from commit d58f078ce2d53e5dab6b3d0d5f960504268e1894)