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?

Richard.

> Thanks,
> bin
>
> 2016-10-21  Bin Cheng  <bin.ch...@arm.com>
>
>         * 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  <bin.ch...@arm.com>
>
>         * gcc.dg/fold-narrowbopcst-1.c: New test.

Reply via email to