On Thu, Oct 15 2020, Martin Liška wrote: > Hello. > > As mentioned in the PR, since 74ca1c01d02e548f32aa26f9a887dcc0730703fb we > wrongly > merge a pair of VRP ranges with a different TREE_TYPE (in the PR one is char > and second > one is short). Then we merge 2 ranges and make an anti-range and bad things > happen. > > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > > Ready to be installed? > Thanks, > Martin > > gcc/ChangeLog: > > PR ipa/97404 > * ipa-prop.c (struct ipa_vr_ggc_hash_traits): > Compare types of VRP min and max as we can merge ranges of > different types. > > gcc/testsuite/ChangeLog: > > PR ipa/97404 > * gcc.c-torture/execute/pr97404.c: New test. > --- > gcc/ipa-prop.c | 6 +++- > gcc/testsuite/gcc.c-torture/execute/pr97404.c | 28 +++++++++++++++++++ > 2 files changed, 33 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 63c652f4ffc..3d0ebefa4aa 100644 > --- a/gcc/ipa-prop.c > +++ b/gcc/ipa-prop.c > @@ -123,7 +123,11 @@ struct ipa_vr_ggc_hash_traits : public ggc_cache_remove > <value_range *> > static bool > equal (const value_range *a, const value_range *b) > { > - return a->equal_p (*b); > + return (a->equal_p (*b) > + && types_compatible_p (TREE_TYPE (a->min ()), > + TREE_TYPE (b->min ())) > + && types_compatible_p (TREE_TYPE (a->max ()), > + TREE_TYPE (b->max ())));
I think the best check is: types_compatible_p (a->type (), b->type ()) ...which internally checks just the minima, but I understand the intention is that the types are the same or at least compatible. OK with that change. Thanks! Martin