Got it, thanks. (Now there are phi instead of if)
On Fri, Oct 10, 2014 at 6:18 PM, Richard Biener <richard.guent...@gmail.com> wrote: > On Fri, Oct 10, 2014 at 3:44 PM, Evgeniya Maenkova > <evgeniya.maenk...@gmail.com> wrote: >> Hi, >> could anyone clarify about predicated code motion in lim? >> >> After reading a TODO in /tree-ssa-loop-im.c (see [1]) I tried several >> examples, say [2]. However, in all of them the code was moved out of >> the loop successfully (either by pre or by lim, as in [2]). >> >> So my question is: what the author of this code did mean by >> "predicated code motion"? (what is the TODO) > > It means transforming > >> Thanks, >> >> Evgeniya >> >> [1] >> TODO: Support for predicated code motion. I.e. >> >> while (1) >> { >> if (cond) >> { >> a = inv; >> something; >> } >> } > > this to > > if (cond) > { > a= inv; > something; > } > while (1) > ; > > which is currently supported in a very limited way by emitting > this as > > a = cond ? inv : a; > > for at most two statements. As it executes stmts unconditionally > that way it is limited to non-trapping operations. > > Richard. > > >> [2] >> >> void foo(int cond, int inv) >> { >> >> int a; >> int i = 0; >> int j = 0; >> while (j++ < 100) { >> while (i++ < 2000) >> { >> if (j % 2) >> { >> a = 528*j; >> printf("Hey1%d %d", a, i);//something; >> } >> } >> >> } >> } >> >> lim: >> >> ;; Function foo (foo, funcdef_no=0, decl_uid=1394, cgraph_uid=0, >> symbol_order=0) >> >> foo (int cond, int inv) >> { >> int j; >> int i; >> int a; >> unsigned int j.0_12; >> unsigned int _13; >> unsigned int _18; >> unsigned int _21; >> >> <bb 2>: >> goto <bb 8>; >> >> <bb 3>: >> if (_13 != 0) >> goto <bb 4>; >> else >> goto <bb 10>; >> >> <bb 10>: >> goto <bb 5>; >> >> <bb 4>: >> printf ("Hey1%d %d", a_14, i_11); >> >> <bb 5>: >> >> <bb 6>: >> # i_1 = PHI <i_22(8), i_11(5)> >> i_11 = i_1 + 1; >> if (i_1 <= 1999) >> goto <bb 3>; >> else >> goto <bb 7>; >> >> <bb 7>: >> # i_20 = PHI <i_11(6)> >> j_9 = j_23 + 1; >> if (j_23 != 100) >> goto <bb 11>; >> else >> goto <bb 9>; >> >> <bb 11>: >> >> <bb 8>: >> # i_22 = PHI <i_20(11), 0(2)> >> # j_23 = PHI <j_9(11), 1(2)> >> j.0_12 = (unsigned int) j_23; >> _13 = j.0_12 & 1; >> _21 = (unsigned int) j_23; >> _18 = _21 * 528; >> a_14 = (int) _18; >> goto <bb 6>; >> >> <bb 9>: >> return; >> >> } >> >> >> However, in loopinit (the optimization before lim) there was no motion >> (So this was done by lim: >> <bb 4>: >> a_14 = j_23 * 528; >> printf ("Hey1%d %d", a_14, i_11); -- Thanks, Evgeniya perfstories.wordpress.com