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?
Thanks!
-Zhenqiang
ChangeLog:
2013-10-16 Zhenqiang Chen <[email protected]>
* 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 <[email protected]>
* 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.
ifcombine.patch
Description: Binary data
