Hi Richard, I checked that both test-cases from 23855 are sucessfully unswitched by proposed patch. I understand that it does not catch deeper loop nest as for (i=0; i<10; i++) for (j=0;j<n;j++) for (k=0;k<20;k++) ... but duplication of middle-loop does not look reasonable.
Here is dump for your second test-case: void foo(int *ie, int *je, double *x) { int i, j; for (j=0; j<*je; ++j) for (i=0; i<*ie; ++i) x[i+j] = 0.0; } grep -i unswitch t6.c.119t.unswitch ;; Unswitching outer loop Yuri. 2015-07-14 14:06 GMT+03:00 Richard Biener <richard.guent...@gmail.com>: > On Fri, Jul 10, 2015 at 12:02 PM, Yuri Rumyantsev <ysrum...@gmail.com> wrote: >> 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? > > I think this is > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=23855 > > as well. It has a patch adding a invariant loop guard hoisting > phase to loop-header copying. Yeah, it needs updating to > trunk again I suppose. It's always non-stage1 when I come > back to that patch. > > Your patch seems to be very specific and only handles outer > loops of innermost loops. > > Richard. > >> ChangeLog: >> 2015-07-10 Yuri Rumyantsev <ysrum...@gmail.com> >> >> * 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.