On Tue, Oct 25, 2016 at 1:21 PM, Bin Cheng <[email protected]> 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?
Richard.
> Thanks,
> bin
>
> 2016-10-21 Bin Cheng <[email protected]>
>
> * match.pd ((convert (op:s (convert@2 @0) (convert?@3 @1)))): Add
> support for constant operand for OP.
>
> gcc/testsuite/ChangeLog
> 2016-10-21 Bin Cheng <[email protected]>
>
> * gcc.dg/fold-narrowbopcst-1.c: New test.