On Thu, Oct 17, 2013 at 4:14 AM, Andrew Pinski <pins...@gmail.com> wrote: > On Wed, Oct 16, 2013 at 2:12 AM, Zhenqiang Chen > <zhenqiang.c...@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 <apin...@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.c...@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.c...@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.