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
