RFC: C++ delayed folding merge
Jason Merrill
jason@redhat.com
Mon Nov 9 19:28:00 GMT 2015
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.
> Not sure if we can even
> write a testcase for such conversions with the GCC vector extensions
> though.
Jason
More information about the Gcc-patches
mailing list