lfmeadow wrote:

I narrowed it as offered. `norecurse` now stays on the `target` and `teams` 
bodies, which the runtime enters once and never calls back into, and comes off 
only the `parallel` bodies and the GPU data sharing wrapper, where a nested 
region really does put the function in a cycle. So the answer to "is it load 
bearing" is that the sound half is kept, and for a program whose parallel 
regions do not nest `function-attrs` infers it on the parallel bodies too.

The price is that the parallel bodies no longer share an attribute group with 
the enclosing `teams`/`target` body, which renumbers the groups in 107 
autogenerated combined-construct tests. Those files are pure `#[[ATTR1]]` to 
`#[[ATTR3]]` churn from `update_cc_test_checks.py`; the only hand-written 
changes are `amdgcn-attributes.cpp`, which is back to its original text, and 
one hardcoded `#2` in `reduction_complex.c` that I turned into a regex.

One case I left alone: `.omp_task_entry.` in `emitTaskProxyFunction` also gets 
`norecurse` explicitly, and the runtime re-enters it for the undeferred-task 
path the same way, so it has the same exposure. It is not what I was chasing, 
so I would rather not fold it in here unless you want it.

https://github.com/llvm/llvm-project/pull/218862
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to