[PATCH] Enhance ifcombine to recover non short circuit branches
Andrew Pinski
pinskia@gmail.com
Fri Oct 18 02:37:00 GMT 2013
On Thu, Oct 17, 2013 at 4:03 AM, Richard Biener
<richard.guenther@gmail.com> wrote:
> On Thu, Oct 17, 2013 at 4:14 AM, Andrew Pinski <pinskia@gmail.com> wrote:
>> 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).
>
> I like that more (note you can now use is_gimple_condexpr as predicate
> for force_gimple_operand).
Ok, with both this email and Jakub's email, I decided to port the
patch to the trunk but I ran into a bug in reassoc which I submitted
as PR 58775 (with a testcase which shows the issue without this
patch).
>
> With that we should be able to kill the fold-const.c transform?
I think so but I have never tested removing it.
Thanks,
Andrew Pinski
>
> Thanks,
> Richard.
>
>> 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.
More information about the Gcc-patches
mailing list