Re: [P1] [PATCH] [PR tree-optimization/80374] Do not try to convert integer_zero_node to undesirable types
On Mon, Apr 10, 2017 at 9:20 PM, Jeff Lawwrote: > > fold_convert can fail for certain types. It can fail either by returning a > error_mark_node or triggering a gcc_assert depending on the exact situation. > > Both are problematical. This patch checks that we can convert > integer_zero_node to the proper type before calling fold_convert. > > Bootstrapped and regression tested on x86_64. Installing on the trunk. I am testing the proper fix below (NULLPTR_TYPE is somewhat special...) Richard. Index: gcc/tree-ssa-dom.c === --- gcc/tree-ssa-dom.c (revision 246832) +++ gcc/tree-ssa-dom.c (working copy) @@ -701,13 +701,12 @@ derive_equivalences_from_bit_ior (tree n const_and_copies *const_and_copies, int recursion_limit) { - if (recursion_limit == 0 - || !fold_convertible_p (TREE_TYPE (name), integer_zero_node)) + if (recursion_limit == 0) return; if (TREE_CODE (name) == SSA_NAME) { - tree value = fold_convert (TREE_TYPE (name), integer_zero_node); + tree value = build_zero_cst (TREE_TYPE (name)); /* This records the equivalence for the toplevel object. */ record_equality (name, value, const_and_copies); > Jeff > > diff --git a/gcc/ChangeLog b/gcc/ChangeLog > index 6edad21..7db5359 100644 > --- a/gcc/ChangeLog > +++ b/gcc/ChangeLog > @@ -1,3 +1,10 @@ > +2017-04-10 Jeff Law > + > + PR tree-optimization/80374 > + * tree-ssa-dom.c (derive_equivalences_from_bit_ior): Do not try to > + record anything if we can not convert integer_zero_node to the > + desired type. > + > 2017-04-10 Bin Cheng > > PR tree-optimization/80153 > diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog > index b87d0ee..6ed3c99 100644 > --- a/gcc/testsuite/ChangeLog > +++ b/gcc/testsuite/ChangeLog > @@ -1,3 +1,8 @@ > +2017-04-10 Jeff Law > + > + PR tree-optimization/80374 > + * g++.dg/pr80374.c: New test. > + > 2017-04-10 Daniel Santos > > PR testsuite/79867 > diff --git a/gcc/testsuite/g++.dg/pr80374.C b/gcc/testsuite/g++.dg/pr80374.C > new file mode 100644 > index 000..b02b656 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/pr80374.C > @@ -0,0 +1,19 @@ > +void a (const char *, const char *, int, const char *) > + __attribute__ ((__noreturn__)); > +template > +void > +c () try > + { > +throw; > + } > +catch (b d) > + { > +if (d) > + a ("", "", 2, __PRETTY_FUNCTION__); > + } > +main () > +{ > + using e = decltype (nullptr); > + c (); > +} > + > diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c > index d2263bb..d9e5942 100644 > --- a/gcc/tree-ssa-dom.c > +++ b/gcc/tree-ssa-dom.c > @@ -701,7 +701,8 @@ derive_equivalences_from_bit_ior (tree name, > const_and_copies *const_and_copies, > int recursion_limit) > { > - if (recursion_limit == 0) > + if (recursion_limit == 0 > + || !fold_convertible_p (TREE_TYPE (name), integer_zero_node)) > return; > >if (TREE_CODE (name) == SSA_NAME) >
Re: [P1] [PATCH] [PR tree-optimization/80374] Do not try to convert integer_zero_node to undesirable types
On 2017.04.10 at 13:20 -0600, Jeff Law wrote: > > fold_convert can fail for certain types. It can fail either by returning a > error_mark_node or triggering a gcc_assert depending on the exact situation. > > Both are problematical. This patch checks that we can convert > integer_zero_node to the proper type before calling fold_convert. > > Bootstrapped and regression tested on x86_64. Installing on the trunk. I've fixed up the testcase: FAIL: g++.dg/pr80374.C -std=c++11 (test for excess errors) FAIL: g++.dg/pr80374.C -std=c++14 (test for excess errors) FAIL: g++.dg/pr80374.C -std=c++98 (test for excess errors) Committed as obvious. diff --git a/gcc/testsuite/g++.dg/pr80374.C b/gcc/testsuite/g++.dg/pr80374.C index b02b65629aef..83f778be638a 100644 --- a/gcc/testsuite/g++.dg/pr80374.C +++ b/gcc/testsuite/g++.dg/pr80374.C @@ -1,3 +1,5 @@ +// { dg-do compile } +// { dg-options "-O1 -std=c++11" } void a (const char *, const char *, int, const char *) __attribute__ ((__noreturn__)); template @@ -11,7 +13,8 @@ catch (b d) if (d) a ("", "", 2, __PRETTY_FUNCTION__); } -main () +void +foo () { using e = decltype (nullptr); c (); -- Markus
[P1] [PATCH] [PR tree-optimization/80374] Do not try to convert integer_zero_node to undesirable types
fold_convert can fail for certain types. It can fail either by returning a error_mark_node or triggering a gcc_assert depending on the exact situation. Both are problematical. This patch checks that we can convert integer_zero_node to the proper type before calling fold_convert. Bootstrapped and regression tested on x86_64. Installing on the trunk. Jeff diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6edad21..7db5359 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-04-10 Jeff Law+ + PR tree-optimization/80374 + * tree-ssa-dom.c (derive_equivalences_from_bit_ior): Do not try to + record anything if we can not convert integer_zero_node to the + desired type. + 2017-04-10 Bin Cheng PR tree-optimization/80153 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b87d0ee..6ed3c99 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-04-10 Jeff Law + + PR tree-optimization/80374 + * g++.dg/pr80374.c: New test. + 2017-04-10 Daniel Santos PR testsuite/79867 diff --git a/gcc/testsuite/g++.dg/pr80374.C b/gcc/testsuite/g++.dg/pr80374.C new file mode 100644 index 000..b02b656 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr80374.C @@ -0,0 +1,19 @@ +void a (const char *, const char *, int, const char *) + __attribute__ ((__noreturn__)); +template +void +c () try + { +throw; + } +catch (b d) + { +if (d) + a ("", "", 2, __PRETTY_FUNCTION__); + } +main () +{ + using e = decltype (nullptr); + c (); +} + diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index d2263bb..d9e5942 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -701,7 +701,8 @@ derive_equivalences_from_bit_ior (tree name, const_and_copies *const_and_copies, int recursion_limit) { - if (recursion_limit == 0) + if (recursion_limit == 0 + || !fold_convertible_p (TREE_TYPE (name), integer_zero_node)) return; if (TREE_CODE (name) == SSA_NAME)