diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 68b9a5dfea0dc..3fff583ec33f6 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2398,6 +2398,10 @@ def fsycl_device_code_split_esimd : Flag<["-"], "fsycl-device-code-split-esimd"> Flags<[CC1Option, CoreOption]>, HelpText<"Split SYCL and ESIMD kernels into separate modules">; def fno_sycl_device_code_split_esimd : Flag<["-"], "fno-sycl-device-code-split-esimd">, Flags<[CC1Option, CoreOption]>, HelpText<"Don't split SYCL and ESIMD kernels into separate modules">; +def fsycl_device_code_lower_esimd : Flag<["-"], "fsycl-device-code-lower-esimd">, + Flags<[CC1Option, CoreOption]>, HelpText<"Lower ESIMD-specific constructs">; +def fno_sycl_device_code_lower_esimd : Flag<["-"], "fno-sycl-device-code-lower-esimd">, + Flags<[CC1Option, CoreOption]>, HelpText<"Do not lower ESIMD-specific constructs">; defm sycl_id_queries_fit_in_int: OptInFFlag<"sycl-id-queries-fit-in-int", "Assume", "Do not assume", " that SYCL ID queries fit within MAX_INT.", [CC1Option,CoreOption], LangOpts<"SYCLValueFitInMaxInt">>; def fsycl_use_bitcode : Flag<["-"], "fsycl-use-bitcode">, Flags<[CC1Option, CoreOption]>, HelpText<"Use LLVM bitcode instead of SPIR-V in fat objects">; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 9af3c0690bda9..efce129e74600 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8321,6 +8321,9 @@ void SYCLPostLink::ConstructJob(Compilation &C, const JobAction &JA, if (TCArgs.hasFlag(options::OPT_fsycl_device_code_split_esimd, options::OPT_fno_sycl_device_code_split_esimd, true)) addArgs(CmdArgs, TCArgs, {"-split-esimd"}); + if (TCArgs.hasFlag(options::OPT_fsycl_device_code_lower_esimd, + options::OPT_fno_sycl_device_code_lower_esimd, false)) + addArgs(CmdArgs, TCArgs, {"-lower-esimd"}); } // specialization constants processing is mandatory auto *SYCLPostLink = llvm::dyn_cast(&JA); diff --git a/clang/test/Driver/sycl-offload-with-split.c b/clang/test/Driver/sycl-offload-with-split.c index bb4be0cf7a0b0..aa10720871a0b 100644 --- a/clang/test/Driver/sycl-offload-with-split.c +++ b/clang/test/Driver/sycl-offload-with-split.c @@ -316,3 +316,15 @@ // RUN: %clang_cl -### -fsycl -fintelfpga %s 2>&1 | FileCheck %s -check-prefixes=CHK-NO-ESIMD-SPLIT // CHK-ESIMD-SPLIT: sycl-post-link{{.*}} "-split-esimd" // CHK-NO-ESIMD-SPLIT-NOT: sycl-post-link{{.*}} "-split-esimd" + +// Check lowering of ESIMD device code. +// RUN: %clang -### -fsycl %s 2>&1 | FileCheck %s -check-prefixes=CHK-NO-ESIMD-LOWER +// RUN: %clang_cl -### -fsycl %s 2>&1 | FileCheck %s -check-prefixes=CHK-NO-ESIMD-LOWER +// RUN: %clang -### -fsycl -fsycl-device-code-lower-esimd %s 2>&1 | FileCheck %s -check-prefixes=CHK-ESIMD-LOWER +// RUN: %clang_cl -### -fsycl -fsycl-device-code-lower-esimd %s 2>&1 | FileCheck %s -check-prefixes=CHK-ESIMD-LOWER +// RUN: %clang -### -fsycl -fno-sycl-device-code-lower-esimd %s 2>&1 | FileCheck %s -check-prefixes=CHK-NO-ESIMD-LOWER +// RUN: %clang_cl -### -fsycl -fno-sycl-device-code-lower-esimd %s 2>&1 | FileCheck %s -check-prefixes=CHK-NO-ESIMD-LOWER +// RUN: %clang -### -fsycl -fintelfpga %s 2>&1 | FileCheck %s -check-prefixes=CHK-NO-ESIMD-LOWER +// RUN: %clang_cl -### -fsycl -fintelfpga %s 2>&1 | FileCheck %s -check-prefixes=CHK-NO-ESIMD-LOWER +// CHK-ESIMD-LOWER: sycl-post-link{{.*}} "-lower-esimd" +// CHK-NO-ESIMD-LOWER-NOT: sycl-post-link{{.*}} "-lower-esimd"