[PATCH] Enhance ifcombine to recover non short circuit branches

Richard Biener richard.guenther@gmail.com
Thu Oct 17 11:14:00 GMT 2013


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).

With that we should be able to kill the fold-const.c transform?

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