Do not run mir opts for targets with convergent ops and add convergent attribute by Flakebi · Pull Request #149637 · rust-lang/rust (original) (raw)
GPU targets have convergent operations that require careful handling
when running optimizations. E.g. they must not be duplicated.
An example convergent operation is a barrier/syncthreads.
We do not want to deal with convergent operations in mir optimizations,
so set the optimization level to 0 and skip all optimizations.
On targets with convergent operations, we need to add the convergent
attribute to all functions that run convergent operations. Following
clang, we can conservatively apply the attribute to all functions when
compiling for such a target and rely on LLVM optimizing away the
attribute in cases where it is not necessary.
The amdgpu and nvptx targets are marked as having convergent operations.
Fixes #137086, see this issue for details.
Tracking issue: #135024
cc @RDambrosio016 @kjetilkjeka for nvptx
cc @ZuseZ4