On Wed, Nov 23, 2016 at 12:04 PM, Bin.Cheng <amker.ch...@gmail.com> wrote: > On Wed, Nov 23, 2016 at 10:51 AM, Richard Biener > <richard.guent...@gmail.com> wrote: >> On Wed, Nov 23, 2016 at 11:40 AM, Bin.Cheng <amker.ch...@gmail.com> wrote: >>> On Wed, Nov 23, 2016 at 10:29 AM, Richard Biener >>> <richard.guent...@gmail.com> wrote: >>>> On Fri, Nov 18, 2016 at 11:20 AM, Bin Cheng <bin.ch...@arm.com> wrote: >>>>> Hi, >>>>> This is a rework of >>>>> https://gcc.gnu.org/ml/gcc-patches/2016-10/msg02005.html. According to >>>>> review comment, I extended the original patch and made it covering last >>>>> kind simplification of fold_cond_expr_with_comparison (Well, this patch >>>>> handles <, <=, > and >=. == will be handled by a follow up). This patch >>>>> also adds several tests, some tests are for existing >>>>> fold_cond_expr_with_comparison simplification but not covered yet; others >>>>> are for new extension. >>>>> Bootstrap and test on x86_64 and AArch64 along with following patches, is >>>>> it OK? >>>> >>>> I think you don't need the explicit types in the result >>>> >>>> + (if (code == MAX_EXPR) >>>> + (convert (max @1 (convert:from_type @2))) >>>> + (if (code == MIN_EXPR) >>>> + (convert (min @1 (convert:from_type @2)))))))) >>>> >>>> A simple (convert (max @1 (convert @2))) should work. >>> Hi Richiard, could you explain about this more please? If convert2 >>> appears in the code, @2 would be of type after conversion? >> >> You convert to TREE_TYPE (@1), this is what genmatch auto-guesses >> if you just write (min @1 (convert @2)) > Now I found a bug in the patch? The pattern is: > (cond (cmp@0 (convert1? @1) INTEGER_CST@3) (convert2? @1) INTEGER_CST@2) > So the default type derived is the result type of the top expression. > It could be the promoted type if convert2 appears. So something like: > > + (if (code == MAX_EXPR) > + (max @1 (convert:from_type @2)) > + (if (code == MIN_EXPR) > + (min @1 (convert:from_type @2)))))))
But @1 may be converted via convert2 and thus TREE_TYPE (@1) != type so you do need the outermost convert. You still do not need the ':from_type' type specifier. Richard. > ? > > Thanks, > bin >> >>> >>> Thanks, >>> bin >>>> >>>> Otherwise ok. >>>> >>>> Thanks, >>>> Richard. >>>> >>>>> Thanks, >>>>> bin >>>>> >>>>> 2016-11-16 Bin Cheng <bin.ch...@arm.com> >>>>> >>>>> * fold-const.c (fold_cond_expr_with_comparison): Move >>>>> simplification >>>>> for A cmp C1 ? A : C2 to below, also simplify remaining code. >>>>> * match.pd: Move and extend simplification from above to here: >>>>> (cond (cmp (convert1? x) c1) (convert2? x) c2) -> (minmax (x c)). >>>>> * tree-if-conv.c (ifcvt_follow_ssa_use_edges): New func. >>>>> (predicate_scalar_phi): Call fold_stmt using the new valueize >>>>> func. >>>>> >>>>> gcc/testsuite/ChangeLog >>>>> 2016-11-16 Bin Cheng <bin.ch...@arm.com> >>>>> >>>>> * gcc.dg/fold-cond_expr-1.c: New test. >>>>> * gcc.dg/fold-condcmpconv-1.c: New test. >>>>> * gcc.dg/fold-condcmpconv-2.c: New test. >>>>> * gcc.dg/tree-ssa/pr66726.c: Adjust test strings.