This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Enhance ifcombine to recover non short circuit branches


On Wed, Oct 16, 2013 at 2:12 AM, Zhenqiang Chen
<zhenqiang.chen@linaro.org> wrote:
> Hi,
>
> The patch enhances ifcombine pass to recover some non short circuit
> branches. Basically, it will do the following transformation:
>
> Case 1:
>   if (cond1)
>     if (cond2)
> ==>
>   if (cond1 && cond2)
>
> Case 2:
>   if (cond1)
>     goto L1
>   if (cond2)
>     goto L1
> ==>
>   if (cond1 || cond2)
>     goto L1
>
> Case 3:
>   if (cond1)
>     goto L1
>   else
>     goto L2
> L1:
>   if (cond2)
>     goto L2
> ==>
>   if (invert (cond1) || cond2)
>     goto L2
>
> Case 4:
>   if (cond1)
>     goto L1
>   if (cond2)
>     goto L2
> L1:
> ==>
>   if (invert (cond1) && cond2)
>     goto L2
>
> Bootstrap on X86-64 and ARM.
>
> Two new FAILs in regression tests:
> gcc.dg/uninit-pred-8_b.c
> gcc.dg/uninit-pred-9_b.c
> uninit pass should be enhanced to handle more complex conditions. Will
> submit a bug to track it and fix it later.
>
> Is it OK for trunk?

I had a much simpler change which did basically the same from 4.7 (I
can update it if people think this is a better approach).

Thanks,
Andrew Pinski


    2012-09-29  Andrew Pinski  <apinski@cavium.com>

        * tree-ssa-ifcombine.c: Include rtl.h and tm_p.h.
        (ifcombine_ifandif): Handle cases where
        maybe_fold_and_comparisons fails, combining the branches
        anyways.
        (tree_ssa_ifcombine): Inverse the order of
        the basic block walk, increases the number of combinings.
        * Makefile.in (tree-ssa-ifcombine.o): Update dependencies.

        * testsuite/gcc.dg/tree-ssa/phi-opt-2.c: Expect zero ifs as the compiler
        produces a & b now.
        * testsuite/gcc.dg/tree-ssa/phi-opt-9.c: Use a function call
        to prevent conditional move to be used.
        * testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c: Remove check for
        "one or more intermediate".


>
> Thanks!
> -Zhenqiang
>
> ChangeLog:
> 2013-10-16  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
>
>         * fold-const.c (simple_operand_p_2): Make it global.
>         * tree.h (simple_operand_p_2): Declare it.
>         * tree-ssa-ifcombine.c: Include rtl.h and tm_p.h.
>         (bb_has_overhead_p, generate_condition_node,
>         ifcombine_ccmp): New functions.
>         (ifcombine_fold_ifandif): New function, extracted from
>         ifcombine_ifandif.
>         (ifcombine_ifandif): Call ifcombine_ccmp.
>         (tree_ssa_ifcombine_bb): Skip optimized bb.
>
> testsuite/ChangeLog
> 2013-10-16  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
>
>         * gcc.dg/tree-ssa/ssa-ifcombine-ccmp-1.c: New test case.
>         * gcc.dg/tree-ssa/ssa-ifcombine-ccmp-2.c: New test case.
>         * gcc.dg/tree-ssa/ssa-ifcombine-ccmp-3.c: New test case.
>         * gcc.dg/tree-ssa/ssa-ifcombine-ccmp-4.c: New test case.
>         * gcc.dg/tree-ssa/ssa-ifcombine-ccmp-5.c: New test case.
>         * gcc.dg/tree-ssa/ssa-ifcombine-ccmp-6.c: New test case.
>         * gcc.dg/tree-ssa/ssa-dom-thread-3.c: Updated.

Attachment: doifcombine.diff.txt
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]