On Wed, Oct 26, 2016 at 4:01 PM, Bin.Cheng <amker.ch...@gmail.com> wrote:
> On Tue, Oct 25, 2016 at 1:00 PM, Richard Biener
> <richard.guent...@gmail.com> wrote:
>> On Tue, Oct 25, 2016 at 1:21 PM, Bin Cheng <bin.ch...@arm.com> wrote:
>>> Hi,
>>> This is an update patch for 
>>> https://gcc.gnu.org/ml/gcc-patches/2016-10/msg00738.html .  In this 
>>> version, existing pattern (convert (op:s (convert@2 @0) (convert?@3 @1))) 
>>> is extended.  It allows narrowing of arithmetic operation which has 
>>> constant integer as its second operand.  It also simplifies next patch 
>>> handling cond_expr.
>>> Bootstrap and test on x86_64 and AArch64 for whole patch set.  Is it OK?
>>
>> +        && types_match (@0, type)
>> +        && (types_match (@0, @1)
>> +            /* Or the second operand must be constant integer.  */
>> +            || (@3 == @1
>> +                && types_match (@1, @2)
>> +                && TREE_CODE (@1) == INTEGER_CST)))
>>
>> So this fails to match the pattern if we get into it via valueization
>> and get, say,
>> (short)((int)a + (int)7).  I believe for plus and minus we're always safe so
>> I suggest to simply do
>>
>>   && (types_match (@0, @1)
>>         || TREE_CODE (@1) == INTEGER_CST)
>>
>>        (if (TYPE_OVERFLOW_WRAPS (TREE_TYPE (@0)))
>> -       (convert (op @0 @1))
>> +       (convert (op @0 (convert:type @1)))
>>
>> :type shouldn't be necessary -- it also shows the outer (convert ..)
>> is not required,
>> please remove it while you're here.
>>
>>         (with { tree utype = unsigned_type_for (TREE_TYPE (@0)); }
>> -        (convert (op (convert:utype @0) (convert:utype @1))))))))
>> +        (convert (op (convert:utype @0)
>> +                     (convert:utype (convert:type @1)))))))))
>>
>> Why do you need the intermediate conversion?
>
> Thanks for reviewing, updated patch attached.  Is it OK?

Ok.

Thanks,
Richard.

> Thanks,
> bin

Reply via email to