On Mon, 9 Nov 2015, Jason Merrill wrote: > 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?
Yes. Thanks, Richard.