aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2020-08-12 09:21:51 +0200
committerGiuliano Belinassi <giuliano.belinassi@usp.br>2020-08-17 15:08:06 -0300
commitdb122305ddfab4977731e27e37f1b5a3ec9c4ffc (patch)
treea3ba8fdc80c79d287f5398e958be28265de3529f /gcc/fortran
parentc448b45c1d53e8b2a9903cc3df1dcb461e7d94e0 (diff)
downloadgcc-db122305ddfab4977731e27e37f1b5a3ec9c4ffc.zip
gcc-db122305ddfab4977731e27e37f1b5a3ec9c4ffc.tar.gz
gcc-db122305ddfab4977731e27e37f1b5a3ec9c4ffc.tar.bz2
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.
Diffstat (limited to 'gcc/fortran')
0 files changed, 0 insertions, 0 deletions