Question about fold C_MAYBE_CONST_EXPR expressions

Bin.Cheng amker.cheng@gmail.com
Mon Jul 25 07:29:00 GMT 2016


On Sun, Jul 24, 2016 at 11:04 PM, Prathamesh Kulkarni
<prathamesh.kulkarni@linaro.org> wrote:
> On 24 July 2016 at 21:26, Bin.Cheng <amker.cheng@gmail.com> wrote:
>> Hi,
>> I ran into a problem that C frontend (in function
>> build_conditional_expr) creates expression like (C_MAYBE_CONST_EXPR
>> (NULL, x + const)).  The inner expression (and its operands) have
>> unsigned int type.  After that, the expression needs to be casted to
>> result type which is unsigned short.  In this case,
>> convert_to_integer/convert_to_integer_1 doesn't fold into
>> C_MAYBE_CONST_EXPR and just returns (unsigned
>> short)(C_MAYBE_CONST_EXPR (NULL, x + const)), as a result, (unsigned
>> short)(x + const) won't be simplified as (unsigned short)x + const.
>> My questions are, 1) Is it possible to fold type conversion into
>> C_MAYBE_CONST_EXPR's inner expression in convert_to_integer_1?  2) If
>> not, looks like there are couple of places the mentioned fold can be
>> done, for example, after stripping C_MAYBE_CONST_EXPR and before (or
>> during) gimplify.  So which place is preferred?
> Sorry, I have a very silly question:
> I don't understand how the following transform
> (unsigned short) (x + const) to (unsigned short)x + const would be legal
> since the operands to PLUS_EXPR in latter case would have different types
> (unsigned short, unsigned) ?
> I suppose in GIMPLE (and GENERIC too?)
> we require rhs1 and rhs2 to have same types  ?
I skipped type information for the const operand, of course the const
will be converted to unsigned short which is the type for computation.

Thanks,
bin



More information about the Gcc mailing list