diff options
author | 2020-08-13 09:39:49 +0100 | |
---|---|---|
committer | 2020-08-13 09:39:49 +0100 | |
commit | c446f6f37e5a5f0867527acdb0b78333e3b70822 (patch) | |
tree | 3caff5b711ce71f3aa7f9c593e9176d66dad6a98 /10.2.0 | |
parent | 4.9.4: cut 2 patchset, fix config/esp path wi t-p1 (diff) | |
download | gcc-patches-c446f6f37e5a5f0867527acdb0b78333e3b70822.tar.gz gcc-patches-c446f6f37e5a5f0867527acdb0b78333e3b70822.tar.bz2 gcc-patches-c446f6f37e5a5f0867527acdb0b78333e3b70822.zip |
10.2.0:backport ipa-cp bit fix (PR/96482)
Reported-by: Johannes Hirte
Bug: https://bugs.gentoo.org/736685
Bug: https://gcc.gnu.org/PR96482
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
Diffstat (limited to '10.2.0')
-rw-r--r-- | 10.2.0/gentoo/35_all_ipa-fix-bit-CP.patch | 145 | ||||
-rw-r--r-- | 10.2.0/gentoo/README.history | 1 |
2 files changed, 146 insertions, 0 deletions
diff --git a/10.2.0/gentoo/35_all_ipa-fix-bit-CP.patch b/10.2.0/gentoo/35_all_ipa-fix-bit-CP.patch new file mode 100644 index 0000000..34a1fe0 --- /dev/null +++ b/10.2.0/gentoo/35_all_ipa-fix-bit-CP.patch @@ -0,0 +1,145 @@ +https://bugs.gentoo.org/736685 +https://gcc.gnu.org/PR96482 + +From 66780083a0e79e5cb7c3acc8665aa47be4084a67 Mon Sep 17 00:00:00 2001 +From: Martin Liska <mliska@suse.cz> +Date: Wed, 12 Aug 2020 09:21:51 +0200 +Subject: [PATCH] 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) +--- + gcc/ipa-cp.c | 3 +- + gcc/testsuite/gcc.dg/ipa/pr96482.c | 44 ++++++++++++++++++++++++++++++ + gcc/tree-ssa-ccp.c | 3 ++ + 3 files changed, 49 insertions(+), 1 deletion(-) + create mode 100644 gcc/testsuite/gcc.dg/ipa/pr96482.c + +--- a/gcc/ipa-cp.c ++++ b/gcc/ipa-cp.c +@@ -1010,7 +1010,7 @@ ipcp_bits_lattice::set_to_constant (widest_int value, widest_int mask) + { + gcc_assert (top_p ()); + m_lattice_val = IPA_BITS_CONSTANT; +- m_value = value; ++ m_value = wi::bit_and (wi::bit_not (mask), value); + m_mask = mask; + return true; + } +@@ -1047,6 +1047,7 @@ ipcp_bits_lattice::meet_with_1 (widest_int value, widest_int mask, + + widest_int old_mask = m_mask; + m_mask = (m_mask | mask) | (m_value ^ value); ++ m_value &= value; + + if (wi::sext (m_mask, precision) == -1) + return set_to_bottom (); +--- /dev/null ++++ b/gcc/testsuite/gcc.dg/ipa/pr96482.c +@@ -0,0 +1,44 @@ ++/* PR ipa/96482 */ ++/* { dg-do run } */ ++/* { dg-options "-O2 -flto" } */ ++/* { dg-require-effective-target lto } */ ++ ++int ++__attribute__((noinline)) ++foo(int arg) ++{ ++ if (arg == 3) ++ return 1; ++ if (arg == 4) ++ return 123; ++ ++ __builtin_unreachable (); ++} ++ ++int ++__attribute__((noinline)) ++baz(int x) ++{ ++ if (x != 0) ++ return foo(3); /* called */ ++ ++ return 1; ++} ++ ++int ++__attribute__((noinline)) ++bar(int x) ++{ ++ if (x == 0) ++ return foo(5); /* not executed */ ++ ++ return 1; ++} ++ ++int main(int argc, char **argv) ++{ ++ if (bar(argc) != baz(argc)) ++ __builtin_abort (); ++ ++ return 0; ++} +--- a/gcc/tree-ssa-ccp.c ++++ b/gcc/tree-ssa-ccp.c +@@ -306,6 +306,9 @@ get_default_value (tree var) + { + val.lattice_val = CONSTANT; + val.value = value; ++ widest_int ipa_value = wi::to_widest (value); ++ /* Unknown bits from IPA CP must be equal to zero. */ ++ gcc_assert (wi::bit_and (ipa_value, mask) == 0); + val.mask = mask; + if (nonzero_bits != -1) + val.mask &= extend_mask (nonzero_bits, +-- +2.28.0 + diff --git a/10.2.0/gentoo/README.history b/10.2.0/gentoo/README.history index 7cde6a3..49edda3 100644 --- a/10.2.0/gentoo/README.history +++ b/10.2.0/gentoo/README.history @@ -1,6 +1,7 @@ 2 TODO + 33_all_lto-O0-mix-ICE-ipa-PR96291.patch + 34_all_fundecl-ICE-PR95820.patch + + 35_all_ipa-fix-bit-CP.patch 1 23 July 2020 + 01_all_default-fortify-source.patch |