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.