aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
authorJoseph Huber <huberjn@outlook.com>2024-10-04 06:12:50 -0700
committerGitHub <noreply@github.com>2024-10-04 06:12:50 -0700
commitd8f22514eb0b83f302872af4689d27dce67501fc (patch)
treeddc732a1202be4be8e3b6124ae0c9a809e6b8d17 /clang/lib/Frontend/CompilerInvocation.cpp
parent8d661fd9fd50fe4be9a9d5a8cc8f52f23925e7f6 (diff)
downloadllvm-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.cpp18
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,