diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index 3c02fc17550ae..e68f3f2e0418e 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -915,11 +915,6 @@ class Driver { /// targets. mutable llvm::StringMap SYCLUniqueIDList; - /// Vector of Macros that need to be added to the Host compilation in a - /// SYCL based offloading scenario. These macros are gathered during - /// construction of the device compilations. - mutable std::vector SYCLTargetMacroArgs; - /// Vector of Macros related to Device Traits that need to be added to the /// device compilation in a SYCL based offloading scenario. These macros are /// gathered during creation of offloading device toolchains. @@ -991,17 +986,6 @@ class Driver { void createAppendedFooterInput(Action *&Input, Compilation &C, const llvm::opt::ArgList &Args) const; - /// addSYCLTargetMacroArg - Add the given macro to the vector of args to be - /// added to the host compilation step. - void addSYCLTargetMacroArg(const llvm::opt::ArgList &Args, - StringRef Macro) const { - SYCLTargetMacroArgs.push_back(Args.MakeArgString(Macro)); - } - /// getSYCLTargetMacroArgs - return the previously gathered macro target args. - llvm::ArrayRef getSYCLTargetMacroArgs() const { - return SYCLTargetMacroArgs; - } - /// setSYCLUniqueID - set the Unique ID that is used for all FE invocations /// when performing compilations for SYCL. void addSYCLUniqueID(StringRef UniqueID, StringRef FileName) const { diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 08b5ef94a5a3f..903cdf7c8126d 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -7266,6 +7266,9 @@ defm sycl_allow_device_image_dependencies: BoolOptionWithoutMarshalling<"f", "sy def fsycl_dump_device_code_EQ : Joined<["-"], "fsycl-dump-device-code=">, Flags<[NoXarchOption]>, HelpText<"Dump device code into the user provided directory.">; +def fno_spirv : Flag<["-"], "fno-spirv">, + HelpText<"Disable inclusion of default spir64 target when performing SYCL " + "offloading.">; } // let Group = sycl_Group // FIXME: -fsycl-explicit-simd is deprecated. remove it when support is dropped. diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index f5865d69df995..1688c7359db32 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -940,7 +940,10 @@ llvm::Triple Driver::getSYCLDeviceTriple(StringRef TargetArch, static bool addSYCLDefaultTriple(Compilation &C, SmallVectorImpl &SYCLTriples) { /// Returns true if a triple is added to SYCLTriples, false otherwise - if (!C.getDriver().isSYCLDefaultTripleImplied()) + if (C.getInputArgs().hasArg(options::OPT_fno_spirv)) + return false; + // No default triple with -fsycl-device-only + if (C.getInputArgs().hasArg(options::OPT_fsycl_device_only)) return false; if (C.getInputArgs().hasArg(options::OPT_fsycl_force_target_EQ)) return false; @@ -953,6 +956,12 @@ static bool addSYCLDefaultTriple(Compilation &C, if (SYCLTriple.isNVPTX() || SYCLTriple.isAMDGCN()) return false; } + // When SYCL Native is the only target, do not add the default triple. + if (SYCLTriples.size() == 1 && + driver::isSYCLNativeCPU( + C.getSingleOffloadToolChain()->getTriple(), + SYCLTriples[0])) + return false; // Check current set of triples to see if the default has already been set. for (const auto &SYCLTriple : SYCLTriples) { if (SYCLTriple.getSubArch() == llvm::Triple::NoSubArch && @@ -6651,6 +6660,7 @@ class OffloadingActionBuilder final { llvm::StringMap FoundNormalizedTriples; for (StringRef Val : SYCLTargetsValues->getValues()) { StringRef UserTargetName(Val); + bool GPUHasArch = false; if (auto ValidDevice = gen::isGPUTarget(Val)) { if (ValidDevice->empty()) // Unrecognized, we have already diagnosed this earlier; skip. @@ -6660,6 +6670,7 @@ class OffloadingActionBuilder final { C.getDriver().getSYCLDeviceTriple("spir64_gen"), ValidDevice->data()); UserTargetName = "spir64_gen"; + GPUHasArch = true; } else if (auto ValidDevice = gen::isGPUTarget(Val)) { if (ValidDevice->empty()) @@ -6687,9 +6698,13 @@ class OffloadingActionBuilder final { continue; } - llvm::Triple TT( - C.getDriver().getSYCLDeviceTriple(Val, SYCLTargetsValues)); - std::string NormalizedName = TT.normalize(); + llvm::Triple TT(C.getDriver().getSYCLDeviceTriple(UserTargetName)); + if (!isValidSYCLTriple(TT)) + continue; + std::string NormalizedName = + C.getDriver() + .getSYCLDeviceTriple(Val, SYCLTargetsValues) + .normalize(); // Make sure we don't have a duplicate triple. auto Duplicate = FoundNormalizedTriples.find(NormalizedName); @@ -6706,7 +6721,7 @@ class OffloadingActionBuilder final { SYCLfpgaTriple = true; // For user specified spir64_gen, add an empty device value as a // placeholder. - if (TT.getSubArch() == llvm::Triple::SPIRSubArch_gen) + if (TT.getSubArch() == llvm::Triple::SPIRSubArch_gen && !GPUHasArch) GpuArchList.emplace_back(TT, nullptr); } diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 30844a4d20db6..47391dfd89b77 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -5846,7 +5846,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, Macro = "-D__SYCL_TARGET_INTEL_X86_64__"; if (Macro.size()) { CmdArgs.push_back(Args.MakeArgString(Macro)); - D.addSYCLTargetMacroArg(Args, Macro); } }; addTargetMacros(RawTriple); @@ -5897,10 +5896,29 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-D_MT"); CmdArgs.push_back("-D_DLL"); } - // Add the SYCL target macro arguments that were generated during the - // device compilation step. - for (auto &Macro : D.getSYCLTargetMacroArgs()) - CmdArgs.push_back(Args.MakeArgString(Macro)); + // Add the host side macros. + // TODO: There is some code duplication for adding the macros for the + // host and device side, find a way to clean this up. + auto SYCLTCRange = C.getOffloadToolChains(); + for (auto TI = SYCLTCRange.first, TE = SYCLTCRange.second; TI != TE; + ++TI) { + auto TC = TI->second; + llvm::Triple SYCLTriple = TC->getTriple(); + SmallString<64> Macro; + if (SYCLTriple.getSubArch() == llvm::Triple::SPIRSubArch_gen || + SYCLTriple.isNVPTX() || SYCLTriple.isAMDGCN()) { + for (StringRef Arch : D.getOffloadArchs( + C, C.getArgs(), Action::OFK_SYCL, &*TC, true)) { + if (!SYCL::gen::getGenDeviceMacro(Arch).empty()) { + Macro = "-D"; + Macro += SYCL::gen::getGenDeviceMacro(Arch); + } + } + } else if (SYCLTriple.getSubArch() == llvm::Triple::SPIRSubArch_x86_64) + Macro = "-D__SYCL_TARGET_INTEL_X86_64__"; + if (Macro.size()) + CmdArgs.push_back(Args.MakeArgString(Macro)); + } if (Args.hasArg(options::OPT_fno_sycl_esimd_build_host_code)) CmdArgs.push_back("-fno-sycl-esimd-build-host-code"); } @@ -5996,7 +6014,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // Pass -fintelfpga to both the host and device SYCL compilations if set. CmdArgs.push_back("-fintelfpga"); } - const auto DeviceTraitsMacrosArgs = D.getDeviceTraitsMacrosArgs(); for (const auto &Arg : DeviceTraitsMacrosArgs) { CmdArgs.push_back(Arg); diff --git a/clang/test/Driver/sycl-early-device-link-old-model.cpp b/clang/test/Driver/sycl-early-device-link-old-model.cpp index 0e97a1353f0ad..acd8421a877da 100644 --- a/clang/test/Driver/sycl-early-device-link-old-model.cpp +++ b/clang/test/Driver/sycl-early-device-link-old-model.cpp @@ -3,7 +3,7 @@ // Behavior is restricted to spir64_gen targets for now. // Create object that contains final device image -// RUN: %clangxx -c -fno-sycl-rdc -fsycl --no-offload-new-driver -fsycl-targets=spir64_gen \ +// RUN: %clangxx -c -fno-sycl-rdc -fsycl --no-offload-new-driver -fsycl-targets=spir64_gen -fno-spirv \ // RUN: --target=x86_64-unknown-linux-gnu -Xsycl-target-backend \ // RUN: "-device skl" --sysroot=%S/Inputs/SYCL -### %s 2>&1 \ // RUN: | FileCheck %s -check-prefix=CREATE_IMAGE @@ -20,7 +20,7 @@ // CREATE_IMAGE: clang{{.*}} "-fsycl-is-host"{{.*}} "-o" "[[HOST_OBJECT:.+\.o]]" // CREATE_IMAGE: clang-offload-bundler{{.*}} "-targets=sycl-spir64_gen_image-unknown-unknown,host-x86_64-unknown-linux-gnu" "-output={{.*}}" "-input=[[DEVICE_OBJECT]]" "-input=[[HOST_OBJECT]]" -// RUN: %clangxx -c -fno-sycl-rdc -fsycl --no-offload-new-driver -fsycl-targets=spir64_gen \ +// RUN: %clangxx -c -fno-sycl-rdc -fsycl --no-offload-new-driver -fsycl-targets=spir64_gen -fno-spirv \ // RUN: --target=x86_64-unknown-linux-gnu -Xsycl-target-backend \ // RUN: "-device skl" --sysroot=%S/Inputs/SYCL -ccc-print-phases %s \ // RUN: -fsycl-instrument-device-code -fno-sycl-device-lib=all 2>&1 \ diff --git a/clang/test/Driver/sycl-offload-aot.cpp b/clang/test/Driver/sycl-offload-aot.cpp index 50b484b1f874d..d3eb4c756b94b 100644 --- a/clang/test/Driver/sycl-offload-aot.cpp +++ b/clang/test/Driver/sycl-offload-aot.cpp @@ -46,13 +46,13 @@ // CHK-FSYCL-TARGET-2X-ERROR-NOT: clang{{.*}} error: cannot deduce implicit triple value for '-Xsycl-target{{.*}}', specify triple using '-Xsycl-target{{.*}}=' /// Ahead of Time compilation for gen, cpu -// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fsycl-targets=spir64_gen-unknown-unknown %s 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fno-spirv -fsycl-targets=spir64_gen-unknown-unknown %s 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-GEN -// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fsycl-targets=spir64_gen %s 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fno-spirv -fsycl-targets=spir64_gen %s 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-GEN -// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fsycl-targets=spir64_x86_64-unknown-unknown %s 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fno-spirv -fsycl-targets=spir64_x86_64-unknown-unknown %s 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-CPU -// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fsycl-targets=spir64_x86_64 %s 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fno-spirv -fsycl-targets=spir64_x86_64 %s 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-CPU // CHK-PHASES-AOT: 0: input, "[[INPUT:.+\.cpp]]", c++, (host-sycl) // CHK-PHASES-AOT: 1: preprocessor, {0}, c++-cpp-output, (host-sycl) @@ -79,13 +79,13 @@ /// ########################################################################### /// Ahead of Time compilation for gen, cpu - tool invocation -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fsycl-targets=spir64_gen-unknown-unknown %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fno-spirv -fsycl-targets=spir64_gen-unknown-unknown %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-GEN -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fsycl-targets=spir64_x86_64-unknown-unknown %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fno-spirv -fsycl-targets=spir64_x86_64-unknown-unknown %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-CPU -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fsycl-targets=spir64_gen-unknown-unknown %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fno-spirv -fsycl-targets=spir64_gen-unknown-unknown %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-GEN -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fsycl-targets=spir64_x86_64-unknown-unknown %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fno-spirv -fsycl-targets=spir64_x86_64-unknown-unknown %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-CPU // CHK-TOOLS-GEN: clang{{.*}} "-triple" "spir64_gen-unknown-unknown" // CHK-TOOLS-CPU: clang{{.*}} "-triple" "spir64_x86_64-unknown-unknown" @@ -127,39 +127,39 @@ // RUN: | FileCheck -check-prefix=CHK-TOOLS-CPU-OPTS %s /// Check -Xsycl-target-backend option passing -// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_gen-unknown-unknown -Xsycl-target-backend "-DFOO1 -DFOO2" %s 2>&1 \ +// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fno-spirv -fsycl-targets=spir64_gen-unknown-unknown -Xsycl-target-backend "-DFOO1 -DFOO2" %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-TOOLS-GEN-OPTS %s // CHK-TOOLS-GEN-OPTS: ocloc{{.*}} "-output" {{.*}} "-output_no_suffix" {{.*}} "-DFOO1" "-DFOO2" // CHK-TOOLS-GEN-OPTS-NOT: clang-offload-wrapper{{.*}} "-compile-opts={{.*}} -// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown -Xsycl-target-backend "-DFOO1 -DFOO2" %s 2>&1 \ +// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fno-spirv -fsycl-targets=spir64_x86_64-unknown-unknown -Xsycl-target-backend "-DFOO1 -DFOO2" %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-TOOLS-CPU-OPTS %s // CHK-TOOLS-CPU-OPTS: opencl-aot{{.*}} "-DFOO1" "-DFOO2" // CHK-TOOLS-CPU-OPTS-NOT: clang-offload-wrapper{{.*}} "-compile-opts={{.*}} -// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown -Xsycl-target-backend "--bo='\"-DFOO1 -DFOO2\"'" %s 2>&1 \ +// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fno-spirv -fsycl-targets=spir64_x86_64-unknown-unknown -Xsycl-target-backend "--bo='\"-DFOO1 -DFOO2\"'" %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-TOOLS-CPU-OPTS3 %s // CHK-TOOLS-CPU-OPTS3: opencl-aot{{.*}} "--bo=\"-DFOO1 -DFOO2\"" -// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown -g -O0 -Xsycl-target-backend "-DFOO1 -DFOO2" %s 2>&1 \ +// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fno-spirv -fsycl-targets=spir64_x86_64-unknown-unknown -g -O0 -Xsycl-target-backend "-DFOO1 -DFOO2" %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-TOOLS-IMPLIED-OPTS-CPU %s -// RUN: %clang_cl -### -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown -Zi -Od -Xsycl-target-backend "-DFOO1 -DFOO2" -- %s 2>&1 \ +// RUN: %clang_cl -### -fsycl -fno-spirv -fsycl-targets=spir64_x86_64-unknown-unknown -Zi -Od -Xsycl-target-backend "-DFOO1 -DFOO2" -- %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-TOOLS-IMPLIED-OPTS-CPU %s // CHK-TOOLS-IMPLIED-OPTS-CPU: opencl-aot{{.*}} "--bo=-g -cl-opt-disable" "-DFOO1" "-DFOO2" -// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_gen-unknown-unknown -g -O0 -Xsycl-target-backend "-DFOO1 -DFOO2" %s 2>&1 \ +// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fno-spirv -fsycl-targets=spir64_gen-unknown-unknown -g -O0 -Xsycl-target-backend "-DFOO1 -DFOO2" %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-TOOLS-IMPLIED-OPTS-GEN %s // RUN: %clang_cl -### -fsycl -fsycl-targets=spir64_gen-unknown-unknown -Zi -Od -Xsycl-target-backend "-DFOO1 -DFOO2" -- %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-TOOLS-IMPLIED-OPTS-GEN %s // CHK-TOOLS-IMPLIED-OPTS-GEN: ocloc{{.*}} "-options" "-g -cl-opt-disable" "-DFOO1" "-DFOO2" /// Check -Xsycl-target-linker option passing -// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_gen-unknown-unknown -Xsycl-target-linker "-DFOO1 -DFOO2" %s 2>&1 \ +// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fno-spirv -fsycl-targets=spir64_gen-unknown-unknown -Xsycl-target-linker "-DFOO1 -DFOO2" %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-TOOLS-GEN-OPTS2 %s // CHK-TOOLS-GEN-OPTS2: ocloc{{.*}} "-output" {{.*}} "-output_no_suffix" {{.*}} "-DFOO1" "-DFOO2" // CHK-TOOLS-GEN-OPTS2-NOT: clang-offload-wrapper{{.*}} "-link-opts={{.*}} -// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown -Xsycl-target-linker "-DFOO1 -DFOO2" %s 2>&1 \ +// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fno-spirv -fsycl-targets=spir64_x86_64-unknown-unknown -Xsycl-target-linker "-DFOO1 -DFOO2" %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-TOOLS-CPU-OPTS2 %s // CHK-TOOLS-CPU-OPTS2: opencl-aot{{.*}} "-DFOO1" "-DFOO2" // CHK-TOOLS-CPU-OPTS2-NOT: clang-offload-wrapper{{.*}} "-link-opts=-DFOO1 -DFOO2" diff --git a/clang/test/Driver/sycl-offload-new-driver.c b/clang/test/Driver/sycl-offload-new-driver.c index e03709f97cb2a..0540dbcce3148 100644 --- a/clang/test/Driver/sycl-offload-new-driver.c +++ b/clang/test/Driver/sycl-offload-new-driver.c @@ -118,7 +118,7 @@ // CHK_PACKAGER_OPTS-SAME: {{.*}}triple=spir64-unknown-unknown,arch=,kind=sycl,compile-opts={{.*}}-spir64-opt,link-opts=-spir64-link-opt /// Check phases with multiple intel_gpu settings -// RUN: %clangxx --target=x86_64-unknown-linux-gnu -fsycl \ +// RUN: %clangxx --target=x86_64-unknown-linux-gnu -fno-spirv -fsycl \ // RUN: -fsycl-targets=intel_gpu_dg1,intel_gpu_pvc \ // RUN: --offload-new-driver -ccc-print-phases %s 2>&1 \ // RUN: | FileCheck -check-prefix=MULT_TARG_PHASES %s diff --git a/clang/test/Driver/sycl-offload-with-split.c b/clang/test/Driver/sycl-offload-with-split.c index c61b2981aca9b..ee3113e7015b1 100644 --- a/clang/test/Driver/sycl-offload-with-split.c +++ b/clang/test/Driver/sycl-offload-with-split.c @@ -7,9 +7,9 @@ /// ########################################################################### /// Ahead of Time compilation for gen, cpu - tool invocation -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl --offload-new-driver -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fsycl-device-code-split -fsycl-targets=spir64_gen-unknown-unknown %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-spirv --offload-new-driver -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fsycl-device-code-split -fsycl-targets=spir64_gen-unknown-unknown %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl --offload-new-driver -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fsycl-device-code-split -fsycl-targets=spir64_x86_64-unknown-unknown %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-spirv --offload-new-driver -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fsycl-device-code-split -fsycl-targets=spir64_x86_64-unknown-unknown %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT // CHK-TOOLS-AOT: clang{{.*}} "-fsycl-is-device"{{.*}} "-fsycl-int-header=[[INPUT1:.+\-header.+\.h]]" "-fsycl-int-footer={{.*}}"{{.*}} "-o" "[[OUTPUT1:.+\.bc]]" // CHK-TOOLS-AOT: clang-offload-packager{{.*}} diff --git a/clang/test/Driver/sycl-oneapi-gpu-intelgpu.cpp b/clang/test/Driver/sycl-oneapi-gpu-intelgpu.cpp index 2335d16d5cf64..b6aa27291164f 100644 --- a/clang/test/Driver/sycl-oneapi-gpu-intelgpu.cpp +++ b/clang/test/Driver/sycl-oneapi-gpu-intelgpu.cpp @@ -160,10 +160,8 @@ // RUN: FileCheck %s --check-prefixes=DEVICE,MACRO -DDEV_STR=ptl_u -DMAC_STR=PTL_U // RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_30_1_1 -### %s 2>&1 | \ // RUN: FileCheck %s --check-prefixes=DEVICE,MACRO -DDEV_STR=ptl_u -DMAC_STR=PTL_U -// MACRO: clang{{.*}} "-triple" "spir64_gen-unknown-unknown" -// MACRO: "-D__SYCL_TARGET_INTEL_GPU_[[MAC_STR]]__" -// MACRO: clang{{.*}} "-fsycl-is-host" -// MACRO: "-D__SYCL_TARGET_INTEL_GPU_[[MAC_STR]]__" +// MACRO-DAG: clang{{.*}} "-triple" "spir64_gen-unknown-unknown"{{.*}} "-D__SYCL_TARGET_INTEL_GPU_[[MAC_STR]]__" +// MACRO-DAG: clang{{.*}} "-fsycl-is-host"{{.*}} "-D__SYCL_TARGET_INTEL_GPU_[[MAC_STR]]__" // DEVICE: ocloc{{.*}} "-device" "[[DEV_STR]]" /// -fsycl-targets=spir64_x86_64 should set a specific macro @@ -171,10 +169,8 @@ // RUN: FileCheck %s --check-prefix=MACRO_X86_64 // RUN: %clang_cl -c -fsycl -fsycl-targets=spir64_x86_64 -### -- %s 2>&1 | \ // RUN: FileCheck %s --check-prefix=MACRO_X86_64 -// MACRO_X86_64: clang{{.*}} "-triple" "spir64_x86_64-unknown-unknown" -// MACRO_X86_64: "-D__SYCL_TARGET_INTEL_X86_64__" -// MACRO_X86_64: clang{{.*}} "-fsycl-is-host" -// MACRO_X86_64: "-D__SYCL_TARGET_INTEL_X86_64__" +// MACRO_X86_64-DAG: clang{{.*}} "-triple" "spir64_x86_64-unknown-unknown"{{.*}} "-D__SYCL_TARGET_INTEL_X86_64__" +// MACRO_X86_64-DAG: clang{{.*}} "-fsycl-is-host"{{.*}} "-D__SYCL_TARGET_INTEL_X86_64__" /// test for invalid intel arch // RUN: not %clangxx -c -fsycl -fsycl-targets=intel_gpu_bad -### %s 2>&1 | \ @@ -184,7 +180,7 @@ // BAD_INPUT: error: SYCL target is invalid: 'intel_gpu_bad' /// Test for proper creation of fat object -// RUN: %clangxx -c -fsycl -fsycl-targets=intel_gpu_skl \ +// RUN: %clangxx -c -fsycl -fno-spirv -fsycl-targets=intel_gpu_skl \ // RUN: -target x86_64-unknown-linux-gnu -### %s 2>&1 | \ // RUN: FileCheck %s --check-prefix=FATO // FATO: clang-offload-bundler{{.*}} "-type=o" @@ -192,7 +188,7 @@ /// Test for proper consumption of fat object // RUN: touch %t.o -// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_skl \ +// RUN: %clangxx -fsycl -fno-spirv -fsycl-targets=intel_gpu_skl \ // RUN: -target x86_64-unknown-linux-gnu -### %t.o 2>&1 | \ // RUN: FileCheck %s --check-prefix=CONSUME_FAT // CONSUME_FAT: clang-offload-bundler{{.*}} "-type=o" @@ -202,7 +198,7 @@ /// Test phases, BoundArch settings used for -device target. Additional /// offload action used for compilation and backend compilation. // RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_skl -fno-sycl-device-lib=all \ -// RUN: -fno-sycl-instrument-device-code \ +// RUN: -fno-sycl-instrument-device-code -fno-spirv \ // RUN: -target x86_64-unknown-linux-gnu -ccc-print-phases %s 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK_PHASES // CHECK_PHASES: 0: input, "[[INPUT:.+\.cpp]]", c++, (host-sycl) @@ -232,15 +228,13 @@ // RUN: -target x86_64-unknown-linux-gnu -### %s 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK_TOOLS_MIX // CHECK_TOOLS_MIX: clang{{.*}} "-triple" "spir64_gen-unknown-unknown" -// CHECK_TOOLS_MIX-NOT: "-D__SYCL_TARGET_INTEL_GPU{{.*}}" -// CHECK_TOOLS_MIX: clang{{.*}} "-triple" "spir64_gen-unknown-unknown" // CHECK_TOOLS_MIX: "-D__SYCL_TARGET_INTEL_GPU_DG1__" // CHECK_TOOLS_MIX: ocloc{{.*}} "-device" "dg1" // CHECK_TOOLS_MIX: ocloc{{.*}} "-device" "skl" /// Test phases when using both spir64_gen and intel_gpu* // RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_skl,spir64_gen \ -// RUN: -fno-sycl-device-lib=all -fno-sycl-instrument-device-code \ +// RUN: -fno-spirv -fno-sycl-device-lib=all -fno-sycl-instrument-device-code \ // RUN: -target x86_64-unknown-linux-gnu -ccc-print-phases %s 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK_PHASES_MIX // CHECK_PHASES_MIX: 0: input, "[[INPUT:.+\.cpp]]", c++, (host-sycl) @@ -291,13 +285,12 @@ // RUN: %clangxx -fsycl-targets=intel_gpu_dg1,spir64_x86_64,intel_gpu_skl \ // RUN: -fsycl -Xsycl-target-backend=spir64_x86_64 "-DCPU" \ // RUN: -Xsycl-target-backend=intel_gpu_dg1 "-DDG1" \ -// RUN: -Xsycl-target-backend=intel_gpu_skl "-DSKL2" \ +// RUN: -Xsycl-target-backend=intel_gpu_skl "-DSKL2" -fno-spirv \ // RUN: -fno-sycl-device-lib=all -fno-sycl-instrument-device-code \ // RUN: -target x86_64-unknown-linux-gnu -### %s 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK_TOOLS_BEOPTS_MIX // CHECK_TOOLS_BEOPTS_MIX: ocloc{{.*}} "-device" "dg1"{{.*}}"-DDG1" // CHECK_TOOLS_BEOPTS_MIX: opencl-aot{{.*}} "-DCPU" -// CHECK_TOOLS_BEOPTS_MIX-NOT: "-DDG1" // CHECK_TOOLS_BEOPTS_MIX: ocloc{{.*}} "-device" "skl"{{.*}}"-DSKL2" /// Check that target is passed to sycl-post-link for filtering diff --git a/clang/test/Driver/sycl-oneapi-gpu-nvidia.cpp b/clang/test/Driver/sycl-oneapi-gpu-nvidia.cpp index 26b0cf8812ffa..fb7e9f08c2000 100644 --- a/clang/test/Driver/sycl-oneapi-gpu-nvidia.cpp +++ b/clang/test/Driver/sycl-oneapi-gpu-nvidia.cpp @@ -35,7 +35,6 @@ // MACRO_NVIDIA: clang{{.*}} "-triple" "nvptx64-nvidia-cuda" // DEVICE_NVIDIA: llvm-foreach{{.*}} "--gpu-name" "[[DEV_STR]]" - /// test for invalid nvidia arch // RUN: not %clangxx -c -fsycl -fsycl-targets=nvidia_gpu_bad -### %s 2>&1 | \ // RUN: FileCheck %s --check-prefix=BAD_NVIDIA_INPUT diff --git a/sycl/doc/UsersManual.md b/sycl/doc/UsersManual.md index 48d1053d15aef..50cb22afb4bb4 100644 --- a/sycl/doc/UsersManual.md +++ b/sycl/doc/UsersManual.md @@ -426,6 +426,12 @@ and not recommended to use in production environment. When this option is used in conjunction with -fsycl, the driver will link against an alternate form of libsycl, libsycl-preview. +**`-fno-spirv`** + + By default, the use of -fsycl will always perform a device compilation + that targets spir64 for JIT compilation. Use -fno-spirv to disable this + behavior. + # Example: SYCL device code compilation To invoke SYCL device compiler set `-fsycl-device-only` flag.