From 595b9cd8a7888f4298cb48462539c92f9fb7ad7b Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Mon, 18 Nov 2019 20:12:39 +0300 Subject: [PATCH 01/13] [SYCL][Driver] Add device code split job Signed-off-by: Mariya Podchishchaeva --- clang/include/clang/Driver/Action.h | 12 + clang/include/clang/Driver/Options.td | 4 + clang/include/clang/Driver/ToolChain.h | 2 + clang/include/clang/Driver/Types.def | 4 +- clang/lib/Driver/Action.cpp | 7 + clang/lib/Driver/Compilation.cpp | 4 +- clang/lib/Driver/Driver.cpp | 60 +++- clang/lib/Driver/ToolChain.cpp | 9 + clang/lib/Driver/ToolChains/Clang.cpp | 138 +++++++- clang/lib/Driver/ToolChains/Clang.h | 13 + clang/lib/Driver/ToolChains/SYCL.cpp | 99 ++++-- clang/lib/Driver/ToolChains/SYCL.h | 17 +- clang/test/Driver/sycl-offload-intelfpga.cpp | 39 ++- clang/test/Driver/sycl-offload-win.c | 11 +- clang/test/Driver/sycl-offload.c | 306 ++++++++++++------ llvm/tools/sycl-post-link/sycl-post-link.cpp | 24 +- .../function-pointers/fp-as-kernel-arg.cpp | 2 +- .../pass-fp-through-buffer.cpp | 2 +- 18 files changed, 589 insertions(+), 164 deletions(-) diff --git a/clang/include/clang/Driver/Action.h b/clang/include/clang/Driver/Action.h index d90c76e8738d2..b39362f693de5 100644 --- a/clang/include/clang/Driver/Action.h +++ b/clang/include/clang/Driver/Action.h @@ -75,6 +75,7 @@ class Action { OffloadWrapperJobClass, SPIRVTranslatorJobClass, SPIRCheckJobClass, + SYCLPostLinkJobClass, BackendCompileJobClass, JobClassFirst = PreprocessJobClass, @@ -667,6 +668,17 @@ class SPIRCheckJobAction : public JobAction { } }; +class SYCLPostLinkJobAction : public JobAction { + void anchor() override; + +public: + SYCLPostLinkJobAction(Action *Input, types::ID OutputType); + + static bool classof(const Action *A) { + return A->getKind() == SYCLPostLinkJobClass; + } +}; + class BackendCompileJobAction : public JobAction { void anchor() override; diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index c669c080b3e13..af44d7fcfc1da 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1822,6 +1822,10 @@ def fsycl_add_targets_EQ : CommaJoined<["-"], "fsycl-add-targets=">, Flags<[Driv HelpText<"Specify comma-separated list of triple and device binary image pairs to add to the final SYCL binary">; def fsycl_link_targets_EQ : CommaJoined<["-"], "fsycl-link-targets=">, Flags<[DriverOption, CC1Option, CoreOption]>, HelpText<"Specify comma-separated list of triples SYCL offloading targets to produce linked device images">; +def fno_sycl_device_code_split : Flag<["-"], "fno-sycl-device-code-split">, + Flags<[CC1Option, CoreOption]>, HelpText<"Do not perform SYCL device code split">; +def fsycl_one_kernel_per_module : Flag<["-"], "fsycl-one-kernel-per-module">, + Flags<[CC1Option, CoreOption]>, HelpText<"Emit a separate device module for each kernel">; def fsycl_use_bitcode : Flag<["-"], "fsycl-use-bitcode">, Flags<[CC1Option, CoreOption]>, HelpText<"Use LLVM bitcode instead of SPIR-V in fat objects">; def fno_sycl_use_bitcode : Flag<["-"], "fno-sycl-use-bitcode">, diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index 4fa00c9d0892f..45649b0b9e9a2 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -142,6 +142,7 @@ class ToolChain { mutable std::unique_ptr OffloadWrapper; mutable std::unique_ptr SPIRVTranslator; mutable std::unique_ptr SPIRCheck; + mutable std::unique_ptr SYCLPostLink; mutable std::unique_ptr BackendCompiler; Tool *getClang() const; @@ -154,6 +155,7 @@ class ToolChain { Tool *getOffloadWrapper() const; Tool *getSPIRVTranslator() const; Tool *getSPIRCheck() const; + Tool *getSYCLPostLink() const; Tool *getBackendCompiler() const; mutable std::unique_ptr SanitizerArguments; diff --git a/clang/include/clang/Driver/Types.def b/clang/include/clang/Driver/Types.def index dc2f5475f4582..e1e4c723ca82d 100644 --- a/clang/include/clang/Driver/Types.def +++ b/clang/include/clang/Driver/Types.def @@ -102,7 +102,9 @@ TYPE("hip-fatbin", HIP_FATBIN, INVALID, "hipfb", phases TYPE("spirv", SPIRV, INVALID, "spv", phases::Compile, phases::Backend, phases::Assemble, phases::Link) TYPE("sycl-header", SYCL_Header, INVALID, "h", phases::Compile, phases::Backend, phases::Assemble, phases::Link) TYPE("sycl-fatbin", SYCL_FATBIN, INVALID, nullptr, phases::Compile, phases::Backend, phases::Assemble, phases::Link) -TYPE("tempfilelist", Tempfilelist, INVALID, nullptr, phases::Compile, phases::Backend, phases::Assemble, phases::Link) +TYPE("tempfilelist", Tempfilelist, INVALID, "txt", phases::Compile, phases::Backend, phases::Assemble, phases::Link) +TYPE("tempirfilelist", TempIRfilelist, INVALID, "txt", phases::Compile, phases::Backend, phases::Assemble, phases::Link) +TYPE("tempentriesfilelist", TempEntriesfilelist, INVALID, "txt", phases::Compile, phases::Backend, phases::Assemble, phases::Link) TYPE("archive", Archive, INVALID, "a", phases::Compile, phases::Backend, phases::Assemble, phases::Link) TYPE("fpga-aocx", FPGA_AOCX, INVALID, "aocx", phases::Compile, phases::Backend, phases::Assemble, phases::Link) TYPE("fpga-aocr", FPGA_AOCR, INVALID, "aocr", phases::Compile, phases::Backend, phases::Assemble, phases::Link) diff --git a/clang/lib/Driver/Action.cpp b/clang/lib/Driver/Action.cpp index 6d92914dd8e81..062ef9216e15d 100644 --- a/clang/lib/Driver/Action.cpp +++ b/clang/lib/Driver/Action.cpp @@ -47,6 +47,8 @@ const char *Action::getClassName(ActionClass AC) { return "llvm-spirv"; case SPIRCheckJobClass: return "llvm-no-spir-kernel"; + case SYCLPostLinkJobClass: + return "sycl-post-link"; case BackendCompileJobClass: return "backend-compiler"; } @@ -443,6 +445,11 @@ void SPIRCheckJobAction::anchor() {} SPIRCheckJobAction::SPIRCheckJobAction(Action *Input, types::ID Type) : JobAction(SPIRCheckJobClass, Input, Type) {} +void SYCLPostLinkJobAction::anchor() {} + +SYCLPostLinkJobAction::SYCLPostLinkJobAction(Action *Input, types::ID Type) + : JobAction(SYCLPostLinkJobClass, Input, Type) {} + void BackendCompileJobAction::anchor() {} BackendCompileJobAction::BackendCompileJobAction(Action *Input, diff --git a/clang/lib/Driver/Compilation.cpp b/clang/lib/Driver/Compilation.cpp index 1b6cdc26b0e95..89f7622b50588 100644 --- a/clang/lib/Driver/Compilation.cpp +++ b/clang/lib/Driver/Compilation.cpp @@ -135,7 +135,9 @@ bool Compilation::CleanupFileList(const TempFileList &Files, for (const auto &File: Files) { // Temporary file lists contain files that need to be cleaned. The // file containing the information is also removed - if (File.second == types::TY_Tempfilelist) { + if (File.second == types::TY_Tempfilelist || + File.second == types::TY_TempIRfilelist || + File.second == types::TY_TempEntriesfilelist) { std::ifstream ListFile(File.first); if (ListFile) { // These are temporary files and need to be removed. diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index c8cf729b0369d..ee7bea02b7d4a 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -3195,9 +3195,12 @@ class OffloadingActionBuilder final { /// Flag to signal if the user requested device-only compilation. bool CompileDeviceOnly = false; - /// Flag to signal if the user requested the device object to be wrapped + /// Flag to signal if the user requested the device object to be wrapped. bool WrapDeviceOnlyBinary = false; + /// Flag to signal if the user requested do not perform device code split. + bool NoDeviceCodeSplit = false; + /// The SYCL actions for the current input. ActionList SYCLDeviceActions; @@ -3237,7 +3240,7 @@ class OffloadingActionBuilder final { phases::ID CurPhase, phases::ID FinalPhase, PhasesTy &Phases) override { - // FIXME: This adds the integrated header generation pass before the + // FIXME: This adds the integration header generation pass before the // Host compilation pass so the Host can use the header generated. This // can be improved upon to where the header generation and spv generation // is done in the same step. Currently, its not too efficient. @@ -3279,9 +3282,12 @@ class OffloadingActionBuilder final { SYCLLinkBinary = C.MakeAction(DeviceLinkAction, types::TY_Object); - } else - SYCLLinkBinary = C.MakeAction(SYCLLinkBinaryList, + } else { + auto Link = C.MakeAction(SYCLLinkBinaryList, types::TY_Image); + SYCLLinkBinary = C.MakeAction( + Link, types::TY_Image); + } // Remove the SYCL actions as they are already connected to an host // action or fat binary. @@ -3460,17 +3466,34 @@ class OffloadingActionBuilder final { if (!DeviceObjects.empty()) { // link and wrap the device binary, but do not perform the // backend compile. + // TODO: perform split here? auto *DeviceLinkAction = - C.MakeAction(DeviceObjects, types::TY_SPIRV); + C.MakeAction(DeviceObjects, types::TY_LLVM_BC); + auto *SPIRVTranslateAction = C.MakeAction( + DeviceLinkAction, types::TY_SPIRV); auto *DeviceWrappingAction = C.MakeAction( - DeviceLinkAction, types::TY_Object); + SPIRVTranslateAction, types::TY_Object); DA.add(*DeviceWrappingAction, **TC, /*BoundArch=*/nullptr, Action::OFK_SYCL); } continue; } auto *DeviceLinkAction = - C.MakeAction(LI, types::TY_SPIRV); + C.MakeAction(LI, types::TY_LLVM_BC); + ActionList WrapperInputs; + Action *SPIRVInput = DeviceLinkAction; + if (!NoDeviceCodeSplit) { + auto *SplitAction = C.MakeAction( + DeviceLinkAction, types::TY_TempIRfilelist); + auto *EntryGenAction = C.MakeAction( + DeviceLinkAction, types::TY_TempEntriesfilelist); + SPIRVInput = SplitAction; + WrapperInputs.push_back(EntryGenAction); + } + auto *SPIRVTranslateAction = C.MakeAction( + SPIRVInput, + (NoDeviceCodeSplit) ? types::TY_SPIRV : types::TY_Tempfilelist); + auto TT = SYCLTripleList[I]; bool SYCLAOTCompile = (TT.getSubArch() != llvm::Triple::NoSubArch && @@ -3480,21 +3503,27 @@ class OffloadingActionBuilder final { // After the Link, wrap the files before the final host link if (SYCLAOTCompile) { - types::ID OutType = types::TY_Image; - if (TT.getSubArch() == llvm::Triple::SPIRSubArch_fpga) - OutType = FPGAOutType; + types::ID OutType; + if (NoDeviceCodeSplit) { + OutType = types::TY_Image; + if (TT.getSubArch() == llvm::Triple::SPIRSubArch_fpga) + OutType = FPGAOutType; + } else + OutType = types::TY_Tempfilelist; // Do the additional Ahead of Time compilation when the specific // triple calls for it (provided a valid subarch). - auto *DeviceBECompileAction = - C.MakeAction(DeviceLinkAction, OutType); + auto *DeviceBECompileAction = C.MakeAction( + SPIRVTranslateAction, OutType); + WrapperInputs.push_back(DeviceBECompileAction); auto *DeviceWrappingAction = C.MakeAction( - DeviceBECompileAction, types::TY_Object); + WrapperInputs, types::TY_Object); DA.add(*DeviceWrappingAction, **TC, /*BoundArch=*/nullptr, Action::OFK_SYCL); } else { + WrapperInputs.push_back(SPIRVTranslateAction); auto *DeviceWrappingAction = C.MakeAction( - DeviceLinkAction, types::TY_Object); + WrapperInputs, types::TY_Object); DA.add(*DeviceWrappingAction, **TC, /*BoundArch=*/nullptr, Action::OFK_SYCL); } @@ -3538,6 +3567,7 @@ class OffloadingActionBuilder final { Arg *SYCLLinkTargets = Args.getLastArg( options::OPT_fsycl_link_targets_EQ); WrapDeviceOnlyBinary = Args.hasArg(options::OPT_fsycl_link_EQ); + NoDeviceCodeSplit = Args.hasArg(options::OPT_fno_sycl_device_code_split); // Device only compilation for -fsycl-link (no FPGA) and // -fsycl-link-targets CompileDeviceOnly = @@ -5407,7 +5437,7 @@ const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA, } else { TmpName = GetTemporaryPath(Split.first, Suffix); } - return C.addTempFile(C.getArgs().MakeArgString(TmpName)); + return C.addTempFile(C.getArgs().MakeArgString(TmpName), JA.getType()); } SmallString<128> BasePath(BaseInput); diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index cf7a5e5f06e5d..d2f00a98a3ae7 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -322,6 +322,12 @@ Tool *ToolChain::getSPIRCheck() const { return SPIRCheck.get(); } +Tool *ToolChain::getSYCLPostLink() const { + if (!SYCLPostLink) + SYCLPostLink.reset(new tools::SYCLPostLink(*this)); + return SYCLPostLink.get(); +} + Tool *ToolChain::getBackendCompiler() const { if (!BackendCompiler) BackendCompiler.reset(buildBackendCompiler()); @@ -370,6 +376,9 @@ Tool *ToolChain::getTool(Action::ActionClass AC) const { case Action::SPIRCheckJobClass: return getSPIRCheck(); + case Action::SYCLPostLinkJobClass: + return getSYCLPostLink(); + case Action::BackendCompileJobClass: return getBackendCompiler(); } diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index b690dc4a26a92..bd65510dd0e9d 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -6994,15 +6994,70 @@ void OffloadWrapper::ConstructJob(Compilation &C, const JobAction &JA, WrapperArgs.push_back( C.getArgs().MakeArgString(Twine("-kind=") + Twine(Kind))); + ArgStringList ForeachArgs; + for (const InputInfo &I : Inputs) { assert(I.isFilename() && "Invalid input."); - WrapperArgs.push_back(I.getFilename()); + std::string FileName(I.getFilename()); + if (I.getType() == types::TY_Tempfilelist || + I.getType() == types::TY_TempEntriesfilelist) { + ForeachArgs.push_back( + C.getArgs().MakeArgString("--in-file-list=" + FileName)); + ForeachArgs.push_back( + C.getArgs().MakeArgString("--in-replace=" + FileName)); + + if (I.getType() == types::TY_TempEntriesfilelist) { + WrapperArgs.push_back( + C.getArgs().MakeArgString("-entries=" + FileName)); + continue; + } + } + WrapperArgs.push_back(C.getArgs().MakeArgString(FileName)); } - C.addCommand(std::make_unique( + auto Cmd = std::make_unique( JA, *this, TCArgs.MakeArgString(getToolChain().GetProgramPath(getShortName())), - WrapperArgs, None)); + WrapperArgs, None); + if (!ForeachArgs.empty()) { + std::string ForeachOutName = + C.getDriver().GetTemporaryPath("wrapper-linker", "txt"); + const char *ForeachOutput = + C.addTempFile(C.getArgs().MakeArgString(ForeachOutName)); + SmallString<128> OutOpt("--out-file-list="); + OutOpt += ForeachOutput; + + // Construct llvm-foreach command. + // The llvm-foreach command looks like this: + // llvm-foreach --in-file-list=a.list --in-replace='{}' -- echo '{}' + ForeachArgs.push_back(C.getArgs().MakeArgString(OutOpt)); + ForeachArgs.push_back( + C.getArgs().MakeArgString("--out-replace=" + OutTmpName)); + ForeachArgs.push_back(C.getArgs().MakeArgString("--")); + + ForeachArgs.push_back(Cmd->getExecutable()); + for (auto &Arg : WrapperArgs) + ForeachArgs.push_back(Arg); + + SmallString<128> ForeachPath(C.getDriver().Dir); + llvm::sys::path::append(ForeachPath, "llvm-foreach"); + const char *Foreach = C.getArgs().MakeArgString(ForeachPath); + C.addCommand( + std::make_unique(JA, *this, Foreach, ForeachArgs, None)); + + // Construct llvm-link command. + SmallString<128> InOpt("@"); + InOpt += ForeachOutName; + ArgStringList LLVMLinkArgs{C.getArgs().MakeArgString("-o"), + WrapperFileName, + C.getArgs().MakeArgString(InOpt)}; + SmallString<128> LLVMLinkPath(C.getDriver().Dir); + llvm::sys::path::append(LLVMLinkPath, "llvm-link"); + const char *LLVMLink = C.getArgs().MakeArgString(LLVMLinkPath); + C.addCommand( + std::make_unique(JA, *this, LLVMLink, LLVMLinkArgs, None)); + } else + C.addCommand(std::move(Cmd)); // Construct llc command. // The output is an object file @@ -7084,6 +7139,7 @@ void SPIRVTranslator::ConstructJob(Compilation &C, const JobAction &JA, // The translator command looks like this: // llvm-spirv -o .spv .bc + ArgStringList ForeachArgs; ArgStringList TranslatorArgs; TranslatorArgs.push_back("-o"); @@ -7093,12 +7149,44 @@ void SPIRVTranslator::ConstructJob(Compilation &C, const JobAction &JA, TranslatorArgs.push_back("-spirv-ext=+all"); } for (auto I : Inputs) { + if (I.getType() == types::TY_TempIRfilelist) { + std::string FileName(I.getFilename()); + ForeachArgs.push_back( + C.getArgs().MakeArgString("--in-file-list=" + FileName)); + ForeachArgs.push_back( + C.getArgs().MakeArgString("--in-replace=" + FileName)); + ForeachArgs.push_back( + C.getArgs().MakeArgString("--out-ext=spv")); + } TranslatorArgs.push_back(I.getFilename()); } - C.addCommand(std::make_unique(JA, *this, + auto Cmd = std::make_unique(JA, *this, TCArgs.MakeArgString(getToolChain().GetProgramPath(getShortName())), - TranslatorArgs, None)); + TranslatorArgs, None); + + if (!ForeachArgs.empty()) { + // Construct llvm-foreach command. + // The llvm-foreach command looks like this: + // llvm-foreach a.list --out-replace=out "cp {} out" + // --out-file-list=list + std::string OutputFileName(Output.getFilename()); + ForeachArgs.push_back( + TCArgs.MakeArgString("--out-file-list=" + OutputFileName)); + ForeachArgs.push_back( + TCArgs.MakeArgString("--out-replace=" + OutputFileName)); + ForeachArgs.push_back(TCArgs.MakeArgString("--")); + ForeachArgs.push_back(TCArgs.MakeArgString(Cmd->getExecutable())); + + for (auto &Arg : Cmd->getArguments()) + ForeachArgs.push_back(Arg); + + SmallString<128> ForeachPath(C.getDriver().Dir); + llvm::sys::path::append(ForeachPath, "llvm-foreach"); + const char *Foreach = C.getArgs().MakeArgString(ForeachPath); + C.addCommand(std::make_unique(JA, *this, Foreach, ForeachArgs, None)); + } else + C.addCommand(std::move(Cmd)); } void SPIRCheck::ConstructJob(Compilation &C, const JobAction &JA, @@ -7128,3 +7216,43 @@ void SPIRCheck::ConstructJob(Compilation &C, const JobAction &JA, TCArgs.MakeArgString(getToolChain().GetProgramPath(getShortName())), CheckArgs, None)); } + +void SYCLPostLink::ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, + const InputInfoList &Inputs, + const llvm::opt::ArgList &TCArgs, + const char *LinkingOutput) const { + // Construct sycl-post-link command. + assert(isa(JA) && "Expecting SYCL post link job!"); + + // The split command looks like this: + // sycl-post-link input_file.ll -ir-files-list=ir.txt + // -txt-files-list=files.txt -o base_output + + ArgStringList CmdArgs; + InputInfo Input = Inputs.front(); + const char *InputFileName = Input.getFilename(); + + CmdArgs.push_back(InputFileName); + std::string OutputFileName(Output.getFilename()); + if (Output.getType() == types::TY_TempIRfilelist) + CmdArgs.push_back(TCArgs.MakeArgString("-ir-files-list=" + OutputFileName)); + else if (Output.getType() == types::TY_TempEntriesfilelist) + CmdArgs.push_back( + TCArgs.MakeArgString("-txt-files-list=" + OutputFileName)); + SmallString<128> TmpName; + llvm::sys::fs::createUniquePath("split-%%%%%%", TmpName, + /*MakeAbsolute*/ true); + CmdArgs.push_back(TCArgs.MakeArgString("-o")); + CmdArgs.push_back(TCArgs.MakeArgString(TmpName)); + + if (TCArgs.hasArg(options::OPT_fsycl_one_kernel_per_module)) + CmdArgs.push_back("-one-kernel"); + + // All the inputs are encoded as commands. + C.addCommand(std::make_unique( + JA, *this, + TCArgs.MakeArgString(getToolChain().GetProgramPath(getShortName())), + CmdArgs, None)); +} + diff --git a/clang/lib/Driver/ToolChains/Clang.h b/clang/lib/Driver/ToolChains/Clang.h index 3163513139428..a7dec20d8dbfa 100644 --- a/clang/lib/Driver/ToolChains/Clang.h +++ b/clang/lib/Driver/ToolChains/Clang.h @@ -191,6 +191,19 @@ class LLVM_LIBRARY_VISIBILITY SPIRCheck final : public Tool { const llvm::opt::ArgList &TCArgs, const char *LinkingOutput) const override; }; + +/// SYCL post-link device code processing tool. +class LLVM_LIBRARY_VISIBILITY SYCLPostLink final : public Tool { +public: + SYCLPostLink(const ToolChain &TC) + : Tool("SYCL post link", "sycl-post-link", TC) {} + + bool hasIntegratedCPP() const override { return false; } + void ConstructJob(Compilation &C, const JobAction &JA, + const InputInfo &Output, const InputInfoList &Inputs, + const llvm::opt::ArgList &TCArgs, + const char *LinkingOutput) const override; +}; } // end namespace tools } // end namespace driver diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index b8d2a3cfa6411..1b86d31c58ee8 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -53,6 +53,31 @@ const char *SYCL::Linker::constructLLVMSpirvCommand(Compilation &C, return OutputFileName; } +void SYCL::constructLLVMForeachCommand(Compilation &C, const JobAction &JA, + std::unique_ptr InputCommand, + ArgStringList &ForeachArgs, + const InputInfo &Output, const Tool *T) { + // Construct llvm-foreach command. + // The llvm-foreach command looks like this: + // llvm-foreach --in-file-list=a.list --in-replace='{}' -- echo '{}' + std::string OutputFileName(Output.getFilename()); + ForeachArgs.push_back( + C.getArgs().MakeArgString("--out-file-list=" + OutputFileName)); + ForeachArgs.push_back( + C.getArgs().MakeArgString("--out-replace=" + OutputFileName)); + ForeachArgs.push_back(C.getArgs().MakeArgString("--")); + ForeachArgs.push_back( + C.getArgs().MakeArgString(InputCommand->getExecutable())); + + for (auto &Arg : InputCommand->getArguments()) + ForeachArgs.push_back(Arg); + + SmallString<128> ForeachPath(C.getDriver().Dir); + llvm::sys::path::append(ForeachPath, "llvm-foreach"); + const char *Foreach = C.getArgs().MakeArgString(ForeachPath); + C.addCommand(std::make_unique(JA, *T, Foreach, ForeachArgs, None)); +} + const char *SYCL::Linker::constructLLVMLinkCommand(Compilation &C, const JobAction &JA, const InputInfo &Output, const ArgList &Args, StringRef SubArchName, StringRef OutputFilePrefix, bool ToBc, @@ -82,14 +107,8 @@ const char *SYCL::Linker::constructLLVMLinkCommand(Compilation &C, TranslateSYCLLinkerArgs(C, Args, getToolChain(), CmdArgs); // Add an intermediate output file. CmdArgs.push_back("-o"); - const char *OutputFileName = nullptr; - if (ToBc) { - SmallString<128> TmpName(C.getDriver().GetTemporaryPath( - OutputFilePrefix.str() + "-linked", "bc")); - OutputFileName = C.addTempFile(C.getArgs().MakeArgString(TmpName)); - CmdArgs.push_back(OutputFileName); - } else - CmdArgs.push_back(Output.getFilename()); + const char *OutputFileName = Output.getFilename(); + CmdArgs.push_back(OutputFileName); // TODO: temporary workaround for a problem with warnings reported by // llvm-link when driver links LLVM modules with empty modules CmdArgs.push_back("--suppress-warnings"); @@ -150,10 +169,8 @@ void SYCL::Linker::ConstructJob(Compilation &C, const JobAction &JA, } } - const char *LLVMLinkOutputFile = - constructLLVMLinkCommand(C, JA, Output, Args, SubArchName, Prefix, true, + constructLLVMLinkCommand(C, JA, Output, Args, SubArchName, Prefix, true, SpirvInputs); - constructLLVMSpirvCommand(C, JA, Output, Prefix, false, LLVMLinkOutputFile); } void SYCL::TranslateSYCLTargetArgs(Compilation &C, @@ -272,18 +289,27 @@ void SYCL::fpga::BackendCompiler::ConstructJob(Compilation &C, assert((getToolChain().getTriple().getArch() == llvm::Triple::spir || getToolChain().getTriple().getArch() == llvm::Triple::spir64) && "Unsupported target"); - assert((JA.getType() == types::TY_FPGA_AOCX || - JA.getType() == types::TY_FPGA_AOCR) && - "aoc type required"); + StringRef ForeachExt = "aocx"; ArgStringList CmdArgs{"-o", Output.getFilename()}; - for (const auto &II : Inputs) { - CmdArgs.push_back(II.getFilename()); - } + ArgStringList ForeachArgs; CmdArgs.push_back("-sycl"); if (Arg *A = Args.getLastArg(options::OPT_fsycl_link_EQ)) - if (A->getValue() == StringRef("early")) + if (A->getValue() == StringRef("early")) { CmdArgs.push_back("-rtl"); + ForeachExt = "aocr"; + } + + for (const auto &II : Inputs) { + if (II.getType() == types::TY_Tempfilelist) { + std::string FileName(II.getFilename()); + ForeachArgs.push_back( + C.getArgs().MakeArgString("--in-file-list=" + FileName)); + ForeachArgs.push_back( + C.getArgs().MakeArgString("--in-replace=" + FileName)); + } + CmdArgs.push_back(II.getFilename()); + } InputInfoList FPGADepFiles; for (auto *A : Args) { @@ -352,7 +378,13 @@ void SYCL::fpga::BackendCompiler::ConstructJob(Compilation &C, SmallString<128> ExecPath(getToolChain().GetProgramPath("aoc")); const char *Exec = C.getArgs().MakeArgString(ExecPath); - C.addCommand(std::make_unique(JA, *this, Exec, CmdArgs, None)); + auto Cmd = std::make_unique(JA, *this, Exec, CmdArgs, None); + if (!ForeachArgs.empty()) { + ForeachArgs.push_back(C.getArgs().MakeArgString("--out-ext=" + ForeachExt)); + constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachArgs, Output, + this); + } else + C.addCommand(std::move(Cmd)); } void SYCL::gen::BackendCompiler::ConstructJob(Compilation &C, @@ -365,8 +397,16 @@ void SYCL::gen::BackendCompiler::ConstructJob(Compilation &C, getToolChain().getTriple().getArch() == llvm::Triple::spir64) && "Unsupported target"); ArgStringList CmdArgs{"-output", Output.getFilename()}; + ArgStringList ForeachArgs; for (const auto &II : Inputs) { CmdArgs.push_back("-file"); + if (II.getType() == types::TY_Tempfilelist) { + std::string FileName(II.getFilename()); + ForeachArgs.push_back( + C.getArgs().MakeArgString("--in-file-list=" + FileName)); + ForeachArgs.push_back( + C.getArgs().MakeArgString("--in-replace=" + FileName)); + } CmdArgs.push_back(II.getFilename()); } // The next line prevents ocloc from modifying the image name @@ -375,7 +415,11 @@ void SYCL::gen::BackendCompiler::ConstructJob(Compilation &C, TranslateSYCLTargetArgs(C, Args, getToolChain(), CmdArgs); SmallString<128> ExecPath(getToolChain().GetProgramPath("ocloc")); const char *Exec = C.getArgs().MakeArgString(ExecPath); - C.addCommand(std::make_unique(JA, *this, Exec, CmdArgs, None)); + auto Cmd = std::make_unique(JA, *this, Exec, CmdArgs, None); + if (!ForeachArgs.empty()) + constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachArgs, Output, this); + else + C.addCommand(std::move(Cmd)); } void SYCL::x86_64::BackendCompiler::ConstructJob(Compilation &C, @@ -387,13 +431,26 @@ void SYCL::x86_64::BackendCompiler::ConstructJob(Compilation &C, ArgStringList CmdArgs; CmdArgs.push_back(Args.MakeArgString(Twine("-ir=") + Output.getFilename())); CmdArgs.push_back("-device=cpu"); + ArgStringList ForeachArgs; for (const auto &II : Inputs) { + if (II.getType() == types::TY_Tempfilelist) { + std::string FileName(II.getFilename()); + ForeachArgs.push_back( + C.getArgs().MakeArgString("--in-file-list=" + FileName)); + ForeachArgs.push_back( + C.getArgs().MakeArgString("--in-replace=" + FileName)); + } CmdArgs.push_back(Args.MakeArgString(Twine("-binary=") + II.getFilename())); } TranslateSYCLTargetArgs(C, Args, getToolChain(), CmdArgs); SmallString<128> ExecPath(getToolChain().GetProgramPath("ioc64")); const char *Exec = C.getArgs().MakeArgString(ExecPath); - C.addCommand(std::make_unique(JA, *this, Exec, CmdArgs, None)); + auto Cmd = std::make_unique(JA, *this, Exec, CmdArgs, None); + if (!ForeachArgs.empty()) + constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachArgs, Output, + this); + else + C.addCommand(std::move(Cmd)); } SYCLToolChain::SYCLToolChain(const Driver &D, const llvm::Triple &Triple, diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h index 351e5b85505dc..6869562b93404 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -15,16 +15,25 @@ namespace clang { namespace driver { +class Command; + namespace tools { namespace SYCL { // Gather command line arguments for backend compilation call -void TranslateSYCLTargetArgs(Compilation &C, - const llvm::opt::ArgList &Args, const ToolChain &TC, llvm::opt::ArgStringList &CmdArgs); +void TranslateSYCLTargetArgs(Compilation &C, const llvm::opt::ArgList &Args, + const ToolChain &TC, + llvm::opt::ArgStringList &CmdArgs); // Gather command line arguments for device specific link -void TranslateSYCLLinkerArgs(Compilation &C, - const llvm::opt::ArgList &Args, const ToolChain &TC, llvm::opt::ArgStringList &CmdArgs); +void TranslateSYCLLinkerArgs(Compilation &C, const llvm::opt::ArgList &Args, + const ToolChain &TC, + llvm::opt::ArgStringList &CmdArgs); + +void constructLLVMForeachCommand(Compilation &C, const JobAction &JA, + std::unique_ptr InputCommand, + llvm::opt::ArgStringList &ForeachArgs, + const InputInfo &Output, const Tool *T); // Runs llvm-spirv to convert spirv to bc, llvm-link, which links multiple LLVM // bitcode. Converts generated bc back to spirv using llvm-spirv, wraps with diff --git a/clang/test/Driver/sycl-offload-intelfpga.cpp b/clang/test/Driver/sycl-offload-intelfpga.cpp index 779ffbb1122ee..761705ed19b77 100644 --- a/clang/test/Driver/sycl-offload-intelfpga.cpp +++ b/clang/test/Driver/sycl-offload-intelfpga.cpp @@ -7,7 +7,7 @@ // RUN: %clangxx -### -target x86_64-unknown-linux-gnu -fsycl -fintelfpga %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-TOOLS-INTELFPGA %s // CHK-TOOLS-INTELFPGA: clang{{.*}} "-debug-info-kind=limited" {{.*}} "-dependency-file" -// CHK-TOOLS-INTELFPGA: aoc{{.*}} "-dep-files={{.*}}" +// CHK-TOOLS-INTELFPGA: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-dep-files={{.*}}" /// -fintelfpga implies -g but -g0 should override // RUN: %clangxx -### -target x86_64-unknown-linux-gnu -g0 -fsycl -fintelfpga %s 2>&1 \ @@ -25,9 +25,10 @@ // CHK-FPGA-LINK-NOT: clang-offload-bundler{{.*}} "-check-section" // CHK-FPGA-LINK: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64_fpga-unknown-unknown-sycldevice" "-inputs=[[INPUT:.+\.o]]" "-outputs=[[OUTPUT1:.+\.o]]" "-unbundle" // CHK-FPGA-LINK: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2:.+\.bc]]" -// CHK-FPGA-LINK: llvm-spirv{{.*}} "-spirv-max-version=1.1" "-spirv-ext=+all" "-o" "[[OUTPUT3:.+\.spv]]" "[[OUTPUT2]]" -// CHK-FPGA-EARLY: aoc{{.*}} "-o" "[[OUTPUT4:.+\.aocr]]" "[[OUTPUT3]]" "-sycl" "-rtl" -// CHK-FPGA-IMAGE: aoc{{.*}} "-o" "[[OUTPUT5:.+\.aocx]]" "[[OUTPUT3]]" "-sycl" +// CHK-FPGA-LINK: sycl-post-link{{.*}} "[[OUTPUT2]]" "-ir-files-list=[[OUTPUT3:.*]]" "-o" +// CHK-FPGA-LINK: llvm-foreach{{.*}} "--" "{{.*}}llvm-spirv{{.*}} "-o" "[[OUTPUT4:.+]]" "-spirv-max-version=1.1" "-spirv-ext=+all" "[[OUTPUT3]]" +// CHK-FPGA-EARLY: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-o" "[[OUTPUT5:.+]]" "-sycl" "-rtl" "[[OUTPUT4]]" +// CHK-FPGA-IMAGE: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-o" "[[OUTPUT5:.+]]" "-sycl" "[[OUTPUT4]]" // CHK-FPGA-LINK: {{lib|llvm-ar}}{{.*}} "[[INPUT]]" /// -fintelfpga -fsycl-link clang-cl specific @@ -36,8 +37,9 @@ // RUN: | FileCheck -check-prefixes=CHK-FPGA-LINK-WIN %s // CHK-FPGA-LINK-WIN: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64_fpga-unknown-unknown-sycldevice{{.*}}" "-inputs=[[INPUT:.+\.obj]]" "-outputs=[[OUTPUT1:.+\.obj]]" "-unbundle" // CHK-FPGA-LINK-WIN: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2:.+\.bc]]" -// CHK-FPGA-LINK-WIN: llvm-spirv{{.*}} "-spirv-max-version=1.1" "-spirv-ext=+all" "-o" "[[OUTPUT3:.+\.spv]]" "[[OUTPUT2]]" -// CHK-FPGA-LINK-WIN: aoc{{.*}} "-o" "[[OUTPUT5:.+\.aocr]]" "[[OUTPUT3]]" "-sycl" "-rtl" +// CHK-FPGA-LINK-WIN: sycl-post-link{{.*}} "[[OUTPUT2]]" "-ir-files-list=[[OUTPUT3:.*]]" "-o" +// CHK-FPGA-LINK-WIN: llvm-foreach{{.*}} "--" "{{.*}}llvm-spirv{{.*}} "-o" "[[OUTPUT4:.+]]" "-spirv-max-version=1.1" "-spirv-ext=+all" "[[OUTPUT3]]" +// CHK-FPGA-LINK-WIN: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}}" "-o" "[[OUTPUT5:.+]]" "-sycl" "-rtl" "[[OUTPUT4]]" // CHK-FPGA-LINK-WIN: lib.exe{{.*}} "[[INPUT]]" @@ -56,8 +58,8 @@ // CHK-FPGA-LINK-LIB: clang-offload-bundler{{.*}} "-type=ao" "-targets=sycl-fpga_aocx-intel-unknown-sycldevice" "-inputs=[[INPUT:.+\.a]]" "-check-section" // CHK-FPGA-LINK-LIB: clang-offload-bundler{{.*}} "-type=ao" "-targets=sycl-fpga_aocr-intel-unknown-sycldevice" "-inputs=[[INPUT]]" "-check-section" // CHK-FPGA-LINK-LIB: clang-offload-bundler{{.*}} "-type=ao" "-targets=sycl-fpga_aocr-intel-unknown-sycldevice" "-inputs=[[INPUT]]" "-outputs=[[OUTPUT2:.+\.aocr]]" "-unbundle" -// CHK-FPGA-LINK-LIB-IMAGE: aoc{{.*}} "-o" "[[OUTPUT3:.+\.aocx]]" "[[OUTPUT2]]" "-sycl" -// CHK-FPGA-LINK-LIB-EARLY: aoc{{.*}} "-o" "[[OUTPUT4:.+\.aocr]]" "[[OUTPUT2]]" "-sycl" "-rtl" +// CHK-FPGA-LINK-LIB-IMAGE: aoc{{.*}} "-o" "[[OUTPUT3:.+\.aocx]]" "-sycl" "[[OUTPUT2]]" +// CHK-FPGA-LINK-LIB-EARLY: aoc{{.*}} "-o" "[[OUTPUT4:.+\.aocr]]" "-sycl" "-rtl" "[[OUTPUT2]]" // CHK-FPGA-LINK-LIB-IMAGE: clang-offload-wrapper{{.*}} "-host=x86_64-unknown-linux-gnu" "--emit-reg-funcs=0" "-target=fpga_aocx-intel-unknown-sycldevice" "-kind=sycl" "[[OUTPUT3]]" // CHK-FPGA-LINK-LIB-EARLY: clang-offload-wrapper{{.*}} "-host=x86_64-unknown-linux-gnu" "-target=fpga_aocr-intel-unknown-sycldevice" "-kind=sycl" "[[OUTPUT4]]" // CHK-FPGA-LINK-LIB: llc{{.*}} "-filetype=obj" "-o" "[[OUTPUT5:.+\.o]]" @@ -73,7 +75,7 @@ // CHK-FPGA: clang-offload-bundler{{.*}} "-type=o" "-targets=host-x86_64-unknown-linux-gnu,sycl-spir64_fpga-unknown-unknown-sycldevice" {{.*}} "-outputs=[[FINALLINK2:.+\.o]],[[OUTPUT1:.+\.o]]" "-unbundle" // CHK-FPGA: llvm-no-spir-kernel{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT3:.+\.o]]" // CHK-FPGA: llvm-link{{.*}} "[[OUTPUT3]]" "-o" "[[OUTPUT4:.+\.bc]]" -// CHK-FPGA: llvm-spirv{{.*}} "-o" "[[OUTPUT5:.+\.spv]]" "[[OUTPUT4]]" +// CHK-FPGA: llvm-spirv{{.*}} "-o" "[[OUTPUT5:.+\.spv]]" {{.*}} "[[OUTPUT4]]" // CHK-FPGA: clang-offload-wrapper{{.*}} "-o=[[OUTPUT6:.+\.bc]]" "-host=x86_64-unknown-linux-gnu" "-target=spir64_fpga" "-kind=sycl" "[[OUTPUT5]]" // CHK-FPGA: llc{{.*}} "-filetype=obj" "-o" "[[FINALLINK3:.+\.o]]" "[[OUTPUT6]]" // CHK-FPGA: clang-offload-bundler{{.*}} "-type=aoo" "-targets=host-x86_64-unknown-linux-gnu" {{.*}} "-outputs=[[FINALLINK4:.+\.txt]]" "-unbundle" @@ -125,17 +127,20 @@ // CHK-FPGA-LINK-SRC: 10: compiler, {3}, ir, (device-sycl) // CHK-FPGA-LINK-SRC: 11: backend, {10}, assembler, (device-sycl) // CHK-FPGA-LINK-SRC: 12: assembler, {11}, object, (device-sycl) -// CHK-FPGA-LINK-SRC: 13: linker, {12}, spirv, (device-sycl) -// CHK-FPGA-LINK-SRC: 14: backend-compiler, {13}, fpga-aocr, (device-sycl) -// CHK-FPGA-LINK-SRC: 15: clang-offload-wrapper, {14}, object, (device-sycl) -// CHK-FPGA-LINK-SRC-DEFAULT: 16: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {15}, archive -// CHK-FPGA-LINK-SRC-CL: 16: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice-coff)" {15}, archive +// CHK-FPGA-LINK-SRC: 13: linker, {12}, ir, (device-sycl) +// CHK-FPGA-LINK-SRC: 14: sycl-post-link, {13}, tempentriesfilelist, (device-sycl) +// CHK-FPGA-LINK-SRC: 15: sycl-post-link, {13}, tempirfilelist, (device-sycl) +// CHK-FPGA-LINK-SRC: 16: llvm-spirv, {15}, tempfilelist, (device-sycl) +// CHK-FPGA-LINK-SRC: 17: backend-compiler, {16}, tempfilelist, (device-sycl) +// CHK-FPGA-LINK-SRC: 18: clang-offload-wrapper, {14, 17}, object, (device-sycl) +// CHK-FPGA-LINK-SRC-DEFAULT: 19: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {18}, archive +// CHK-FPGA-LINK-SRC-CL: 19: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice-coff)" {18}, archive /// -fintelfpga with -reuse-exe= // RUN: touch %t.cpp // RUN: %clangxx -### -reuse-exe=testing -target x86_64-unknown-linux-gnu -fsycl -fintelfpga %t.cpp 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-REUSE-EXE %s -// CHK-FPGA-REUSE-EXE: aoc{{.*}} "-o" {{.*}} "-sycl" {{.*}} "-reuse-exe=testing" +// CHK-FPGA-REUSE-EXE: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-o" "{{.*}}" "-sycl" "{{.*}}" "-reuse-exe=testing" /// -fintelfpga dependency file generation test // RUN: touch %t-1.cpp @@ -146,7 +151,7 @@ // RUN: | FileCheck -check-prefix=CHK-FPGA-DEP-FILES %s // CHK-FPGA-DEP-FILES: clang{{.*}} "-dependency-file" "[[INPUT1:.+\.d]]" // CHK-FPGA-DEP-FILES: clang{{.*}} "-dependency-file" "[[INPUT2:.+\.d]]" -// CHK-FPGA-DEP-FILES: aoc{{.*}} "-dep-files={{.*}}[[INPUT1]],{{.*}}[[INPUT2]]" +// CHK-FPGA-DEP-FILES: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-dep-files={{.*}}[[INPUT1]],{{.*}}[[INPUT2]] /// -fintelfpga output report file test // RUN: mkdir -p %t_dir @@ -156,7 +161,7 @@ // RUN: | FileCheck -DOUTDIR=%t_dir -check-prefix=CHK-FPGA-REPORT-OPT %s // RUN: %clang_cl -### -fsycl -fintelfpga %s -Fe%t_dir/file.out 2>&1 \ // RUN: | FileCheck -DOUTDIR=%t_dir -check-prefix=CHK-FPGA-REPORT-OPT %s -// CHK-FPGA-REPORT-OPT: aoc{{.*}} "-sycl" {{.*}} "-output-report-folder=[[OUTDIR]]{{/|\\\\}}file.prj" +// CHK-FPGA-REPORT-OPT: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-sycl" {{.*}} "-output-report-folder=[[OUTDIR]]{{/|\\\\}}file.prj // TODO: SYCL specific fail - analyze and enable // XFAIL: windows-msvc diff --git a/clang/test/Driver/sycl-offload-win.c b/clang/test/Driver/sycl-offload-win.c index e9cc238c1fbec..bd727184d61aa 100644 --- a/clang/test/Driver/sycl-offload-win.c +++ b/clang/test/Driver/sycl-offload-win.c @@ -79,10 +79,13 @@ // FOFFLOAD_STATIC_LIB_SRC: 12: assembler, {11}, object, (device-sycl) // FOFFLOAD_STATIC_LIB_SRC: 13: input, "[[LIB]]", archive // FOFFLOAD_STATIC_LIB_SRC: 14: clang-offload-unbundler, {13}, archive -// FOFFLOAD_STATIC_LIB_SRC: 15: linker, {12, 14}, spirv, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 16: clang-offload-wrapper, {15}, object, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC_DEFAULT: 17: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {16}, image -// FOFFLOAD_STATIC_LIB_SRC_CL: 17: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice-coff)" {16}, image +// FOFFLOAD_STATIC_LIB_SRC: 15: linker, {12, 14}, ir, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 16: sycl-post-link, {15}, tempentriesfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 17: sycl-post-link, {15}, tempirfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 18: llvm-spirv, {17}, tempfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 19: clang-offload-wrapper, {16, 18}, object, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC_DEFAULT: 20: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {19}, image +// FOFFLOAD_STATIC_LIB_SRC_CL: 20: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice-coff)" {19}, image /// ########################################################################### diff --git a/clang/test/Driver/sycl-offload.c b/clang/test/Driver/sycl-offload.c index 85059717e7fac..202f3e97559fa 100644 --- a/clang/test/Driver/sycl-offload.c +++ b/clang/test/Driver/sycl-offload.c @@ -187,14 +187,17 @@ // CHK-PHASES: 10: compiler, {3}, ir, (device-sycl) // CHK-PHASES: 11: backend, {10}, assembler, (device-sycl) // CHK-PHASES: 12: assembler, {11}, object, (device-sycl) -// CHK-PHASES: 13: linker, {12}, spirv, (device-sycl) -// CHK-PHASES: 14: clang-offload-wrapper, {13}, object, (device-sycl) -// CHK-PHASES-DEFAULT-MODE: 15: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {14}, image -// CHK-PHASES-CL-MODE: 15: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice-coff)" {14}, image +// CHK-PHASES: 13: linker, {12}, ir, (device-sycl) +// CHK-PHASES: 14: sycl-post-link, {13}, tempentriesfilelist, (device-sycl) +// CHK-PHASES: 15: sycl-post-link, {13}, tempirfilelist, (device-sycl) +// CHK-PHASES: 16: llvm-spirv, {15}, tempfilelist, (device-sycl) +// CHK-PHASES: 17: clang-offload-wrapper, {14, 16}, object, (device-sycl) +// CHK-PHASES-DEFAULT-MODE: 18: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {17}, image +// CHK-PHASES-CL-MODE: 18: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice-coff)" {17}, image /// ########################################################################### -/// Check the compilation flow to verify that the integrated header is filtered +/// Check the compilation flow to verify that the integration header is filtered // RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -c %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=CHK-INT-HEADER // CHK-INT-HEADER: clang{{.*}} "-fsycl-is-device" {{.*}} "-o" "[[OUTPUT1:.+\.o]]" @@ -222,9 +225,12 @@ // CHK-PHASES-LIB: 11: compiler, {4}, ir, (device-sycl) // CHK-PHASES-LIB: 12: backend, {11}, assembler, (device-sycl) // CHK-PHASES-LIB: 13: assembler, {12}, object, (device-sycl) -// CHK-PHASES-LIB: 14: linker, {13}, spirv, (device-sycl) -// CHK-PHASES-LIB: 15: clang-offload-wrapper, {14}, object, (device-sycl) -// CHK-PHASES-LIB: 16: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (spir64-unknown-unknown-sycldevice)" {15}, image +// CHK-PHASES-LIB: 14: linker, {13}, ir, (device-sycl) +// CHK-PHASES-LIB: 15: sycl-post-link, {14}, tempentriesfilelist, (device-sycl) +// CHK-PHASES-LIBL 16: sycl-post-link, {14}, tempirfilelist, (device-sycl) +// CHK-PHASES-LIB: 17: llvm-spirv, {16}, tempfilelist, (device-sycl) +// CHK-PHASES-LIB: 18: clang-offload-wrapper, {15, 17}, object, (device-sycl) +// CHK-PHASES-LIB: 19: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (spir64-unknown-unknown-sycldevice)" {18}, image /// Compilation check with -lstdc++ (treated differently than regular lib) // RUN: %clang -### -target x86_64-unknown-linux-gnu -lstdc++ -fsycl %s 2>&1 \ @@ -266,9 +272,12 @@ // CHK-PHASES-FILES: 23: compiler, {13}, ir, (device-sycl) // CHK-PHASES-FILES: 24: backend, {23}, assembler, (device-sycl) // CHK-PHASES-FILES: 25: assembler, {24}, object, (device-sycl) -// CHK-PHASES-FILES: 26: linker, {22, 25}, spirv, (device-sycl) -// CHK-PHASES-FILES: 27: clang-offload-wrapper, {26}, object, (device-sycl) -// CHK-PHASES-FILES: 28: offload, "host-sycl (x86_64-unknown-linux-gnu)" {19}, "device-sycl (spir64-unknown-unknown-sycldevice)" {27}, image +// CHK-PHASES-FILES: 26: linker, {22, 25}, ir, (device-sycl) +// CHK-PHASES-FILES: 27: sycl-post-link, {26}, tempentriesfilelist, (device-sycl) +// CHK-PHASES-FILES: 28: sycl-post-link, {26}, tempirfilelist, (device-sycl) +// CHK-PHASES-FILES: 29: llvm-spirv, {28}, tempfilelist, (device-sycl) +// CHK-PHASES-FILES: 30: clang-offload-wrapper, {27, 29}, object, (device-sycl) +// CHK-PHASES-FILES: 31: offload, "host-sycl (x86_64-unknown-linux-gnu)" {19}, "device-sycl (spir64-unknown-unknown-sycldevice)" {30}, image /// ########################################################################### @@ -304,9 +313,12 @@ // CHK-UBACTIONS: 1: input, "[[INPUT]]", object, (host-sycl) // CHK-UBACTIONS: 2: clang-offload-unbundler, {1}, object, (host-sycl) // CHK-UBACTIONS: 3: linker, {0, 2}, image, (host-sycl) -// CHK-UBACTIONS: 4: linker, {2}, spirv, (device-sycl) -// CHK-UBACTIONS: 5: clang-offload-wrapper, {4}, object, (device-sycl) -// CHK-UBACTIONS: 6: offload, "host-sycl (x86_64-unknown-linux-gnu)" {3}, "device-sycl (spir64-unknown-unknown-sycldevice)" {5}, image +// CHK-UBACTIONS: 4: linker, {2}, ir, (device-sycl) +// CHK-UBACTIONS: 5: sycl-post-link, {4}, tempentriesfilelist, (device-sycl) +// CHK-UBACTIONS: 6: sycl-post-link, {4}, tempirfilelist, (device-sycl) +// CHK-UBACTIONS: 7: llvm-spirv, {6}, tempfilelist, (device-sycl) +// CHK-UBACTIONS: 8: clang-offload-wrapper, {5, 7}, object, (device-sycl) +// CHK-UBACTIONS: 9: offload, "host-sycl (x86_64-unknown-linux-gnu)" {3}, "device-sycl (spir64-unknown-unknown-sycldevice)" {8}, image /// ########################################################################### @@ -330,9 +342,12 @@ // CHK-UBUACTIONS: 13: compiler, {6}, ir, (device-sycl) // CHK-UBUACTIONS: 14: backend, {13}, assembler, (device-sycl) // CHK-UBUACTIONS: 15: assembler, {14}, object, (device-sycl) -// CHK-UBUACTIONS: 16: linker, {2, 15}, spirv, (device-sycl) -// CHK-UBUACTIONS: 17: clang-offload-wrapper, {16}, object, (device-sycl) -// CHK-UBUACTIONS: 18: offload, "host-sycl (x86_64-unknown-linux-gnu)" {12}, "device-sycl (spir64-unknown-unknown-sycldevice)" {17}, image +// CHK-UBUACTIONS: 16: linker, {2, 15}, ir, (device-sycl) +// CHK-UBUACTIONS: 17: sycl-post-link, {16}, tempentriesfilelist, (device-sycl) +// CHK-UBUACTIONS: 18: sycl-post-link, {16}, tempirfilelist, (device-sycl) +// CHK-UBUACTIONS: 19: llvm-spirv, {18}, tempfilelist, (device-sycl) +// CHK-UBUACTIONS: 20: clang-offload-wrapper, {17, 19}, object, (device-sycl) +// CHK-UBUACTIONS: 21: offload, "host-sycl (x86_64-unknown-linux-gnu)" {12}, "device-sycl (spir64-unknown-unknown-sycldevice)" {20}, image /// ########################################################################### @@ -367,7 +382,8 @@ // CHK-LINK-TARGETS-UB: 0: input, "[[INPUT:.+\.o]]", object // CHK-LINK-TARGETS-UB: 1: clang-offload-unbundler, {0}, object // CHK-LINK-TARGETS-UB: 2: linker, {1}, image, (device-sycl) -// CHK-LINK-TARGETS-UB: 3: offload, "device-sycl (spir64-unknown-unknown-sycldevice)" {2}, image +// CHK-LINK-TARGETS-UB: 3: llvm-spirv, {2}, image, (device-sycl) +// CHK-LINK-TARGETS-UB: 4: offload, "device-sycl (spir64-unknown-unknown-sycldevice)" {3}, image /// ########################################################################### @@ -386,7 +402,8 @@ // CHK-LINK-TARGETS-UB2: 4: input, "[[INPUT:.+\c.o]]", object // CHK-LINK-TARGETS-UB2: 5: clang-offload-unbundler, {4}, object // CHK-LINK-TARGETS-UB2: 6: linker, {1, 3, 5}, image, (device-sycl) -// CHK-LINK-TARGETS-UB2: 7: offload, "device-sycl (spir64-unknown-unknown-sycldevice)" {6}, image +// CHK-LINK-TARGETS-UB2: 7: llvm-spirv, {6}, image, (device-sycl) +// CHK-LINK-TARGETS-UB2: 8: offload, "device-sycl (spir64-unknown-unknown-sycldevice)" {7}, image /// ########################################################################### @@ -401,7 +418,8 @@ // CHK-LINK-TARGETS: 3: backend, {2}, assembler, (device-sycl) // CHK-LINK-TARGETS: 4: assembler, {3}, object, (device-sycl) // CHK-LINK-TARGETS: 5: linker, {4}, image, (device-sycl) -// CHK-LINK-TARGETS: 6: offload, "device-sycl (spir64-unknown-unknown-sycldevice)" {5}, image +// CHK-LINK-TARGETS: 6: llvm-spirv, {5}, image, (device-sycl) +// CHK-LINK-TARGETS: 7: offload, "device-sycl (spir64-unknown-unknown-sycldevice)" {6}, image /// ########################################################################### @@ -512,11 +530,14 @@ // CHK-ADD-TARGETS-REG: 10: compiler, {3}, ir, (device-sycl) // CHK-ADD-TARGETS-REG: 11: backend, {10}, assembler, (device-sycl) // CHK-ADD-TARGETS-REG: 12: assembler, {11}, object, (device-sycl) -// CHK-ADD-TARGETS-REG: 13: linker, {12}, spirv, (device-sycl) -// CHK-ADD-TARGETS-REG: 14: clang-offload-wrapper, {13}, object, (device-sycl) -// CHK-ADD-TARGETS-REG: 15: input, "dummy.spv", sycl-fatbin, (device-sycl) -// CHK-ADD-TARGETS-REG: 16: clang-offload-wrapper, {15}, object, (device-sycl) -// CHK-ADD-TARGETS-REG: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {14}, "device-sycl (spir64-unknown-unknown-sycldevice)" {16}, image +// CHK-ADD-TARGETS-REG: 13: linker, {12}, ir, (device-sycl) +// CHK-ADD-TARGETS-REG: 14: sycl-post-link, {13}, tempentriesfilelist, (device-sycl) +// CHK-ADD-TARGETS-REG: 15: sycl-post-link, {13}, tempirfilelist, (device-sycl) +// CHK-ADD-TARGETS-REG: 16: llvm-spirv, {15}, tempfilelist, (device-sycl) +// CHK-ADD-TARGETS-REG: 17: clang-offload-wrapper, {14, 16}, object, (device-sycl) +// CHK-ADD-TARGETS-REG: 18: input, "dummy.spv", sycl-fatbin, (device-sycl) +// CHK-ADD-TARGETS-REG: 19: clang-offload-wrapper, {18}, object, (device-sycl) +// CHK-ADD-TARGETS-REG: 20: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {17}, "device-sycl (spir64-unknown-unknown-sycldevice)" {19}, image /// ########################################################################### @@ -538,15 +559,18 @@ // CHK-ADD-TARGETS-REG-MUL: 12: compiler, {11}, ir, (device-sycl) // CHK-ADD-TARGETS-REG-MUL: 13: backend, {12}, assembler, (device-sycl) // CHK-ADD-TARGETS-REG-MUL: 14: assembler, {13}, object, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 15: linker, {14}, spirv, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 16: clang-offload-wrapper, {15}, object, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 17: input, "dummy.aocx", sycl-fatbin, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 18: clang-offload-wrapper, {17}, object, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 19: input, "dummy_Gen9core.bin", sycl-fatbin, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 20: clang-offload-wrapper, {19}, object, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 21: input, "dummy.ir", sycl-fatbin, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 22: clang-offload-wrapper, {21}, object, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 23: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {16}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {18}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {20}, "device-sycl (spir64_x86_64-unknown-unknown-sycldevice)" {22}, image +// CHK-ADD-TARGETS-REG-MUL: 15: linker, {14}, ir, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 16: sycl-post-link, {15}, tempentriesfilelist, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 17: sycl-post-link, {15}, tempirfilelist, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 18: llvm-spirv, {17}, tempfilelist, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 19: clang-offload-wrapper, {16, 18}, object, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 20: input, "dummy.aocx", sycl-fatbin, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 21: clang-offload-wrapper, {20}, object, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 22: input, "dummy_Gen9core.bin", sycl-fatbin, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 23: clang-offload-wrapper, {22}, object, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 24: input, "dummy.ir", sycl-fatbin, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 25: clang-offload-wrapper, {24}, object, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 26: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {19}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {21}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {23}, "device-sycl (spir64_x86_64-unknown-unknown-sycldevice)" {25}, image /// ########################################################################### @@ -611,9 +635,12 @@ // FOFFLOAD_STATIC_LIB_SRC: 11: compiler, {3}, ir, (device-sycl) // FOFFLOAD_STATIC_LIB_SRC: 12: backend, {11}, assembler, (device-sycl) // FOFFLOAD_STATIC_LIB_SRC: 13: assembler, {12}, object, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 14: linker, {13, 9}, spirv, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 15: clang-offload-wrapper, {14}, object, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 16: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (spir64-unknown-unknown-sycldevice)" {15}, image +// FOFFLOAD_STATIC_LIB_SRC: 14: linker, {13, 9}, ir, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 15: sycl-post-link, {14}, tempentriesfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 16: sycl-post-link, {14}, tempirfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 17: llvm-spirv, {16}, tempfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 18: clang-offload-wrapper, {15, 17}, object, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 19: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (spir64-unknown-unknown-sycldevice)" {18}, image /// ########################################################################### @@ -677,13 +704,16 @@ // CHK-PHASES-AOT: 10: compiler, {3}, ir, (device-sycl) // CHK-PHASES-AOT: 11: backend, {10}, assembler, (device-sycl) // CHK-PHASES-AOT: 12: assembler, {11}, object, (device-sycl) -// CHK-PHASES-AOT: 13: linker, {12}, spirv, (device-sycl) -// CHK-PHASES-GEN: 14: backend-compiler, {13}, image, (device-sycl) -// CHK-PHASES-FPGA: 14: backend-compiler, {13}, fpga-aocx, (device-sycl) -// CHK-PHASES-AOT: 15: clang-offload-wrapper, {14}, object, (device-sycl) -// CHK-PHASES-FPGA: 16: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {15}, image -// CHK-PHASES-GEN: 16: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {15}, image -// CHK-PHASES-CPU: 16: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_x86_64-unknown-unknown-sycldevice)" {15}, image +// CHK-PHASES-AOT: 13: linker, {12}, ir, (device-sycl) +// CHK-PHASES-AOT: 14: sycl-post-link, {13}, tempentriesfilelist, (device-sycl) +// CHK-PHASES-AOT: 15: sycl-post-link, {13}, tempirfilelist, (device-sycl) +// CHK-PHASES-AOT: 16: llvm-spirv, {15}, tempfilelist, (device-sycl) +// CHK-PHASES-GEN: 17: backend-compiler, {16}, tempfilelist, (device-sycl) +// CHK-PHASES-FPGA: 17: backend-compiler, {16}, tempfilelist, (device-sycl) +// CHK-PHASES-AOT: 18: clang-offload-wrapper, {14, 17}, object, (device-sycl) +// CHK-PHASES-FPGA: 19: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {18}, image +// CHK-PHASES-GEN: 19: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {18}, image +// CHK-PHASES-CPU: 19: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_x86_64-unknown-unknown-sycldevice)" {18}, image /// ########################################################################### @@ -698,19 +728,22 @@ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-CPU // CHK-TOOLS-AOT: clang{{.*}} "-fsycl-is-device" {{.*}} "-o" "[[OUTPUT1:.+\.o]]" // CHK-TOOLS-AOT: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2:.+\.bc]]" -// CHK-TOOLS-AOT: llvm-spirv{{.*}} "-o" "[[OUTPUT3:.+\.spv]]" "[[OUTPUT2]]" -// CHK-TOOLS-FPGA: aoc{{.*}} "-o" "[[OUTPUT4:.+\.aocx]]" "[[OUTPUT3]]" -// CHK-TOOLS-GEN: ocloc{{.*}} "-output" "[[OUTPUT4:.+\.out]]" {{.*}} "[[OUTPUT3]]" -// CHK-TOOLS-CPU: ioc{{.*}} "-ir=[[OUTPUT4:.+\.out]]" {{.*}} "-binary=[[OUTPUT3]]" -// CHK-TOOLS-FPGA: clang-offload-wrapper{{.*}} "-o=[[OUTPUT5:.+\.bc]]" "-host=x86_64-unknown-linux-gnu" "-target=spir64_fpga{{.*}}" "-kind=sycl" "[[OUTPUT4]]" -// CHK-TOOLS-GEN: clang-offload-wrapper{{.*}} "-o=[[OUTPUT5:.+\.bc]]" "-host=x86_64-unknown-linux-gnu" "-target=spir64_gen{{.*}}" "-kind=sycl" "[[OUTPUT4]]" -// CHK-TOOLS-CPU: clang-offload-wrapper{{.*}} "-o=[[OUTPUT5:.+\.bc]]" "-host=x86_64-unknown-linux-gnu" "-target=spir64_x86_64{{.*}}" "-kind=sycl" "[[OUTPUT4]]" -// CHK-TOOLS-AOT: llc{{.*}} "-filetype=obj" "-o" "[[OUTPUT6:.+\.o]]" "[[OUTPUT5]]" +// CHK-TOOLS-AOT: sycl-post-link{{.*}} "[[OUTPUT2]]" "-txt-files-list=[[OUTPUT6:.+\.txt]]" "-o" +// CHK-TOOLS-AOT: sycl-post-link{{.*}} "[[OUTPUT2]]" "-ir-files-list=[[OUTPUT3:.+\.txt]]" "-o" +// CHK-TOOLS-AOT: llvm-foreach{{.*}} "--in-file-list=[[OUTPUT3]]" "--in-replace=[[OUTPUT3]]" "--out-ext=spv" "--out-file-list=[[OUTPUT4:.+\.txt]]" "--out-replace=[[OUTPUT4]]" "--" "{{.*}}llvm-spirv{{.*}} "-o" "[[OUTPUT4]]" {{.*}} "[[OUTPUT3]]" +// CHK-TOOLS-FPGA: llvm-foreach{{.*}} "--out-file-list=[[OUTPUT5:.+\.txt]]{{.*}} "--" "{{.*}}aoc{{.*}} "-o" "[[OUTPUT5]]" "-sycl" "[[OUTPUT4]]" +// CHK-TOOLS-GEN: llvm-foreach{{.*}} "--out-file-list=[[OUTPUT5:.+\.txt]]{{.*}} "--" "{{.*}}ocloc{{.*}} "-output" "[[OUTPUT5]]" "-file" "[[OUTPUT4]]" +// CHK-TOOLS-CPU: llvm-foreach{{.*}} "--out-file-list=[[OUTPUT5:.+\.txt]]{{.*}} "--" "{{.*}}ioc{{.*}} "-ir=[[OUTPUT5]]" "-device=cpu" "-binary=[[OUTPUT4]]" +// CHK-TOOLS-FPGA: llvm-foreach{{.*}} "--out-file-list=[[OUTPUT7:.+\.txt]]{{.*}} "--" "{{.*}}clang-offload-wrapper{{.*}} "-o={{.*}}" "-host=x86_64-unknown-linux-gnu" "-target=spir64_fpga{{.*}}" "-kind=sycl" "-entries=[[OUTPUT6]]" "[[OUTPUT5]]" +// CHK-TOOLS-GEN: llvm-foreach{{.*}} "--out-file-list=[[OUTPUT7:.+\.txt]]{{.*}} "--" "{{.*}}clang-offload-wrapper{{.*}} "-o={{.*}}" "-host=x86_64-unknown-linux-gnu" "-target=spir64_gen{{.*}}" "-kind=sycl" "-entries=[[OUTPUT6]]" "[[OUTPUT5]]" +// CHK-TOOLS-CPU: llvm-foreach{{.*}} "--out-file-list=[[OUTPUT7:.+\.txt]]{{.*}} "--" "{{.*}}clang-offload-wrapper{{.*}} "-o={{.*}}" "-host=x86_64-unknown-linux-gnu" "-target=spir64_x86_64{{.*}}" "-kind=sycl" "-entries=[[OUTPUT6]]" "[[OUTPUT5]]" +// CHK-TOOLS-AOT: llvm-link{{.*}} "-o" "[[OUTPUT8:.+\.bc]]" "@[[OUTPUT7]]" +// CHK-TOOLS-AOT: llc{{.*}} "-filetype=obj" "-o" "[[OUTPUT9:.+\.o]]" "[[OUTPUT8]]" // CHK-TOOLS-FPGA: clang{{.*}} "-triple" "spir64_fpga-unknown-unknown-sycldevice" {{.*}} "-fsycl-int-header=[[INPUT1:.+\.h]]" "-faddrsig" // CHK-TOOLS-GEN: clang{{.*}} "-triple" "spir64_gen-unknown-unknown-sycldevice" {{.*}} "-fsycl-int-header=[[INPUT1:.+\.h]]" "-faddrsig" // CHK-TOOLS-CPU: clang{{.*}} "-triple" "spir64_x86_64-unknown-unknown-sycldevice" {{.*}} "-fsycl-int-header=[[INPUT1:.+\.h]]" "-faddrsig" -// CHK-TOOLS-AOT: clang{{.*}} "-triple" "x86_64-unknown-linux-gnu" {{.*}} "-include" "[[INPUT1]]" {{.*}} "-o" "[[OUTPUT7:.+\.o]]" -// CHK-TOOLS-AOT: ld{{.*}} "[[OUTPUT7]]" "[[OUTPUT6]]" {{.*}} "-lsycl" +// CHK-TOOLS-AOT: clang{{.*}} "-triple" "x86_64-unknown-linux-gnu" {{.*}} "-include" "[[INPUT1]]" {{.*}} "-o" "[[OUTPUT10:.+\.o]]" +// CHK-TOOLS-AOT: ld{{.*}} "[[OUTPUT10]]" "[[OUTPUT9]]" {{.*}} "-lsycl" /// ########################################################################### @@ -722,15 +755,15 @@ // RUN: | FileCheck -check-prefix=CHK-TOOLS-FPGA-OPTS %s // RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fintelfpga -Xs "-DFOO1 -DFOO2" %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-TOOLS-FPGA-OPTS %s -// CHK-TOOLS-FPGA-OPTS: aoc{{.*}} "-o" {{.*}} "-DFOO1" "-DFOO2" +// CHK-TOOLS-FPGA-OPTS: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-o" "{{.*}}" "-DFOO1" "-DFOO2" // RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -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: llvm-foreach{{.*}} "--" "{{.*}}ocloc{{.*}} "-output" "{{.*}}" "-output_no_suffix" "{{.*}}" "-DFOO1" "-DFOO2" // RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -Xsycl-target-backend "-DFOO1 -DFOO2" %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-TOOLS-CPU-OPTS %s -// CHK-TOOLS-CPU-OPTS: ioc{{.*}} "-DFOO1" "-DFOO2" +// CHK-TOOLS-CPU-OPTS: llvm-foreach{{.*}} "--" "{{.*}}ioc{{.*}} "-DFOO1" "-DFOO2" /// ########################################################################### @@ -752,23 +785,32 @@ // CHK-PHASE-MULTI-TARG: 12: compiler, {11}, ir, (device-sycl) // CHK-PHASE-MULTI-TARG: 13: backend, {12}, assembler, (device-sycl) // CHK-PHASE-MULTI-TARG: 14: assembler, {13}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG: 15: linker, {14}, spirv, (device-sycl) -// CHK-PHASE-MULTI-TARG: 16: clang-offload-wrapper, {15}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG: 17: input, "[[INPUT]]", c, (device-sycl) -// CHK-PHASE-MULTI-TARG: 18: preprocessor, {17}, cpp-output, (device-sycl) -// CHK-PHASE-MULTI-TARG: 19: compiler, {18}, ir, (device-sycl) -// CHK-PHASE-MULTI-TARG: 20: backend, {19}, assembler, (device-sycl) -// CHK-PHASE-MULTI-TARG: 21: assembler, {20}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG: 22: linker, {21}, spirv, (device-sycl) -// CHK-PHASE-MULTI-TARG: 23: backend-compiler, {22}, fpga-aocx, (device-sycl) -// CHK-PHASE-MULTI-TARG: 24: clang-offload-wrapper, {23}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG: 25: compiler, {3}, ir, (device-sycl) -// CHK-PHASE-MULTI-TARG: 26: backend, {25}, assembler, (device-sycl) -// CHK-PHASE-MULTI-TARG: 27: assembler, {26}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG: 28: linker, {27}, spirv, (device-sycl) -// CHK-PHASE-MULTI-TARG: 29: backend-compiler, {28}, image, (device-sycl) -// CHK-PHASE-MULTI-TARG: 30: clang-offload-wrapper, {29}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG: 31: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {16}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {24}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {30}, image +// CHK-PHASE-MULTI-TARG: 15: linker, {14}, ir, (device-sycl) +// CHK-PHASE-MULTI-TARG: 16: sycl-post-link, {15}, tempentriesfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG: 17: sycl-post-link, {15}, tempirfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG: 18: llvm-spirv, {17}, tempfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG: 19: clang-offload-wrapper, {16, 18}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG: 20: input, "[[INPUT]]", c, (device-sycl) +// CHK-PHASE-MULTI-TARG: 21: preprocessor, {20}, cpp-output, (device-sycl) +// CHK-PHASE-MULTI-TARG: 22: compiler, {21}, ir, (device-sycl) +// CHK-PHASE-MULTI-TARG: 23: backend, {22}, assembler, (device-sycl) +// CHK-PHASE-MULTI-TARG: 24: assembler, {23}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG: 25: linker, {24}, ir, (device-sycl) +// CHK-PHASE-MULTI-TARG: 26: sycl-post-link, {25}, tempentriesfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG: 27: sycl-post-link, {25}, tempirfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG: 28: llvm-spirv, {27}, tempfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG: 29: backend-compiler, {28}, tempfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG: 30: clang-offload-wrapper, {26, 29}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG: 31: compiler, {3}, ir, (device-sycl) +// CHK-PHASE-MULTI-TARG: 32: backend, {31}, assembler, (device-sycl) +// CHK-PHASE-MULTI-TARG: 33: assembler, {32}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG: 34: linker, {33}, ir, (device-sycl) +// CHK-PHASE-MULTI-TARG: 35: sycl-post-link, {34}, tempentriesfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG: 36: sycl-post-link, {34}, tempirfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG: 37: llvm-spirv, {36}, tempfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG: 38: backend-compiler, {37}, tempfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG: 39: clang-offload-wrapper, {35, 38}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG: 40: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {19}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {30}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {39}, image /// ########################################################################### @@ -791,24 +833,30 @@ // CHK-PHASE-MULTI-TARG-W-ADD: 12: compiler, {11}, ir, (device-sycl) // CHK-PHASE-MULTI-TARG-W-ADD: 13: backend, {12}, assembler, (device-sycl) // CHK-PHASE-MULTI-TARG-W-ADD: 14: assembler, {13}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 15: linker, {14}, spirv, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 16: backend-compiler, {15}, fpga-aocx, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 17: clang-offload-wrapper, {16}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 18: input, "[[INPUT]]", c, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 19: preprocessor, {18}, cpp-output, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 20: compiler, {19}, ir, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 21: backend, {20}, assembler, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 22: assembler, {21}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 23: linker, {22}, spirv, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 24: backend-compiler, {23}, image, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 25: clang-offload-wrapper, {24}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 26: input, "dummy.ir", sycl-fatbin, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 27: clang-offload-wrapper, {26}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 28: input, "dummy.aocx", sycl-fatbin, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 29: clang-offload-wrapper, {28}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 30: input, "dummy_Gen9core.bin", sycl-fatbin, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 31: clang-offload-wrapper, {30}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 32: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {17}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {25}, "device-sycl (spir64_x86_64-unknown-unknown-sycldevice)" {27}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {29}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {31}, image +// CHK-PHASE-MULTI-TARG-W-ADD: 15: linker, {14}, ir, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 16: sycl-post-link, {15}, tempentriesfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 17: sycl-post-link, {15}, tempirfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 18: llvm-spirv, {17}, tempfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 19: backend-compiler, {18}, tempfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 20: clang-offload-wrapper, {16, 19}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 21: input, "[[INPUT]]", c, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 22: preprocessor, {21}, cpp-output, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 23: compiler, {22}, ir, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 24: backend, {23}, assembler, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 25: assembler, {24}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 26: linker, {25}, ir, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 27: sycl-post-link, {26}, tempentriesfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 28: sycl-post-link, {26}, tempirfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 29: llvm-spirv, {28}, tempfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 30: backend-compiler, {29}, tempfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 31: clang-offload-wrapper, {27, 30}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 32: input, "dummy.ir", sycl-fatbin, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 33: clang-offload-wrapper, {32}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 34: input, "dummy.aocx", sycl-fatbin, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 35: clang-offload-wrapper, {34}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 36: input, "dummy_Gen9core.bin", sycl-fatbin, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 37: clang-offload-wrapper, {36}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 38: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {20}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {31}, "device-sycl (spir64_x86_64-unknown-unknown-sycldevice)" {33}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {35}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {37}, image /// ########################################################################### /// Verify that -save-temps does not crash @@ -844,5 +892,79 @@ // LIB-NODEVICE: 1: linker, {0}, image, (host-sycl) // LIB-NODEVICE-NOT: linker, {{.*}}, spirv, (device-sycl) +/// ########################################################################### + +// Check disabling of device code split for default mode. +// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice -fno-sycl-device-code-split %s 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHK-PHASES-NO-SPLIT,CHK-PHASES-DEFAULT-MODE-NO-SPLIT %s +// RUN: %clang_cl -ccc-print-phases -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice-coff %s -fno-sycl-device-code-split 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHK-PHASES-NO-SPLIT,CHK-PHASES-CL-MODE-NO-SPLIT %s +// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-use-bitcode %s -fno-sycl-device-code-split 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHK-PHASES-NO-SPLIT,CHK-PHASES-DEFAULT-MODE-NO-SPLIT %s +// RUN: %clang_cl -ccc-print-phases -fsycl -fno-sycl-use-bitcode -fno-sycl-device-code-split %s 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHK-PHASES-NO-SPLIT,CHK-PHASES-CL-MODE-NO-SPLIT %s +// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fsycl-use-bitcode -fno-sycl-device-code-split %s 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHK-PHASES-NO-SPLIT,CHK-PHASES-DEFAULT-MODE-NO-SPLIT %s +// RUN: %clang_cl -ccc-print-phases -fsycl -fsycl-use-bitcode -fno-sycl-device-code-split %s 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHK-PHASES-NO-SPLIT,CHK-PHASES-CL-MODE-NO-SPLIT %s +// CHK-PHASES-NO-SPLIT: 0: input, "[[INPUT:.+\.c]]", c, (host-sycl) +// CHK-PHASES-NO-SPLIT: 1: preprocessor, {0}, cpp-output, (host-sycl) +// CHK-PHASES-NO-SPLIT: 2: input, "[[INPUT]]", c, (device-sycl) +// CHK-PHASES-NO-SPLIT: 3: preprocessor, {2}, cpp-output, (device-sycl) +// CHK-PHASES-NO-SPLIT: 4: compiler, {3}, sycl-header, (device-sycl) +// CHK-PHASES-DEFAULT-MODE-NO-SPLIT: 5: offload, "host-sycl (x86_64-unknown-linux-gnu)" {1}, "device-sycl (spir64-unknown-unknown-sycldevice)" {4}, cpp-output +// CHK-PHASES-CL-MODE-NO-SPLIT: 5: offload, "host-sycl (x86_64-pc-windows-msvc)" {1}, "device-sycl (spir64-unknown-unknown-sycldevice-coff)" {4}, cpp-output +// CHK-PHASES-NO-SPLIT: 6: compiler, {5}, ir, (host-sycl) +// CHK-PHASES-NO-SPLIT: 7: backend, {6}, assembler, (host-sycl) +// CHK-PHASES-NO-SPLIT: 8: assembler, {7}, object, (host-sycl) +// CHK-PHASES-NO-SPLIT: 9: linker, {8}, image, (host-sycl) +// CHK-PHASES-NO-SPLIT: 10: compiler, {3}, ir, (device-sycl) +// CHK-PHASES-NO-SPLIT: 11: backend, {10}, assembler, (device-sycl) +// CHK-PHASES-NO-SPLIT: 12: assembler, {11}, object, (device-sycl) +// CHK-PHASES-NO-SPLIT: 13: linker, {12}, ir, (device-sycl) +// CHK-PHASES-NO-SPLIT: 14: llvm-spirv, {13}, spirv, (device-sycl) +// CHK-PHASES-NO-SPLIT: 15: clang-offload-wrapper, {14}, object, (device-sycl) +// CHK-PHASES-DEFAULT-MODE-NO-SPLIT: 16: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {15}, image +// CHK-PHASES-CL-MODE-NO-SPLIT: 16: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice-coff)" {15}, image + +// Check disabling of device code split for AOT compilation +// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice -fno-sycl-device-code-split %s 2>&1 \ +// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT-NO-SPLIT,CHK-PHASES-FPGA-NO-SPLIT +// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -fno-sycl-device-code-split %s 2>&1 \ +// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT-NO-SPLIT,CHK-PHASES-GEN-NO-SPLIT +// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -fno-sycl-device-code-split %s 2>&1 \ +// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT-NO-SPLIT,CHK-PHASES-CPU-NO-SPLIT +// CHK-PHASES-AOT-NO-SPLIT: 0: input, "[[INPUT:.+\.c]]", c, (host-sycl) +// CHK-PHASES-AOT-NO-SPLIT: 1: preprocessor, {0}, cpp-output, (host-sycl) +// CHK-PHASES-AOT-NO-SPLIT: 2: input, "[[INPUT]]", c, (device-sycl) +// CHK-PHASES-AOT-NO-SPLIT: 3: preprocessor, {2}, cpp-output, (device-sycl) +// CHK-PHASES-AOT-NO-SPLIT: 4: compiler, {3}, sycl-header, (device-sycl) +// CHK-PHASES-FPGA-NO-SPLIT: 5: offload, "host-sycl (x86_64-unknown-linux-gnu)" {1}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {4}, cpp-output +// CHK-PHASES-GEN-NO-SPLIT: 5: offload, "host-sycl (x86_64-unknown-linux-gnu)" {1}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {4}, cpp-output +// CHK-PHASES-CPU-NO-SPLIT: 5: offload, "host-sycl (x86_64-unknown-linux-gnu)" {1}, "device-sycl (spir64_x86_64-unknown-unknown-sycldevice)" {4}, cpp-output +// CHK-PHASES-AOT-NO-SPLIT: 6: compiler, {5}, ir, (host-sycl) +// CHK-PHASES-AOT-NO-SPLIT: 7: backend, {6}, assembler, (host-sycl) +// CHK-PHASES-AOT-NO-SPLIT: 8: assembler, {7}, object, (host-sycl) +// CHK-PHASES-AOT-NO-SPLIT: 9: linker, {8}, image, (host-sycl) +// CHK-PHASES-AOT-NO-SPLIT: 10: compiler, {3}, ir, (device-sycl) +// CHK-PHASES-AOT-NO-SPLIT: 11: backend, {10}, assembler, (device-sycl) +// CHK-PHASES-AOT-NO-SPLIT: 12: assembler, {11}, object, (device-sycl) +// CHK-PHASES-AOT-NO-SPLIT: 13: linker, {12}, ir, (device-sycl) +// CHK-PHASES-AOT-NO-SPLIT: 14: llvm-spirv, {13}, spirv, (device-sycl) +// CHK-PHASES-GEN-NO-SPLIT: 15: backend-compiler, {14}, image, (device-sycl) +// CHK-PHASES-FPGA-NO-SPLIT: 15: backend-compiler, {14}, fpga-aocx, (device-sycl) +// CHK-PHASES-AOT-NO-SPLIT: 16: clang-offload-wrapper, {15}, object, (device-sycl) +// CHK-PHASES-FPGA-NO-SPLIT: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {16}, image +// CHK-PHASES-GEN-NO-SPLIT: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {16}, image +// CHK-PHASES-CPU-NO-SPLIT: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_x86_64-unknown-unknown-sycldevice)" {16}, image + +// Check -fsycl-one-kernel-per-module option passing. +// RUN: %clang -### -fsycl -fsycl-one-kernel-per-module %s 2>&1 \ +// RUN: | FileCheck %s -check-prefixes=CHK-ONE-KERNEL +// RUN: %clang_cl -### -fsycl -fsycl-one-kernel-per-module %s 2>&1 \ +// RUN: | FileCheck %s -check-prefixes=CHK-ONE-KERNEL +// CHK-ONE-KERNEL: sycl-post-link{{.*}} "-txt-files-list{{.*}} "-one-kernel" +// CHK-ONE-KERNEL: sycl-post-link{{.*}} "-ir-files-list{{.*}} "-one-kernel" + // TODO: SYCL specific fail - analyze and enable // XFAIL: windows-msvc diff --git a/llvm/tools/sycl-post-link/sycl-post-link.cpp b/llvm/tools/sycl-post-link/sycl-post-link.cpp index d0bd2e646f834..1d81e0649ba18 100644 --- a/llvm/tools/sycl-post-link/sycl-post-link.cpp +++ b/llvm/tools/sycl-post-link/sycl-post-link.cpp @@ -24,6 +24,7 @@ #include "llvm/IRReader/IRReader.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/InitLLVM.h" +#include "llvm/Support/Path.h" #include "llvm/Support/SystemUtils.h" #include "llvm/Transforms/IPO.h" #include "llvm/Transforms/Utils/Cloning.h" @@ -226,10 +227,29 @@ static void saveResults(std::vector> &ResModules, ++NumOfFile; } - if (OutputIRFilesList != "-") + if (OutputIRFilesList != "-") { + // TODO: Figure out what can be added to output list if there are no kernels + // in the input module + // Just pass input module to next tools if there was nothing to split + if (IRFilesList.empty()) + IRFilesList = + (Twine(InputFilename) + Twine("\n")).str(); writeToFile(OutputIRFilesList, IRFilesList); - if (OutputTxtFilesList != "-") + } + if (OutputTxtFilesList != "-") { + // TODO: Figure out what can be added to output list if there are no kernels + // in the input module + if (TxtFilesList.empty()) { + // Just create an empty temporary file if there was nothing to split + std::string TempFileNameBase = sys::path::stem(BaseOutputFilename); + SmallString<128> Path; + std::error_code EC = + sys::fs::createTemporaryFile(TempFileNameBase, "txt", Path); + error(EC, "Could not create a file for command output."); + TxtFilesList = (Twine(Path) + Twine("\n")).str(); + } writeToFile(OutputTxtFilesList, TxtFilesList); + } } int main(int argc, char **argv) { diff --git a/sycl/test/function-pointers/fp-as-kernel-arg.cpp b/sycl/test/function-pointers/fp-as-kernel-arg.cpp index 70ebac362324a..cd82a8f97a499 100644 --- a/sycl/test/function-pointers/fp-as-kernel-arg.cpp +++ b/sycl/test/function-pointers/fp-as-kernel-arg.cpp @@ -1,4 +1,4 @@ -// RUN: %clangxx -Xclang -fsycl-allow-func-ptr -std=c++14 -fsycl %s -o %t.out -lOpenCL +// RUN: %clangxx -Xclang -fsycl-allow-func-ptr -fno-sycl-device-code-split -std=c++14 -fsycl %s -o %t.out -lOpenCL // RUN: env SYCL_DEVICE_TYPE=HOST %t.out // RUN: %CPU_RUN_PLACEHOLDER %t.out // RUN: %GPU_RUN_PLACEHOLDER %t.out diff --git a/sycl/test/function-pointers/pass-fp-through-buffer.cpp b/sycl/test/function-pointers/pass-fp-through-buffer.cpp index 4891c31b19412..55b74a5af360b 100644 --- a/sycl/test/function-pointers/pass-fp-through-buffer.cpp +++ b/sycl/test/function-pointers/pass-fp-through-buffer.cpp @@ -1,4 +1,4 @@ -// RUN: %clangxx -Xclang -fsycl-allow-func-ptr -std=c++14 -fsycl %s -o %t.out -lOpenCL +// RUN: %clangxx -Xclang -fsycl-allow-func-ptr -fno-sycl-device-code-split -std=c++14 -fsycl %s -o %t.out -lOpenCL // RUN: env SYCL_DEVICE_TYPE=HOST %t.out // RUN: %CPU_RUN_PLACEHOLDER %t.out // RUN: %GPU_RUN_PLACEHOLDER %t.out From 4960e106746fa75f8637cca84ce60373510651b2 Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Thu, 21 Nov 2019 14:57:13 +0300 Subject: [PATCH 02/13] Apply minor comments Signed-off-by: Mariya Podchishchaeva --- clang/lib/Driver/Driver.cpp | 20 ++++++++++---------- clang/lib/Driver/ToolChains/Clang.cpp | 8 ++++---- clang/lib/Driver/ToolChains/SYCL.cpp | 24 ++++++++++++------------ 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index ee7bea02b7d4a..3f71ad1853ce7 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -3283,7 +3283,7 @@ class OffloadingActionBuilder final { C.MakeAction(DeviceLinkAction, types::TY_Object); } else { - auto Link = C.MakeAction(SYCLLinkBinaryList, + auto *Link = C.MakeAction(SYCLLinkBinaryList, types::TY_Image); SYCLLinkBinary = C.MakeAction( Link, types::TY_Image); @@ -3482,6 +3482,7 @@ class OffloadingActionBuilder final { C.MakeAction(LI, types::TY_LLVM_BC); ActionList WrapperInputs; Action *SPIRVInput = DeviceLinkAction; + types::ID OutType = types::TY_SPIRV; if (!NoDeviceCodeSplit) { auto *SplitAction = C.MakeAction( DeviceLinkAction, types::TY_TempIRfilelist); @@ -3489,10 +3490,10 @@ class OffloadingActionBuilder final { DeviceLinkAction, types::TY_TempEntriesfilelist); SPIRVInput = SplitAction; WrapperInputs.push_back(EntryGenAction); + OutType = types::TY_Tempfilelist; } - auto *SPIRVTranslateAction = C.MakeAction( - SPIRVInput, - (NoDeviceCodeSplit) ? types::TY_SPIRV : types::TY_Tempfilelist); + auto *SPIRVTranslateAction = + C.MakeAction(SPIRVInput, OutType); auto TT = SYCLTripleList[I]; bool SYCLAOTCompile = @@ -3503,13 +3504,12 @@ class OffloadingActionBuilder final { // After the Link, wrap the files before the final host link if (SYCLAOTCompile) { - types::ID OutType; + OutType = types::TY_Tempfilelist; if (NoDeviceCodeSplit) { - OutType = types::TY_Image; - if (TT.getSubArch() == llvm::Triple::SPIRSubArch_fpga) - OutType = FPGAOutType; - } else - OutType = types::TY_Tempfilelist; + OutType = (TT.getSubArch() == llvm::Triple::SPIRSubArch_fpga) + ? FPGAOutType + : types::TY_Image; + } // Do the additional Ahead of Time compilation when the specific // triple calls for it (provided a valid subarch). auto *DeviceBECompileAction = C.MakeAction( diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index bd65510dd0e9d..ffb7144b63de8 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -7149,16 +7149,16 @@ void SPIRVTranslator::ConstructJob(Compilation &C, const JobAction &JA, TranslatorArgs.push_back("-spirv-ext=+all"); } for (auto I : Inputs) { + std::string Filename(I.getFilename()); if (I.getType() == types::TY_TempIRfilelist) { - std::string FileName(I.getFilename()); ForeachArgs.push_back( - C.getArgs().MakeArgString("--in-file-list=" + FileName)); + C.getArgs().MakeArgString("--in-file-list=" + Filename)); ForeachArgs.push_back( - C.getArgs().MakeArgString("--in-replace=" + FileName)); + C.getArgs().MakeArgString("--in-replace=" + Filename)); ForeachArgs.push_back( C.getArgs().MakeArgString("--out-ext=spv")); } - TranslatorArgs.push_back(I.getFilename()); + TranslatorArgs.push_back(C.getArgs().MakeArgString(Filename)); } auto Cmd = std::make_unique(JA, *this, diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 1b86d31c58ee8..9c8a2ef5af7f3 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -301,14 +301,14 @@ void SYCL::fpga::BackendCompiler::ConstructJob(Compilation &C, } for (const auto &II : Inputs) { + std::string Filename(II.getFilename()); if (II.getType() == types::TY_Tempfilelist) { - std::string FileName(II.getFilename()); ForeachArgs.push_back( - C.getArgs().MakeArgString("--in-file-list=" + FileName)); + C.getArgs().MakeArgString("--in-file-list=" + Filename)); ForeachArgs.push_back( - C.getArgs().MakeArgString("--in-replace=" + FileName)); + C.getArgs().MakeArgString("--in-replace=" + Filename)); } - CmdArgs.push_back(II.getFilename()); + CmdArgs.push_back(C.getArgs().MakeArgString(Filename)); } InputInfoList FPGADepFiles; @@ -400,14 +400,14 @@ void SYCL::gen::BackendCompiler::ConstructJob(Compilation &C, ArgStringList ForeachArgs; for (const auto &II : Inputs) { CmdArgs.push_back("-file"); + std::string Filename(II.getFilename()); if (II.getType() == types::TY_Tempfilelist) { - std::string FileName(II.getFilename()); ForeachArgs.push_back( - C.getArgs().MakeArgString("--in-file-list=" + FileName)); + C.getArgs().MakeArgString("--in-file-list=" + Filename)); ForeachArgs.push_back( - C.getArgs().MakeArgString("--in-replace=" + FileName)); + C.getArgs().MakeArgString("--in-replace=" + Filename)); } - CmdArgs.push_back(II.getFilename()); + CmdArgs.push_back(C.getArgs().MakeArgString(Filename)); } // The next line prevents ocloc from modifying the image name CmdArgs.push_back("-output_no_suffix"); @@ -433,14 +433,14 @@ void SYCL::x86_64::BackendCompiler::ConstructJob(Compilation &C, CmdArgs.push_back("-device=cpu"); ArgStringList ForeachArgs; for (const auto &II : Inputs) { + std::string Filename(II.getFilename()); if (II.getType() == types::TY_Tempfilelist) { - std::string FileName(II.getFilename()); ForeachArgs.push_back( - C.getArgs().MakeArgString("--in-file-list=" + FileName)); + C.getArgs().MakeArgString("--in-file-list=" + Filename)); ForeachArgs.push_back( - C.getArgs().MakeArgString("--in-replace=" + FileName)); + C.getArgs().MakeArgString("--in-replace=" + Filename)); } - CmdArgs.push_back(Args.MakeArgString(Twine("-binary=") + II.getFilename())); + CmdArgs.push_back(Args.MakeArgString(Twine("-binary=") + Filename)); } TranslateSYCLTargetArgs(C, Args, getToolChain(), CmdArgs); SmallString<128> ExecPath(getToolChain().GetProgramPath("ioc64")); From 6a5eff7ba99ff5b38dffce1885fc9fbb0bd6e39d Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Mon, 25 Nov 2019 15:10:51 +0300 Subject: [PATCH 03/13] Apply comments Signed-off-by: Mariya Podchishchaeva --- clang/lib/Driver/Driver.cpp | 7 +- clang/lib/Driver/ToolChains/SYCL.cpp | 73 ++++++++++---------- clang/lib/Driver/ToolChains/SYCL.h | 9 +-- clang/test/Driver/sycl-offload-intelfpga.cpp | 4 +- 4 files changed, 48 insertions(+), 45 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 3f71ad1853ce7..55eb4875c9954 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -3464,9 +3464,10 @@ class OffloadingActionBuilder final { } } if (!DeviceObjects.empty()) { - // link and wrap the device binary, but do not perform the - // backend compile. - // TODO: perform split here? + // When aocx or aocr is seen, there is an expectation that none of + // the other objects processed have any kernel. So, there + // is no need in device code split and backend compile here. Just + // link and wrap the device binary. auto *DeviceLinkAction = C.MakeAction(DeviceObjects, types::TY_LLVM_BC); auto *SPIRVTranslateAction = C.MakeAction( diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 9c8a2ef5af7f3..46a04fdbe3381 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -55,12 +55,23 @@ const char *SYCL::Linker::constructLLVMSpirvCommand(Compilation &C, void SYCL::constructLLVMForeachCommand(Compilation &C, const JobAction &JA, std::unique_ptr InputCommand, - ArgStringList &ForeachArgs, - const InputInfo &Output, const Tool *T) { + const InputInfoList &InputFiles, + const InputInfo &Output, const Tool *T, + StringRef Ext = "out") { // Construct llvm-foreach command. // The llvm-foreach command looks like this: // llvm-foreach --in-file-list=a.list --in-replace='{}' -- echo '{}' + ArgStringList ForeachArgs; std::string OutputFileName(Output.getFilename()); + ForeachArgs.push_back(C.getArgs().MakeArgString("--out-ext=" + Ext)); + for (auto &I : InputFiles) { + std::string Filename(I.getFilename()); + ForeachArgs.push_back( + C.getArgs().MakeArgString("--in-file-list=" + Filename)); + ForeachArgs.push_back( + C.getArgs().MakeArgString("--in-replace=" + Filename)); + } + ForeachArgs.push_back( C.getArgs().MakeArgString("--out-file-list=" + OutputFileName)); ForeachArgs.push_back( @@ -80,7 +91,7 @@ void SYCL::constructLLVMForeachCommand(Compilation &C, const JobAction &JA, const char *SYCL::Linker::constructLLVMLinkCommand(Compilation &C, const JobAction &JA, const InputInfo &Output, const ArgList &Args, - StringRef SubArchName, StringRef OutputFilePrefix, bool ToBc, + StringRef SubArchName, StringRef OutputFilePrefix, const InputInfoList &InputFiles) const { ArgStringList CmdArgs; // Add the input bc's created by compile step. @@ -169,8 +180,8 @@ void SYCL::Linker::ConstructJob(Compilation &C, const JobAction &JA, } } - constructLLVMLinkCommand(C, JA, Output, Args, SubArchName, Prefix, true, - SpirvInputs); + constructLLVMLinkCommand(C, JA, Output, Args, SubArchName, Prefix, + SpirvInputs); } void SYCL::TranslateSYCLTargetArgs(Compilation &C, @@ -289,25 +300,23 @@ void SYCL::fpga::BackendCompiler::ConstructJob(Compilation &C, assert((getToolChain().getTriple().getArch() == llvm::Triple::spir || getToolChain().getTriple().getArch() == llvm::Triple::spir64) && "Unsupported target"); - StringRef ForeachExt = "aocx"; ArgStringList CmdArgs{"-o", Output.getFilename()}; - ArgStringList ForeachArgs; + InputInfoList ForeachInputs; CmdArgs.push_back("-sycl"); + + StringRef ForeachExt = "aocx"; if (Arg *A = Args.getLastArg(options::OPT_fsycl_link_EQ)) if (A->getValue() == StringRef("early")) { CmdArgs.push_back("-rtl"); ForeachExt = "aocr"; } + for (const auto &II : Inputs) { std::string Filename(II.getFilename()); - if (II.getType() == types::TY_Tempfilelist) { - ForeachArgs.push_back( - C.getArgs().MakeArgString("--in-file-list=" + Filename)); - ForeachArgs.push_back( - C.getArgs().MakeArgString("--in-replace=" + Filename)); - } + if (II.getType() == types::TY_Tempfilelist) + ForeachInputs.push_back(II); CmdArgs.push_back(C.getArgs().MakeArgString(Filename)); } @@ -379,11 +388,10 @@ void SYCL::fpga::BackendCompiler::ConstructJob(Compilation &C, SmallString<128> ExecPath(getToolChain().GetProgramPath("aoc")); const char *Exec = C.getArgs().MakeArgString(ExecPath); auto Cmd = std::make_unique(JA, *this, Exec, CmdArgs, None); - if (!ForeachArgs.empty()) { - ForeachArgs.push_back(C.getArgs().MakeArgString("--out-ext=" + ForeachExt)); - constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachArgs, Output, - this); - } else + if (!ForeachInputs.empty()) + constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachInputs, Output, + this, ForeachExt); + else C.addCommand(std::move(Cmd)); } @@ -397,16 +405,12 @@ void SYCL::gen::BackendCompiler::ConstructJob(Compilation &C, getToolChain().getTriple().getArch() == llvm::Triple::spir64) && "Unsupported target"); ArgStringList CmdArgs{"-output", Output.getFilename()}; - ArgStringList ForeachArgs; + InputInfoList ForeachInputs; for (const auto &II : Inputs) { CmdArgs.push_back("-file"); std::string Filename(II.getFilename()); - if (II.getType() == types::TY_Tempfilelist) { - ForeachArgs.push_back( - C.getArgs().MakeArgString("--in-file-list=" + Filename)); - ForeachArgs.push_back( - C.getArgs().MakeArgString("--in-replace=" + Filename)); - } + if (II.getType() == types::TY_Tempfilelist) + ForeachInputs.push_back(II); CmdArgs.push_back(C.getArgs().MakeArgString(Filename)); } // The next line prevents ocloc from modifying the image name @@ -416,8 +420,9 @@ void SYCL::gen::BackendCompiler::ConstructJob(Compilation &C, SmallString<128> ExecPath(getToolChain().GetProgramPath("ocloc")); const char *Exec = C.getArgs().MakeArgString(ExecPath); auto Cmd = std::make_unique(JA, *this, Exec, CmdArgs, None); - if (!ForeachArgs.empty()) - constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachArgs, Output, this); + if (!ForeachInputs.empty()) + constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachInputs, Output, + this); else C.addCommand(std::move(Cmd)); } @@ -431,23 +436,19 @@ void SYCL::x86_64::BackendCompiler::ConstructJob(Compilation &C, ArgStringList CmdArgs; CmdArgs.push_back(Args.MakeArgString(Twine("-ir=") + Output.getFilename())); CmdArgs.push_back("-device=cpu"); - ArgStringList ForeachArgs; + InputInfoList ForeachInputs; for (const auto &II : Inputs) { std::string Filename(II.getFilename()); - if (II.getType() == types::TY_Tempfilelist) { - ForeachArgs.push_back( - C.getArgs().MakeArgString("--in-file-list=" + Filename)); - ForeachArgs.push_back( - C.getArgs().MakeArgString("--in-replace=" + Filename)); - } + if (II.getType() == types::TY_Tempfilelist) + ForeachInputs.push_back(II); CmdArgs.push_back(Args.MakeArgString(Twine("-binary=") + Filename)); } TranslateSYCLTargetArgs(C, Args, getToolChain(), CmdArgs); SmallString<128> ExecPath(getToolChain().GetProgramPath("ioc64")); const char *Exec = C.getArgs().MakeArgString(ExecPath); auto Cmd = std::make_unique(JA, *this, Exec, CmdArgs, None); - if (!ForeachArgs.empty()) - constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachArgs, Output, + if (!ForeachInputs.empty()) + constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachInputs, Output, this); else C.addCommand(std::move(Cmd)); diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h index 6869562b93404..1045d4827a217 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -31,9 +31,10 @@ void TranslateSYCLLinkerArgs(Compilation &C, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs); void constructLLVMForeachCommand(Compilation &C, const JobAction &JA, - std::unique_ptr InputCommand, - llvm::opt::ArgStringList &ForeachArgs, - const InputInfo &Output, const Tool *T); + std::unique_ptr InputCommand, + const InputInfoList &InputFiles, + const InputInfo &Output, const Tool *T, + StringRef Ext); // Runs llvm-spirv to convert spirv to bc, llvm-link, which links multiple LLVM // bitcode. Converts generated bc back to spirv using llvm-spirv, wraps with @@ -60,7 +61,7 @@ class LLVM_LIBRARY_VISIBILITY Linker : public Tool { const InputInfo &Output, const llvm::opt::ArgList &Args, llvm::StringRef SubArchName, - llvm::StringRef OutputFilePrefix, bool isBc, + llvm::StringRef OutputFilePrefix, const InputInfoList &InputFiles) const; void constructLlcCommand(Compilation &C, const JobAction &JA, const InputInfo &Output, diff --git a/clang/test/Driver/sycl-offload-intelfpga.cpp b/clang/test/Driver/sycl-offload-intelfpga.cpp index 761705ed19b77..109a8a8856854 100644 --- a/clang/test/Driver/sycl-offload-intelfpga.cpp +++ b/clang/test/Driver/sycl-offload-intelfpga.cpp @@ -27,8 +27,8 @@ // CHK-FPGA-LINK: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2:.+\.bc]]" // CHK-FPGA-LINK: sycl-post-link{{.*}} "[[OUTPUT2]]" "-ir-files-list=[[OUTPUT3:.*]]" "-o" // CHK-FPGA-LINK: llvm-foreach{{.*}} "--" "{{.*}}llvm-spirv{{.*}} "-o" "[[OUTPUT4:.+]]" "-spirv-max-version=1.1" "-spirv-ext=+all" "[[OUTPUT3]]" -// CHK-FPGA-EARLY: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-o" "[[OUTPUT5:.+]]" "-sycl" "-rtl" "[[OUTPUT4]]" -// CHK-FPGA-IMAGE: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-o" "[[OUTPUT5:.+]]" "-sycl" "[[OUTPUT4]]" +// CHK-FPGA-EARLY: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-o" {{.*}} "-sycl" "-rtl" "[[OUTPUT4]]" +// CHK-FPGA-IMAGE: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-o" {{.*}} "-sycl" "[[OUTPUT4]]" // CHK-FPGA-LINK: {{lib|llvm-ar}}{{.*}} "[[INPUT]]" /// -fintelfpga -fsycl-link clang-cl specific From bbcd3b58e79661490ebb6a7c0a698895201ec6db Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Mon, 25 Nov 2019 19:02:15 +0300 Subject: [PATCH 04/13] Apply minor CR comments Signed-off-by: Mariya Podchishchaeva --- clang/lib/Driver/ToolChains/SYCL.cpp | 1 - clang/lib/Driver/ToolChains/SYCL.h | 18 ++++++++---------- clang/test/Driver/sycl-offload-intelfpga.cpp | 2 +- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 46a04fdbe3381..7f0b1c9fe6cbb 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -312,7 +312,6 @@ void SYCL::fpga::BackendCompiler::ConstructJob(Compilation &C, ForeachExt = "aocr"; } - for (const auto &II : Inputs) { std::string Filename(II.getFilename()); if (II.getType() == types::TY_Tempfilelist) diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h index 1045d4827a217..6515ef82697fc 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -21,20 +21,18 @@ namespace tools { namespace SYCL { // Gather command line arguments for backend compilation call -void TranslateSYCLTargetArgs(Compilation &C, const llvm::opt::ArgList &Args, - const ToolChain &TC, - llvm::opt::ArgStringList &CmdArgs); +void TranslateSYCLTargetArgs(Compilation &C, + const llvm::opt::ArgList &Args, const ToolChain &TC, llvm::opt::ArgStringList &CmdArgs); // Gather command line arguments for device specific link -void TranslateSYCLLinkerArgs(Compilation &C, const llvm::opt::ArgList &Args, - const ToolChain &TC, - llvm::opt::ArgStringList &CmdArgs); +void TranslateSYCLLinkerArgs(Compilation &C, + const llvm::opt::ArgList &Args, const ToolChain &TC, llvm::opt::ArgStringList &CmdArgs); void constructLLVMForeachCommand(Compilation &C, const JobAction &JA, - std::unique_ptr InputCommand, - const InputInfoList &InputFiles, - const InputInfo &Output, const Tool *T, - StringRef Ext); + std::unique_ptr InputCommand, + const InputInfoList &InputFiles, + const InputInfo &Output, const Tool *T, + StringRef Ext); // Runs llvm-spirv to convert spirv to bc, llvm-link, which links multiple LLVM // bitcode. Converts generated bc back to spirv using llvm-spirv, wraps with diff --git a/clang/test/Driver/sycl-offload-intelfpga.cpp b/clang/test/Driver/sycl-offload-intelfpga.cpp index 109a8a8856854..17482b16caf8c 100644 --- a/clang/test/Driver/sycl-offload-intelfpga.cpp +++ b/clang/test/Driver/sycl-offload-intelfpga.cpp @@ -75,7 +75,7 @@ // CHK-FPGA: clang-offload-bundler{{.*}} "-type=o" "-targets=host-x86_64-unknown-linux-gnu,sycl-spir64_fpga-unknown-unknown-sycldevice" {{.*}} "-outputs=[[FINALLINK2:.+\.o]],[[OUTPUT1:.+\.o]]" "-unbundle" // CHK-FPGA: llvm-no-spir-kernel{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT3:.+\.o]]" // CHK-FPGA: llvm-link{{.*}} "[[OUTPUT3]]" "-o" "[[OUTPUT4:.+\.bc]]" -// CHK-FPGA: llvm-spirv{{.*}} "-o" "[[OUTPUT5:.+\.spv]]" {{.*}} "[[OUTPUT4]]" +// CHK-FPGA: llvm-spirv{{.*}} "-o" "[[OUTPUT5:.+\.spv]]" "-spirv-max-version=1.1" "-spirv-ext=+all" "[[OUTPUT4]]" // CHK-FPGA: clang-offload-wrapper{{.*}} "-o=[[OUTPUT6:.+\.bc]]" "-host=x86_64-unknown-linux-gnu" "-target=spir64_fpga" "-kind=sycl" "[[OUTPUT5]]" // CHK-FPGA: llc{{.*}} "-filetype=obj" "-o" "[[FINALLINK3:.+\.o]]" "[[OUTPUT6]]" // CHK-FPGA: clang-offload-bundler{{.*}} "-type=aoo" "-targets=host-x86_64-unknown-linux-gnu" {{.*}} "-outputs=[[FINALLINK4:.+\.txt]]" "-unbundle" From 69b70c595b74ab43fd08ccbd08f7cf8be7f0eae5 Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Mon, 25 Nov 2019 19:32:41 +0300 Subject: [PATCH 05/13] Re-use tempfilelist instead of tempirfileslist Signed-off-by: Mariya Podchishchaeva --- clang/include/clang/Driver/Types.def | 1 - clang/lib/Driver/Compilation.cpp | 1 - clang/lib/Driver/Driver.cpp | 2 +- clang/lib/Driver/ToolChains/Clang.cpp | 4 +-- clang/test/Driver/sycl-offload-intelfpga.cpp | 2 +- clang/test/Driver/sycl-offload-win.c | 2 +- clang/test/Driver/sycl-offload.c | 28 ++++++++++---------- 7 files changed, 19 insertions(+), 21 deletions(-) diff --git a/clang/include/clang/Driver/Types.def b/clang/include/clang/Driver/Types.def index e1e4c723ca82d..49196053835eb 100644 --- a/clang/include/clang/Driver/Types.def +++ b/clang/include/clang/Driver/Types.def @@ -103,7 +103,6 @@ TYPE("spirv", SPIRV, INVALID, "spv", phases TYPE("sycl-header", SYCL_Header, INVALID, "h", phases::Compile, phases::Backend, phases::Assemble, phases::Link) TYPE("sycl-fatbin", SYCL_FATBIN, INVALID, nullptr, phases::Compile, phases::Backend, phases::Assemble, phases::Link) TYPE("tempfilelist", Tempfilelist, INVALID, "txt", phases::Compile, phases::Backend, phases::Assemble, phases::Link) -TYPE("tempirfilelist", TempIRfilelist, INVALID, "txt", phases::Compile, phases::Backend, phases::Assemble, phases::Link) TYPE("tempentriesfilelist", TempEntriesfilelist, INVALID, "txt", phases::Compile, phases::Backend, phases::Assemble, phases::Link) TYPE("archive", Archive, INVALID, "a", phases::Compile, phases::Backend, phases::Assemble, phases::Link) TYPE("fpga-aocx", FPGA_AOCX, INVALID, "aocx", phases::Compile, phases::Backend, phases::Assemble, phases::Link) diff --git a/clang/lib/Driver/Compilation.cpp b/clang/lib/Driver/Compilation.cpp index 89f7622b50588..b203dc388bff0 100644 --- a/clang/lib/Driver/Compilation.cpp +++ b/clang/lib/Driver/Compilation.cpp @@ -136,7 +136,6 @@ bool Compilation::CleanupFileList(const TempFileList &Files, // Temporary file lists contain files that need to be cleaned. The // file containing the information is also removed if (File.second == types::TY_Tempfilelist || - File.second == types::TY_TempIRfilelist || File.second == types::TY_TempEntriesfilelist) { std::ifstream ListFile(File.first); if (ListFile) { diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 55eb4875c9954..c3612cdfefc6e 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -3486,7 +3486,7 @@ class OffloadingActionBuilder final { types::ID OutType = types::TY_SPIRV; if (!NoDeviceCodeSplit) { auto *SplitAction = C.MakeAction( - DeviceLinkAction, types::TY_TempIRfilelist); + DeviceLinkAction, types::TY_Tempfilelist); auto *EntryGenAction = C.MakeAction( DeviceLinkAction, types::TY_TempEntriesfilelist); SPIRVInput = SplitAction; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index ffb7144b63de8..a3c9981411273 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -7150,7 +7150,7 @@ void SPIRVTranslator::ConstructJob(Compilation &C, const JobAction &JA, } for (auto I : Inputs) { std::string Filename(I.getFilename()); - if (I.getType() == types::TY_TempIRfilelist) { + if (I.getType() == types::TY_Tempfilelist) { ForeachArgs.push_back( C.getArgs().MakeArgString("--in-file-list=" + Filename)); ForeachArgs.push_back( @@ -7235,7 +7235,7 @@ void SYCLPostLink::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back(InputFileName); std::string OutputFileName(Output.getFilename()); - if (Output.getType() == types::TY_TempIRfilelist) + if (Output.getType() == types::TY_Tempfilelist) CmdArgs.push_back(TCArgs.MakeArgString("-ir-files-list=" + OutputFileName)); else if (Output.getType() == types::TY_TempEntriesfilelist) CmdArgs.push_back( diff --git a/clang/test/Driver/sycl-offload-intelfpga.cpp b/clang/test/Driver/sycl-offload-intelfpga.cpp index 17482b16caf8c..48648aedc19ee 100644 --- a/clang/test/Driver/sycl-offload-intelfpga.cpp +++ b/clang/test/Driver/sycl-offload-intelfpga.cpp @@ -129,7 +129,7 @@ // CHK-FPGA-LINK-SRC: 12: assembler, {11}, object, (device-sycl) // CHK-FPGA-LINK-SRC: 13: linker, {12}, ir, (device-sycl) // CHK-FPGA-LINK-SRC: 14: sycl-post-link, {13}, tempentriesfilelist, (device-sycl) -// CHK-FPGA-LINK-SRC: 15: sycl-post-link, {13}, tempirfilelist, (device-sycl) +// CHK-FPGA-LINK-SRC: 15: sycl-post-link, {13}, tempfilelist, (device-sycl) // CHK-FPGA-LINK-SRC: 16: llvm-spirv, {15}, tempfilelist, (device-sycl) // CHK-FPGA-LINK-SRC: 17: backend-compiler, {16}, tempfilelist, (device-sycl) // CHK-FPGA-LINK-SRC: 18: clang-offload-wrapper, {14, 17}, object, (device-sycl) diff --git a/clang/test/Driver/sycl-offload-win.c b/clang/test/Driver/sycl-offload-win.c index bd727184d61aa..1964574d9d586 100644 --- a/clang/test/Driver/sycl-offload-win.c +++ b/clang/test/Driver/sycl-offload-win.c @@ -81,7 +81,7 @@ // FOFFLOAD_STATIC_LIB_SRC: 14: clang-offload-unbundler, {13}, archive // FOFFLOAD_STATIC_LIB_SRC: 15: linker, {12, 14}, ir, (device-sycl) // FOFFLOAD_STATIC_LIB_SRC: 16: sycl-post-link, {15}, tempentriesfilelist, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 17: sycl-post-link, {15}, tempirfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 17: sycl-post-link, {15}, tempfilelist, (device-sycl) // FOFFLOAD_STATIC_LIB_SRC: 18: llvm-spirv, {17}, tempfilelist, (device-sycl) // FOFFLOAD_STATIC_LIB_SRC: 19: clang-offload-wrapper, {16, 18}, object, (device-sycl) // FOFFLOAD_STATIC_LIB_SRC_DEFAULT: 20: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {19}, image diff --git a/clang/test/Driver/sycl-offload.c b/clang/test/Driver/sycl-offload.c index 202f3e97559fa..b88a166b48405 100644 --- a/clang/test/Driver/sycl-offload.c +++ b/clang/test/Driver/sycl-offload.c @@ -189,7 +189,7 @@ // CHK-PHASES: 12: assembler, {11}, object, (device-sycl) // CHK-PHASES: 13: linker, {12}, ir, (device-sycl) // CHK-PHASES: 14: sycl-post-link, {13}, tempentriesfilelist, (device-sycl) -// CHK-PHASES: 15: sycl-post-link, {13}, tempirfilelist, (device-sycl) +// CHK-PHASES: 15: sycl-post-link, {13}, tempfilelist, (device-sycl) // CHK-PHASES: 16: llvm-spirv, {15}, tempfilelist, (device-sycl) // CHK-PHASES: 17: clang-offload-wrapper, {14, 16}, object, (device-sycl) // CHK-PHASES-DEFAULT-MODE: 18: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {17}, image @@ -227,7 +227,7 @@ // CHK-PHASES-LIB: 13: assembler, {12}, object, (device-sycl) // CHK-PHASES-LIB: 14: linker, {13}, ir, (device-sycl) // CHK-PHASES-LIB: 15: sycl-post-link, {14}, tempentriesfilelist, (device-sycl) -// CHK-PHASES-LIBL 16: sycl-post-link, {14}, tempirfilelist, (device-sycl) +// CHK-PHASES-LIBL 16: sycl-post-link, {14}, tempfilelist, (device-sycl) // CHK-PHASES-LIB: 17: llvm-spirv, {16}, tempfilelist, (device-sycl) // CHK-PHASES-LIB: 18: clang-offload-wrapper, {15, 17}, object, (device-sycl) // CHK-PHASES-LIB: 19: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (spir64-unknown-unknown-sycldevice)" {18}, image @@ -274,7 +274,7 @@ // CHK-PHASES-FILES: 25: assembler, {24}, object, (device-sycl) // CHK-PHASES-FILES: 26: linker, {22, 25}, ir, (device-sycl) // CHK-PHASES-FILES: 27: sycl-post-link, {26}, tempentriesfilelist, (device-sycl) -// CHK-PHASES-FILES: 28: sycl-post-link, {26}, tempirfilelist, (device-sycl) +// CHK-PHASES-FILES: 28: sycl-post-link, {26}, tempfilelist, (device-sycl) // CHK-PHASES-FILES: 29: llvm-spirv, {28}, tempfilelist, (device-sycl) // CHK-PHASES-FILES: 30: clang-offload-wrapper, {27, 29}, object, (device-sycl) // CHK-PHASES-FILES: 31: offload, "host-sycl (x86_64-unknown-linux-gnu)" {19}, "device-sycl (spir64-unknown-unknown-sycldevice)" {30}, image @@ -315,7 +315,7 @@ // CHK-UBACTIONS: 3: linker, {0, 2}, image, (host-sycl) // CHK-UBACTIONS: 4: linker, {2}, ir, (device-sycl) // CHK-UBACTIONS: 5: sycl-post-link, {4}, tempentriesfilelist, (device-sycl) -// CHK-UBACTIONS: 6: sycl-post-link, {4}, tempirfilelist, (device-sycl) +// CHK-UBACTIONS: 6: sycl-post-link, {4}, tempfilelist, (device-sycl) // CHK-UBACTIONS: 7: llvm-spirv, {6}, tempfilelist, (device-sycl) // CHK-UBACTIONS: 8: clang-offload-wrapper, {5, 7}, object, (device-sycl) // CHK-UBACTIONS: 9: offload, "host-sycl (x86_64-unknown-linux-gnu)" {3}, "device-sycl (spir64-unknown-unknown-sycldevice)" {8}, image @@ -344,7 +344,7 @@ // CHK-UBUACTIONS: 15: assembler, {14}, object, (device-sycl) // CHK-UBUACTIONS: 16: linker, {2, 15}, ir, (device-sycl) // CHK-UBUACTIONS: 17: sycl-post-link, {16}, tempentriesfilelist, (device-sycl) -// CHK-UBUACTIONS: 18: sycl-post-link, {16}, tempirfilelist, (device-sycl) +// CHK-UBUACTIONS: 18: sycl-post-link, {16}, tempfilelist, (device-sycl) // CHK-UBUACTIONS: 19: llvm-spirv, {18}, tempfilelist, (device-sycl) // CHK-UBUACTIONS: 20: clang-offload-wrapper, {17, 19}, object, (device-sycl) // CHK-UBUACTIONS: 21: offload, "host-sycl (x86_64-unknown-linux-gnu)" {12}, "device-sycl (spir64-unknown-unknown-sycldevice)" {20}, image @@ -532,7 +532,7 @@ // CHK-ADD-TARGETS-REG: 12: assembler, {11}, object, (device-sycl) // CHK-ADD-TARGETS-REG: 13: linker, {12}, ir, (device-sycl) // CHK-ADD-TARGETS-REG: 14: sycl-post-link, {13}, tempentriesfilelist, (device-sycl) -// CHK-ADD-TARGETS-REG: 15: sycl-post-link, {13}, tempirfilelist, (device-sycl) +// CHK-ADD-TARGETS-REG: 15: sycl-post-link, {13}, tempfilelist, (device-sycl) // CHK-ADD-TARGETS-REG: 16: llvm-spirv, {15}, tempfilelist, (device-sycl) // CHK-ADD-TARGETS-REG: 17: clang-offload-wrapper, {14, 16}, object, (device-sycl) // CHK-ADD-TARGETS-REG: 18: input, "dummy.spv", sycl-fatbin, (device-sycl) @@ -561,7 +561,7 @@ // CHK-ADD-TARGETS-REG-MUL: 14: assembler, {13}, object, (device-sycl) // CHK-ADD-TARGETS-REG-MUL: 15: linker, {14}, ir, (device-sycl) // CHK-ADD-TARGETS-REG-MUL: 16: sycl-post-link, {15}, tempentriesfilelist, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 17: sycl-post-link, {15}, tempirfilelist, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 17: sycl-post-link, {15}, tempfilelist, (device-sycl) // CHK-ADD-TARGETS-REG-MUL: 18: llvm-spirv, {17}, tempfilelist, (device-sycl) // CHK-ADD-TARGETS-REG-MUL: 19: clang-offload-wrapper, {16, 18}, object, (device-sycl) // CHK-ADD-TARGETS-REG-MUL: 20: input, "dummy.aocx", sycl-fatbin, (device-sycl) @@ -637,7 +637,7 @@ // FOFFLOAD_STATIC_LIB_SRC: 13: assembler, {12}, object, (device-sycl) // FOFFLOAD_STATIC_LIB_SRC: 14: linker, {13, 9}, ir, (device-sycl) // FOFFLOAD_STATIC_LIB_SRC: 15: sycl-post-link, {14}, tempentriesfilelist, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 16: sycl-post-link, {14}, tempirfilelist, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 16: sycl-post-link, {14}, tempfilelist, (device-sycl) // FOFFLOAD_STATIC_LIB_SRC: 17: llvm-spirv, {16}, tempfilelist, (device-sycl) // FOFFLOAD_STATIC_LIB_SRC: 18: clang-offload-wrapper, {15, 17}, object, (device-sycl) // FOFFLOAD_STATIC_LIB_SRC: 19: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (spir64-unknown-unknown-sycldevice)" {18}, image @@ -706,7 +706,7 @@ // CHK-PHASES-AOT: 12: assembler, {11}, object, (device-sycl) // CHK-PHASES-AOT: 13: linker, {12}, ir, (device-sycl) // CHK-PHASES-AOT: 14: sycl-post-link, {13}, tempentriesfilelist, (device-sycl) -// CHK-PHASES-AOT: 15: sycl-post-link, {13}, tempirfilelist, (device-sycl) +// CHK-PHASES-AOT: 15: sycl-post-link, {13}, tempfilelist, (device-sycl) // CHK-PHASES-AOT: 16: llvm-spirv, {15}, tempfilelist, (device-sycl) // CHK-PHASES-GEN: 17: backend-compiler, {16}, tempfilelist, (device-sycl) // CHK-PHASES-FPGA: 17: backend-compiler, {16}, tempfilelist, (device-sycl) @@ -787,7 +787,7 @@ // CHK-PHASE-MULTI-TARG: 14: assembler, {13}, object, (device-sycl) // CHK-PHASE-MULTI-TARG: 15: linker, {14}, ir, (device-sycl) // CHK-PHASE-MULTI-TARG: 16: sycl-post-link, {15}, tempentriesfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG: 17: sycl-post-link, {15}, tempirfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG: 17: sycl-post-link, {15}, tempfilelist, (device-sycl) // CHK-PHASE-MULTI-TARG: 18: llvm-spirv, {17}, tempfilelist, (device-sycl) // CHK-PHASE-MULTI-TARG: 19: clang-offload-wrapper, {16, 18}, object, (device-sycl) // CHK-PHASE-MULTI-TARG: 20: input, "[[INPUT]]", c, (device-sycl) @@ -797,7 +797,7 @@ // CHK-PHASE-MULTI-TARG: 24: assembler, {23}, object, (device-sycl) // CHK-PHASE-MULTI-TARG: 25: linker, {24}, ir, (device-sycl) // CHK-PHASE-MULTI-TARG: 26: sycl-post-link, {25}, tempentriesfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG: 27: sycl-post-link, {25}, tempirfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG: 27: sycl-post-link, {25}, tempfilelist, (device-sycl) // CHK-PHASE-MULTI-TARG: 28: llvm-spirv, {27}, tempfilelist, (device-sycl) // CHK-PHASE-MULTI-TARG: 29: backend-compiler, {28}, tempfilelist, (device-sycl) // CHK-PHASE-MULTI-TARG: 30: clang-offload-wrapper, {26, 29}, object, (device-sycl) @@ -806,7 +806,7 @@ // CHK-PHASE-MULTI-TARG: 33: assembler, {32}, object, (device-sycl) // CHK-PHASE-MULTI-TARG: 34: linker, {33}, ir, (device-sycl) // CHK-PHASE-MULTI-TARG: 35: sycl-post-link, {34}, tempentriesfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG: 36: sycl-post-link, {34}, tempirfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG: 36: sycl-post-link, {34}, tempfilelist, (device-sycl) // CHK-PHASE-MULTI-TARG: 37: llvm-spirv, {36}, tempfilelist, (device-sycl) // CHK-PHASE-MULTI-TARG: 38: backend-compiler, {37}, tempfilelist, (device-sycl) // CHK-PHASE-MULTI-TARG: 39: clang-offload-wrapper, {35, 38}, object, (device-sycl) @@ -835,7 +835,7 @@ // CHK-PHASE-MULTI-TARG-W-ADD: 14: assembler, {13}, object, (device-sycl) // CHK-PHASE-MULTI-TARG-W-ADD: 15: linker, {14}, ir, (device-sycl) // CHK-PHASE-MULTI-TARG-W-ADD: 16: sycl-post-link, {15}, tempentriesfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 17: sycl-post-link, {15}, tempirfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 17: sycl-post-link, {15}, tempfilelist, (device-sycl) // CHK-PHASE-MULTI-TARG-W-ADD: 18: llvm-spirv, {17}, tempfilelist, (device-sycl) // CHK-PHASE-MULTI-TARG-W-ADD: 19: backend-compiler, {18}, tempfilelist, (device-sycl) // CHK-PHASE-MULTI-TARG-W-ADD: 20: clang-offload-wrapper, {16, 19}, object, (device-sycl) @@ -846,7 +846,7 @@ // CHK-PHASE-MULTI-TARG-W-ADD: 25: assembler, {24}, object, (device-sycl) // CHK-PHASE-MULTI-TARG-W-ADD: 26: linker, {25}, ir, (device-sycl) // CHK-PHASE-MULTI-TARG-W-ADD: 27: sycl-post-link, {26}, tempentriesfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 28: sycl-post-link, {26}, tempirfilelist, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 28: sycl-post-link, {26}, tempfilelist, (device-sycl) // CHK-PHASE-MULTI-TARG-W-ADD: 29: llvm-spirv, {28}, tempfilelist, (device-sycl) // CHK-PHASE-MULTI-TARG-W-ADD: 30: backend-compiler, {29}, tempfilelist, (device-sycl) // CHK-PHASE-MULTI-TARG-W-ADD: 31: clang-offload-wrapper, {27, 30}, object, (device-sycl) From aa34e2575aad1b3ba70251590b0280464f141423 Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Wed, 27 Nov 2019 16:58:39 +0300 Subject: [PATCH 06/13] Do not perform split by default Signed-off-by: Mariya Podchishchaeva --- clang/include/clang/Driver/Options.td | 4 +- clang/lib/Driver/Driver.cpp | 8 +- clang/lib/Driver/ToolChains/SYCL.cpp | 14 +- clang/test/Driver/sycl-offload-intelfpga.cpp | 36 +-- clang/test/Driver/sycl-offload-win.c | 10 +- clang/test/Driver/sycl-offload.c | 283 ++++++------------ .../function-pointers/fp-as-kernel-arg.cpp | 2 +- .../pass-fp-through-buffer.cpp | 2 +- 8 files changed, 124 insertions(+), 235 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index af44d7fcfc1da..2dcc47877e211 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1822,8 +1822,8 @@ def fsycl_add_targets_EQ : CommaJoined<["-"], "fsycl-add-targets=">, Flags<[Driv HelpText<"Specify comma-separated list of triple and device binary image pairs to add to the final SYCL binary">; def fsycl_link_targets_EQ : CommaJoined<["-"], "fsycl-link-targets=">, Flags<[DriverOption, CC1Option, CoreOption]>, HelpText<"Specify comma-separated list of triples SYCL offloading targets to produce linked device images">; -def fno_sycl_device_code_split : Flag<["-"], "fno-sycl-device-code-split">, - Flags<[CC1Option, CoreOption]>, HelpText<"Do not perform SYCL device code split">; +def fsycl_device_code_split : Flag<["-"], "fsycl-device-code-split">, + Flags<[CC1Option, CoreOption]>, HelpText<"Perform SYCL device code split">; def fsycl_one_kernel_per_module : Flag<["-"], "fsycl-one-kernel-per-module">, Flags<[CC1Option, CoreOption]>, HelpText<"Emit a separate device module for each kernel">; def fsycl_use_bitcode : Flag<["-"], "fsycl-use-bitcode">, diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index c3612cdfefc6e..400cb500502a6 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -3199,7 +3199,7 @@ class OffloadingActionBuilder final { bool WrapDeviceOnlyBinary = false; /// Flag to signal if the user requested do not perform device code split. - bool NoDeviceCodeSplit = false; + bool DeviceCodeSplit = false; /// The SYCL actions for the current input. ActionList SYCLDeviceActions; @@ -3484,7 +3484,7 @@ class OffloadingActionBuilder final { ActionList WrapperInputs; Action *SPIRVInput = DeviceLinkAction; types::ID OutType = types::TY_SPIRV; - if (!NoDeviceCodeSplit) { + if (DeviceCodeSplit) { auto *SplitAction = C.MakeAction( DeviceLinkAction, types::TY_Tempfilelist); auto *EntryGenAction = C.MakeAction( @@ -3506,7 +3506,7 @@ class OffloadingActionBuilder final { // After the Link, wrap the files before the final host link if (SYCLAOTCompile) { OutType = types::TY_Tempfilelist; - if (NoDeviceCodeSplit) { + if (!DeviceCodeSplit) { OutType = (TT.getSubArch() == llvm::Triple::SPIRSubArch_fpga) ? FPGAOutType : types::TY_Image; @@ -3568,7 +3568,7 @@ class OffloadingActionBuilder final { Arg *SYCLLinkTargets = Args.getLastArg( options::OPT_fsycl_link_targets_EQ); WrapDeviceOnlyBinary = Args.hasArg(options::OPT_fsycl_link_EQ); - NoDeviceCodeSplit = Args.hasArg(options::OPT_fno_sycl_device_code_split); + DeviceCodeSplit = Args.hasArg(options::OPT_fsycl_device_code_split); // Device only compilation for -fsycl-link (no FPGA) and // -fsycl-link-targets CompileDeviceOnly = diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 7f0b1c9fe6cbb..84ac639ce3df2 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -301,8 +301,14 @@ void SYCL::fpga::BackendCompiler::ConstructJob(Compilation &C, getToolChain().getTriple().getArch() == llvm::Triple::spir64) && "Unsupported target"); - ArgStringList CmdArgs{"-o", Output.getFilename()}; InputInfoList ForeachInputs; + ArgStringList CmdArgs{"-o", Output.getFilename()}; + for (const auto &II : Inputs) { + std::string Filename(II.getFilename()); + if (II.getType() == types::TY_Tempfilelist) + ForeachInputs.push_back(II); + CmdArgs.push_back(C.getArgs().MakeArgString(Filename)); + } CmdArgs.push_back("-sycl"); StringRef ForeachExt = "aocx"; @@ -312,12 +318,6 @@ void SYCL::fpga::BackendCompiler::ConstructJob(Compilation &C, ForeachExt = "aocr"; } - for (const auto &II : Inputs) { - std::string Filename(II.getFilename()); - if (II.getType() == types::TY_Tempfilelist) - ForeachInputs.push_back(II); - CmdArgs.push_back(C.getArgs().MakeArgString(Filename)); - } InputInfoList FPGADepFiles; for (auto *A : Args) { diff --git a/clang/test/Driver/sycl-offload-intelfpga.cpp b/clang/test/Driver/sycl-offload-intelfpga.cpp index 48648aedc19ee..4c015445717a3 100644 --- a/clang/test/Driver/sycl-offload-intelfpga.cpp +++ b/clang/test/Driver/sycl-offload-intelfpga.cpp @@ -7,7 +7,7 @@ // RUN: %clangxx -### -target x86_64-unknown-linux-gnu -fsycl -fintelfpga %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-TOOLS-INTELFPGA %s // CHK-TOOLS-INTELFPGA: clang{{.*}} "-debug-info-kind=limited" {{.*}} "-dependency-file" -// CHK-TOOLS-INTELFPGA: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-dep-files={{.*}}" +// CHK-TOOLS-INTELFPGA: aoc{{.*}} "-dep-files={{.*}}" /// -fintelfpga implies -g but -g0 should override // RUN: %clangxx -### -target x86_64-unknown-linux-gnu -g0 -fsycl -fintelfpga %s 2>&1 \ @@ -25,10 +25,9 @@ // CHK-FPGA-LINK-NOT: clang-offload-bundler{{.*}} "-check-section" // CHK-FPGA-LINK: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64_fpga-unknown-unknown-sycldevice" "-inputs=[[INPUT:.+\.o]]" "-outputs=[[OUTPUT1:.+\.o]]" "-unbundle" // CHK-FPGA-LINK: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2:.+\.bc]]" -// CHK-FPGA-LINK: sycl-post-link{{.*}} "[[OUTPUT2]]" "-ir-files-list=[[OUTPUT3:.*]]" "-o" -// CHK-FPGA-LINK: llvm-foreach{{.*}} "--" "{{.*}}llvm-spirv{{.*}} "-o" "[[OUTPUT4:.+]]" "-spirv-max-version=1.1" "-spirv-ext=+all" "[[OUTPUT3]]" -// CHK-FPGA-EARLY: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-o" {{.*}} "-sycl" "-rtl" "[[OUTPUT4]]" -// CHK-FPGA-IMAGE: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-o" {{.*}} "-sycl" "[[OUTPUT4]]" +// CHK-FPGA-LINK: llvm-spirv{{.*}} "-o" "[[OUTPUT3:.+\.spv]]" "-spirv-max-version=1.1" "-spirv-ext=+all" "[[OUTPUT2]]" +// CHK-FPGA-EARLY: aoc{{.*}} "-o" "[[OUTPUT4:.+\.aocr]]" "[[OUTPUT3]]" "-sycl" "-rtl" +// CHK-FPGA-IMAGE: aoc{{.*}} "-o" "[[OUTPUT5:.+\.aocx]]" "[[OUTPUT3]]" "-sycl" // CHK-FPGA-LINK: {{lib|llvm-ar}}{{.*}} "[[INPUT]]" /// -fintelfpga -fsycl-link clang-cl specific @@ -37,9 +36,8 @@ // RUN: | FileCheck -check-prefixes=CHK-FPGA-LINK-WIN %s // CHK-FPGA-LINK-WIN: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64_fpga-unknown-unknown-sycldevice{{.*}}" "-inputs=[[INPUT:.+\.obj]]" "-outputs=[[OUTPUT1:.+\.obj]]" "-unbundle" // CHK-FPGA-LINK-WIN: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2:.+\.bc]]" -// CHK-FPGA-LINK-WIN: sycl-post-link{{.*}} "[[OUTPUT2]]" "-ir-files-list=[[OUTPUT3:.*]]" "-o" -// CHK-FPGA-LINK-WIN: llvm-foreach{{.*}} "--" "{{.*}}llvm-spirv{{.*}} "-o" "[[OUTPUT4:.+]]" "-spirv-max-version=1.1" "-spirv-ext=+all" "[[OUTPUT3]]" -// CHK-FPGA-LINK-WIN: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}}" "-o" "[[OUTPUT5:.+]]" "-sycl" "-rtl" "[[OUTPUT4]]" +// CHK-FPGA-LINK-WIN: llvm-spirv{{.*}} "-o" "[[OUTPUT3:.+\.spv]]" "-spirv-max-version=1.1" "-spirv-ext=+all" "[[OUTPUT2]]" +// CHK-FPGA-LINK-WIN: aoc{{.*}} "-o" "[[OUTPUT5:.+\.aocr]]" "[[OUTPUT3]]" "-sycl" "-rtl" // CHK-FPGA-LINK-WIN: lib.exe{{.*}} "[[INPUT]]" @@ -58,8 +56,8 @@ // CHK-FPGA-LINK-LIB: clang-offload-bundler{{.*}} "-type=ao" "-targets=sycl-fpga_aocx-intel-unknown-sycldevice" "-inputs=[[INPUT:.+\.a]]" "-check-section" // CHK-FPGA-LINK-LIB: clang-offload-bundler{{.*}} "-type=ao" "-targets=sycl-fpga_aocr-intel-unknown-sycldevice" "-inputs=[[INPUT]]" "-check-section" // CHK-FPGA-LINK-LIB: clang-offload-bundler{{.*}} "-type=ao" "-targets=sycl-fpga_aocr-intel-unknown-sycldevice" "-inputs=[[INPUT]]" "-outputs=[[OUTPUT2:.+\.aocr]]" "-unbundle" -// CHK-FPGA-LINK-LIB-IMAGE: aoc{{.*}} "-o" "[[OUTPUT3:.+\.aocx]]" "-sycl" "[[OUTPUT2]]" -// CHK-FPGA-LINK-LIB-EARLY: aoc{{.*}} "-o" "[[OUTPUT4:.+\.aocr]]" "-sycl" "-rtl" "[[OUTPUT2]]" +// CHK-FPGA-LINK-LIB-IMAGE: aoc{{.*}} "-o" "[[OUTPUT3:.+\.aocx]]" "[[OUTPUT2]]" "-sycl" +// CHK-FPGA-LINK-LIB-EARLY: aoc{{.*}} "-o" "[[OUTPUT4:.+\.aocr]]" "[[OUTPUT2]]" "-sycl" "-rtl" // CHK-FPGA-LINK-LIB-IMAGE: clang-offload-wrapper{{.*}} "-host=x86_64-unknown-linux-gnu" "--emit-reg-funcs=0" "-target=fpga_aocx-intel-unknown-sycldevice" "-kind=sycl" "[[OUTPUT3]]" // CHK-FPGA-LINK-LIB-EARLY: clang-offload-wrapper{{.*}} "-host=x86_64-unknown-linux-gnu" "-target=fpga_aocr-intel-unknown-sycldevice" "-kind=sycl" "[[OUTPUT4]]" // CHK-FPGA-LINK-LIB: llc{{.*}} "-filetype=obj" "-o" "[[OUTPUT5:.+\.o]]" @@ -128,19 +126,17 @@ // CHK-FPGA-LINK-SRC: 11: backend, {10}, assembler, (device-sycl) // CHK-FPGA-LINK-SRC: 12: assembler, {11}, object, (device-sycl) // CHK-FPGA-LINK-SRC: 13: linker, {12}, ir, (device-sycl) -// CHK-FPGA-LINK-SRC: 14: sycl-post-link, {13}, tempentriesfilelist, (device-sycl) -// CHK-FPGA-LINK-SRC: 15: sycl-post-link, {13}, tempfilelist, (device-sycl) -// CHK-FPGA-LINK-SRC: 16: llvm-spirv, {15}, tempfilelist, (device-sycl) -// CHK-FPGA-LINK-SRC: 17: backend-compiler, {16}, tempfilelist, (device-sycl) -// CHK-FPGA-LINK-SRC: 18: clang-offload-wrapper, {14, 17}, object, (device-sycl) -// CHK-FPGA-LINK-SRC-DEFAULT: 19: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {18}, archive -// CHK-FPGA-LINK-SRC-CL: 19: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice-coff)" {18}, archive +// CHK-FPGA-LINK-SRC: 14: llvm-spirv, {13}, spirv, (device-sycl) +// CHK-FPGA-LINK-SRC: 15: backend-compiler, {14}, fpga-aocr, (device-sycl) +// CHK-FPGA-LINK-SRC: 16: clang-offload-wrapper, {15}, object, (device-sycl) +// CHK-FPGA-LINK-SRC-DEFAULT: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {16}, archive +// CHK-FPGA-LINK-SRC-CL: 17: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice-coff)" {16}, archive /// -fintelfpga with -reuse-exe= // RUN: touch %t.cpp // RUN: %clangxx -### -reuse-exe=testing -target x86_64-unknown-linux-gnu -fsycl -fintelfpga %t.cpp 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-REUSE-EXE %s -// CHK-FPGA-REUSE-EXE: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-o" "{{.*}}" "-sycl" "{{.*}}" "-reuse-exe=testing" +// CHK-FPGA-REUSE-EXE: aoc{{.*}} "-o" {{.*}} "-sycl" {{.*}} "-reuse-exe=testing" /// -fintelfpga dependency file generation test // RUN: touch %t-1.cpp @@ -151,7 +147,7 @@ // RUN: | FileCheck -check-prefix=CHK-FPGA-DEP-FILES %s // CHK-FPGA-DEP-FILES: clang{{.*}} "-dependency-file" "[[INPUT1:.+\.d]]" // CHK-FPGA-DEP-FILES: clang{{.*}} "-dependency-file" "[[INPUT2:.+\.d]]" -// CHK-FPGA-DEP-FILES: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-dep-files={{.*}}[[INPUT1]],{{.*}}[[INPUT2]] +// CHK-FPGA-DEP-FILES: aoc{{.*}} "-dep-files={{.*}}[[INPUT1]],{{.*}}[[INPUT2]]" /// -fintelfpga output report file test // RUN: mkdir -p %t_dir @@ -161,7 +157,7 @@ // RUN: | FileCheck -DOUTDIR=%t_dir -check-prefix=CHK-FPGA-REPORT-OPT %s // RUN: %clang_cl -### -fsycl -fintelfpga %s -Fe%t_dir/file.out 2>&1 \ // RUN: | FileCheck -DOUTDIR=%t_dir -check-prefix=CHK-FPGA-REPORT-OPT %s -// CHK-FPGA-REPORT-OPT: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-sycl" {{.*}} "-output-report-folder=[[OUTDIR]]{{/|\\\\}}file.prj +// CHK-FPGA-REPORT-OPT: aoc{{.*}} "-sycl" {{.*}} "-output-report-folder=[[OUTDIR]]{{/|\\\\}}file.prj" // TODO: SYCL specific fail - analyze and enable // XFAIL: windows-msvc diff --git a/clang/test/Driver/sycl-offload-win.c b/clang/test/Driver/sycl-offload-win.c index 1964574d9d586..397da245166ab 100644 --- a/clang/test/Driver/sycl-offload-win.c +++ b/clang/test/Driver/sycl-offload-win.c @@ -80,12 +80,10 @@ // FOFFLOAD_STATIC_LIB_SRC: 13: input, "[[LIB]]", archive // FOFFLOAD_STATIC_LIB_SRC: 14: clang-offload-unbundler, {13}, archive // FOFFLOAD_STATIC_LIB_SRC: 15: linker, {12, 14}, ir, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 16: sycl-post-link, {15}, tempentriesfilelist, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 17: sycl-post-link, {15}, tempfilelist, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 18: llvm-spirv, {17}, tempfilelist, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 19: clang-offload-wrapper, {16, 18}, object, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC_DEFAULT: 20: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {19}, image -// FOFFLOAD_STATIC_LIB_SRC_CL: 20: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice-coff)" {19}, image +// FOFFLOAD_STATIC_LIB_SRC: 16: llvm-spirv, {15}, spirv, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 17: clang-offload-wrapper, {16}, object, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC_DEFAULT: 18: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {17}, image +// FOFFLOAD_STATIC_LIB_SRC_CL: 18: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice-coff)" {17}, image /// ########################################################################### diff --git a/clang/test/Driver/sycl-offload.c b/clang/test/Driver/sycl-offload.c index b88a166b48405..3b6913fc98ced 100644 --- a/clang/test/Driver/sycl-offload.c +++ b/clang/test/Driver/sycl-offload.c @@ -188,16 +188,14 @@ // CHK-PHASES: 11: backend, {10}, assembler, (device-sycl) // CHK-PHASES: 12: assembler, {11}, object, (device-sycl) // CHK-PHASES: 13: linker, {12}, ir, (device-sycl) -// CHK-PHASES: 14: sycl-post-link, {13}, tempentriesfilelist, (device-sycl) -// CHK-PHASES: 15: sycl-post-link, {13}, tempfilelist, (device-sycl) -// CHK-PHASES: 16: llvm-spirv, {15}, tempfilelist, (device-sycl) -// CHK-PHASES: 17: clang-offload-wrapper, {14, 16}, object, (device-sycl) -// CHK-PHASES-DEFAULT-MODE: 18: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {17}, image -// CHK-PHASES-CL-MODE: 18: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice-coff)" {17}, image +// CHK-PHASES: 14: llvm-spirv, {13}, spirv, (device-sycl) +// CHK-PHASES: 15: clang-offload-wrapper, {14}, object, (device-sycl) +// CHK-PHASES-DEFAULT-MODE: 16: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {15}, image +// CHK-PHASES-CL-MODE: 16: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice-coff)" {15}, image /// ########################################################################### -/// Check the compilation flow to verify that the integration header is filtered +/// Check the compilation flow to verify that the integrated header is filtered // RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -c %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=CHK-INT-HEADER // CHK-INT-HEADER: clang{{.*}} "-fsycl-is-device" {{.*}} "-o" "[[OUTPUT1:.+\.o]]" @@ -226,11 +224,9 @@ // CHK-PHASES-LIB: 12: backend, {11}, assembler, (device-sycl) // CHK-PHASES-LIB: 13: assembler, {12}, object, (device-sycl) // CHK-PHASES-LIB: 14: linker, {13}, ir, (device-sycl) -// CHK-PHASES-LIB: 15: sycl-post-link, {14}, tempentriesfilelist, (device-sycl) -// CHK-PHASES-LIBL 16: sycl-post-link, {14}, tempfilelist, (device-sycl) -// CHK-PHASES-LIB: 17: llvm-spirv, {16}, tempfilelist, (device-sycl) -// CHK-PHASES-LIB: 18: clang-offload-wrapper, {15, 17}, object, (device-sycl) -// CHK-PHASES-LIB: 19: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (spir64-unknown-unknown-sycldevice)" {18}, image +// CHK-PHASES-LIB: 15: llvm-spirv, {14}, spirv, (device-sycl) +// CHK-PHASES-LIB: 16: clang-offload-wrapper, {15}, object, (device-sycl) +// CHK-PHASES-LIB: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (spir64-unknown-unknown-sycldevice)" {16}, image /// Compilation check with -lstdc++ (treated differently than regular lib) // RUN: %clang -### -target x86_64-unknown-linux-gnu -lstdc++ -fsycl %s 2>&1 \ @@ -273,11 +269,9 @@ // CHK-PHASES-FILES: 24: backend, {23}, assembler, (device-sycl) // CHK-PHASES-FILES: 25: assembler, {24}, object, (device-sycl) // CHK-PHASES-FILES: 26: linker, {22, 25}, ir, (device-sycl) -// CHK-PHASES-FILES: 27: sycl-post-link, {26}, tempentriesfilelist, (device-sycl) -// CHK-PHASES-FILES: 28: sycl-post-link, {26}, tempfilelist, (device-sycl) -// CHK-PHASES-FILES: 29: llvm-spirv, {28}, tempfilelist, (device-sycl) -// CHK-PHASES-FILES: 30: clang-offload-wrapper, {27, 29}, object, (device-sycl) -// CHK-PHASES-FILES: 31: offload, "host-sycl (x86_64-unknown-linux-gnu)" {19}, "device-sycl (spir64-unknown-unknown-sycldevice)" {30}, image +// CHK-PHASES-FILES: 27: llvm-spirv, {26}, spirv, (device-sycl) +// CHK-PHASES-FILES: 28: clang-offload-wrapper, {27}, object, (device-sycl) +// CHK-PHASES-FILES: 29: offload, "host-sycl (x86_64-unknown-linux-gnu)" {19}, "device-sycl (spir64-unknown-unknown-sycldevice)" {28}, image /// ########################################################################### @@ -314,11 +308,9 @@ // CHK-UBACTIONS: 2: clang-offload-unbundler, {1}, object, (host-sycl) // CHK-UBACTIONS: 3: linker, {0, 2}, image, (host-sycl) // CHK-UBACTIONS: 4: linker, {2}, ir, (device-sycl) -// CHK-UBACTIONS: 5: sycl-post-link, {4}, tempentriesfilelist, (device-sycl) -// CHK-UBACTIONS: 6: sycl-post-link, {4}, tempfilelist, (device-sycl) -// CHK-UBACTIONS: 7: llvm-spirv, {6}, tempfilelist, (device-sycl) -// CHK-UBACTIONS: 8: clang-offload-wrapper, {5, 7}, object, (device-sycl) -// CHK-UBACTIONS: 9: offload, "host-sycl (x86_64-unknown-linux-gnu)" {3}, "device-sycl (spir64-unknown-unknown-sycldevice)" {8}, image +// CHK-UBACTIONS: 5: llvm-spirv, {4}, spirv, (device-sycl) +// CHK-UBACTIONS: 6: clang-offload-wrapper, {5}, object, (device-sycl) +// CHK-UBACTIONS: 7: offload, "host-sycl (x86_64-unknown-linux-gnu)" {3}, "device-sycl (spir64-unknown-unknown-sycldevice)" {6}, image /// ########################################################################### @@ -343,11 +335,9 @@ // CHK-UBUACTIONS: 14: backend, {13}, assembler, (device-sycl) // CHK-UBUACTIONS: 15: assembler, {14}, object, (device-sycl) // CHK-UBUACTIONS: 16: linker, {2, 15}, ir, (device-sycl) -// CHK-UBUACTIONS: 17: sycl-post-link, {16}, tempentriesfilelist, (device-sycl) -// CHK-UBUACTIONS: 18: sycl-post-link, {16}, tempfilelist, (device-sycl) -// CHK-UBUACTIONS: 19: llvm-spirv, {18}, tempfilelist, (device-sycl) -// CHK-UBUACTIONS: 20: clang-offload-wrapper, {17, 19}, object, (device-sycl) -// CHK-UBUACTIONS: 21: offload, "host-sycl (x86_64-unknown-linux-gnu)" {12}, "device-sycl (spir64-unknown-unknown-sycldevice)" {20}, image +// CHK-UBUACTIONS: 17: llvm-spirv, {16}, spirv, (device-sycl) +// CHK-UBUACTIONS: 18: clang-offload-wrapper, {17}, object, (device-sycl) +// CHK-UBUACTIONS: 19: offload, "host-sycl (x86_64-unknown-linux-gnu)" {12}, "device-sycl (spir64-unknown-unknown-sycldevice)" {18}, image /// ########################################################################### @@ -531,13 +521,11 @@ // CHK-ADD-TARGETS-REG: 11: backend, {10}, assembler, (device-sycl) // CHK-ADD-TARGETS-REG: 12: assembler, {11}, object, (device-sycl) // CHK-ADD-TARGETS-REG: 13: linker, {12}, ir, (device-sycl) -// CHK-ADD-TARGETS-REG: 14: sycl-post-link, {13}, tempentriesfilelist, (device-sycl) -// CHK-ADD-TARGETS-REG: 15: sycl-post-link, {13}, tempfilelist, (device-sycl) -// CHK-ADD-TARGETS-REG: 16: llvm-spirv, {15}, tempfilelist, (device-sycl) -// CHK-ADD-TARGETS-REG: 17: clang-offload-wrapper, {14, 16}, object, (device-sycl) -// CHK-ADD-TARGETS-REG: 18: input, "dummy.spv", sycl-fatbin, (device-sycl) -// CHK-ADD-TARGETS-REG: 19: clang-offload-wrapper, {18}, object, (device-sycl) -// CHK-ADD-TARGETS-REG: 20: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {17}, "device-sycl (spir64-unknown-unknown-sycldevice)" {19}, image +// CHK-ADD-TARGETS-REG: 14: llvm-spirv, {13}, spirv, (device-sycl) +// CHK-ADD-TARGETS-REG: 15: clang-offload-wrapper, {14}, object, (device-sycl) +// CHK-ADD-TARGETS-REG: 16: input, "dummy.spv", sycl-fatbin, (device-sycl) +// CHK-ADD-TARGETS-REG: 17: clang-offload-wrapper, {16}, object, (device-sycl) +// CHK-ADD-TARGETS-REG: 18: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {15}, "device-sycl (spir64-unknown-unknown-sycldevice)" {17}, image /// ########################################################################### @@ -560,17 +548,15 @@ // CHK-ADD-TARGETS-REG-MUL: 13: backend, {12}, assembler, (device-sycl) // CHK-ADD-TARGETS-REG-MUL: 14: assembler, {13}, object, (device-sycl) // CHK-ADD-TARGETS-REG-MUL: 15: linker, {14}, ir, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 16: sycl-post-link, {15}, tempentriesfilelist, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 17: sycl-post-link, {15}, tempfilelist, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 18: llvm-spirv, {17}, tempfilelist, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 19: clang-offload-wrapper, {16, 18}, object, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 20: input, "dummy.aocx", sycl-fatbin, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 16: llvm-spirv, {15}, spirv, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 17: clang-offload-wrapper, {16}, object, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 18: input, "dummy.aocx", sycl-fatbin, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 19: clang-offload-wrapper, {18}, object, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 20: input, "dummy_Gen9core.bin", sycl-fatbin, (device-sycl) // CHK-ADD-TARGETS-REG-MUL: 21: clang-offload-wrapper, {20}, object, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 22: input, "dummy_Gen9core.bin", sycl-fatbin, (device-sycl) +// CHK-ADD-TARGETS-REG-MUL: 22: input, "dummy.ir", sycl-fatbin, (device-sycl) // CHK-ADD-TARGETS-REG-MUL: 23: clang-offload-wrapper, {22}, object, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 24: input, "dummy.ir", sycl-fatbin, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 25: clang-offload-wrapper, {24}, object, (device-sycl) -// CHK-ADD-TARGETS-REG-MUL: 26: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {19}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {21}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {23}, "device-sycl (spir64_x86_64-unknown-unknown-sycldevice)" {25}, image +// CHK-ADD-TARGETS-REG-MUL: 24: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {17}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {19}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {21}, "device-sycl (spir64_x86_64-unknown-unknown-sycldevice)" {23}, image /// ########################################################################### @@ -636,11 +622,9 @@ // FOFFLOAD_STATIC_LIB_SRC: 12: backend, {11}, assembler, (device-sycl) // FOFFLOAD_STATIC_LIB_SRC: 13: assembler, {12}, object, (device-sycl) // FOFFLOAD_STATIC_LIB_SRC: 14: linker, {13, 9}, ir, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 15: sycl-post-link, {14}, tempentriesfilelist, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 16: sycl-post-link, {14}, tempfilelist, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 17: llvm-spirv, {16}, tempfilelist, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 18: clang-offload-wrapper, {15, 17}, object, (device-sycl) -// FOFFLOAD_STATIC_LIB_SRC: 19: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (spir64-unknown-unknown-sycldevice)" {18}, image +// FOFFLOAD_STATIC_LIB_SRC: 15: llvm-spirv, {14}, spirv, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 16: clang-offload-wrapper, {15}, object, (device-sycl) +// FOFFLOAD_STATIC_LIB_SRC: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (spir64-unknown-unknown-sycldevice)" {16}, image /// ########################################################################### @@ -705,15 +689,13 @@ // CHK-PHASES-AOT: 11: backend, {10}, assembler, (device-sycl) // CHK-PHASES-AOT: 12: assembler, {11}, object, (device-sycl) // CHK-PHASES-AOT: 13: linker, {12}, ir, (device-sycl) -// CHK-PHASES-AOT: 14: sycl-post-link, {13}, tempentriesfilelist, (device-sycl) -// CHK-PHASES-AOT: 15: sycl-post-link, {13}, tempfilelist, (device-sycl) -// CHK-PHASES-AOT: 16: llvm-spirv, {15}, tempfilelist, (device-sycl) -// CHK-PHASES-GEN: 17: backend-compiler, {16}, tempfilelist, (device-sycl) -// CHK-PHASES-FPGA: 17: backend-compiler, {16}, tempfilelist, (device-sycl) -// CHK-PHASES-AOT: 18: clang-offload-wrapper, {14, 17}, object, (device-sycl) -// CHK-PHASES-FPGA: 19: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {18}, image -// CHK-PHASES-GEN: 19: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {18}, image -// CHK-PHASES-CPU: 19: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_x86_64-unknown-unknown-sycldevice)" {18}, image +// CHK-PHASES-AOT: 14: llvm-spirv, {13}, spirv, (device-sycl) +// CHK-PHASES-GEN: 15: backend-compiler, {14}, image, (device-sycl) +// CHK-PHASES-FPGA: 15: backend-compiler, {14}, fpga-aocx, (device-sycl) +// CHK-PHASES-AOT: 16: clang-offload-wrapper, {15}, object, (device-sycl) +// CHK-PHASES-FPGA: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {16}, image +// CHK-PHASES-GEN: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {16}, image +// CHK-PHASES-CPU: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_x86_64-unknown-unknown-sycldevice)" {16}, image /// ########################################################################### @@ -728,22 +710,19 @@ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-CPU // CHK-TOOLS-AOT: clang{{.*}} "-fsycl-is-device" {{.*}} "-o" "[[OUTPUT1:.+\.o]]" // CHK-TOOLS-AOT: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2:.+\.bc]]" -// CHK-TOOLS-AOT: sycl-post-link{{.*}} "[[OUTPUT2]]" "-txt-files-list=[[OUTPUT6:.+\.txt]]" "-o" -// CHK-TOOLS-AOT: sycl-post-link{{.*}} "[[OUTPUT2]]" "-ir-files-list=[[OUTPUT3:.+\.txt]]" "-o" -// CHK-TOOLS-AOT: llvm-foreach{{.*}} "--in-file-list=[[OUTPUT3]]" "--in-replace=[[OUTPUT3]]" "--out-ext=spv" "--out-file-list=[[OUTPUT4:.+\.txt]]" "--out-replace=[[OUTPUT4]]" "--" "{{.*}}llvm-spirv{{.*}} "-o" "[[OUTPUT4]]" {{.*}} "[[OUTPUT3]]" -// CHK-TOOLS-FPGA: llvm-foreach{{.*}} "--out-file-list=[[OUTPUT5:.+\.txt]]{{.*}} "--" "{{.*}}aoc{{.*}} "-o" "[[OUTPUT5]]" "-sycl" "[[OUTPUT4]]" -// CHK-TOOLS-GEN: llvm-foreach{{.*}} "--out-file-list=[[OUTPUT5:.+\.txt]]{{.*}} "--" "{{.*}}ocloc{{.*}} "-output" "[[OUTPUT5]]" "-file" "[[OUTPUT4]]" -// CHK-TOOLS-CPU: llvm-foreach{{.*}} "--out-file-list=[[OUTPUT5:.+\.txt]]{{.*}} "--" "{{.*}}ioc{{.*}} "-ir=[[OUTPUT5]]" "-device=cpu" "-binary=[[OUTPUT4]]" -// CHK-TOOLS-FPGA: llvm-foreach{{.*}} "--out-file-list=[[OUTPUT7:.+\.txt]]{{.*}} "--" "{{.*}}clang-offload-wrapper{{.*}} "-o={{.*}}" "-host=x86_64-unknown-linux-gnu" "-target=spir64_fpga{{.*}}" "-kind=sycl" "-entries=[[OUTPUT6]]" "[[OUTPUT5]]" -// CHK-TOOLS-GEN: llvm-foreach{{.*}} "--out-file-list=[[OUTPUT7:.+\.txt]]{{.*}} "--" "{{.*}}clang-offload-wrapper{{.*}} "-o={{.*}}" "-host=x86_64-unknown-linux-gnu" "-target=spir64_gen{{.*}}" "-kind=sycl" "-entries=[[OUTPUT6]]" "[[OUTPUT5]]" -// CHK-TOOLS-CPU: llvm-foreach{{.*}} "--out-file-list=[[OUTPUT7:.+\.txt]]{{.*}} "--" "{{.*}}clang-offload-wrapper{{.*}} "-o={{.*}}" "-host=x86_64-unknown-linux-gnu" "-target=spir64_x86_64{{.*}}" "-kind=sycl" "-entries=[[OUTPUT6]]" "[[OUTPUT5]]" -// CHK-TOOLS-AOT: llvm-link{{.*}} "-o" "[[OUTPUT8:.+\.bc]]" "@[[OUTPUT7]]" -// CHK-TOOLS-AOT: llc{{.*}} "-filetype=obj" "-o" "[[OUTPUT9:.+\.o]]" "[[OUTPUT8]]" +// CHK-TOOLS-AOT: llvm-spirv{{.*}} "-o" "[[OUTPUT3:.+\.spv]]" "-spirv-max-version=1.1" "-spirv-ext=+all" "[[OUTPUT2]]" +// CHK-TOOLS-FPGA: aoc{{.*}} "-o" "[[OUTPUT4:.+\.aocx]]" "[[OUTPUT3]]" +// CHK-TOOLS-GEN: ocloc{{.*}} "-output" "[[OUTPUT4:.+\.out]]" {{.*}} "[[OUTPUT3]]" +// CHK-TOOLS-CPU: ioc{{.*}} "-ir=[[OUTPUT4:.+\.out]]" {{.*}} "-binary=[[OUTPUT3]]" +// CHK-TOOLS-FPGA: clang-offload-wrapper{{.*}} "-o=[[OUTPUT5:.+\.bc]]" "-host=x86_64-unknown-linux-gnu" "-target=spir64_fpga{{.*}}" "-kind=sycl" "[[OUTPUT4]]" +// CHK-TOOLS-GEN: clang-offload-wrapper{{.*}} "-o=[[OUTPUT5:.+\.bc]]" "-host=x86_64-unknown-linux-gnu" "-target=spir64_gen{{.*}}" "-kind=sycl" "[[OUTPUT4]]" +// CHK-TOOLS-CPU: clang-offload-wrapper{{.*}} "-o=[[OUTPUT5:.+\.bc]]" "-host=x86_64-unknown-linux-gnu" "-target=spir64_x86_64{{.*}}" "-kind=sycl" "[[OUTPUT4]]" +// CHK-TOOLS-AOT: llc{{.*}} "-filetype=obj" "-o" "[[OUTPUT6:.+\.o]]" "[[OUTPUT5]]" // CHK-TOOLS-FPGA: clang{{.*}} "-triple" "spir64_fpga-unknown-unknown-sycldevice" {{.*}} "-fsycl-int-header=[[INPUT1:.+\.h]]" "-faddrsig" // CHK-TOOLS-GEN: clang{{.*}} "-triple" "spir64_gen-unknown-unknown-sycldevice" {{.*}} "-fsycl-int-header=[[INPUT1:.+\.h]]" "-faddrsig" // CHK-TOOLS-CPU: clang{{.*}} "-triple" "spir64_x86_64-unknown-unknown-sycldevice" {{.*}} "-fsycl-int-header=[[INPUT1:.+\.h]]" "-faddrsig" -// CHK-TOOLS-AOT: clang{{.*}} "-triple" "x86_64-unknown-linux-gnu" {{.*}} "-include" "[[INPUT1]]" {{.*}} "-o" "[[OUTPUT10:.+\.o]]" -// CHK-TOOLS-AOT: ld{{.*}} "[[OUTPUT10]]" "[[OUTPUT9]]" {{.*}} "-lsycl" +// CHK-TOOLS-AOT: clang{{.*}} "-triple" "x86_64-unknown-linux-gnu" {{.*}} "-include" "[[INPUT1]]" {{.*}} "-o" "[[OUTPUT7:.+\.o]]" +// CHK-TOOLS-AOT: ld{{.*}} "[[OUTPUT7]]" "[[OUTPUT6]]" {{.*}} "-lsycl" /// ########################################################################### @@ -755,15 +734,15 @@ // RUN: | FileCheck -check-prefix=CHK-TOOLS-FPGA-OPTS %s // RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fintelfpga -Xs "-DFOO1 -DFOO2" %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-TOOLS-FPGA-OPTS %s -// CHK-TOOLS-FPGA-OPTS: llvm-foreach{{.*}} "--" "{{.*}}aoc{{.*}} "-o" "{{.*}}" "-DFOO1" "-DFOO2" +// CHK-TOOLS-FPGA-OPTS: aoc{{.*}} "-o" {{.*}} "-DFOO1" "-DFOO2" // RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -Xsycl-target-backend "-DFOO1 -DFOO2" %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-TOOLS-GEN-OPTS %s -// CHK-TOOLS-GEN-OPTS: llvm-foreach{{.*}} "--" "{{.*}}ocloc{{.*}} "-output" "{{.*}}" "-output_no_suffix" "{{.*}}" "-DFOO1" "-DFOO2" +// CHK-TOOLS-GEN-OPTS: ocloc{{.*}} "-output" {{.*}} "-output_no_suffix" {{.*}} "-DFOO1" "-DFOO2" // RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -Xsycl-target-backend "-DFOO1 -DFOO2" %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-TOOLS-CPU-OPTS %s -// CHK-TOOLS-CPU-OPTS: llvm-foreach{{.*}} "--" "{{.*}}ioc{{.*}} "-DFOO1" "-DFOO2" +// CHK-TOOLS-CPU-OPTS: ioc{{.*}} "-DFOO1" "-DFOO2" /// ########################################################################### @@ -786,31 +765,25 @@ // CHK-PHASE-MULTI-TARG: 13: backend, {12}, assembler, (device-sycl) // CHK-PHASE-MULTI-TARG: 14: assembler, {13}, object, (device-sycl) // CHK-PHASE-MULTI-TARG: 15: linker, {14}, ir, (device-sycl) -// CHK-PHASE-MULTI-TARG: 16: sycl-post-link, {15}, tempentriesfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG: 17: sycl-post-link, {15}, tempfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG: 18: llvm-spirv, {17}, tempfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG: 19: clang-offload-wrapper, {16, 18}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG: 20: input, "[[INPUT]]", c, (device-sycl) -// CHK-PHASE-MULTI-TARG: 21: preprocessor, {20}, cpp-output, (device-sycl) -// CHK-PHASE-MULTI-TARG: 22: compiler, {21}, ir, (device-sycl) -// CHK-PHASE-MULTI-TARG: 23: backend, {22}, assembler, (device-sycl) -// CHK-PHASE-MULTI-TARG: 24: assembler, {23}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG: 25: linker, {24}, ir, (device-sycl) -// CHK-PHASE-MULTI-TARG: 26: sycl-post-link, {25}, tempentriesfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG: 27: sycl-post-link, {25}, tempfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG: 28: llvm-spirv, {27}, tempfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG: 29: backend-compiler, {28}, tempfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG: 30: clang-offload-wrapper, {26, 29}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG: 31: compiler, {3}, ir, (device-sycl) -// CHK-PHASE-MULTI-TARG: 32: backend, {31}, assembler, (device-sycl) -// CHK-PHASE-MULTI-TARG: 33: assembler, {32}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG: 34: linker, {33}, ir, (device-sycl) -// CHK-PHASE-MULTI-TARG: 35: sycl-post-link, {34}, tempentriesfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG: 36: sycl-post-link, {34}, tempfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG: 37: llvm-spirv, {36}, tempfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG: 38: backend-compiler, {37}, tempfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG: 39: clang-offload-wrapper, {35, 38}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG: 40: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {19}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {30}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {39}, image +// CHK-PHASE-MULTI-TARG: 16: llvm-spirv, {15}, spirv, (device-sycl) +// CHK-PHASE-MULTI-TARG: 17: clang-offload-wrapper, {16}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG: 18: input, "[[INPUT]]", c, (device-sycl) +// CHK-PHASE-MULTI-TARG: 19: preprocessor, {18}, cpp-output, (device-sycl) +// CHK-PHASE-MULTI-TARG: 20: compiler, {19}, ir, (device-sycl) +// CHK-PHASE-MULTI-TARG: 21: backend, {20}, assembler, (device-sycl) +// CHK-PHASE-MULTI-TARG: 22: assembler, {21}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG: 23: linker, {22}, ir, (device-sycl) +// CHK-PHASE-MULTI-TARG: 24: llvm-spirv, {23}, spirv, (device-sycl) +// CHK-PHASE-MULTI-TARG: 25: backend-compiler, {24}, fpga-aocx, (device-sycl) +// CHK-PHASE-MULTI-TARG: 26: clang-offload-wrapper, {25}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG: 27: compiler, {3}, ir, (device-sycl) +// CHK-PHASE-MULTI-TARG: 28: backend, {27}, assembler, (device-sycl) +// CHK-PHASE-MULTI-TARG: 29: assembler, {28}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG: 30: linker, {29}, ir, (device-sycl) +// CHK-PHASE-MULTI-TARG: 31: llvm-spirv, {30}, spirv, (device-sycl) +// CHK-PHASE-MULTI-TARG: 32: backend-compiler, {31}, image, (device-sycl) +// CHK-PHASE-MULTI-TARG: 33: clang-offload-wrapper, {32}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG: 34: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {17}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {26}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {33}, image /// ########################################################################### @@ -834,29 +807,25 @@ // CHK-PHASE-MULTI-TARG-W-ADD: 13: backend, {12}, assembler, (device-sycl) // CHK-PHASE-MULTI-TARG-W-ADD: 14: assembler, {13}, object, (device-sycl) // CHK-PHASE-MULTI-TARG-W-ADD: 15: linker, {14}, ir, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 16: sycl-post-link, {15}, tempentriesfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 17: sycl-post-link, {15}, tempfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 18: llvm-spirv, {17}, tempfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 19: backend-compiler, {18}, tempfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 20: clang-offload-wrapper, {16, 19}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 21: input, "[[INPUT]]", c, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 22: preprocessor, {21}, cpp-output, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 23: compiler, {22}, ir, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 24: backend, {23}, assembler, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 25: assembler, {24}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 26: linker, {25}, ir, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 27: sycl-post-link, {26}, tempentriesfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 28: sycl-post-link, {26}, tempfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 29: llvm-spirv, {28}, tempfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 30: backend-compiler, {29}, tempfilelist, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 31: clang-offload-wrapper, {27, 30}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 32: input, "dummy.ir", sycl-fatbin, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 16: llvm-spirv, {15}, spirv, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 17: backend-compiler, {16}, fpga-aocx, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 18: clang-offload-wrapper, {17}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 19: input, "[[INPUT]]", c, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 20: preprocessor, {19}, cpp-output, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 21: compiler, {20}, ir, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 22: backend, {21}, assembler, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 23: assembler, {22}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 24: linker, {23}, ir, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 25: llvm-spirv, {24}, spirv, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 26: backend-compiler, {25}, image, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 27: clang-offload-wrapper, {26}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 28: input, "dummy.ir", sycl-fatbin, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 29: clang-offload-wrapper, {28}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 30: input, "dummy.aocx", sycl-fatbin, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 31: clang-offload-wrapper, {30}, object, (device-sycl) +// CHK-PHASE-MULTI-TARG-W-ADD: 32: input, "dummy_Gen9core.bin", sycl-fatbin, (device-sycl) // CHK-PHASE-MULTI-TARG-W-ADD: 33: clang-offload-wrapper, {32}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 34: input, "dummy.aocx", sycl-fatbin, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 35: clang-offload-wrapper, {34}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 36: input, "dummy_Gen9core.bin", sycl-fatbin, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 37: clang-offload-wrapper, {36}, object, (device-sycl) -// CHK-PHASE-MULTI-TARG-W-ADD: 38: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {20}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {31}, "device-sycl (spir64_x86_64-unknown-unknown-sycldevice)" {33}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {35}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {37}, image +// CHK-PHASE-MULTI-TARG-W-ADD: 34: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {18}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {27}, "device-sycl (spir64_x86_64-unknown-unknown-sycldevice)" {29}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {31}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {33}, image /// ########################################################################### /// Verify that -save-temps does not crash @@ -892,79 +861,5 @@ // LIB-NODEVICE: 1: linker, {0}, image, (host-sycl) // LIB-NODEVICE-NOT: linker, {{.*}}, spirv, (device-sycl) -/// ########################################################################### - -// Check disabling of device code split for default mode. -// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice -fno-sycl-device-code-split %s 2>&1 \ -// RUN: | FileCheck -check-prefixes=CHK-PHASES-NO-SPLIT,CHK-PHASES-DEFAULT-MODE-NO-SPLIT %s -// RUN: %clang_cl -ccc-print-phases -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice-coff %s -fno-sycl-device-code-split 2>&1 \ -// RUN: | FileCheck -check-prefixes=CHK-PHASES-NO-SPLIT,CHK-PHASES-CL-MODE-NO-SPLIT %s -// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-use-bitcode %s -fno-sycl-device-code-split 2>&1 \ -// RUN: | FileCheck -check-prefixes=CHK-PHASES-NO-SPLIT,CHK-PHASES-DEFAULT-MODE-NO-SPLIT %s -// RUN: %clang_cl -ccc-print-phases -fsycl -fno-sycl-use-bitcode -fno-sycl-device-code-split %s 2>&1 \ -// RUN: | FileCheck -check-prefixes=CHK-PHASES-NO-SPLIT,CHK-PHASES-CL-MODE-NO-SPLIT %s -// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fsycl-use-bitcode -fno-sycl-device-code-split %s 2>&1 \ -// RUN: | FileCheck -check-prefixes=CHK-PHASES-NO-SPLIT,CHK-PHASES-DEFAULT-MODE-NO-SPLIT %s -// RUN: %clang_cl -ccc-print-phases -fsycl -fsycl-use-bitcode -fno-sycl-device-code-split %s 2>&1 \ -// RUN: | FileCheck -check-prefixes=CHK-PHASES-NO-SPLIT,CHK-PHASES-CL-MODE-NO-SPLIT %s -// CHK-PHASES-NO-SPLIT: 0: input, "[[INPUT:.+\.c]]", c, (host-sycl) -// CHK-PHASES-NO-SPLIT: 1: preprocessor, {0}, cpp-output, (host-sycl) -// CHK-PHASES-NO-SPLIT: 2: input, "[[INPUT]]", c, (device-sycl) -// CHK-PHASES-NO-SPLIT: 3: preprocessor, {2}, cpp-output, (device-sycl) -// CHK-PHASES-NO-SPLIT: 4: compiler, {3}, sycl-header, (device-sycl) -// CHK-PHASES-DEFAULT-MODE-NO-SPLIT: 5: offload, "host-sycl (x86_64-unknown-linux-gnu)" {1}, "device-sycl (spir64-unknown-unknown-sycldevice)" {4}, cpp-output -// CHK-PHASES-CL-MODE-NO-SPLIT: 5: offload, "host-sycl (x86_64-pc-windows-msvc)" {1}, "device-sycl (spir64-unknown-unknown-sycldevice-coff)" {4}, cpp-output -// CHK-PHASES-NO-SPLIT: 6: compiler, {5}, ir, (host-sycl) -// CHK-PHASES-NO-SPLIT: 7: backend, {6}, assembler, (host-sycl) -// CHK-PHASES-NO-SPLIT: 8: assembler, {7}, object, (host-sycl) -// CHK-PHASES-NO-SPLIT: 9: linker, {8}, image, (host-sycl) -// CHK-PHASES-NO-SPLIT: 10: compiler, {3}, ir, (device-sycl) -// CHK-PHASES-NO-SPLIT: 11: backend, {10}, assembler, (device-sycl) -// CHK-PHASES-NO-SPLIT: 12: assembler, {11}, object, (device-sycl) -// CHK-PHASES-NO-SPLIT: 13: linker, {12}, ir, (device-sycl) -// CHK-PHASES-NO-SPLIT: 14: llvm-spirv, {13}, spirv, (device-sycl) -// CHK-PHASES-NO-SPLIT: 15: clang-offload-wrapper, {14}, object, (device-sycl) -// CHK-PHASES-DEFAULT-MODE-NO-SPLIT: 16: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice)" {15}, image -// CHK-PHASES-CL-MODE-NO-SPLIT: 16: offload, "host-sycl (x86_64-pc-windows-msvc)" {9}, "device-sycl (spir64-unknown-unknown-sycldevice-coff)" {15}, image - -// Check disabling of device code split for AOT compilation -// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice -fno-sycl-device-code-split %s 2>&1 \ -// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT-NO-SPLIT,CHK-PHASES-FPGA-NO-SPLIT -// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -fno-sycl-device-code-split %s 2>&1 \ -// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT-NO-SPLIT,CHK-PHASES-GEN-NO-SPLIT -// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -fno-sycl-device-code-split %s 2>&1 \ -// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT-NO-SPLIT,CHK-PHASES-CPU-NO-SPLIT -// CHK-PHASES-AOT-NO-SPLIT: 0: input, "[[INPUT:.+\.c]]", c, (host-sycl) -// CHK-PHASES-AOT-NO-SPLIT: 1: preprocessor, {0}, cpp-output, (host-sycl) -// CHK-PHASES-AOT-NO-SPLIT: 2: input, "[[INPUT]]", c, (device-sycl) -// CHK-PHASES-AOT-NO-SPLIT: 3: preprocessor, {2}, cpp-output, (device-sycl) -// CHK-PHASES-AOT-NO-SPLIT: 4: compiler, {3}, sycl-header, (device-sycl) -// CHK-PHASES-FPGA-NO-SPLIT: 5: offload, "host-sycl (x86_64-unknown-linux-gnu)" {1}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {4}, cpp-output -// CHK-PHASES-GEN-NO-SPLIT: 5: offload, "host-sycl (x86_64-unknown-linux-gnu)" {1}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {4}, cpp-output -// CHK-PHASES-CPU-NO-SPLIT: 5: offload, "host-sycl (x86_64-unknown-linux-gnu)" {1}, "device-sycl (spir64_x86_64-unknown-unknown-sycldevice)" {4}, cpp-output -// CHK-PHASES-AOT-NO-SPLIT: 6: compiler, {5}, ir, (host-sycl) -// CHK-PHASES-AOT-NO-SPLIT: 7: backend, {6}, assembler, (host-sycl) -// CHK-PHASES-AOT-NO-SPLIT: 8: assembler, {7}, object, (host-sycl) -// CHK-PHASES-AOT-NO-SPLIT: 9: linker, {8}, image, (host-sycl) -// CHK-PHASES-AOT-NO-SPLIT: 10: compiler, {3}, ir, (device-sycl) -// CHK-PHASES-AOT-NO-SPLIT: 11: backend, {10}, assembler, (device-sycl) -// CHK-PHASES-AOT-NO-SPLIT: 12: assembler, {11}, object, (device-sycl) -// CHK-PHASES-AOT-NO-SPLIT: 13: linker, {12}, ir, (device-sycl) -// CHK-PHASES-AOT-NO-SPLIT: 14: llvm-spirv, {13}, spirv, (device-sycl) -// CHK-PHASES-GEN-NO-SPLIT: 15: backend-compiler, {14}, image, (device-sycl) -// CHK-PHASES-FPGA-NO-SPLIT: 15: backend-compiler, {14}, fpga-aocx, (device-sycl) -// CHK-PHASES-AOT-NO-SPLIT: 16: clang-offload-wrapper, {15}, object, (device-sycl) -// CHK-PHASES-FPGA-NO-SPLIT: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {16}, image -// CHK-PHASES-GEN-NO-SPLIT: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_gen-unknown-unknown-sycldevice)" {16}, image -// CHK-PHASES-CPU-NO-SPLIT: 17: offload, "host-sycl (x86_64-unknown-linux-gnu)" {9}, "device-sycl (spir64_x86_64-unknown-unknown-sycldevice)" {16}, image - -// Check -fsycl-one-kernel-per-module option passing. -// RUN: %clang -### -fsycl -fsycl-one-kernel-per-module %s 2>&1 \ -// RUN: | FileCheck %s -check-prefixes=CHK-ONE-KERNEL -// RUN: %clang_cl -### -fsycl -fsycl-one-kernel-per-module %s 2>&1 \ -// RUN: | FileCheck %s -check-prefixes=CHK-ONE-KERNEL -// CHK-ONE-KERNEL: sycl-post-link{{.*}} "-txt-files-list{{.*}} "-one-kernel" -// CHK-ONE-KERNEL: sycl-post-link{{.*}} "-ir-files-list{{.*}} "-one-kernel" - // TODO: SYCL specific fail - analyze and enable // XFAIL: windows-msvc diff --git a/sycl/test/function-pointers/fp-as-kernel-arg.cpp b/sycl/test/function-pointers/fp-as-kernel-arg.cpp index cd82a8f97a499..70ebac362324a 100644 --- a/sycl/test/function-pointers/fp-as-kernel-arg.cpp +++ b/sycl/test/function-pointers/fp-as-kernel-arg.cpp @@ -1,4 +1,4 @@ -// RUN: %clangxx -Xclang -fsycl-allow-func-ptr -fno-sycl-device-code-split -std=c++14 -fsycl %s -o %t.out -lOpenCL +// RUN: %clangxx -Xclang -fsycl-allow-func-ptr -std=c++14 -fsycl %s -o %t.out -lOpenCL // RUN: env SYCL_DEVICE_TYPE=HOST %t.out // RUN: %CPU_RUN_PLACEHOLDER %t.out // RUN: %GPU_RUN_PLACEHOLDER %t.out diff --git a/sycl/test/function-pointers/pass-fp-through-buffer.cpp b/sycl/test/function-pointers/pass-fp-through-buffer.cpp index 55b74a5af360b..4891c31b19412 100644 --- a/sycl/test/function-pointers/pass-fp-through-buffer.cpp +++ b/sycl/test/function-pointers/pass-fp-through-buffer.cpp @@ -1,4 +1,4 @@ -// RUN: %clangxx -Xclang -fsycl-allow-func-ptr -fno-sycl-device-code-split -std=c++14 -fsycl %s -o %t.out -lOpenCL +// RUN: %clangxx -Xclang -fsycl-allow-func-ptr -std=c++14 -fsycl %s -o %t.out -lOpenCL // RUN: env SYCL_DEVICE_TYPE=HOST %t.out // RUN: %CPU_RUN_PLACEHOLDER %t.out // RUN: %GPU_RUN_PLACEHOLDER %t.out From 169ee4bfe18c11b4b44de446f6359f8d866fb9b2 Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Wed, 27 Nov 2019 17:03:12 +0300 Subject: [PATCH 07/13] Extend a comment Signed-off-by: Mariya Podchishchaeva --- clang/lib/Driver/ToolChains/Clang.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index a3c9981411273..018282bc61205 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -7225,9 +7225,11 @@ void SYCLPostLink::ConstructJob(Compilation &C, const JobAction &JA, // Construct sycl-post-link command. assert(isa(JA) && "Expecting SYCL post link job!"); - // The split command looks like this: - // sycl-post-link input_file.ll -ir-files-list=ir.txt - // -txt-files-list=files.txt -o base_output + // Variants of split command look like this: + // sycl-post-link input_file.bc -ir-files-list=ir.txt -o base_output - for + // IR files generation. + // sycl-post-link input_file.bc -txt-files-list=files.txt -o base_output - for + // entries files generation. ArgStringList CmdArgs; InputInfo Input = Inputs.front(); From 33d8a4d5c8cb6670efd542aa8de984c0b51a99ac Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Wed, 27 Nov 2019 20:12:09 +0300 Subject: [PATCH 08/13] Merge split options Signed-off-by: Mariya Podchishchaeva --- clang/include/clang/Driver/Options.td | 9 +++++---- clang/lib/Driver/Driver.cpp | 2 +- clang/lib/Driver/ToolChains/Clang.cpp | 5 +++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 2dcc47877e211..cb9e862f09367 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1822,10 +1822,11 @@ def fsycl_add_targets_EQ : CommaJoined<["-"], "fsycl-add-targets=">, Flags<[Driv HelpText<"Specify comma-separated list of triple and device binary image pairs to add to the final SYCL binary">; def fsycl_link_targets_EQ : CommaJoined<["-"], "fsycl-link-targets=">, Flags<[DriverOption, CC1Option, CoreOption]>, HelpText<"Specify comma-separated list of triples SYCL offloading targets to produce linked device images">; -def fsycl_device_code_split : Flag<["-"], "fsycl-device-code-split">, - Flags<[CC1Option, CoreOption]>, HelpText<"Perform SYCL device code split">; -def fsycl_one_kernel_per_module : Flag<["-"], "fsycl-one-kernel-per-module">, - Flags<[CC1Option, CoreOption]>, HelpText<"Emit a separate device module for each kernel">; +def fsycl_device_code_split_EQ : Joined<["-"], "fsycl-device-code-split=">, + Flags<[CC1Option, CoreOption]>, HelpText<"Perform SYCL device code split">, Values<"per_source,per_kernel">; +def fsycl_device_code_split : Flag<["-"], "fsycl-device-code-split">, Alias, + AliasArgs<["per_source"]>, Flags<[CC1Option, CoreOption]>, + HelpText<"Perform SYCL device code split">; def fsycl_use_bitcode : Flag<["-"], "fsycl-use-bitcode">, Flags<[CC1Option, CoreOption]>, HelpText<"Use LLVM bitcode instead of SPIR-V in fat objects">; def fno_sycl_use_bitcode : Flag<["-"], "fno-sycl-use-bitcode">, diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 400cb500502a6..e99080151364d 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -3568,7 +3568,7 @@ class OffloadingActionBuilder final { Arg *SYCLLinkTargets = Args.getLastArg( options::OPT_fsycl_link_targets_EQ); WrapDeviceOnlyBinary = Args.hasArg(options::OPT_fsycl_link_EQ); - DeviceCodeSplit = Args.hasArg(options::OPT_fsycl_device_code_split); + DeviceCodeSplit = Args.hasArg(options::OPT_fsycl_device_code_split_EQ); // Device only compilation for -fsycl-link (no FPGA) and // -fsycl-link-targets CompileDeviceOnly = diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 018282bc61205..05eecfda2b5d7 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -7248,8 +7248,9 @@ void SYCLPostLink::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back(TCArgs.MakeArgString("-o")); CmdArgs.push_back(TCArgs.MakeArgString(TmpName)); - if (TCArgs.hasArg(options::OPT_fsycl_one_kernel_per_module)) - CmdArgs.push_back("-one-kernel"); + if (Arg *A = TCArgs.getLastArg(options::OPT_fsycl_device_code_split_EQ)) + if (A->getValue() == StringRef("per_kernel")) + CmdArgs.push_back("-one-kernel"); // All the inputs are encoded as commands. C.addCommand(std::make_unique( From 6b9f252eb4e0e6928a2b8ce72d07454f2abaf5a8 Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Wed, 27 Nov 2019 20:39:09 +0300 Subject: [PATCH 09/13] Make help for new options more detailed Signed-off-by: Mariya Podchishchaeva --- clang/include/clang/Driver/Options.td | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index cb9e862f09367..97fddb8e2bb78 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1823,10 +1823,10 @@ def fsycl_add_targets_EQ : CommaJoined<["-"], "fsycl-add-targets=">, Flags<[Driv def fsycl_link_targets_EQ : CommaJoined<["-"], "fsycl-link-targets=">, Flags<[DriverOption, CC1Option, CoreOption]>, HelpText<"Specify comma-separated list of triples SYCL offloading targets to produce linked device images">; def fsycl_device_code_split_EQ : Joined<["-"], "fsycl-device-code-split=">, - Flags<[CC1Option, CoreOption]>, HelpText<"Perform SYCL device code split">, Values<"per_source,per_kernel">; + Flags<[CC1Option, CoreOption]>, HelpText<"Perform SYCL device code split: per_kernel (device code module is created for each SYCL kernel) | per_source (device code module is created for each source (translation unit)). Default is no device code split - all kernels go into a single module`">, Values<"per_source,per_kernel">; def fsycl_device_code_split : Flag<["-"], "fsycl-device-code-split">, Alias, AliasArgs<["per_source"]>, Flags<[CC1Option, CoreOption]>, - HelpText<"Perform SYCL device code split">; + HelpText<"Perform SYCL device code split in the per_source mode i.e. create a device code module for each source (translation unit)">; def fsycl_use_bitcode : Flag<["-"], "fsycl-use-bitcode">, Flags<[CC1Option, CoreOption]>, HelpText<"Use LLVM bitcode instead of SPIR-V in fat objects">; def fno_sycl_use_bitcode : Flag<["-"], "fno-sycl-use-bitcode">, From 5e08fb9d96c250eaa3790384e97e8fa25931efe2 Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Thu, 28 Nov 2019 09:03:04 +0300 Subject: [PATCH 10/13] Apply suggestion Signed-off-by: Mariya Podchishchaeva --- clang/include/clang/Driver/Options.td | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 97fddb8e2bb78..0d299e643e716 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1823,7 +1823,9 @@ def fsycl_add_targets_EQ : CommaJoined<["-"], "fsycl-add-targets=">, Flags<[Driv def fsycl_link_targets_EQ : CommaJoined<["-"], "fsycl-link-targets=">, Flags<[DriverOption, CC1Option, CoreOption]>, HelpText<"Specify comma-separated list of triples SYCL offloading targets to produce linked device images">; def fsycl_device_code_split_EQ : Joined<["-"], "fsycl-device-code-split=">, - Flags<[CC1Option, CoreOption]>, HelpText<"Perform SYCL device code split: per_kernel (device code module is created for each SYCL kernel) | per_source (device code module is created for each source (translation unit)). Default is no device code split - all kernels go into a single module`">, Values<"per_source,per_kernel">; + Flags<[CC1Option, CoreOption]>, HelpText<"Perform SYCL device code split: per_kernel (device code module is " + "created for each SYCL kernel) | per_source (device code module is created for each source (translation unit)). " + "Default is no device code split - all kernels go into a single module`">, Values<"per_source,per_kernel">; def fsycl_device_code_split : Flag<["-"], "fsycl-device-code-split">, Alias, AliasArgs<["per_source"]>, Flags<[CC1Option, CoreOption]>, HelpText<"Perform SYCL device code split in the per_source mode i.e. create a device code module for each source (translation unit)">; From a088384fefd7d55d1e434c309952166be5fdb9f6 Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Thu, 28 Nov 2019 12:52:45 +0300 Subject: [PATCH 11/13] Fix comments Signed-off-by: Mariya Podchishchaeva --- clang/lib/Driver/Driver.cpp | 4 ++-- llvm/tools/sycl-post-link/sycl-post-link.cpp | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index e99080151364d..1ae923af9e92f 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -3198,7 +3198,7 @@ class OffloadingActionBuilder final { /// Flag to signal if the user requested the device object to be wrapped. bool WrapDeviceOnlyBinary = false; - /// Flag to signal if the user requested do not perform device code split. + /// Flag to signal if the user requested device code split. bool DeviceCodeSplit = false; /// The SYCL actions for the current input. @@ -3568,7 +3568,7 @@ class OffloadingActionBuilder final { Arg *SYCLLinkTargets = Args.getLastArg( options::OPT_fsycl_link_targets_EQ); WrapDeviceOnlyBinary = Args.hasArg(options::OPT_fsycl_link_EQ); - DeviceCodeSplit = Args.hasArg(options::OPT_fsycl_device_code_split_EQ); + DeviceCodeSplit = Args.hasArg(options::OPT_fsycl_device_code_split); // Device only compilation for -fsycl-link (no FPGA) and // -fsycl-link-targets CompileDeviceOnly = diff --git a/llvm/tools/sycl-post-link/sycl-post-link.cpp b/llvm/tools/sycl-post-link/sycl-post-link.cpp index 1d81e0649ba18..faf04b8e1510d 100644 --- a/llvm/tools/sycl-post-link/sycl-post-link.cpp +++ b/llvm/tools/sycl-post-link/sycl-post-link.cpp @@ -228,9 +228,9 @@ static void saveResults(std::vector> &ResModules, } if (OutputIRFilesList != "-") { - // TODO: Figure out what can be added to output list if there are no kernels - // in the input module - // Just pass input module to next tools if there was nothing to split + // TODO: Figure out what can be added to the output list if there are no + // kernels in the input module Just pass input module to next tools if there + // was nothing to split if (IRFilesList.empty()) IRFilesList = (Twine(InputFilename) + Twine("\n")).str(); From f2d616f53c089e6ec324823e3f40147e3a460482 Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Thu, 28 Nov 2019 12:54:33 +0300 Subject: [PATCH 12/13] Fix comment Signed-off-by: Mariya Podchishchaeva --- clang/lib/Driver/Driver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 1ae923af9e92f..09f60ff38b7dc 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -3464,7 +3464,7 @@ class OffloadingActionBuilder final { } } if (!DeviceObjects.empty()) { - // When aocx or aocr is seen, there is an expectation that none of + // When aocx or aocr is found, there is an expectation that none of // the other objects processed have any kernel. So, there // is no need in device code split and backend compile here. Just // link and wrap the device binary. From a2782c1d25f456d53870295cfe26b3f9c3538c09 Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Thu, 28 Nov 2019 13:25:48 +0300 Subject: [PATCH 13/13] Fix comments again Signed-off-by: Mariya Podchishchaeva --- llvm/tools/sycl-post-link/sycl-post-link.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/llvm/tools/sycl-post-link/sycl-post-link.cpp b/llvm/tools/sycl-post-link/sycl-post-link.cpp index faf04b8e1510d..73f40d364a61a 100644 --- a/llvm/tools/sycl-post-link/sycl-post-link.cpp +++ b/llvm/tools/sycl-post-link/sycl-post-link.cpp @@ -229,8 +229,8 @@ static void saveResults(std::vector> &ResModules, if (OutputIRFilesList != "-") { // TODO: Figure out what can be added to the output list if there are no - // kernels in the input module Just pass input module to next tools if there - // was nothing to split + // kernels in the input module. + // Just pass input module to next tools if there was nothing to split. if (IRFilesList.empty()) IRFilesList = (Twine(InputFilename) + Twine("\n")).str(); @@ -238,7 +238,7 @@ static void saveResults(std::vector> &ResModules, } if (OutputTxtFilesList != "-") { // TODO: Figure out what can be added to output list if there are no kernels - // in the input module + // in the input module. if (TxtFilesList.empty()) { // Just create an empty temporary file if there was nothing to split std::string TempFileNameBase = sys::path::stem(BaseOutputFilename);