From c9bfd8d9b4f00d2f14aa0edb76824058a686908e Mon Sep 17 00:00:00 2001 From: gejin Date: Thu, 30 Jul 2020 15:39:47 +0800 Subject: [PATCH 01/15] [SYCL]Link DeviceLibs with user's device code as default Signed-off-by: gejin --- clang/lib/Driver/Driver.cpp | 43 +++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 56ca80cef827b..214952486942d 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -331,6 +331,48 @@ static Arg *MakeInputArg(DerivedArgList &Args, const OptTable &Opts, return A; } +// Add SYCL device libraries into device code link proess as default. +static void addSYCLDeviceLibs(const ToolChain &TC, Driver::InputList &Inputs, + const OptTable &Opts, DerivedArgList &Args) { + enum SYCLDeviceLibType {sycl_devicelib_wrapper, sycl_devicelib_fallback}; + if (Args.hasArg(options::OPT_c)) + return; + if (Args.hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, false)) { + StringRef LibLoc, LibSysUtils; + if (TC.getTriple().isWindowsMSVCEnvironment()) { + LibLoc = Args.MakeArgString(TC.getDriver().Dir + "/../bin"); + LibSysUtils = "libsycl-msvc"; + } else { + LibLoc = Args.MakeArgString(TC.getDriver().Dir + "/../lib"); + LibSysUtils = "libsycl-glibc"; + } + SmallVector sycl_device_wrapper_libs = { + LibSysUtils, "libsycl-complex", "libsycl-complex-fp64", "libsycl-cmath", + "libsycl-cmath-fp64"}; + // For AOT compilation, we need to link sycl_device_fallback_libs as default too. + SmallVector sycl_device_fallback_libs = { + "libsycl-fallback-cassert", "libsycl-fallback-complex", "libsycl-fallback-complex-fp64", + "libsycl-fallback-cmath", "libsycl-fallback-cmath-fp64"}; + + auto addInputs = [&](SYCLDeviceLibType t) { + auto sycl_libs = (t == sycl_devicelib_wrapper) ? sycl_device_wrapper_libs : sycl_device_fallback_libs; + for (const StringRef &Lib : sycl_libs) { + SmallString<128> LibName(LibLoc); + llvm::sys::path::append(LibName, Lib); + llvm::sys::path::replace_extension(LibName, ".o"); + Arg *InputArg = MakeInputArg(Args, Opts, Args.MakeArgString(LibName)); + Inputs.push_back(std::make_pair(types::TY_Object, InputArg)); + } + }; + addInputs(sycl_devicelib_wrapper); + bool isSpirvAOT = TC.getTriple().getSubArch() == llvm::Triple::SPIRSubArch_fpga || + TC.getTriple().getSubArch() == llvm::Triple::SPIRSubArch_gen || + TC.getTriple().getSubArch() == llvm::Triple::SPIRSubArch_x86_64; + if (isSpirvAOT) + addInputs(sycl_devicelib_fallback); + } +} + DerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const { const llvm::opt::OptTable &Opts = getOpts(); DerivedArgList *DAL = new DerivedArgList(Args); @@ -2545,6 +2587,7 @@ void Driver::BuildInputs(const ToolChain &TC, DerivedArgList &Args, << A->getAsString(Args) << A->getValue(); } } + addSYCLDeviceLibs(TC, Inputs, Opts, Args); if (CCCIsCPP() && Inputs.empty()) { // If called as standalone preprocessor, stdin is processed // if no other input is present. From 3f5e7dc39292f87f8def783e745c5774c4bc82bc Mon Sep 17 00:00:00 2001 From: gejin Date: Mon, 3 Aug 2020 10:34:29 +0800 Subject: [PATCH 02/15] Ignore fallback device library in Non-SpirvAOT mode Signed-off-by: gejin --- clang/lib/Driver/Driver.cpp | 53 +++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 214952486942d..e68f26e228ccc 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -333,8 +333,8 @@ static Arg *MakeInputArg(DerivedArgList &Args, const OptTable &Opts, // Add SYCL device libraries into device code link proess as default. static void addSYCLDeviceLibs(const ToolChain &TC, Driver::InputList &Inputs, - const OptTable &Opts, DerivedArgList &Args) { - enum SYCLDeviceLibType {sycl_devicelib_wrapper, sycl_devicelib_fallback}; + const OptTable &Opts, DerivedArgList &Args) { + enum SYCLDeviceLibType { sycl_devicelib_wrapper, sycl_devicelib_fallback }; if (Args.hasArg(options::OPT_c)) return; if (Args.hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, false)) { @@ -349,13 +349,17 @@ static void addSYCLDeviceLibs(const ToolChain &TC, Driver::InputList &Inputs, SmallVector sycl_device_wrapper_libs = { LibSysUtils, "libsycl-complex", "libsycl-complex-fp64", "libsycl-cmath", "libsycl-cmath-fp64"}; - // For AOT compilation, we need to link sycl_device_fallback_libs as default too. + // For AOT compilation, we need to link sycl_device_fallback_libs as default + // too. SmallVector sycl_device_fallback_libs = { - "libsycl-fallback-cassert", "libsycl-fallback-complex", "libsycl-fallback-complex-fp64", - "libsycl-fallback-cmath", "libsycl-fallback-cmath-fp64"}; + "libsycl-fallback-cassert", "libsycl-fallback-complex", + "libsycl-fallback-complex-fp64", "libsycl-fallback-cmath", + "libsycl-fallback-cmath-fp64"}; auto addInputs = [&](SYCLDeviceLibType t) { - auto sycl_libs = (t == sycl_devicelib_wrapper) ? sycl_device_wrapper_libs : sycl_device_fallback_libs; + auto sycl_libs = (t == sycl_devicelib_wrapper) + ? sycl_device_wrapper_libs + : sycl_device_fallback_libs; for (const StringRef &Lib : sycl_libs) { SmallString<128> LibName(LibLoc); llvm::sys::path::append(LibName, Lib); @@ -365,14 +369,24 @@ static void addSYCLDeviceLibs(const ToolChain &TC, Driver::InputList &Inputs, } }; addInputs(sycl_devicelib_wrapper); - bool isSpirvAOT = TC.getTriple().getSubArch() == llvm::Triple::SPIRSubArch_fpga || - TC.getTriple().getSubArch() == llvm::Triple::SPIRSubArch_gen || - TC.getTriple().getSubArch() == llvm::Triple::SPIRSubArch_x86_64; - if (isSpirvAOT) - addInputs(sycl_devicelib_fallback); + addInputs(sycl_devicelib_fallback); } } + +static bool isFallbackDeviceLibsInputAction(const Action *OffloadAct) { + auto IT = *(OffloadAct->input_begin()); + if (dyn_cast(IT)) { + StringRef InputObjPath = + dyn_cast(IT)->getInputArg().getValue(); + StringRef InputObjFileName = llvm::sys::path::filename(InputObjPath); + if (InputObjFileName.startswith("libsycl-fallback-") && + InputObjFileName.endswith(".o")) + return true; + } + return false; +} + DerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const { const llvm::opt::OptTable &Opts = getOpts(); DerivedArgList *DAL = new DerivedArgList(Args); @@ -3839,7 +3853,6 @@ class OffloadingActionBuilder final { unsigned I = 0; for (auto &LI : DeviceLinkerInputs) { - auto TripleIt = llvm::find_if(SYCLTripleList, [&](auto &SYCLTriple) { return SYCLTriple == (*TC)->getTriple(); }); @@ -3909,12 +3922,22 @@ class OffloadingActionBuilder final { } ActionList DeviceLibObjects; ActionList LinkObjects; + auto TT = SYCLTripleList[I]; + bool isSpirvAOT = TT.getSubArch() == llvm::Triple::SPIRSubArch_fpga || + TT.getSubArch() == llvm::Triple::SPIRSubArch_gen || + TT.getSubArch() == llvm::Triple::SPIRSubArch_x86_64; for (const auto &Input : LI) { // FPGA aoco does not go through the link, everything else does. if (Input->getType() == types::TY_FPGA_AOCO) DeviceLibObjects.push_back(Input); - else + else { + if (!isSpirvAOT && + Input->getKind() == Action::OffloadUnbundlingJobClass && + Input->size() == 1 && isFallbackDeviceLibsInputAction(Input)) { + continue; + } LinkObjects.push_back(Input); + } } // The linkage actions subgraph leading to the offload wrapper. // [cond] Means incoming/outgoing dependence is created only when cond @@ -3982,10 +4005,6 @@ class OffloadingActionBuilder final { D.Diag(diag::err_drv_unsupported_opt_for_target) << OptName << (*TC)->getTriple().str(); } - auto TT = SYCLTripleList[I]; - bool isSpirvAOT = TT.getSubArch() == llvm::Triple::SPIRSubArch_fpga || - TT.getSubArch() == llvm::Triple::SPIRSubArch_gen || - TT.getSubArch() == llvm::Triple::SPIRSubArch_x86_64; // reflects whether current target is ahead-of-time and can't support // runtime setting of specialization constants bool isAOT = isNVPTX || isSpirvAOT; From d8ba722b59e4dbd7af7adfd94a665fc7576f1b91 Mon Sep 17 00:00:00 2001 From: gejin Date: Tue, 4 Aug 2020 22:16:10 +0800 Subject: [PATCH 03/15] remove all unnecessary functions introduced by device libraries Signed-off-by: gejin --- clang/include/clang/Driver/Action.h | 5 + clang/lib/Driver/Driver.cpp | 137 +++++++++---------- clang/lib/Driver/ToolChains/Clang.cpp | 2 + llvm/tools/sycl-post-link/sycl-post-link.cpp | 37 ++++- 4 files changed, 110 insertions(+), 71 deletions(-) diff --git a/clang/include/clang/Driver/Action.h b/clang/include/clang/Driver/Action.h index 3965ad1df7814..8e4e1ab1df274 100644 --- a/clang/include/clang/Driver/Action.h +++ b/clang/include/clang/Driver/Action.h @@ -687,8 +687,13 @@ class SYCLPostLinkJobAction : public JobAction { bool getRTSetsSpecConstants() const { return RTSetsSpecConsts; } + void setDeadCodeRemoval(bool Val) { DeadCodeRemoval = Val; } + + bool getDeadCodeRemoval() const { return DeadCodeRemoval; } + private: bool RTSetsSpecConsts = true; + bool DeadCodeRemoval = false; }; class PartialLinkJobAction : public JobAction { diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index e68f26e228ccc..cd3168a466cd3 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -331,62 +331,6 @@ static Arg *MakeInputArg(DerivedArgList &Args, const OptTable &Opts, return A; } -// Add SYCL device libraries into device code link proess as default. -static void addSYCLDeviceLibs(const ToolChain &TC, Driver::InputList &Inputs, - const OptTable &Opts, DerivedArgList &Args) { - enum SYCLDeviceLibType { sycl_devicelib_wrapper, sycl_devicelib_fallback }; - if (Args.hasArg(options::OPT_c)) - return; - if (Args.hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, false)) { - StringRef LibLoc, LibSysUtils; - if (TC.getTriple().isWindowsMSVCEnvironment()) { - LibLoc = Args.MakeArgString(TC.getDriver().Dir + "/../bin"); - LibSysUtils = "libsycl-msvc"; - } else { - LibLoc = Args.MakeArgString(TC.getDriver().Dir + "/../lib"); - LibSysUtils = "libsycl-glibc"; - } - SmallVector sycl_device_wrapper_libs = { - LibSysUtils, "libsycl-complex", "libsycl-complex-fp64", "libsycl-cmath", - "libsycl-cmath-fp64"}; - // For AOT compilation, we need to link sycl_device_fallback_libs as default - // too. - SmallVector sycl_device_fallback_libs = { - "libsycl-fallback-cassert", "libsycl-fallback-complex", - "libsycl-fallback-complex-fp64", "libsycl-fallback-cmath", - "libsycl-fallback-cmath-fp64"}; - - auto addInputs = [&](SYCLDeviceLibType t) { - auto sycl_libs = (t == sycl_devicelib_wrapper) - ? sycl_device_wrapper_libs - : sycl_device_fallback_libs; - for (const StringRef &Lib : sycl_libs) { - SmallString<128> LibName(LibLoc); - llvm::sys::path::append(LibName, Lib); - llvm::sys::path::replace_extension(LibName, ".o"); - Arg *InputArg = MakeInputArg(Args, Opts, Args.MakeArgString(LibName)); - Inputs.push_back(std::make_pair(types::TY_Object, InputArg)); - } - }; - addInputs(sycl_devicelib_wrapper); - addInputs(sycl_devicelib_fallback); - } -} - - -static bool isFallbackDeviceLibsInputAction(const Action *OffloadAct) { - auto IT = *(OffloadAct->input_begin()); - if (dyn_cast(IT)) { - StringRef InputObjPath = - dyn_cast(IT)->getInputArg().getValue(); - StringRef InputObjFileName = llvm::sys::path::filename(InputObjPath); - if (InputObjFileName.startswith("libsycl-fallback-") && - InputObjFileName.endswith(".o")) - return true; - } - return false; -} - DerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const { const llvm::opt::OptTable &Opts = getOpts(); DerivedArgList *DAL = new DerivedArgList(Args); @@ -2601,7 +2545,6 @@ void Driver::BuildInputs(const ToolChain &TC, DerivedArgList &Args, << A->getAsString(Args) << A->getValue(); } } - addSYCLDeviceLibs(TC, Inputs, Opts, Args); if (CCCIsCPP() && Inputs.empty()) { // If called as standalone preprocessor, stdin is processed // if no other input is present. @@ -3737,7 +3680,6 @@ class OffloadingActionBuilder final { } ActionBuilderReturnCode addDeviceDepences(Action *HostAction) override { - // If this is an input action replicate it for each SYCL toolchain. if (auto *IA = dyn_cast(HostAction)) { SYCLDeviceActions.clear(); @@ -3844,6 +3786,53 @@ class OffloadingActionBuilder final { SYCLDeviceActions.clear(); } + void addSYCLDeviceLibs(const ToolChain *TC, ActionList &DeviceLinkObjects, + bool isSpirvAOT) { + enum SYCLDeviceLibType { + sycl_devicelib_wrapper, + sycl_devicelib_fallback + }; + StringRef LibLoc, LibSysUtils; + if (TC->getTriple().isWindowsMSVCEnvironment()) { + LibLoc = Args.MakeArgString(TC->getDriver().Dir + "/../bin"); + LibSysUtils = "libsycl-msvc"; + } else { + LibLoc = Args.MakeArgString(TC->getDriver().Dir + "/../lib"); + LibSysUtils = "libsycl-glibc"; + } + SmallVector sycl_device_wrapper_libs = { + LibSysUtils, "libsycl-complex", "libsycl-complex-fp64", + "libsycl-cmath", "libsycl-cmath-fp64"}; + // For AOT compilation, we need to link sycl_device_fallback_libs as + // default too. + SmallVector sycl_device_fallback_libs = { + "libsycl-fallback-cassert", "libsycl-fallback-complex", + "libsycl-fallback-complex-fp64", "libsycl-fallback-cmath", + "libsycl-fallback-cmath-fp64"}; + auto addInputs = [&](SYCLDeviceLibType t) { + auto sycl_libs = (t == sycl_devicelib_wrapper) + ? sycl_device_wrapper_libs + : sycl_device_fallback_libs; + for (const StringRef &Lib : sycl_libs) { + SmallString<128> LibName(LibLoc); + llvm::sys::path::append(LibName, Lib); + llvm::sys::path::replace_extension(LibName, ".o"); + Arg *InputArg = MakeInputArg(Args, C.getDriver().getOpts(), + Args.MakeArgString(LibName)); + auto *SYCLDeviceLibsInputAction = + C.MakeAction(*InputArg, types::TY_Object); + auto *SYCLDeviceLibsUnbundleAction = + C.MakeAction( + SYCLDeviceLibsInputAction); + addDeviceDepences(SYCLDeviceLibsUnbundleAction); + DeviceLinkObjects.push_back(SYCLDeviceLibsUnbundleAction); + } + }; + addInputs(sycl_devicelib_wrapper); + if (isSpirvAOT) + addInputs(sycl_devicelib_fallback); + } + void appendLinkDependences(OffloadAction::DeviceDependences &DA) override { assert(ToolChains.size() == DeviceLinkerInputs.size() && "Toolchains and linker inputs sizes do not match."); @@ -3923,6 +3912,7 @@ class OffloadingActionBuilder final { ActionList DeviceLibObjects; ActionList LinkObjects; auto TT = SYCLTripleList[I]; + auto isNVPTX = (*TC)->getTriple().isNVPTX(); bool isSpirvAOT = TT.getSubArch() == llvm::Triple::SPIRSubArch_fpga || TT.getSubArch() == llvm::Triple::SPIRSubArch_gen || TT.getSubArch() == llvm::Triple::SPIRSubArch_x86_64; @@ -3930,15 +3920,13 @@ class OffloadingActionBuilder final { // FPGA aoco does not go through the link, everything else does. if (Input->getType() == types::TY_FPGA_AOCO) DeviceLibObjects.push_back(Input); - else { - if (!isSpirvAOT && - Input->getKind() == Action::OffloadUnbundlingJobClass && - Input->size() == 1 && isFallbackDeviceLibsInputAction(Input)) { - continue; - } + else LinkObjects.push_back(Input); - } } + + // For SYCL compilation, add SYCL device libraries as default. + if (!isNVPTX && !Args.hasArg(options::OPT_fintelfpga)) + addSYCLDeviceLibs(*TC, LinkObjects, isSpirvAOT); // The linkage actions subgraph leading to the offload wrapper. // [cond] Means incoming/outgoing dependence is created only when cond // is true. A function of: @@ -3993,7 +3981,6 @@ class OffloadingActionBuilder final { Action *DeviceLinkAction = C.MakeAction(LinkObjects, types::TY_LLVM_BC); // setup some flags upfront - auto isNVPTX = (*TC)->getTriple().isNVPTX(); if (isNVPTX && DeviceCodeSplit) { // TODO Temporary limitation, need to support code splitting for PTX @@ -4017,8 +4004,19 @@ class OffloadingActionBuilder final { types::ID PostLinkOutType = isNVPTX || !MultiFileActionDeps ? types::TY_LLVM_BC : types::TY_Tempfiletable; - auto *PostLinkAction = C.MakeAction( - DeviceLinkAction, PostLinkOutType); + SYCLPostLinkJobAction *PostLinkDCRAction = nullptr; + SYCLPostLinkJobAction *PostLinkAction = nullptr; + if (isNVPTX) { + PostLinkAction = C.MakeAction(DeviceLinkAction, + PostLinkOutType); + } else { + PostLinkDCRAction = C.MakeAction( + DeviceLinkAction, types::TY_LLVM_BC); + PostLinkDCRAction->setDeadCodeRemoval(true); + PostLinkDCRAction->setRTSetsSpecConstants(false); + PostLinkAction = C.MakeAction( + PostLinkDCRAction, PostLinkOutType); + } PostLinkAction->setRTSetsSpecConstants(!isAOT); if (isNVPTX) { @@ -4561,7 +4559,7 @@ class OffloadingActionBuilder final { return nullptr; // Let builders add host linking actions. - Action* HA; + Action* HA = nullptr; for (DeviceActionBuilder *SB : SpecializedBuilders) { if (!SB->isValid()) continue; @@ -4580,7 +4578,6 @@ class OffloadingActionBuilder final { for (auto *SB : SpecializedBuilders) { if (!SB->isValid()) continue; - SB->appendLinkDependences(DDeps); } diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 4d1b12e337dbb..8445eaeb3028b 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -7811,6 +7811,8 @@ void SYCLPostLink::ConstructJob(Compilation &C, const JobAction &JA, else addArgs(CmdArgs, TCArgs, {"-spec-const=default"}); + if (SYCLPostLink && SYCLPostLink->getDeadCodeRemoval()) + addArgs(CmdArgs, TCArgs, {"--dead-code-removal"}); // Add output file table file option assert(Output.isFilename() && "output must be a filename"); addArgs(CmdArgs, TCArgs, {"-o", Output.getFilename()}); diff --git a/llvm/tools/sycl-post-link/sycl-post-link.cpp b/llvm/tools/sycl-post-link/sycl-post-link.cpp index 13d7d5e4c45a1..3947decac0798 100644 --- a/llvm/tools/sycl-post-link/sycl-post-link.cpp +++ b/llvm/tools/sycl-post-link/sycl-post-link.cpp @@ -86,6 +86,10 @@ static cl::opt OutputAssembly{"S", cl::desc("Write output as LLVM assembly"), cl::Hidden, cl::cat(PostLinkCat)}; +static cl::opt DeadCodeRemoval{ + "dead-code-removal", cl::desc("Remove all dead code in current module"), + cl::cat(PostLinkCat)}; + enum IRSplitMode { SPLIT_PER_TU, // one module per translation unit SPLIT_PER_KERNEL // one module per kernel @@ -532,6 +536,29 @@ static string_vector saveResultSymbolsLists(string_vector &ResSymbolsLists) { return std::move(Res); } +void RemoveDeadCode(Module &M) { + std::vector unusedFuncVec; + bool isClean = false; + while (!isClean) { + unusedFuncVec.clear(); + for (Function &F : M) { + if (F.user_empty() && (F.getCallingConv() == CallingConv::SPIR_FUNC)) { + F.deleteBody(); + unusedFuncVec.push_back(&F); + } + } + + if (!unusedFuncVec.empty()) { + for (Function *F : unusedFuncVec) { + M.getFunctionList().remove(F); + } + isClean = false; + } else { + isClean = true; + } + } +} + #define CHECK_AND_EXIT(E) \ { \ Error LocE = std::move(E); \ @@ -578,7 +605,10 @@ int main(int argc, char **argv) { "will produce single output file example_p.bc suitable for SPIRV\n" "translation.\n"); - bool DoSplit = SplitMode.getNumOccurrences() > 0; + // For DeadCodeRemoval, the input is original IR and output is a 'clean' IR + // whose 'unused' functions are removed. DeadCodeRemoval shouldn't work with + // any other functionalities such as code split... + bool DoSplit = (SplitMode.getNumOccurrences() > 0) && !DeadCodeRemoval; bool DoSpecConst = SpecConstLower.getNumOccurrences() > 0; if (!DoSplit && !DoSpecConst && !DoSymGen) { @@ -608,6 +638,11 @@ int main(int argc, char **argv) { if (OutputFilename.getNumOccurrences() == 0) OutputFilename = (Twine(sys::path::stem(InputFilename)) + ".files").str(); + if (DeadCodeRemoval && IROutputOnly) { + RemoveDeadCode(*MPtr); + saveModule(*MPtr, OutputFilename); + return 0; + } std::map> GlobalsSet; if (DoSplit || DoSymGen) { From f1476577e396f83bec1416050f3b02d4d962915f Mon Sep 17 00:00:00 2001 From: gejin Date: Fri, 7 Aug 2020 10:11:42 +0800 Subject: [PATCH 04/15] Don't remove dead code in NVPTX or intelfpga compilation Signed-off-by: gejin --- 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 cd3168a466cd3..e653e5f9dff2a 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -4006,7 +4006,7 @@ class OffloadingActionBuilder final { : types::TY_Tempfiletable; SYCLPostLinkJobAction *PostLinkDCRAction = nullptr; SYCLPostLinkJobAction *PostLinkAction = nullptr; - if (isNVPTX) { + if (isNVPTX || Args.hasArg(options::OPT_fintelfpga)) { PostLinkAction = C.MakeAction(DeviceLinkAction, PostLinkOutType); } else { From 498e1abf61b827f379809ddede5f473fd804dfb4 Mon Sep 17 00:00:00 2001 From: gejin Date: Fri, 7 Aug 2020 11:17:38 +0800 Subject: [PATCH 05/15] adjust devicelib tests, manually linking is not needed Signed-off-by: gejin --- sycl/test/devicelib/assert-aot.cpp | 2 +- sycl/test/devicelib/assert-windows.cpp | 3 +-- sycl/test/devicelib/assert.cpp | 3 +-- sycl/test/devicelib/cmath-aot.cpp | 8 ++++---- sycl/test/devicelib/cmath_fp64_test.cpp | 3 +-- sycl/test/devicelib/cmath_test.cpp | 3 +-- sycl/test/devicelib/math_fp64_test.cpp | 3 +-- sycl/test/devicelib/math_fp64_windows_test.cpp | 9 ++++----- sycl/test/devicelib/math_override_test.cpp | 6 +++--- sycl/test/devicelib/math_test.cpp | 3 +-- sycl/test/devicelib/math_windows_test.cpp | 9 ++++----- sycl/test/devicelib/std_complex_math_fp64_test.cpp | 3 +-- sycl/test/devicelib/std_complex_math_test.cpp | 3 +-- 13 files changed, 24 insertions(+), 34 deletions(-) diff --git a/sycl/test/devicelib/assert-aot.cpp b/sycl/test/devicelib/assert-aot.cpp index 3867b97039987..811f174b399d7 100644 --- a/sycl/test/devicelib/assert-aot.cpp +++ b/sycl/test/devicelib/assert-aot.cpp @@ -1,5 +1,5 @@ // REQUIRES: opencl-aot, cpu, linux -// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %S/assert.cpp %sycl_libs_dir/libsycl-glibc.o %sycl_libs_dir/libsycl-fallback-cassert.o -o %t.aot.out +// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %S/assert.cpp -o %t.aot.out // RUN: %CPU_RUN_PLACEHOLDER %t.aot.out >%t.aot.msg // RUN: FileCheck %S/assert.cpp --input-file %t.aot.msg --check-prefixes=CHECK-MESSAGE diff --git a/sycl/test/devicelib/assert-windows.cpp b/sycl/test/devicelib/assert-windows.cpp index fb38520601d98..01db1858e5e67 100644 --- a/sycl/test/devicelib/assert-windows.cpp +++ b/sycl/test/devicelib/assert-windows.cpp @@ -4,8 +4,7 @@ // Disable the test until the fix reaches SYCL test infrastructure. // XFAIL: * // -// RUN: %clangxx -fsycl -c %s -o %t.o -// RUN: %clangxx -fsycl %t.o %sycl_libs_dir/../bin/libsycl-msvc.o -o %t.out +// RUN: %clangxx -fsycl %s -o %t.out // // MSVC implementation of assert does not call an unreachable built-in, so the // program doesn't terminate when fallback is used. diff --git a/sycl/test/devicelib/assert.cpp b/sycl/test/devicelib/assert.cpp index 343d949b74052..e86923ee09f10 100644 --- a/sycl/test/devicelib/assert.cpp +++ b/sycl/test/devicelib/assert.cpp @@ -1,6 +1,5 @@ // REQUIRES: cpu,linux -// RUN: %clangxx -fsycl -c %s -o %t.o -// RUN: %clangxx -fsycl %t.o %sycl_libs_dir/libsycl-glibc.o -o %t.out +// RUN: %clangxx -fsycl %s -o %t.out // (see the other RUN lines below; it is a bit complicated) // // assert() call in device code guarantees nothing: on some devices it behaves diff --git a/sycl/test/devicelib/cmath-aot.cpp b/sycl/test/devicelib/cmath-aot.cpp index e58a87d9f51bc..18ac5095bd074 100644 --- a/sycl/test/devicelib/cmath-aot.cpp +++ b/sycl/test/devicelib/cmath-aot.cpp @@ -1,14 +1,14 @@ // REQUIRES: opencl-aot, cpu // UNSUPPORTED: windows -// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %S/cmath_test.cpp %sycl_libs_dir/libsycl-cmath.o %sycl_libs_dir/libsycl-fallback-cmath.o -o %t.cmath.out +// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %S/cmath_test.cpp -o %t.cmath.out // RUN: %CPU_RUN_PLACEHOLDER %t.cmath.out -// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %S/cmath_fp64_test.cpp %sycl_libs_dir/libsycl-cmath-fp64.o %sycl_libs_dir/libsycl-fallback-cmath-fp64.o -o %t.cmath.fp64.out +// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %S/cmath_fp64_test.cpp -o %t.cmath.fp64.out // RUN: %CPU_RUN_PLACEHOLDER %t.cmath.fp64.out -// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %S/std_complex_math_test.cpp %sycl_libs_dir/libsycl-complex.o %sycl_libs_dir/libsycl-cmath.o %sycl_libs_dir/libsycl-fallback-complex.o %sycl_libs_dir/libsycl-fallback-cmath.o -o %t.complex.out +// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %S/std_complex_math_test.cpp -o %t.complex.out // RUN: %CPU_RUN_PLACEHOLDER %t.complex.out -// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %S/std_complex_math_fp64_test.cpp %sycl_libs_dir/libsycl-complex-fp64.o %sycl_libs_dir/libsycl-cmath-fp64.o %sycl_libs_dir/libsycl-fallback-complex-fp64.o %sycl_libs_dir/libsycl-fallback-cmath-fp64.o -o %t.complex.fp64.out +// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %S/std_complex_math_fp64_test.cpp -o %t.complex.fp64.out // RUN: %CPU_RUN_PLACEHOLDER %t.complex.fp64.out diff --git a/sycl/test/devicelib/cmath_fp64_test.cpp b/sycl/test/devicelib/cmath_fp64_test.cpp index 30954e0eff59f..92b71027088a8 100644 --- a/sycl/test/devicelib/cmath_fp64_test.cpp +++ b/sycl/test/devicelib/cmath_fp64_test.cpp @@ -1,6 +1,5 @@ // UNSUPPORTED: windows -// RUN: %clangxx -fsycl -c %s -o %t.o -// RUN: %clangxx -fsycl %t.o %sycl_libs_dir/libsycl-cmath-fp64.o -o %t.out +// RUN: %clangxx -fsycl %s -o %t.out // RUN: env SYCL_DEVICE_TYPE=HOST %t.out // RUN: %CPU_RUN_PLACEHOLDER %t.out // RUN: %ACC_RUN_PLACEHOLDER %t.out diff --git a/sycl/test/devicelib/cmath_test.cpp b/sycl/test/devicelib/cmath_test.cpp index bb2e37345d6fc..ffb4fc039b54b 100644 --- a/sycl/test/devicelib/cmath_test.cpp +++ b/sycl/test/devicelib/cmath_test.cpp @@ -1,6 +1,5 @@ // UNSUPPORTED: windows -// RUN: %clangxx -fsycl -c %s -o %t.o -// RUN: %clangxx -fsycl %t.o %sycl_libs_dir/libsycl-cmath.o -o %t.out +// RUN: %clangxx -fsycl %s -o %t.out // RUN: env SYCL_DEVICE_TYPE=HOST %t.out // RUN: %CPU_RUN_PLACEHOLDER %t.out // RUN: %ACC_RUN_PLACEHOLDER %t.out diff --git a/sycl/test/devicelib/math_fp64_test.cpp b/sycl/test/devicelib/math_fp64_test.cpp index dec0bf7341d92..23c81033e9ea4 100644 --- a/sycl/test/devicelib/math_fp64_test.cpp +++ b/sycl/test/devicelib/math_fp64_test.cpp @@ -1,6 +1,5 @@ // REQUIRES: cpu, linux -// RUN: %clangxx -fsycl -c %s -o %t.o -// RUN: %clangxx -fsycl %t.o %sycl_libs_dir/libsycl-cmath-fp64.o -o %t.out +// RUN: %clangxx -fsycl %s -o %t.out // RUN: env SYCL_DEVICE_TYPE=HOST %t.out // RUN: %CPU_RUN_PLACEHOLDER %t.out // RUN: %ACC_RUN_PLACEHOLDER %t.out diff --git a/sycl/test/devicelib/math_fp64_windows_test.cpp b/sycl/test/devicelib/math_fp64_windows_test.cpp index 64d4e000c5ff5..166452819e3f0 100644 --- a/sycl/test/devicelib/math_fp64_windows_test.cpp +++ b/sycl/test/devicelib/math_fp64_windows_test.cpp @@ -1,9 +1,8 @@ // REQUIRES: cpu, windows -// RUN: %clangxx -fsycl -c %s -o %t.o -// RUN: %clangxx -fsycl %t.o %sycl_libs_dir/../bin/libsycl-cmath-fp64.o -o %t.out -// RUN: env SYCL_DEVICE_TYPE=HOST %t.out -// RUN: %CPU_RUN_PLACEHOLDER %t.out -// RUN: %ACC_RUN_PLACEHOLDER %t.out +// RUN: %clangxx -fsycl %s -o %t.exe +// RUN: env SYCL_DEVICE_TYPE=HOST %t.exe +// RUN: %CPU_RUN_PLACEHOLDER %t.exe +// RUN: %ACC_RUN_PLACEHOLDER %t.exe #include "math_utils.hpp" #include #include diff --git a/sycl/test/devicelib/math_override_test.cpp b/sycl/test/devicelib/math_override_test.cpp index e634bf77fbd37..b3014f9bea884 100644 --- a/sycl/test/devicelib/math_override_test.cpp +++ b/sycl/test/devicelib/math_override_test.cpp @@ -1,6 +1,5 @@ // UNSUPPORTED: windows -// RUN: %clangxx -fsycl -c %s -o %t.o -// RUN: %clangxx -fsycl %t.o %sycl_libs_dir/libsycl-cmath.o -o %t.out +// RUN: %clangxx -fsycl %s -o %t.out -fno-builtin // RUN: env SYCL_DEVICE_TYPE=HOST %t.out #include #include @@ -16,6 +15,8 @@ constexpr s::access::mode sycl_write = s::access::mode::write; SYCL_EXTERNAL extern "C" float sinf(float x) { return x + 100.f; } +SYCL_EXTERNAL +extern "C" float cosf(float x); class DeviceTest; void device_test() { @@ -37,7 +38,6 @@ void device_test() { }); }); } - assert(approx_equal_fp(result_sin, 100.f) && approx_equal_fp(result_cos, 1.f)); } diff --git a/sycl/test/devicelib/math_test.cpp b/sycl/test/devicelib/math_test.cpp index 1e3885960b2c5..8394874b7b76c 100644 --- a/sycl/test/devicelib/math_test.cpp +++ b/sycl/test/devicelib/math_test.cpp @@ -1,6 +1,5 @@ // REQUIRES: cpu, linux -// RUN: %clangxx -fsycl -c %s -o %t.o -// RUN: %clangxx -fsycl %t.o %sycl_libs_dir/libsycl-cmath.o -o %t.out +// RUN: %clangxx -fsycl %s -o %t.out // RUN: env SYCL_DEVICE_TYPE=HOST %t.out // RUN: %CPU_RUN_PLACEHOLDER %t.out // RUN: %ACC_RUN_PLACEHOLDER %t.out diff --git a/sycl/test/devicelib/math_windows_test.cpp b/sycl/test/devicelib/math_windows_test.cpp index fa295c8bff84c..c217c36506725 100644 --- a/sycl/test/devicelib/math_windows_test.cpp +++ b/sycl/test/devicelib/math_windows_test.cpp @@ -1,9 +1,8 @@ // REQUIRES: cpu, windows -// RUN: %clangxx -fsycl -c %s -o %t.o -// RUN: %clangxx -fsycl %t.o %sycl_libs_dir/../bin/libsycl-cmath.o -o %t.out -// RUN: env SYCL_DEVICE_TYPE=HOST %t.out -// RUN: %CPU_RUN_PLACEHOLDER %t.out -// RUN: %ACC_RUN_PLACEHOLDER %t.out +// RUN: %clangxx -fsycl %s -o %t.exe +// RUN: env SYCL_DEVICE_TYPE=HOST %t.exe +// RUN: %CPU_RUN_PLACEHOLDER %t.exe +// RUN: %ACC_RUN_PLACEHOLDER %t.exe #include "math_utils.hpp" #include #include diff --git a/sycl/test/devicelib/std_complex_math_fp64_test.cpp b/sycl/test/devicelib/std_complex_math_fp64_test.cpp index 40eeadfd04321..673583b39a20d 100644 --- a/sycl/test/devicelib/std_complex_math_fp64_test.cpp +++ b/sycl/test/devicelib/std_complex_math_fp64_test.cpp @@ -1,6 +1,5 @@ // UNSUPPORTED: windows -// RUN: %clangxx -fsycl -c %s -o %t.o -// RUN: %clangxx -fsycl %t.o %sycl_libs_dir/libsycl-complex-fp64.o %sycl_libs_dir/libsycl-cmath-fp64.o -o %t.out +// RUN: %clangxx -fsycl %s -o %t.out // RUN: env SYCL_DEVICE_TYPE=HOST %t.out // RUN: %CPU_RUN_PLACEHOLDER %t.out // RUN: %ACC_RUN_PLACEHOLDER %t.out diff --git a/sycl/test/devicelib/std_complex_math_test.cpp b/sycl/test/devicelib/std_complex_math_test.cpp index b2578076243ff..fb6b1feaf1319 100644 --- a/sycl/test/devicelib/std_complex_math_test.cpp +++ b/sycl/test/devicelib/std_complex_math_test.cpp @@ -1,6 +1,5 @@ // UNSUPPORTED: windows -// RUN: %clangxx -fsycl -c %s -o %t.o -// RUN: %clangxx -fsycl %t.o %sycl_libs_dir/libsycl-complex.o %sycl_libs_dir/libsycl-cmath.o -o %t.out +// RUN: %clangxx -fsycl %s -o %t.out // RUN: env SYCL_DEVICE_TYPE=HOST %t.out // RUN: %CPU_RUN_PLACEHOLDER %t.out // RUN: %ACC_RUN_PLACEHOLDER %t.out From 937328fe5c5bc809205dd607487f7d27b03e625a Mon Sep 17 00:00:00 2001 From: gejin Date: Fri, 7 Aug 2020 14:46:28 +0800 Subject: [PATCH 06/15] check 'referenced-indirect' attribute when removing 'unused' function Signed-off-by: gejin --- clang/lib/Driver/Driver.cpp | 2 +- llvm/tools/sycl-post-link/sycl-post-link.cpp | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index b6315637a4c60..36214be331d02 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -4559,7 +4559,7 @@ class OffloadingActionBuilder final { return nullptr; // Let builders add host linking actions. - Action* HA = nullptr; + Action *HA = nullptr; for (DeviceActionBuilder *SB : SpecializedBuilders) { if (!SB->isValid()) continue; diff --git a/llvm/tools/sycl-post-link/sycl-post-link.cpp b/llvm/tools/sycl-post-link/sycl-post-link.cpp index 3947decac0798..d772d1a4d2587 100644 --- a/llvm/tools/sycl-post-link/sycl-post-link.cpp +++ b/llvm/tools/sycl-post-link/sycl-post-link.cpp @@ -535,14 +535,16 @@ static string_vector saveResultSymbolsLists(string_vector &ResSymbolsLists) { } return std::move(Res); } - -void RemoveDeadCode(Module &M) { +// Remove 'unused' functions in device LLVM IR module, there is one execption +// that functions with 'reference-indirectly' attribute can't be removed. +static void RemoveDeadCode(Module &M) { std::vector unusedFuncVec; bool isClean = false; while (!isClean) { unusedFuncVec.clear(); for (Function &F : M) { - if (F.user_empty() && (F.getCallingConv() == CallingConv::SPIR_FUNC)) { + if (F.user_empty() && (F.getCallingConv() == CallingConv::SPIR_FUNC) && + !F.getAttributes().hasFnAttribute("referenced-indirectly")) { F.deleteBody(); unusedFuncVec.push_back(&F); } From 49845e50e3299002a7a3af31cadd2755783005e9 Mon Sep 17 00:00:00 2001 From: gejin Date: Fri, 7 Aug 2020 16:29:55 +0800 Subject: [PATCH 07/15] use defaul toolchain to check MSVC environment in device compilation Signed-off-by: gejin --- clang/lib/Driver/Driver.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 36214be331d02..e39e709b2bb38 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -5,7 +5,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// - #include "clang/Driver/Driver.h" #include "InputInfo.h" #include "ToolChains/AIX.h" @@ -3787,13 +3786,13 @@ class OffloadingActionBuilder final { } void addSYCLDeviceLibs(const ToolChain *TC, ActionList &DeviceLinkObjects, - bool isSpirvAOT) { + bool isSpirvAOT, bool isMSVCEnv) { enum SYCLDeviceLibType { sycl_devicelib_wrapper, sycl_devicelib_fallback }; StringRef LibLoc, LibSysUtils; - if (TC->getTriple().isWindowsMSVCEnvironment()) { + if (isMSVCEnv) { LibLoc = Args.MakeArgString(TC->getDriver().Dir + "/../bin"); LibSysUtils = "libsycl-msvc"; } else { @@ -3925,8 +3924,11 @@ class OffloadingActionBuilder final { } // For SYCL compilation, add SYCL device libraries as default. - if (!isNVPTX && !Args.hasArg(options::OPT_fintelfpga)) - addSYCLDeviceLibs(*TC, LinkObjects, isSpirvAOT); + if (!isNVPTX && !Args.hasArg(options::OPT_fintelfpga)) { + addSYCLDeviceLibs( + *TC, LinkObjects, isSpirvAOT, + C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment()); + } // The linkage actions subgraph leading to the offload wrapper. // [cond] Means incoming/outgoing dependence is created only when cond // is true. A function of: From cccff9801c2cf0afda593285d251386692f0868f Mon Sep 17 00:00:00 2001 From: gejin Date: Fri, 21 Aug 2020 16:48:57 +0800 Subject: [PATCH 08/15] Add -fno-sycl-devicelib to disable device lib auto link Signed-off-by: gejin --- clang/include/clang/Driver/Options.td | 3 +- clang/lib/Driver/Driver.cpp | 6 +- .../test/Driver/sycl-offload-static-lib-2.cpp | 4 +- clang/test/Driver/sycl-offload-static-lib.cpp | 6 +- clang/test/Driver/sycl-offload-win.c | 4 +- clang/test/Driver/sycl-offload-with-split.c | 38 ++++++------- clang/test/Driver/sycl-offload.c | 56 +++++++++---------- 7 files changed, 60 insertions(+), 57 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 03c1f03df2bb1..7839e1d8c191f 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3531,7 +3531,8 @@ def fsycl_esimd : Flag<["-"], "fsycl-explicit-simd">, Group, Flags<[ def fno_sycl_esimd : Flag<["-"], "fno-sycl-explicit-simd">, Group, HelpText<"Disable SYCL explicit SIMD extension">, Flags<[NoArgumentUnused, CoreOption]>; defm sycl_std_optimizations : OptOutFFlag<"sycl-std-optimizations", "Enable", "Disable", " standard optimization pipeline for SYCL device compiler">; - +def fno_sycl_devicelib : Flag<["-"], "fno-sycl-devicelib">, Group, + HelpText<"Disable SYCL device library link with kernel code">, Flags<[NoArgumentUnused, CoreOption]>; //===----------------------------------------------------------------------===// // CC1 Options //===----------------------------------------------------------------------===// diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index e39e709b2bb38..c5d002535f9ec 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -3924,7 +3924,8 @@ class OffloadingActionBuilder final { } // For SYCL compilation, add SYCL device libraries as default. - if (!isNVPTX && !Args.hasArg(options::OPT_fintelfpga)) { + if (!isNVPTX && !Args.hasArg(options::OPT_fintelfpga) && + !Args.hasArg(options::OPT_fno_sycl_devicelib)) { addSYCLDeviceLibs( *TC, LinkObjects, isSpirvAOT, C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment()); @@ -4008,7 +4009,8 @@ class OffloadingActionBuilder final { : types::TY_Tempfiletable; SYCLPostLinkJobAction *PostLinkDCRAction = nullptr; SYCLPostLinkJobAction *PostLinkAction = nullptr; - if (isNVPTX || Args.hasArg(options::OPT_fintelfpga)) { + if (isNVPTX || Args.hasArg(options::OPT_fintelfpga) || + Args.hasArg(options::OPT_fno_sycl_devicelib)) { PostLinkAction = C.MakeAction(DeviceLinkAction, PostLinkOutType); } else { diff --git a/clang/test/Driver/sycl-offload-static-lib-2.cpp b/clang/test/Driver/sycl-offload-static-lib-2.cpp index eff45a9d19f30..5a6d9c1955c90 100644 --- a/clang/test/Driver/sycl-offload-static-lib-2.cpp +++ b/clang/test/Driver/sycl-offload-static-lib-2.cpp @@ -99,9 +99,9 @@ /// ########################################################################### /// test behaviors of static lib with no source/object -// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -L/dummy/dir %t.a -### 2>&1 \ +// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -L/dummy/dir %t.a -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=STATIC_LIB_NOSRC -DINPUTLIB=%t.a -// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -L/dummy/dir %t.lo -### 2>&1 \ +// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -L/dummy/dir %t.lo -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=STATIC_LIB_NOSRC -DINPUTLIB=%t.lo // STATIC_LIB_NOSRC: clang-offload-bundler{{.*}} "-type=ao" "-targets=host-x86_64-unknown-linux-gnu" "-inputs=[[INPUTLIB]]" "-check-section" // STATIC_LIB_NOSRC: ld{{.*}} "-r" "-o" "[[PARTIALOBJ:.+\.o]]" "{{.*}}crt1.o" {{.*}} "-L/dummy/dir" {{.*}} "[[INPUTLIB]]" diff --git a/clang/test/Driver/sycl-offload-static-lib.cpp b/clang/test/Driver/sycl-offload-static-lib.cpp index e32b244162e38..2e557405b4fb1 100644 --- a/clang/test/Driver/sycl-offload-static-lib.cpp +++ b/clang/test/Driver/sycl-offload-static-lib.cpp @@ -47,7 +47,7 @@ /// test behaviors of -foffload-static-lib= from source // RUN: touch %t.a -// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -foffload-static-lib=%t.a -ccc-print-phases %s 2>&1 \ +// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -foffload-static-lib=%t.a -ccc-print-phases %s 2>&1 \ // RUN: | FileCheck %s -check-prefix=FOFFLOAD_STATIC_LIB_SRC // FOFFLOAD_STATIC_LIB_SRC: 0: input, "[[INPUTA:.+\.a]]", object, (host-sycl) @@ -122,9 +122,9 @@ /// ########################################################################### /// test behaviors of -foffload-static-lib with no source/object -// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -L/dummy/dir -foffload-static-lib=%t.a -### -ccc-print-phases 2>&1 \ +// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -L/dummy/dir -foffload-static-lib=%t.a -### -ccc-print-phases 2>&1 \ // RUN: | FileCheck %s -check-prefixes=FOFFLOAD_STATIC_LIB_NOSRC_PHASES,FOFFLOAD_STATIC_LIB_NOSRC_PHASES_1 -// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -L/dummy/dir -foffload-whole-static-lib=%t.a -### -ccc-print-phases 2>&1 \ +// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -L/dummy/dir -foffload-whole-static-lib=%t.a -### -ccc-print-phases 2>&1 \ // RUN: | FileCheck %s -check-prefixes=FOFFLOAD_STATIC_LIB_NOSRC_PHASES,FOFFLOAD_STATIC_LIB_NOSRC_PHASES_2 // FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 0: input, "[[INPUTA:.+\.a]]", object, (host-sycl) // FOFFLOAD_STATIC_LIB_NOSRC_PHASES: 1: linker, {0}, image, (host-sycl) diff --git a/clang/test/Driver/sycl-offload-win.c b/clang/test/Driver/sycl-offload-win.c index 4d2ab26532a27..35748739b5a67 100644 --- a/clang/test/Driver/sycl-offload-win.c +++ b/clang/test/Driver/sycl-offload-win.c @@ -57,9 +57,9 @@ /// Test behaviors of -foffload-static-lib= from source. // RUN: touch %t.lib -// RUN: %clang --target=x86_64-pc-windows-msvc -fsycl -foffload-static-lib=%t.lib -ccc-print-phases %s 2>&1 \ +// RUN: %clang --target=x86_64-pc-windows-msvc -fsycl -fno-sycl-devicelib -foffload-static-lib=%t.lib -ccc-print-phases %s 2>&1 \ // RUN: | FileCheck -DLIB=%t.lib %s -check-prefix=FOFFLOAD_STATIC_LIB_SRC -// RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl -foffload-static-lib=%t.lib -ccc-print-phases %s 2>&1 \ +// RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl -fno-sycl-devicelib -foffload-static-lib=%t.lib -ccc-print-phases %s 2>&1 \ // RUN: | FileCheck -DLIB=%t.lib %s -check-prefix=FOFFLOAD_STATIC_LIB_SRC // FOFFLOAD_STATIC_LIB_SRC: 0: input, "[[INPUTLIB:.+\.lib]]", object, (host-sycl) diff --git a/clang/test/Driver/sycl-offload-with-split.c b/clang/test/Driver/sycl-offload-with-split.c index 2c58196f3a6b9..265bacba1540c 100644 --- a/clang/test/Driver/sycl-offload-with-split.c +++ b/clang/test/Driver/sycl-offload-with-split.c @@ -12,17 +12,17 @@ /// preprocessor and another one joining the device linking outputs to the host /// action. The same graph should be generated when no -fsycl-targets is used /// The same phase graph will be used with -fsycl-use-bitcode -// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fsycl-device-code-split -fsycl-targets=spir64-unknown-unknown-sycldevice %s 2>&1 \ +// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-device-code-split -fsycl-targets=spir64-unknown-unknown-sycldevice %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-PHASES,CHK-PHASES-DEFAULT-MODE %s -// RUN: %clang_cl -ccc-print-phases -fsycl -fsycl-device-code-split=per_source -fsycl-targets=spir64-unknown-unknown-sycldevice %s 2>&1 \ +// RUN: %clang_cl -ccc-print-phases -fsycl -fno-sycl-devicelib -fsycl-device-code-split=per_source -fsycl-targets=spir64-unknown-unknown-sycldevice %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-PHASES,CHK-PHASES-CL-MODE %s -// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fsycl-device-code-split=per_source -fno-sycl-use-bitcode %s 2>&1 \ +// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-device-code-split=per_source -fno-sycl-use-bitcode %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-PHASES,CHK-PHASES-DEFAULT-MODE %s -// RUN: %clang_cl -ccc-print-phases -fsycl -fsycl-device-code-split=per_source -fno-sycl-use-bitcode %s 2>&1 \ +// RUN: %clang_cl -ccc-print-phases -fsycl -fno-sycl-devicelib -fsycl-device-code-split=per_source -fno-sycl-use-bitcode %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-PHASES,CHK-PHASES-CL-MODE %s -// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fsycl-device-code-split=per_source -fsycl-use-bitcode %s 2>&1 \ +// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-device-code-split=per_source -fsycl-use-bitcode %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-PHASES,CHK-PHASES-DEFAULT-MODE %s -// RUN: %clang_cl -ccc-print-phases -fsycl -fsycl-device-code-split=per_source -fsycl-use-bitcode %s 2>&1 \ +// RUN: %clang_cl -ccc-print-phases -fsycl -fno-sycl-devicelib -fsycl-device-code-split=per_source -fsycl-use-bitcode %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-PHASES,CHK-PHASES-CL-MODE %s // CHK-PHASES: 0: input, "[[INPUT:.+\.c]]", c, (host-sycl) // CHK-PHASES: 1: preprocessor, {0}, cpp-output, (host-sycl) @@ -49,7 +49,7 @@ /// Check the phases also add a library to make sure it is treated as input by /// the device. -// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -lsomelib -fsycl -fsycl-device-code-split -fsycl-targets=spir64-unknown-unknown-sycldevice %s 2>&1 \ +// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -lsomelib -fsycl -fno-sycl-devicelib -fsycl-device-code-split -fsycl-targets=spir64-unknown-unknown-sycldevice %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-PHASES-LIB %s // CHK-PHASES-LIB: 0: input, "somelib", object, (host-sycl) // CHK-PHASES-LIB: 1: input, "[[INPUT:.+\.c]]", c, (host-sycl) @@ -75,7 +75,7 @@ /// Check the phases when using and multiple source files // RUN: echo " " > %t.c -// RUN: %clang -ccc-print-phases -lsomelib -target x86_64-unknown-linux-gnu -fsycl -fsycl-device-code-split -fsycl-targets=spir64-unknown-unknown-sycldevice %s %t.c 2>&1 \ +// RUN: %clang -ccc-print-phases -lsomelib -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-device-code-split -fsycl-targets=spir64-unknown-unknown-sycldevice %s %t.c 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-PHASES-FILES %s // CHK-PHASES-FILES: 0: input, "somelib", object, (host-sycl) @@ -112,11 +112,11 @@ /// Check separate compilation with offloading - unbundling actions // RUN: touch %t.o -// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fsycl-device-code-split -o %t.out -lsomelib -fsycl-targets=spir64-unknown-unknown-sycldevice %t.o 2>&1 \ +// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-device-code-split -o %t.out -lsomelib -fsycl-targets=spir64-unknown-unknown-sycldevice %t.o 2>&1 \ // RUN: | FileCheck -DINPUT=%t.o -check-prefix=CHK-UBACTIONS %s // RUN: mkdir -p %t_dir // RUN: touch %t_dir/dummy -// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fsycl-device-code-split -o %t.out -lsomelib -fsycl-targets=spir64-unknown-unknown-sycldevice %t_dir/dummy 2>&1 \ +// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-device-code-split -o %t.out -lsomelib -fsycl-targets=spir64-unknown-unknown-sycldevice %t_dir/dummy 2>&1 \ // RUN: | FileCheck -DINPUT=%t_dir/dummy -check-prefix=CHK-UBACTIONS %s // CHK-UBACTIONS: 0: input, "somelib", object, (host-sycl) // CHK-UBACTIONS: 1: input, "[[INPUT]]", object, (host-sycl) @@ -134,7 +134,7 @@ /// Check separate compilation with offloading - unbundling with source // RUN: touch %t.o -// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -lsomelib -fsycl -fsycl-device-code-split %t.o -fsycl-targets=spir64-unknown-unknown-sycldevice %s 2>&1 \ +// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -lsomelib -fsycl -fno-sycl-devicelib -fsycl-device-code-split %t.o -fsycl-targets=spir64-unknown-unknown-sycldevice %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-UBUACTIONS %s // CHK-UBUACTIONS: 0: input, "somelib", object, (host-sycl) // CHK-UBUACTIONS: 1: input, "[[INPUT1:.+\.o]]", object, (host-sycl) @@ -161,11 +161,11 @@ /// ########################################################################### /// Ahead of Time compilation for fpga, gen, cpu -// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fsycl-device-code-split -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice %s 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fno-sycl-devicelib -fsycl-device-code-split -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice %s 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-FPGA -// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fsycl-device-code-split -fsycl-targets=spir64_gen-unknown-unknown-sycldevice %s 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fno-sycl-devicelib -fsycl-device-code-split -fsycl-targets=spir64_gen-unknown-unknown-sycldevice %s 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-GEN -// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fsycl-device-code-split -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %s 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fno-sycl-devicelib -fsycl-device-code-split -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %s 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-CPU // CHK-PHASES-AOT: 0: input, "[[INPUT:.+\.c]]", c, (host-sycl) // CHK-PHASES-AOT: 1: preprocessor, {0}, cpp-output, (host-sycl) @@ -196,13 +196,13 @@ /// ########################################################################### /// Ahead of Time compilation for fpga, gen, cpu - tool invocation -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-device-code-split -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-device-code-split -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-FPGA -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-device-code-split -fintelfpga %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-device-code-split -fintelfpga %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-FPGA -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-device-code-split -fsycl-targets=spir64_gen-unknown-unknown-sycldevice %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-device-code-split -fsycl-targets=spir64_gen-unknown-unknown-sycldevice %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-GEN -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-device-code-split -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-device-code-split -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-CPU // CHK-TOOLS-AOT: clang{{.*}} "-fsycl-is-device" {{.*}} "-o" "[[OUTPUT1:.+\.bc]]" // CHK-TOOLS-AOT: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2:.+\.bc]]" @@ -226,7 +226,7 @@ /// ########################################################################### /// offload with multiple targets, including AOT -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-device-code-split -fsycl-targets=spir64-unknown-unknown-sycldevice,spir64_fpga-unknown-unknown-sycldevice,spir64_gen-unknown-unknown-sycldevice -### -ccc-print-phases %s 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-device-code-split -fsycl-targets=spir64-unknown-unknown-sycldevice,spir64_fpga-unknown-unknown-sycldevice,spir64_gen-unknown-unknown-sycldevice -### -ccc-print-phases %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-PHASE-MULTI-TARG %s // CHK-PHASE-MULTI-TARG: 0: input, "[[INPUT:.+\.c]]", c, (host-sycl) // CHK-PHASE-MULTI-TARG: 1: preprocessor, {0}, cpp-output, (host-sycl) diff --git a/clang/test/Driver/sycl-offload.c b/clang/test/Driver/sycl-offload.c index 1b29a0d7277a6..eb2c49003985b 100644 --- a/clang/test/Driver/sycl-offload.c +++ b/clang/test/Driver/sycl-offload.c @@ -161,17 +161,17 @@ /// preprocessor and another one joining the device linking outputs to the host /// action. The same graph should be generated when no -fsycl-targets is used /// The same phase graph will be used with -fsycl-use-bitcode -// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice %s 2>&1 \ +// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice -fno-sycl-devicelib %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-PHASES,CHK-PHASES-DEFAULT-MODE %s -// RUN: %clang_cl -ccc-print-phases -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice %s 2>&1 \ +// RUN: %clang_cl -ccc-print-phases -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice -fno-sycl-devicelib %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-PHASES,CHK-PHASES-CL-MODE %s -// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-use-bitcode %s 2>&1 \ +// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-use-bitcode -fno-sycl-devicelib %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-PHASES,CHK-PHASES-DEFAULT-MODE %s -// RUN: %clang_cl -ccc-print-phases -fsycl -fno-sycl-use-bitcode %s 2>&1 \ +// RUN: %clang_cl -ccc-print-phases -fsycl -fno-sycl-use-bitcode -fno-sycl-devicelib %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-PHASES,CHK-PHASES-CL-MODE %s -// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fsycl-use-bitcode %s 2>&1 \ +// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fsycl-use-bitcode -fno-sycl-devicelib %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-PHASES,CHK-PHASES-DEFAULT-MODE %s -// RUN: %clang_cl -ccc-print-phases -fsycl -fsycl-use-bitcode %s 2>&1 \ +// RUN: %clang_cl -ccc-print-phases -fsycl -fsycl-use-bitcode -fno-sycl-devicelib %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-PHASES,CHK-PHASES-CL-MODE %s // CHK-PHASES: 0: input, "[[INPUT:.+\.c]]", c, (host-sycl) // CHK-PHASES: 1: preprocessor, {0}, cpp-output, (host-sycl) @@ -208,7 +208,7 @@ /// Check the phases also add a library to make sure it is treated as input by /// the device. -// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -lsomelib -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice %s 2>&1 \ +// RUN: %clang -ccc-print-phases -target x86_64-unknown-linux-gnu -lsomelib -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice -fno-sycl-devicelib %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-PHASES-LIB %s // CHK-PHASES-LIB: 0: input, "somelib", object, (host-sycl) // CHK-PHASES-LIB: 1: input, "[[INPUT:.+\.c]]", c, (host-sycl) @@ -241,7 +241,7 @@ /// Check the phases when using and multiple source files // RUN: echo " " > %t.c -// RUN: %clang -ccc-print-phases -lsomelib -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice %s %t.c 2>&1 \ +// RUN: %clang -ccc-print-phases -lsomelib -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice -fno-sycl-devicelib %s %t.c 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-PHASES-FILES %s // CHK-PHASES-FILES: 0: input, "somelib", object, (host-sycl) @@ -296,11 +296,11 @@ /// Check separate compilation with offloading - unbundling actions // RUN: touch %t.o -// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -o %t.out -lsomelib -fsycl-targets=spir64-unknown-unknown-sycldevice %t.o 2>&1 \ +// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -o %t.out -lsomelib -fsycl-targets=spir64-unknown-unknown-sycldevice %t.o 2>&1 \ // RUN: | FileCheck -DINPUT=%t.o -check-prefix=CHK-UBACTIONS %s // RUN: mkdir -p %t_dir // RUN: touch %t_dir/dummy -// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -o %t.out -lsomelib -fsycl-targets=spir64-unknown-unknown-sycldevice %t_dir/dummy 2>&1 \ +// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -o %t.out -lsomelib -fsycl-targets=spir64-unknown-unknown-sycldevice %t_dir/dummy 2>&1 \ // RUN: | FileCheck -DINPUT=%t_dir/dummy -check-prefix=CHK-UBACTIONS %s // CHK-UBACTIONS: 0: input, "somelib", object, (host-sycl) // CHK-UBACTIONS: 1: input, "[[INPUT]]", object, (host-sycl) @@ -318,7 +318,7 @@ /// Check separate compilation with offloading - unbundling with source // RUN: touch %t.o -// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -lsomelib -fsycl %t.o -fsycl-targets=spir64-unknown-unknown-sycldevice %s 2>&1 \ +// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -lsomelib -fsycl -fno-sycl-devicelib %t.o -fsycl-targets=spir64-unknown-unknown-sycldevice %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-UBUACTIONS %s // CHK-UBUACTIONS: 0: input, "somelib", object, (host-sycl) // CHK-UBUACTIONS: 1: input, "[[INPUT1:.+\.o]]", object, (host-sycl) @@ -508,7 +508,7 @@ /// Check regular offload with an additional AOT binary passed through -fsycl-add-targets (same triple) -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice -fsycl-add-targets=spir64-unknown-unknown-sycldevice:dummy.spv -ccc-print-phases %s 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-targets=spir64-unknown-unknown-sycldevice -fsycl-add-targets=spir64-unknown-unknown-sycldevice:dummy.spv -ccc-print-phases %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-ADD-TARGETS-REG %s // CHK-ADD-TARGETS-REG: 0: input, "[[INPUT:.+\.c]]", c, (host-sycl) // CHK-ADD-TARGETS-REG: 1: preprocessor, {0}, cpp-output, (host-sycl) @@ -534,7 +534,7 @@ /// ########################################################################### /// Check regular offload with multiple additional AOT binaries passed through -fsycl-add-targets -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice -fsycl-add-targets=spir64_fpga-unknown-unknown-sycldevice:dummy.aocx,spir64_gen-unknown-unknown-sycldevice:dummy_Gen9core.bin,spir64_x86_64-unknown-unknown-sycldevice:dummy.ir -ccc-print-phases %s 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-targets=spir64-unknown-unknown-sycldevice -fsycl-add-targets=spir64_fpga-unknown-unknown-sycldevice:dummy.aocx,spir64_gen-unknown-unknown-sycldevice:dummy_Gen9core.bin,spir64_x86_64-unknown-unknown-sycldevice:dummy.ir -ccc-print-phases %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-ADD-TARGETS-REG-MUL %s // CHK-ADD-TARGETS-REG-MUL: 0: input, "[[INPUT:.+\.c]]", c, (host-sycl) // CHK-ADD-TARGETS-REG-MUL: 1: preprocessor, {0}, cpp-output, (host-sycl) @@ -609,11 +609,11 @@ /// ########################################################################### /// Ahead of Time compilation for fpga, gen, cpu -// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice %s 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fno-sycl-devicelib -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice %s 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-FPGA -// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fsycl-targets=spir64_gen-unknown-unknown-sycldevice %s 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fno-sycl-devicelib -fsycl-targets=spir64_gen-unknown-unknown-sycldevice %s 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-GEN -// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %s 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl -fno-sycl-devicelib -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %s 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-CPU // CHK-PHASES-AOT: 0: input, "[[INPUT:.+\.c]]", c, (host-sycl) // CHK-PHASES-AOT: 1: preprocessor, {0}, cpp-output, (host-sycl) @@ -642,21 +642,21 @@ /// ########################################################################### /// Ahead of Time compilation for fpga, gen, cpu - tool invocation -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice -fno-sycl-devicelib %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-FPGA,CHK-TOOLS-FPGA-USM-DISABLE // RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fintelfpga %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-FPGA,CHK-TOOLS-FPGA-USM-DISABLE -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice -fsycl-enable-usm-address-spaces %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice -fsycl-enable-usm-address-spaces %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-FPGA,CHK-TOOLS-FPGA-USM-ENABLE // RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fintelfpga -fsycl-enable-usm-address-spaces %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-FPGA,CHK-TOOLS-FPGA-USM-ENABLE -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -fsycl-enable-usm-address-spaces %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -fsycl-enable-usm-address-spaces %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-GEN -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -fsycl-enable-usm-address-spaces %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -fsycl-enable-usm-address-spaces %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-CPU -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_gen-unknown-unknown-sycldevice %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-targets=spir64_gen-unknown-unknown-sycldevice %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-GEN -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-CPU // CHK-TOOLS-AOT: clang{{.*}} "-fsycl-is-device" {{.*}} "-o" "[[OUTPUT1:.+\.bc]]" // CHK-TOOLS-AOT: llvm-link{{.*}} "[[OUTPUT1]]" "-o" "[[OUTPUT2:.+\.bc]]" @@ -767,7 +767,7 @@ /// ########################################################################### /// offload with multiple targets, including AOT -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice,spir64_fpga-unknown-unknown-sycldevice,spir64_gen-unknown-unknown-sycldevice -### -ccc-print-phases %s 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-targets=spir64-unknown-unknown-sycldevice,spir64_fpga-unknown-unknown-sycldevice,spir64_gen-unknown-unknown-sycldevice -### -ccc-print-phases %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-PHASE-MULTI-TARG %s // CHK-PHASE-MULTI-TARG: 0: input, "[[INPUT:.+\.c]]", c, (host-sycl) // CHK-PHASE-MULTI-TARG: 1: preprocessor, {0}, cpp-output, (host-sycl) @@ -806,9 +806,9 @@ /// ########################################################################### /// Verify that -save-temps does not crash -// RUN: %clang -fsycl -target x86_64-unknown-linux-gnu -save-temps %s -### 2>&1 -// RUN: %clang -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice -target x86_64-unknown-linux-gnu -save-temps %s -### 2>&1 -// RUN: %clangxx -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice -target x86_64-unknown-linux-gnu -save-temps %s -### 2>&1 \ +// RUN: %clang -fsycl -fno-sycl-devicelib -target x86_64-unknown-linux-gnu -save-temps %s -### 2>&1 +// RUN: %clang -fsycl -fno-sycl-devicelib -fsycl-targets=spir64-unknown-unknown-sycldevice -target x86_64-unknown-linux-gnu -save-temps %s -### 2>&1 +// RUN: %clangxx -fsycl -fno-sycl-devicelib -fsycl-targets=spir64-unknown-unknown-sycldevice -target x86_64-unknown-linux-gnu -save-temps %s -### 2>&1 \ // RUN: | FileCheck %s --check-prefixes=CHK-FSYCL-SAVE-TEMPS,CHK-FSYCL-SAVE-TEMPS-CONFL // CHK-FSYCL-SAVE-TEMPS: clang{{.*}} "-fsycl-is-device"{{.*}} "-o" "[[DEVICE_BASE_NAME:[a-z0-9-]+]].ii" // CHK-FSYCL-SAVE-TEMPS: clang{{.*}} "-fsycl-is-device"{{.*}} "-o" "[[DEVICE_BASE_NAME]].bc"{{.*}} "[[DEVICE_BASE_NAME]].ii" @@ -840,9 +840,9 @@ /// passing of a library should not trigger the unbundler // RUN: touch %t.a // RUN: touch %t.lib -// RUN: %clang -ccc-print-phases -fsycl %t.a %s 2>&1 \ +// RUN: %clang -ccc-print-phases -fsycl -fno-sycl-devicelib %t.a %s 2>&1 \ // RUN: | FileCheck -check-prefix=LIB-UNBUNDLE-CHECK %s -// RUN: %clang_cl -ccc-print-phases -fsycl %t.lib %s 2>&1 \ +// RUN: %clang_cl -ccc-print-phases -fsycl -fno-sycl-devicelib %t.lib %s 2>&1 \ // RUN: | FileCheck -check-prefix=LIB-UNBUNDLE-CHECK %s // LIB-UNBUNDLE-CHECK-NOT: clang-offload-unbundler From 2ccb0f22d9e1e0fef73403b6bac4fd44199a20bb Mon Sep 17 00:00:00 2001 From: gejin Date: Mon, 24 Aug 2020 16:31:00 +0800 Subject: [PATCH 09/15] do dae only when sycl-post-link is not doing dead code removal Signed-off-by: gejin --- clang/lib/Driver/ToolChains/Clang.cpp | 12 ++++++++---- llvm/tools/sycl-post-link/sycl-post-link.cpp | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index c128dff9db57b..8ad65626ee8cf 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -7812,8 +7812,15 @@ void SYCLPostLink::ConstructJob(Compilation &C, const JobAction &JA, // OPT_fsycl_device_code_split is not checked as it is an alias to // -fsycl-device-code-split=per_source + auto *SYCLPostLink = llvm::dyn_cast(&JA); + bool InDeadCodeRemoval = false; + if (SYCLPostLink && SYCLPostLink->getDeadCodeRemoval()) { + addArgs(CmdArgs, TCArgs, {"--dead-code-removal"}); + InDeadCodeRemoval = true; + } + // Turn on Dead Parameter Elimination Optimization with early optimizations - if (!getToolChain().getTriple().isNVPTX() && + if (!getToolChain().getTriple().isNVPTX() && !InDeadCodeRemoval && TCArgs.hasFlag(options::OPT_fsycl_dead_args_optimization, options::OPT_fno_sycl_dead_args_optimization, false)) addArgs(CmdArgs, TCArgs, {"-emit-param-info"}); @@ -7829,14 +7836,11 @@ void SYCLPostLink::ConstructJob(Compilation &C, const JobAction &JA, addArgs(CmdArgs, TCArgs, {"-symbols"}); } // specialization constants processing is mandatory - auto *SYCLPostLink = llvm::dyn_cast(&JA); if (SYCLPostLink && SYCLPostLink->getRTSetsSpecConstants()) addArgs(CmdArgs, TCArgs, {"-spec-const=rt"}); else addArgs(CmdArgs, TCArgs, {"-spec-const=default"}); - if (SYCLPostLink && SYCLPostLink->getDeadCodeRemoval()) - addArgs(CmdArgs, TCArgs, {"--dead-code-removal"}); // Add output file table file option assert(Output.isFilename() && "output must be a filename"); addArgs(CmdArgs, TCArgs, {"-o", Output.getFilename()}); diff --git a/llvm/tools/sycl-post-link/sycl-post-link.cpp b/llvm/tools/sycl-post-link/sycl-post-link.cpp index 63430c4cd9c4a..b55c31fc6b6e5 100644 --- a/llvm/tools/sycl-post-link/sycl-post-link.cpp +++ b/llvm/tools/sycl-post-link/sycl-post-link.cpp @@ -644,7 +644,7 @@ int main(int argc, char **argv) { // any other functionalities such as code split... bool DoSplit = (SplitMode.getNumOccurrences() > 0) && !DeadCodeRemoval; bool DoSpecConst = SpecConstLower.getNumOccurrences() > 0; - bool DoParamInfo = EmitKernelParamInfo.getNumOccurrences() > 0; + bool DoParamInfo = EmitKernelParamInfo.getNumOccurrences() > 0 && !DeadCodeRemoval; if (!DoSplit && !DoSpecConst && !DoSymGen && !DoParamInfo) { errs() << "no actions specified; try --help for usage info\n"; From 1cfa766e6388d524d412e58152e5c78fe158fac1 Mon Sep 17 00:00:00 2001 From: gejin Date: Mon, 24 Aug 2020 16:41:37 +0800 Subject: [PATCH 10/15] fix format issue Signed-off-by: gejin --- llvm/tools/sycl-post-link/sycl-post-link.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/llvm/tools/sycl-post-link/sycl-post-link.cpp b/llvm/tools/sycl-post-link/sycl-post-link.cpp index b55c31fc6b6e5..b348c04dadab9 100644 --- a/llvm/tools/sycl-post-link/sycl-post-link.cpp +++ b/llvm/tools/sycl-post-link/sycl-post-link.cpp @@ -644,7 +644,8 @@ int main(int argc, char **argv) { // any other functionalities such as code split... bool DoSplit = (SplitMode.getNumOccurrences() > 0) && !DeadCodeRemoval; bool DoSpecConst = SpecConstLower.getNumOccurrences() > 0; - bool DoParamInfo = EmitKernelParamInfo.getNumOccurrences() > 0 && !DeadCodeRemoval; + bool DoParamInfo = + EmitKernelParamInfo.getNumOccurrences() > 0 && !DeadCodeRemoval; if (!DoSplit && !DoSpecConst && !DoSymGen && !DoParamInfo) { errs() << "no actions specified; try --help for usage info\n"; From 3afda662d00a3ed4bc2f6afb5dadcccab148f848 Mon Sep 17 00:00:00 2001 From: gejin Date: Mon, 31 Aug 2020 20:45:10 +0800 Subject: [PATCH 11/15] Enable devicelib default link for -fintelfpga Signed-off-by: gejin --- clang/lib/Driver/Driver.cpp | 20 +++++++++---- clang/test/Driver/sycl-offload-intelfpga.cpp | 30 ++++++++++---------- clang/test/Driver/sycl-offload.c | 4 +-- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index a5298cdd120b1..e61b530b0c1fc 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -2713,6 +2713,15 @@ static SmallVector getLinkerArgs(Compilation &C, return LibArgs; } + +static bool IsSYCLDeviceLibObj(std::string ObjFilePath) { + StringRef ObjFileName = llvm::sys::path::filename(ObjFilePath); + bool Ret = (ObjFileName.startswith("libsycl-") && ObjFileName.endswith(".o")) + ? true + : false; + return Ret; +} + // Goes through all of the arguments, including inputs expected for the // linker directly, to determine if we need to perform additional work for // static offload libraries. @@ -3787,7 +3796,10 @@ class OffloadingActionBuilder final { if (IA->getType() == types::TY_Object) { if (!isObjectFile(FileName)) return ABRT_Inactive; - if (Args.hasArg(options::OPT_fintelfpga)) + // For SYCL device libraries, don't need to add them to + // FPGAObjectInputs as there is no fpga dep files inside. + if (Args.hasArg(options::OPT_fintelfpga) && + !IsSYCLDeviceLibObj(FileName)) FPGAObjectInputs.push_back(IA); } // When creating FPGA device fat objects, all host objects are @@ -3990,8 +4002,7 @@ class OffloadingActionBuilder final { } // For SYCL compilation, add SYCL device libraries as default. - if (!isNVPTX && !Args.hasArg(options::OPT_fintelfpga) && - !Args.hasArg(options::OPT_fno_sycl_devicelib)) { + if (!isNVPTX && !Args.hasArg(options::OPT_fno_sycl_devicelib)) { addSYCLDeviceLibs( *TC, LinkObjects, isSpirvAOT, C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment()); @@ -4075,8 +4086,7 @@ class OffloadingActionBuilder final { : types::TY_Tempfiletable; SYCLPostLinkJobAction *PostLinkDCRAction = nullptr; SYCLPostLinkJobAction *PostLinkAction = nullptr; - if (isNVPTX || Args.hasArg(options::OPT_fintelfpga) || - Args.hasArg(options::OPT_fno_sycl_devicelib)) { + if (isNVPTX || Args.hasArg(options::OPT_fno_sycl_devicelib)) { PostLinkAction = C.MakeAction(DeviceLinkAction, PostLinkOutType); } else { diff --git a/clang/test/Driver/sycl-offload-intelfpga.cpp b/clang/test/Driver/sycl-offload-intelfpga.cpp index de589affbc5e7..81ded9b647d17 100644 --- a/clang/test/Driver/sycl-offload-intelfpga.cpp +++ b/clang/test/Driver/sycl-offload-intelfpga.cpp @@ -21,11 +21,11 @@ /// -fintelfpga -fsycl-link tests // RUN: touch %t.o -// RUN: %clangxx -### -target x86_64-unknown-linux-gnu -fsycl -fintelfpga -fsycl-link %t.o -o libfoo.a 2>&1 \ +// RUN: %clangxx -### -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fintelfpga -fsycl-link %t.o -o libfoo.a 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-LINK,CHK-FPGA-EARLY %s -// RUN: %clangxx -### -target x86_64-unknown-linux-gnu -fsycl -fintelfpga -fsycl-link=early %t.o -o libfoo.a 2>&1 \ +// RUN: %clangxx -### -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fintelfpga -fsycl-link=early %t.o -o libfoo.a 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-LINK,CHK-FPGA-EARLY %s -// RUN: %clangxx -### -target x86_64-unknown-linux-gnu -fsycl -fintelfpga -fsycl-link=image %t.o -o libfoo.a 2>&1 \ +// RUN: %clangxx -### -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fintelfpga -fsycl-link=image %t.o -o libfoo.a 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-LINK,CHK-FPGA-IMAGE %s // 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" @@ -50,9 +50,9 @@ /// -fintelfpga -fsycl-link clang-cl specific // RUN: touch %t.obj -// RUN: %clang_cl -### -fsycl -fintelfpga -fsycl-link %t.obj -Folibfoo.lib 2>&1 \ +// RUN: %clang_cl -### -fsycl -fintelfpga -fno-sycl-devicelib -fsycl-link %t.obj -Folibfoo.lib 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-LINK-WIN %s -// RUN: %clang_cl -### -fsycl -fintelfpga -fsycl-link %t.obj -o libfoo.lib 2>&1 \ +// RUN: %clang_cl -### -fsycl -fintelfpga -fno-sycl-devicelib -fsycl-link %t.obj -o libfoo.lib 2>&1 \ // 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-NOT: clang-offload-bundler{{.*}} @@ -185,9 +185,9 @@ /// -fintelfpga -fsycl-link from source // RUN: touch %t.cpp -// RUN: %clangxx -### -target x86_64-unknown-linux-gnu -fsycl -fintelfpga -fsycl-link=early %t.cpp -ccc-print-phases 2>&1 \ +// RUN: %clangxx -### -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fintelfpga -fsycl-link=early %t.cpp -ccc-print-phases 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-LINK-SRC,CHK-FPGA-LINK-SRC-DEFAULT %s -// RUN: %clang_cl -### -target x86_64-unknown-linux-gnu -fsycl -fintelfpga -fsycl-link=early %t.cpp -ccc-print-phases 2>&1 \ +// RUN: %clang_cl -### -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fintelfpga -fsycl-link=early %t.cpp -ccc-print-phases 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-LINK-SRC,CHK-FPGA-LINK-SRC-CL %s // CHK-FPGA-LINK-SRC: 0: input, "[[INPUT:.+\.cpp]]", c++, (host-sycl) // CHK-FPGA-LINK-SRC: 1: preprocessor, {0}, c++-cpp-output, (host-sycl) @@ -275,9 +275,9 @@ /// -fintelfpga dependency file use from object phases test // RUN: touch %t-1.o -// RUN: %clangxx -fsycl -fintelfpga -ccc-print-phases -### %t-1.o 2>&1 \ +// RUN: %clangxx -fsycl -fno-sycl-devicelib -fintelfpga -ccc-print-phases -### %t-1.o 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-FPGA-DEP-FILES-OBJ-PHASES -DINPUT=%t-1.o %s -// RUN: %clang_cl -fsycl -fintelfpga -ccc-print-phases -### %t-1.o 2>&1 \ +// RUN: %clang_cl -fsycl -fno-sycl-devicelib -fintelfpga -ccc-print-phases -### %t-1.o 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-FPGA-DEP-FILES-OBJ-PHASES -DINPUT=%t-1.o %s // CHK-FPGA-DEP-FILES-OBJ-PHASES: 0: input, "[[INPUT]]", object, (host-sycl) // CHK-FPGA-DEP-FILES-OBJ-PHASES: 1: clang-offload-unbundler, {0}, object, (host-sycl) @@ -348,7 +348,7 @@ // RUN: llc -filetype=obj -o %t-aoco_cl.o %t-aoco_cl.bc // RUN: llvm-ar crv %t_aoco.a %t.o %t2.o %t-aoco.o // RUN: llvm-ar crv %t_aoco_cl.a %t.o %t2_cl.o %t-aoco_cl.o -// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fintelfpga -foffload-static-lib=%t_aoco.a %s -### -ccc-print-phases 2>&1 \ +// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fintelfpga -foffload-static-lib=%t_aoco.a %s -### -ccc-print-phases 2>&1 \ // RUN: | FileCheck -check-prefix=CHK-FPGA-AOCO-PHASES %s // CHK-FPGA-AOCO-PHASES: 0: input, "[[INPUTA:.+\.a]]", object, (host-sycl) // CHK-FPGA-AOCO-PHASES: 1: input, "[[INPUTCPP:.+\.cpp]]", c++, (host-sycl) @@ -375,7 +375,7 @@ // CHK-FPGA-AOCO-PHASES: 22: offload, "host-sycl (x86_64-unknown-linux-gnu)" {10}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {21}, image /// FPGA AOCO Windows phases check -// RUN: %clang_cl -fsycl -fintelfpga -foffload-static-lib=%t_aoco_cl.a %s -### -ccc-print-phases 2>&1 \ +// RUN: %clang_cl -fsycl -fno-sycl-devicelib -fintelfpga -foffload-static-lib=%t_aoco_cl.a %s -### -ccc-print-phases 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO-PHASES-WIN %s // CHK-FPGA-AOCO-PHASES-WIN: 0: input, "{{.*}}", object, (host-sycl) // CHK-FPGA-AOCO-PHASES-WIN: 1: input, "[[INPUTSRC:.+\.cpp]]", c++, (host-sycl) @@ -401,13 +401,13 @@ // CHK-FPGA-AOCO-PHASES-WIN: 21: offload, "host-sycl (x86_64-pc-windows-msvc)" {10}, "device-sycl (spir64_fpga-unknown-unknown-sycldevice)" {20}, image /// aoco test, checking tools -// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fintelfpga -foffload-static-lib=%t_aoco.a -### %s 2>&1 \ +// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fintelfpga -foffload-static-lib=%t_aoco.a -### %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO,CHK-FPGA-AOCO-LIN %s -// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fintelfpga %t_aoco.a -### %s 2>&1 \ +// RUN: %clangxx -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fintelfpga %t_aoco.a -### %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO,CHK-FPGA-AOCO-LIN %s -// RUN: %clang_cl -fsycl -fintelfpga -foffload-static-lib=%t_aoco_cl.a -### %s 2>&1 \ +// RUN: %clang_cl -fsycl -fno-sycl-devicelib -fintelfpga -foffload-static-lib=%t_aoco_cl.a -### %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO,CHK-FPGA-AOCO-WIN %s -// RUN: %clang_cl -fsycl -fintelfpga %t_aoco_cl.a -### %s 2>&1 \ +// RUN: %clang_cl -fsycl -fno-sycl-devicelib -fintelfpga %t_aoco_cl.a -### %s 2>&1 \ // RUN: | FileCheck -check-prefixes=CHK-FPGA-AOCO,CHK-FPGA-AOCO-WIN %s // CHK-FPGA-AOCO-LIN: clang-offload-bundler{{.*}} "-type=ao" "-targets=sycl-fpga_aoco-intel-unknown-sycldevice" "-inputs=[[INPUTLIB:.+\.a]]" "-check-section" // CHK-FPGA-AOCO-LIN: clang{{.*}} "-emit-obj" {{.*}} "-o" "[[HOSTOBJ:.+\.o]]" diff --git a/clang/test/Driver/sycl-offload.c b/clang/test/Driver/sycl-offload.c index eb2c49003985b..7859a10160f74 100644 --- a/clang/test/Driver/sycl-offload.c +++ b/clang/test/Driver/sycl-offload.c @@ -644,11 +644,11 @@ /// Ahead of Time compilation for fpga, gen, cpu - tool invocation // RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice -fno-sycl-devicelib %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-FPGA,CHK-TOOLS-FPGA-USM-DISABLE -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fintelfpga %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fintelfpga %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-FPGA,CHK-TOOLS-FPGA-USM-DISABLE // RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice -fsycl-enable-usm-address-spaces %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-FPGA,CHK-TOOLS-FPGA-USM-ENABLE -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fintelfpga -fsycl-enable-usm-address-spaces %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fintelfpga -fsycl-enable-usm-address-spaces %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-FPGA,CHK-TOOLS-FPGA-USM-ENABLE // RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -fsycl-enable-usm-address-spaces %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-GEN From 7689ade3c78c81f099814efeeee02a9cbc20bbb6 Mon Sep 17 00:00:00 2001 From: Ge Jin Date: Mon, 31 Aug 2020 20:51:28 +0800 Subject: [PATCH 12/15] Fix clang format issue Signed-off-by: Ge Jin --- clang/lib/Driver/Driver.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index e61b530b0c1fc..75625ef660590 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -2713,7 +2713,6 @@ static SmallVector getLinkerArgs(Compilation &C, return LibArgs; } - static bool IsSYCLDeviceLibObj(std::string ObjFilePath) { StringRef ObjFileName = llvm::sys::path::filename(ObjFilePath); bool Ret = (ObjFileName.startswith("libsycl-") && ObjFileName.endswith(".o")) From a651c220c7168f40ba4729678a2de5a366db2b66 Mon Sep 17 00:00:00 2001 From: Ge Jin Date: Mon, 31 Aug 2020 22:09:42 +0800 Subject: [PATCH 13/15] add devicelib test for intelfpga Signed-off-by: Ge Jin --- sycl/test/devicelib/complex-fpga.cpp | 15 +++++++++++++++ sycl/test/devicelib/math_fp64_windows_test.cpp | 8 ++++---- sycl/test/devicelib/math_windows_test.cpp | 8 ++++---- 3 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 sycl/test/devicelib/complex-fpga.cpp diff --git a/sycl/test/devicelib/complex-fpga.cpp b/sycl/test/devicelib/complex-fpga.cpp new file mode 100644 index 0000000000000..e8317dc8343b1 --- /dev/null +++ b/sycl/test/devicelib/complex-fpga.cpp @@ -0,0 +1,15 @@ +//==----- accelerator.cpp - AOT compilation for fpga devices using aoc ------==// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===------------------------------------------------------------------------===// + +// REQUIRES: aoc, accelerator + +// RUN: %clangxx -fsycl -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice %S/std_complex_math_test.cpp -o %t.out +// RUN: %ACC_RUN_PLACEHOLDER %t.out + +// RUN: %clangxx -fsycl -fintelfpga %S/std_complex_math_test.cpp -o %t.out +// RUN: %ACC_RUN_PLACEHOLDER %t.out diff --git a/sycl/test/devicelib/math_fp64_windows_test.cpp b/sycl/test/devicelib/math_fp64_windows_test.cpp index 166452819e3f0..ac728ad4bf8b5 100644 --- a/sycl/test/devicelib/math_fp64_windows_test.cpp +++ b/sycl/test/devicelib/math_fp64_windows_test.cpp @@ -1,8 +1,8 @@ // REQUIRES: cpu, windows -// RUN: %clangxx -fsycl %s -o %t.exe -// RUN: env SYCL_DEVICE_TYPE=HOST %t.exe -// RUN: %CPU_RUN_PLACEHOLDER %t.exe -// RUN: %ACC_RUN_PLACEHOLDER %t.exe +// RUN: %clangxx -fsycl %s -o %t.out +// RUN: env SYCL_DEVICE_TYPE=HOST %t.out +// RUN: %CPU_RUN_PLACEHOLDER %t.out +// RUN: %ACC_RUN_PLACEHOLDER %t.out #include "math_utils.hpp" #include #include diff --git a/sycl/test/devicelib/math_windows_test.cpp b/sycl/test/devicelib/math_windows_test.cpp index c217c36506725..964db574beec5 100644 --- a/sycl/test/devicelib/math_windows_test.cpp +++ b/sycl/test/devicelib/math_windows_test.cpp @@ -1,8 +1,8 @@ // REQUIRES: cpu, windows -// RUN: %clangxx -fsycl %s -o %t.exe -// RUN: env SYCL_DEVICE_TYPE=HOST %t.exe -// RUN: %CPU_RUN_PLACEHOLDER %t.exe -// RUN: %ACC_RUN_PLACEHOLDER %t.exe +// RUN: %clangxx -fsycl %s -o %t.out +// RUN: env SYCL_DEVICE_TYPE=HOST %t.out +// RUN: %CPU_RUN_PLACEHOLDER %t.out +// RUN: %ACC_RUN_PLACEHOLDER %t.out #include "math_utils.hpp" #include #include From 13948c689a4230a1e78ffde95a942d42cb9956e7 Mon Sep 17 00:00:00 2001 From: Ge Jin Date: Mon, 31 Aug 2020 22:26:03 +0800 Subject: [PATCH 14/15] fix clang-format issue Signed-off-by: Ge Jin --- sycl/test/devicelib/complex-fpga.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sycl/test/devicelib/complex-fpga.cpp b/sycl/test/devicelib/complex-fpga.cpp index e8317dc8343b1..4d9e4db39e84b 100644 --- a/sycl/test/devicelib/complex-fpga.cpp +++ b/sycl/test/devicelib/complex-fpga.cpp @@ -1,4 +1,4 @@ -//==----- accelerator.cpp - AOT compilation for fpga devices using aoc ------==// +//==----- accelerator.cpp - AOT compilation for fpga devices using aoc ----==// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. From 74e19cc4ff0a0e7a43f3979cafc6bcbe2c84371f Mon Sep 17 00:00:00 2001 From: gejin Date: Mon, 31 Aug 2020 23:32:29 +0800 Subject: [PATCH 15/15] fix wrong option lit test Signed-off-by: gejin --- clang/test/Driver/sycl-offload.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Driver/sycl-offload.c b/clang/test/Driver/sycl-offload.c index 0fa624e4af953..b249c3bb239a7 100644 --- a/clang/test/Driver/sycl-offload.c +++ b/clang/test/Driver/sycl-offload.c @@ -646,7 +646,7 @@ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-FPGA,CHK-TOOLS-FPGA-USM-DISABLE // RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fintelfpga %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-FPGA,CHK-TOOLS-FPGA-USM-DISABLE -// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycldevicelib -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice -Xshardware %s -### 2>&1 \ +// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice -Xshardware %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-FPGA,CHK-TOOLS-FPGA-USM-ENABLE // RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-devicelib -fintelfpga -Xshardware %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefixes=CHK-TOOLS-AOT,CHK-TOOLS-FPGA,CHK-TOOLS-FPGA-USM-ENABLE