From afcdd7b8ff51a7df885dc3fdf38be566a4c1fdbf Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Thu, 15 Oct 2020 14:57:31 +0200 Subject: [PATCH] IPA: compare VRP types. gcc/ChangeLog: PR ipa/97404 * ipa-prop.c (struct ipa_vr_ggc_hash_traits): Compare types of VRP as we can merge ranges of different types. gcc/testsuite/ChangeLog: PR ipa/97404 * gcc.c-torture/execute/pr97404.c: New test. (cherry picked from commit a86623902767122c71c7229150a8b8a79cbb3673) --- gcc/ipa-prop.c | 3 +- gcc/testsuite/gcc.c-torture/execute/pr97404.c | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr97404.c diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 40edee7951c..7c8aee20a88 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -122,7 +122,8 @@ struct ipa_vr_ggc_hash_traits : public ggc_cache_remove static bool equal (const value_range_base *a, const value_range_base *b) { - return a->equal_p (*b); + return (a->equal_p (*b) + && types_compatible_p (a->type (), b->type ())); } static void mark_empty (value_range_base *&p) diff --git a/gcc/testsuite/gcc.c-torture/execute/pr97404.c b/gcc/testsuite/gcc.c-torture/execute/pr97404.c new file mode 100644 index 00000000000..7e5ce231725 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr97404.c @@ -0,0 +1,28 @@ +/* PR ipa/97404 */ +/* { dg-additional-options "-fno-inline" } */ + +char a, b; +long c; +short d, e; +long *f = &c; +int g; +char h(signed char i) { return 0; } +static short j(short i, int k) { return i < 0 ? 0 : i >> k; } +void l(void); +void m(void) +{ + e = j(d | 9766, 11); + *f = e; +} +void l(void) +{ + a = 5 | g; + b = h(a); +} +int main() +{ + m(); + if (c != 4) + __builtin_abort(); + return 0; +} -- 2.28.0