On Fri, Oct 23, 2015 at 2:57 PM, Nathan Sidwell <nat...@acm.org> wrote: > On 10/23/15 04:25, Jakub Jelinek wrote: >> >> On Thu, Oct 22, 2015 at 02:06:54PM -0400, Nathan Sidwell wrote: >>> >>> On 10/22/15 10:26, Richard Biener wrote: >>>> >>>> On Thu, Oct 22, 2015 at 4:01 PM, Nathan Sidwell <nat...@acm.org> wrote: >>>>> >>>>> On 10/22/15 04:07, Richard Biener wrote: >>>>> >>>>>> Yeah, please make them either end or start a BB so we have to check >>>>>> at most a single stmt. ECF_RETURNS_TWICE should achieve that, >>>>>> it also makes it a code motion barrier. >>>>> >>>>> >>>>> >>>>> Just so I'm clear, you're not saying that RETURNS_TWICE will stop the >>>>> call >>>>> being duplicated though? >>>> >>>> >>>> It will in practice. RETURNS_TWICE will get you an abnormal edge from >>>> entry (I think) >>> >>> >>> Won't that interfere with the OMP machinery, which expects correctly >>> nested >>> loops? (no in-to or out-of loop jumps) >> >> >> I bet it will, the region with the abnormal edges is no longer SESE. > > > Hm, it seems like a bad plan to try RETURNS_TWICE then. > > >> If you want to force end of a BB after the IFN_UNIQUE call, then you can >> just >> gimple_call_set_ctrl_altering (gcall, true); >> on it, and probably tweak gimple_call_initialize_ctrl_altering >> so that it does that by default. Plus of course split the blocks after it >> when you emit it. > > > IIUC this won't require RETURNS_TWICE, correct? We're generate these seqs > to a gimple sequence that eventually gets attached to the graph at the end > of lower omp_for with: > > gimple_bind_set_body (new_stmt, body); > gimple_omp_set_body (stmt, NULL); > gimple_omp_for_set_pre_body (stmt, NULL); > > Presumably that sequence will have to be split in the manner you describe > somewhere else. Not sure where that might be? > > Any thoughts on the approach of adding a flag to struct function, and having > tracer to skip such functions?
It's a hack. I don't like hacks. I think the requirement "don't duplicate me" but inlining is ok is somewhat broken. The requirement seems to be sth like the "important" paris of such functions need to dominate/post-dominate each other (technically not even in the same function)? Richard. > nathan