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