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?

nathan

Reply via email to