Hi All, Here is presented simple transformation which tries to hoist out of outer-loop a check on zero trip count for inner-loop. This is very restricted transformation since it accepts outer-loops with very simple cfg, as for example: acc = 0; for (i = 1; i <= m; i++) { for (j = 0; j < n; j++) if (l[j] == i) { v[j] = acc; acc++; }; acc <<= 1; } Note that degenerative outer loop (without inner loop) will be completely deleted as dead code. The main goal of this transformation was to convert outer-loop to form accepted by outer-loop vectorization (such test-case is also included to patch). Bootstrap and regression testing did not show any new failures. Is it OK for trunk? ChangeLog: 2015-07-10 Yuri Rumyantsev * tree-ssa-loop-unswitch.c: Include "tree-cfgcleanup.h" and "gimple-iterator.h", add prototype for tree_unswitch_outer_loop. (tree_ssa_unswitch_loops): Add invoke of tree_unswitch_outer_loop. (tree_unswitch_outer_loop): New function. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/unswitch-outer-loop-1.c: New test. * gcc.dg/vect/vect-outer-simd-3.c: New test.