diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index ddad16d90a98b..ce8bc0c829521 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -327,6 +327,7 @@ def CUDA : LangOpt<"CUDA">; def SYCLIsDevice : LangOpt<"SYCLIsDevice">; def SYCL : LangOpt<"SYCLIsDevice">; def SYCLIsHost : LangOpt<"SYCLIsHost">; +def SYCLExplicitSIMD : LangOpt<"SYCLExplicitSIMD">; def HIP : LangOpt<"HIP">; def COnly : LangOpt<"", "!LangOpts.CPlusPlus">; def CPlusPlus : LangOpt<"CPlusPlus">; diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 600cf5188c077..61a808d5b5985 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -248,6 +248,7 @@ LANGOPT(SYCLStdLayoutKernelParams, 1, 0, "Enable standard layout requirement for LANGOPT(SYCLUnnamedLambda , 1, 0, "Allow unnamed lambda SYCL kernels") LANGOPT(SYCLVersion , 32, 0, "Version of the SYCL standard used") LANGOPT(DeclareSPIRVBuiltins, 1, 0, "Declare SPIR-V builtin functions") +LANGOPT(SYCLExplicitSIMD , 1, 0, "SYCL compilation with explicit SIMD extension") LANGOPT(HIPUseNewLaunchAPI, 1, 0, "Use new kernel launching API for HIP") diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 609afe1c58acb..b3a90fa16cfb9 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3550,6 +3550,10 @@ def fno_sycl : Flag<["-"], "fno-sycl">, Group, Flags<[CoreOption]>, HelpText<"Disable SYCL kernels compilation for device">; def sycl_std_EQ : Joined<["-"], "sycl-std=">, Group, Flags<[CC1Option, NoArgumentUnused, CoreOption]>, HelpText<"SYCL language standard to compile for.">, Values<"2017, 121, 1.2.1, sycl-1.2.1">; +def fsycl_esimd : Flag<["-"], "fsycl-explicit-simd">, Group, Flags<[CC1Option, NoArgumentUnused, CoreOption]>, + HelpText<"Enable SYCL explicit SIMD extension">; +def fno_sycl_esimd : Flag<["-"], "fno-sycl-explicit-simd">, Group, + HelpText<"Disable SYCL explicit SIMD extension">, Flags<[NoArgumentUnused, CoreOption]>; include "CC1Options.td" diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index d27a930d24aa7..b196b11575fee 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4124,6 +4124,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-fsycl"); CmdArgs.push_back("-fsycl-is-device"); CmdArgs.push_back("-fdeclare-spirv-builtins"); + + if (Args.hasFlag(options::OPT_fsycl_esimd, options::OPT_fno_sycl_esimd, + false)) + CmdArgs.push_back("-fsycl-explicit-simd"); // Pass the triple of host when doing SYCL auto AuxT = llvm::Triple(llvm::sys::getProcessTriple()); std::string NormalizedTriple = AuxT.normalize(); @@ -6145,6 +6149,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // doing the host pass. CmdArgs.push_back("-fsycl"); CmdArgs.push_back("-fsycl-is-host"); + + if (Args.hasFlag(options::OPT_fsycl_esimd, options::OPT_fno_sycl_esimd, + false)) + CmdArgs.push_back("-fsycl-explicit-simd"); } if (IsSYCLOffloadDevice && JA.getType() == types::TY_SYCL_Header) { // Generating a SYCL Header diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index ac9c5f81b863d..28020b45a5e5f 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -2556,6 +2556,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, << A->getAsString(Args) << A->getValue(); } } + Opts.SYCLExplicitSIMD = Args.hasArg(options::OPT_fsycl_esimd); } Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header); diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index f5bd8a32954f8..52f0ffc02c77d 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -1113,6 +1113,8 @@ static void InitializePredefinedMacros(const TargetInfo &TI, Builder.defineMacro("__SYCL_NVPTX__", "1"); } } + if (LangOpts.SYCLExplicitSIMD) + Builder.defineMacro("__SYCL_EXPLICIT_SIMD__", "1"); if (LangOpts.SYCLUnnamedLambda) Builder.defineMacro("__SYCL_UNNAMED_LAMBDA__", "1"); diff --git a/clang/test/Driver/sycl-esimd.cpp b/clang/test/Driver/sycl-esimd.cpp new file mode 100644 index 0000000000000..7629051966818 --- /dev/null +++ b/clang/test/Driver/sycl-esimd.cpp @@ -0,0 +1,10 @@ +/// Check that explicit SIMD extension is disabled by default: +// RUN: %clang -### %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-DEFAULT %s +// CHECK-DEFAULT-NOT: "-fsycl-explicit-simd" + +/// Check "-fsycl-explicit-simd" is passed when compiling for device and host: +// RUN: %clang -### -fsycl -fsycl-explicit-simd %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-SYCL-ESIMD %s +// CHECK-SYCL-ESIMD: "-cc1"{{.*}} "-fsycl-explicit-simd"{{.*}} +// CHECK-SYCL-ESIMD: "-cc1"{{.*}} "-fsycl-explicit-simd"{{.*}}