On 11/09/2015 02:28 PM, Jason Merrill wrote: > On 11/09/2015 04:08 AM, Richard Biener wrote: >> On Mon, 9 Nov 2015, Jason Merrill wrote: >> >>> I'm planning to merge the C++ delayed folding branch this week, but I >>> need to >>> get approval of the back end changes (the first patch attached). >>> Most of >>> these are the introduction of non-folding variants of convert_to_*, >>> but there >>> are a few others. >>> >>> One question: The branch changes 'convert' to not fold its result, >>> and it's >>> not clear to me whether that's part of the expected behavior of a >>> front end >>> 'convert' function or not. >> >> History. convert is purely frontend (but shared, unfortunately between >> all frontends). I would expect that FEs that do not do delayed folding >> expect convert to fold. >> >>> Also, I'm a bit uncertain about merging this at the end of stage 1, >>> since it's >>> a large internal change with relatively small user impact; it just >>> improves >>> handling of constant expression corner cases. I'm inclined to go >>> ahead with >>> it at this point, but I'm interested in contrary opinions. >> >> I welcome this change as it should allow cleaning up the FE-middle-end >> interface a bit more. It should be possible to remove all >> NON_LVALUE_EXPR adding/removal from the middle-end folders. >> >> Looks like the backend patch included frontend parts but as far as I >> skimmed it only >> >> diff --git a/gcc/fold-const.c b/gcc/fold-const.c >> index 5e32901..d754a90 100644 >> --- a/gcc/fold-const.c >> +++ b/gcc/fold-const.c >> @@ -2091,6 +2091,17 @@ fold_convert_const (enum tree_code code, tree >> type, >> tree arg1) >> else if (TREE_CODE (arg1) == REAL_CST) >> return fold_convert_const_fixed_from_real (type, arg1); >> } >> + else if (TREE_CODE (type) == VECTOR_TYPE) >> + { >> + if (TREE_CODE (arg1) == VECTOR_CST >> + && TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE >> (arg1)) >> + && TYPE_VECTOR_SUBPARTS (type) == VECTOR_CST_NELTS (arg1)) >> + { >> + tree r = copy_node (arg1); >> + TREE_TYPE (arg1) = type; >> + return r; >> + } >> + } >> >> >> looks suspicious. The issue here is that the vector elements will >> have the wrong type after this simple handling. > > I was aiming to just handle simple cv-qualifier changes; that's why the > TYPE_MAIN_VARIANT comparison is there. > >> If you fix that you can as well handle all kind of element type >> changes via recursing to fold_convert_const (that includes >> float to int / int to float changes). > > But I'll try this. Like so? Jason