If-conversion currently lacks the ability to merge two basic blocks that are identical except for an input register that can be set up using a conditional move, and possibly some different local registers.
Cross-jumping lacks the ability to recognize that two blocks are equivalent when there are different local registers, and (for -Os) to find opportunities where setting up input registers will allow to do cross jumping. The problem has been discussed here: http://gcc.gnu.org/ml/gcc-patches/2004-01/msg03281.html http://gcc.gnu.org/ml/gcc-patches/2005-01/msg00672.html A patch against 4.0 20050218 has been posted here: http://gcc.gnu.org/ml/gcc-patches/2005-02/msg01066.html -- Summary: If-conversion can't match equivalent code, and cross- jumping only works for literal matches Product: gcc Version: 3.3 Status: UNCONFIRMED Keywords: missed-optimization, patch Severity: enhancement Priority: P2 Component: rtl-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: amylaar at gcc dot gnu dot org CC: gcc-bugs at gcc dot gnu dot org OtherBugsDependingO 17652 nThis: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20070