Skip to content

Commit

Permalink
Merge branch 'sycl' into llvmspirv_pulldown
Browse files Browse the repository at this point in the history
  • Loading branch information
calebwat committed Jul 1, 2024
2 parents 209ca8e + 2e212e0 commit 2b950a0
Show file tree
Hide file tree
Showing 186 changed files with 4,625 additions and 2,297 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/scorecard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,6 @@ jobs:

# Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@f079b8493333aace61c81488f8bd40919487bd9f # v3.25.7
uses: github/codeql-action/upload-sarif@b611370bb5703a7efb587f9d136a52ea24c5c38c # v3.25.11
with:
sarif_file: results.sarif
3 changes: 2 additions & 1 deletion .github/workflows/sycl-linux-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,8 @@ jobs:
--cmake-opt=-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
--cmake-opt="-DLLVM_INSTALL_UTILS=ON" \
--cmake-opt="-DNATIVECPU_USE_OCK=Off" \
--cmake-opt="-DSYCL_PI_TESTS=OFF"
--cmake-opt="-DSYCL_PI_TESTS=OFF" \
--cmake-opt="-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=SPIRV"
- name: Compile
id: build
run: cmake --build $GITHUB_WORKSPACE/build
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/sycl-nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ jobs:
echo "TAG=$(date +'%Y-%m-%d')-${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT"
fi
- name: Upload binaries
uses: softprops/action-gh-release@69320dbe05506a9a39fc8ae11030b214ec2d1f87
uses: softprops/action-gh-release@a74c6b72af54cfa997e81df42d94703d6313a2d0
with:
files: |
sycl_linux.tar.gz
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/sycl-windows-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ jobs:
--cmake-opt="-DCMAKE_INSTALL_PREFIX=%GITHUB_WORKSPACE%\install" ^
--cmake-opt="-DCMAKE_CXX_COMPILER_LAUNCHER=sccache" ^
--cmake-opt="-DCMAKE_C_COMPILER_LAUNCHER=sccache" ^
--cmake-opt="-DLLVM_INSTALL_UTILS=ON"
--cmake-opt="-DLLVM_INSTALL_UTILS=ON" ^
--cmake-opt="-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=SPIRV"
- name: Build
id: build
shell: bash
Expand Down
4 changes: 4 additions & 0 deletions clang/include/clang/Driver/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -4087,6 +4087,10 @@ def fsycl_libspirv_path_EQ : Joined<["-"], "fsycl-libspirv-path=">,
Visibility<[ClangOption, CLOption, DXCOption, CC1Option]>, HelpText<"Path to libspirv library">;
def fno_sycl_libspirv : Flag<["-"], "fno-sycl-libspirv">, Visibility<[ClangOption, CLOption, DXCOption]>,
HelpText<"Disable check for libspirv">;
def fsycl_use_spirv_backend_for_spirv_gen : Flag<["-"], "fsycl-use-spirv-backend-for-spirv-gen">,
Visibility<[ClangOption, CLOption]>, Flags<[HelpHidden]>, HelpText<"Use the SPIR-V backend for SPIR-V code generation. "
"Has effect only for SPIR-based targets. It is off by default and "
"the SPIR-V LLVM Translator is used for SPIR-V code generation. (experimental)">;
def fsycl_host_compiler_EQ : Joined<["-"], "fsycl-host-compiler=">,
Flags<[NoArgumentUnused]>, Visibility<[ClangOption, CLOption, DXCOption]>,
HelpText<"Specify C++ compiler binary to perform host "
Expand Down
6 changes: 3 additions & 3 deletions clang/lib/CodeGen/CodeGenModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1381,9 +1381,9 @@ void CodeGenModule::Release() {
for (const auto &Type : TypesWithAspects) {
StringRef Name = Type.first;
const RecordDecl *RD = Type.second;
AspectsMD->addOperand(getAspectsMD(Context, TheModule.getContext(),
Name,
RD->getAttr<SYCLUsesAspectsAttr>()));
if (const auto *Attr = RD->getAttr<SYCLUsesAspectsAttr>())
AspectsMD->addOperand(
getAspectsMD(Context, TheModule.getContext(), Name, Attr));
}
}

Expand Down
42 changes: 34 additions & 8 deletions clang/lib/Driver/Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7785,12 +7785,28 @@ Driver::getOffloadArchs(Compilation &C, const llvm::opt::DerivedArgList &Args,
for (auto *Arg : Args) {
// Extract any '--[no-]offload-arch' arguments intended for this toolchain.
std::unique_ptr<llvm::opt::Arg> ExtractedArg = nullptr;
if (Arg->getOption().matches(options::OPT_Xopenmp_target_EQ) &&
ToolChain::getOpenMPTriple(Arg->getValue(0)) == TC->getTriple()) {
Arg->claim();
unsigned Index = Args.getBaseArgs().MakeIndex(Arg->getValue(1));
ExtractedArg = getOpts().ParseOneArg(Args, Index);
Arg = ExtractedArg.get();
if (Kind == Action::OFK_SYCL) {
// For SYCL based offloading, we allow for -Xsycl-target-backend
// and -Xsycl-target-backend=<target> for specifying options.
if (Arg->getOption().matches(options::OPT_Xsycl_backend_EQ) &&
llvm::Triple(Arg->getValue(0)) == TC->getTriple()) {
Arg->claim();
unsigned Index = Args.getBaseArgs().MakeIndex(Arg->getValue(1));
ExtractedArg = getOpts().ParseOneArg(Args, Index);
Arg = ExtractedArg.get();
} else if (Arg->getOption().matches(options::OPT_Xsycl_backend)) {
unsigned Index = Args.getBaseArgs().MakeIndex(Arg->getValue(0));
ExtractedArg = getOpts().ParseOneArg(Args, Index);
Arg = ExtractedArg.get();
}
} else {
if (Arg->getOption().matches(options::OPT_Xopenmp_target_EQ) &&
ToolChain::getOpenMPTriple(Arg->getValue(0)) == TC->getTriple()) {
Arg->claim();
unsigned Index = Args.getBaseArgs().MakeIndex(Arg->getValue(1));
ExtractedArg = getOpts().ParseOneArg(Args, Index);
Arg = ExtractedArg.get();
}
}

// Add or remove the seen architectures in order of appearance. If an
Expand Down Expand Up @@ -7855,8 +7871,18 @@ Driver::getOffloadArchs(Compilation &C, const llvm::opt::DerivedArgList &Args,
Archs.insert(CudaArchToString(CudaArch::HIPDefault));
else if (Kind == Action::OFK_OpenMP)
Archs.insert(StringRef());
else if (Kind == Action::OFK_SYCL)
Archs.insert(StringRef());
else if (Kind == Action::OFK_SYCL) {
// For SYCL offloading, we need to check the triple for NVPTX or AMDGPU.
// The default arch is set for NVPTX if not provided. For AMDGPU, emit
// an error as the user is responsible to set the arch.
if (TC->getTriple().isNVPTX())
Archs.insert(CudaArchToString(CudaArch::SM_50));
else if (TC->getTriple().isAMDGPU())
C.getDriver().Diag(clang::diag::err_drv_sycl_missing_amdgpu_arch)
<< 1 << TC->getTriple().str();
else
Archs.insert(StringRef());
}
} else {
Args.ClaimAllArgs(options::OPT_offload_arch_EQ);
Args.ClaimAllArgs(options::OPT_no_offload_arch_EQ);
Expand Down
69 changes: 59 additions & 10 deletions clang/lib/Driver/ToolChains/Clang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10440,6 +10440,47 @@ void OffloadDeps::ConstructJobMultipleOutputs(Compilation &C,
constructJob(C, JA, Outputs, Inputs, TCArgs, LinkingOutput);
}

// Utility function to gather all arguments for SPIR-V generation using the
// SPIR-V backend. This set of arguments is expected to get updated as we add
// more features/extensions to the SPIR-V backend.
static void getSPIRVBackendOpts(const llvm::opt::ArgList &TCArgs,
ArgStringList &BackendArgs) {
BackendArgs.push_back(TCArgs.MakeArgString("-filetype=obj"));
BackendArgs.push_back(
TCArgs.MakeArgString("-mtriple=spirv64-unknown-unknown"));
// TODO: Optimization level is currently forced to -O0 due to some testing
// issues. Update optimization level after testing issues are resolved.
BackendArgs.push_back(TCArgs.MakeArgString("-O0"));
BackendArgs.push_back(
TCArgs.MakeArgString("--avoid-spirv-capabilities=Shader"));
BackendArgs.push_back(
TCArgs.MakeArgString("--translator-compatibility-mode"));

// TODO: There is some overlap between the lists of extensions in SPIR-V
// backend and SPIR-V Trnaslator). We will try to combine them when SPIR-V
// backdn is ready.
std::string ExtArg("--spirv-ext=");
std::string DefaultExtArg =
"+SPV_EXT_shader_atomic_float_add,+SPV_EXT_shader_atomic_float_min_max"
",+SPV_KHR_no_integer_wrap_decoration,+SPV_KHR_float_controls"
",+SPV_KHR_expect_assume,+SPV_KHR_linkonce_odr";
std::string INTELExtArg = ",+SPV_INTEL_subgroups,+SPV_INTEL_function_pointers"
",+SPV_INTEL_arbitrary_precision_integers"
",+SPV_INTEL_variable_length_array";
ExtArg = ExtArg + DefaultExtArg + INTELExtArg;

// Other args
ExtArg += ",+SPV_INTEL_bfloat16_conversion"
",+SPV_KHR_uniform_group_instructions"
",+SPV_INTEL_optnone"
",+SPV_KHR_subgroup_rotate"
",+SPV_INTEL_usm_storage_classes"
",+SPV_EXT_shader_atomic_float16_add"
",+SPV_KHR_bit_instructions";

BackendArgs.push_back(TCArgs.MakeArgString(ExtArg));
}

// Utility function to gather all llvm-spirv options.
// Not dependent on target triple.
static void getNonTripleBasedSPIRVTransOpts(Compilation &C,
Expand Down Expand Up @@ -10545,6 +10586,7 @@ static void getTripleBasedSPIRVTransOpts(Compilation &C,
}

// Begin SPIRVTranslator
// TODO: Add a unique 'llc' JobAction for SPIR-V backends.
void SPIRVTranslator::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
Expand All @@ -10560,17 +10602,22 @@ void SPIRVTranslator::ConstructJob(Compilation &C, const JobAction &JA,

TranslatorArgs.push_back("-o");
TranslatorArgs.push_back(Output.getFilename());
bool UseSPIRVBackend =
TCArgs.hasArg(options::OPT_fsycl_use_spirv_backend_for_spirv_gen);
if (JA.isDeviceOffloading(Action::OFK_SYCL)) {
const toolchains::SYCLToolChain &TC =
static_cast<const toolchains::SYCLToolChain &>(getToolChain());
getNonTripleBasedSPIRVTransOpts(C, TCArgs, TranslatorArgs);
llvm::Triple Triple = TC.getTriple();
getTripleBasedSPIRVTransOpts(C, TCArgs, Triple, TranslatorArgs);

// Handle -Xspirv-translator
TC.TranslateTargetOpt(
Triple, TCArgs, TranslatorArgs, options::OPT_Xspirv_translator,
options::OPT_Xspirv_translator_EQ, JA.getOffloadingArch());
if (UseSPIRVBackend) {
getSPIRVBackendOpts(TCArgs, TranslatorArgs);
} else {
getNonTripleBasedSPIRVTransOpts(C, TCArgs, TranslatorArgs);
llvm::Triple Triple = TC.getTriple();
getTripleBasedSPIRVTransOpts(C, TCArgs, Triple, TranslatorArgs);
// Handle -Xspirv-translator
TC.TranslateTargetOpt(
Triple, TCArgs, TranslatorArgs, options::OPT_Xspirv_translator,
options::OPT_Xspirv_translator_EQ, JA.getOffloadingArch());
}
}
for (auto I : Inputs) {
std::string Filename(I.getFilename());
Expand All @@ -10585,8 +10632,10 @@ void SPIRVTranslator::ConstructJob(Compilation &C, const JobAction &JA,
TranslatorArgs.push_back(C.getArgs().MakeArgString(Filename));
}

auto Cmd = std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
TCArgs.MakeArgString(getToolChain().GetProgramPath(getShortName())),
auto ToolName = UseSPIRVBackend ? "llc" : getShortName();
auto Cmd = std::make_unique<Command>(
JA, *this, ResponseFileSupport::None(),
TCArgs.MakeArgString(getToolChain().GetProgramPath(ToolName)),
TranslatorArgs, std::nullopt);

if (!ForeachArgs.empty()) {
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Driver/ToolChains/SYCL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1223,7 +1223,7 @@ void SYCL::x86_64::BackendCompiler::ConstructJob(
// Unsupported options for device compilation
// -fcf-protection, -fsanitize, -fprofile-generate, -fprofile-instr-generate
// -ftest-coverage, -fcoverage-mapping, -fcreate-profile, -fprofile-arcs
// -fcs-profile-generate -forder-file-instrumentation
// -fcs-profile-generate -forder-file-instrumentation, --coverage
static std::vector<OptSpecifier> getUnsupportedOpts(void) {
std::vector<OptSpecifier> UnsupportedOpts = {
options::OPT_fsanitize_EQ,
Expand All @@ -1235,6 +1235,7 @@ static std::vector<OptSpecifier> getUnsupportedOpts(void) {
options::OPT_fno_test_coverage,
options::OPT_fcoverage_mapping,
options::OPT_fno_coverage_mapping,
options::OPT_coverage,
options::OPT_fprofile_instr_generate,
options::OPT_fprofile_instr_generate_EQ,
options::OPT_fprofile_arcs,
Expand Down
11 changes: 7 additions & 4 deletions clang/lib/Sema/SemaDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16610,16 +16610,19 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body,
DiscardCleanupsInEvaluationContext();
}

if (FD && ((LangOpts.OpenMP && (LangOpts.OpenMPIsTargetDevice ||
!LangOpts.OMPTargetTriples.empty())) ||
LangOpts.CUDA || LangOpts.SYCLIsDevice)) {
if (!FD)
return dcl;

if ((LangOpts.OpenMP &&
(LangOpts.OpenMPIsTargetDevice || !LangOpts.OMPTargetTriples.empty())) ||
LangOpts.CUDA || LangOpts.SYCLIsDevice) {
auto ES = getEmissionStatus(FD);
if (ES == Sema::FunctionEmissionStatus::Emitted ||
ES == Sema::FunctionEmissionStatus::Unknown)
DeclsToCheckForDeferredDiags.insert(FD);
}

if (FD && !FD->isDeleted())
if (!FD->isDeleted())
checkTypeSupport(FD->getType(), FD->getLocation(), FD);

// Handle free functions.
Expand Down
1 change: 0 additions & 1 deletion clang/lib/Sema/SemaStmtAttr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1025,7 +1025,6 @@ static void CheckForDuplicateAttrs(Sema &S, ArrayRef<const Attr *> Attrs) {
S.Diag((*LastFoundItr)->getLocation(), diag::err_loop_attr_conflict)
<< *FirstItr;
S.Diag((*FirstItr)->getLocation(), diag::note_previous_attribute);
return;
}
}
}
Expand Down
23 changes: 18 additions & 5 deletions clang/test/Driver/sycl-offload-new-driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
// OFFLOAD-NEW-DRIVER: 1: append-footer, {0}, c++, (host-sycl)
// OFFLOAD-NEW-DRIVER: 2: preprocessor, {1}, c++-cpp-output, (host-sycl)
// OFFLOAD-NEW-DRIVER: 3: compiler, {2}, ir, (host-sycl)
// OFFLOAD-NEW-DRIVER: 4: input, "[[INPUT]]", c++, (device-sycl)
// OFFLOAD-NEW-DRIVER: 5: preprocessor, {4}, c++-cpp-output, (device-sycl)
// OFFLOAD-NEW-DRIVER: 6: compiler, {5}, ir, (device-sycl)
// OFFLOAD-NEW-DRIVER: 7: backend, {6}, ir, (device-sycl)
// OFFLOAD-NEW-DRIVER: 8: offload, "device-sycl (nvptx64-nvidia-cuda)" {7}, ir
// OFFLOAD-NEW-DRIVER: 4: input, "[[INPUT]]", c++, (device-sycl, sm_50)
// OFFLOAD-NEW-DRIVER: 5: preprocessor, {4}, c++-cpp-output, (device-sycl, sm_50)
// OFFLOAD-NEW-DRIVER: 6: compiler, {5}, ir, (device-sycl, sm_50)
// OFFLOAD-NEW-DRIVER: 7: backend, {6}, ir, (device-sycl, sm_50)
// OFFLOAD-NEW-DRIVER: 8: offload, "device-sycl (nvptx64-nvidia-cuda:sm_50)" {7}, ir
// OFFLOAD-NEW-DRIVER: 9: input, "[[INPUT]]", c++, (device-sycl)
// OFFLOAD-NEW-DRIVER: 10: preprocessor, {9}, c++-cpp-output, (device-sycl)
// OFFLOAD-NEW-DRIVER: 11: compiler, {10}, ir, (device-sycl)
Expand Down Expand Up @@ -173,3 +173,16 @@
// WRAPPER_OPTIONS_BACKEND_AOT: clang-linker-wrapper{{.*}} "--host-triple=x86_64-unknown-linux-gnu"
// WRAPPER_OPTIONS_BACKEND_AOT-SAME: "--gpu-tool-arg={{.*}}-backend-gpu-opt"
// WRAPPER_OPTIONS_BACKEND_AOT-SAME: "--cpu-tool-arg={{.*}}-backend-cpu-opt"

/// Verify arch settings for nvptx and amdgcn targets
// RUN: %clangxx -fsycl -### -fsycl-targets=amdgcn-amd-gpu -fno-sycl-libspirv \
// RUN: -nocudalib --offload-new-driver \
// RUN: -Xsycl-target-backend=amdgcn-amd-gpu --offload-arch=gfx600 \
// RUN: %s 2>&1 \
// RUN: | FileCheck -check-prefix AMD_ARCH %s
// AMD_ARCH: clang-offload-packager{{.*}} "--image=file={{.*}},triple=amdgcn-amd-gpu,arch=gfx600,kind=sycl,compile-opts=--offload-arch=gfx600"

// RUN: %clangxx -fsycl -### -fsycl-targets=nvptx64-nvidia-cuda \
// RUN: -fno-sycl-libspirv -nocudalib --offload-new-driver %s 2>&1 \
// RUN: | FileCheck -check-prefix NVPTX_DEF_ARCH %s
// NVPTX_DEF_ARCH: clang-offload-packager{{.*}} "--image=file={{.*}},triple=nvptx64-nvidia-cuda,arch=sm_50,kind=sycl"
6 changes: 6 additions & 0 deletions clang/test/Driver/sycl-spirv-backend.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
///
/// Tests for using SPIR-V backend for SYCL offloading
///
// RUN: %clangxx -fsycl -fsycl-use-spirv-backend-for-spirv-gen -### %s 2>&1 | FileCheck %s

// CHECK: llc{{.*}} "-filetype=obj" "-mtriple=spirv64-unknown-unknown" "-O0" "--avoid-spirv-capabilities=Shader" "--translator-compatibility-mode" "--spirv-ext=
8 changes: 8 additions & 0 deletions clang/test/Driver/sycl-unsupported.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@
// RUN: -check-prefixes=UNSUPPORTED_OPT_DIAG,UNSUPPORTED_OPT
// RUN: %clangxx -fsycl -forder-file-instrumentation -### %s 2>&1 \
// RUN: | FileCheck %s -DARCH=spir64 -DOPT=-forder-file-instrumentation
// RUN: %clangxx -fsycl --coverage -### %s 2>&1 \
// RUN: | FileCheck %s -DARCH=spir64 -DOPT=--coverage \
// RUN: -DOPT_CC1=-coverage-notes-file \
// RUN: -check-prefixes=UNSUPPORTED_OPT_DIAG,UNSUPPORTED_OPT
// RUN: %clang_cl -fsycl --coverage -### %s 2>&1 \
// RUN: | FileCheck %s -DARCH=spir64 -DOPT=--coverage \
// RUN: -DOPT_CC1=-coverage-notes-file \
// RUN: -check-prefixes=UNSUPPORTED_OPT_DIAG,UNSUPPORTED_OPT
// Check to make sure our '-fsanitize=address' exception isn't triggered by a
// different option
// RUN: %clangxx -fsycl -fprofile-instr-generate=address -### %s 2>&1 \
Expand Down
Loading

0 comments on commit 2b950a0

Please sign in to comment.