diff options
author | Joseph Huber <huberjn@outlook.com> | 2024-10-04 06:12:50 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-04 06:12:50 -0700 |
commit | d8f22514eb0b83f302872af4689d27dce67501fc (patch) | |
tree | ddc732a1202be4be8e3b6124ae0c9a809e6b8d17 /clang/lib/Frontend/CompilerInvocation.cpp | |
parent | 8d661fd9fd50fe4be9a9d5a8cc8f52f23925e7f6 (diff) | |
download | llvm-d8f22514eb0b83f302872af4689d27dce67501fc.zip llvm-d8f22514eb0b83f302872af4689d27dce67501fc.tar.gz llvm-d8f22514eb0b83f302872af4689d27dce67501fc.tar.bz2 |
[Clang] Automatically enable `-fconvergent-functions` on GPU targets (#111076)
Summary:
This patch causes us to respect the `-fconvergent-functions` and
`-fno-convergent-functions` options correctly. GPU targets should have
this set all the time, but we now offer `-fno-convergent-functions` to
opt-out if you want to test broken behavior. This munged about with a
lot of the old weird logic, but I don't think it makes any real changes.
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index a0291cc..db7c791 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -3687,10 +3687,10 @@ void CompilerInvocationBase::GenerateLangArgs(const LangOptions &Opts, if (Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200)) GenerateArg(Consumer, OPT_fblocks); - if (Opts.ConvergentFunctions && - !(Opts.OpenCL || (Opts.CUDA && Opts.CUDAIsDevice) || Opts.SYCLIsDevice || - Opts.HLSL)) + if (Opts.ConvergentFunctions) GenerateArg(Consumer, OPT_fconvergent_functions); + else + GenerateArg(Consumer, OPT_fno_convergent_functions); if (Opts.NoBuiltin && !Opts.Freestanding) GenerateArg(Consumer, OPT_fno_builtin); @@ -4106,9 +4106,12 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL && Opts.OpenCLVersion == 200); - Opts.ConvergentFunctions = Args.hasArg(OPT_fconvergent_functions) || - Opts.OpenCL || (Opts.CUDA && Opts.CUDAIsDevice) || - Opts.SYCLIsDevice || Opts.HLSL; + bool HasConvergentOperations = Opts.OpenMPIsTargetDevice || Opts.OpenCL || + Opts.CUDAIsDevice || Opts.SYCLIsDevice || + Opts.HLSL || T.isAMDGPU() || T.isNVPTX(); + Opts.ConvergentFunctions = + Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions, + HasConvergentOperations); Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding; if (!Opts.NoBuiltin) @@ -4164,9 +4167,6 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, bool IsTargetSpecified = Opts.OpenMPIsTargetDevice || Args.hasArg(options::OPT_fopenmp_targets_EQ); - Opts.ConvergentFunctions = - Opts.ConvergentFunctions || Opts.OpenMPIsTargetDevice; - if (Opts.OpenMP || Opts.OpenMPSimd) { if (int Version = getLastArgIntValue( Args, OPT_fopenmp_version_EQ, |