diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 457d2455fadd3..8a0bd9825b9d6 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3815,11 +3815,11 @@ def fsycl_device_only : Flag<["-"], "fsycl-device-only">, Visibility<[ClangOptio def fsycl_embed_ir : Flag<["-"], "fsycl-embed-ir">, Visibility<[ClangOption, CLOption, DXCOption]>, HelpText<"Embed LLVM IR for runtime kernel fusion">; defm sycl_esimd_force_stateless_mem : BoolFOption<"sycl-esimd-force-stateless-mem", - LangOpts<"SYCLESIMDForceStatelessMem">, DefaultFalse, + LangOpts<"SYCLESIMDForceStatelessMem">, DefaultTrue, PosFlag, - NegFlag, + "Enabled by default.">, + NegFlag, BothFlags<[], [ClangOption, CLOption, DXCOption, CC1Option], "">>; // TODO: Remove this option once ESIMD headers are updated to // guard vectors to be device only. diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 4374ca07506b6..db4d58783b97b 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -5396,6 +5396,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, options::OPT_fno_sycl_unnamed_lambda, true)) CmdArgs.push_back("-fno-sycl-unnamed-lambda"); + if (!Args.hasFlag(options::OPT_fsycl_esimd_force_stateless_mem, + options::OPT_fno_sycl_esimd_force_stateless_mem, true)) + CmdArgs.push_back("-fno-sycl-esimd-force-stateless-mem"); + // Add the Unique ID prefix StringRef UniqueID = D.getSYCLUniqueID(Input.getBaseInput()); if (!UniqueID.empty()) @@ -5502,9 +5506,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (Args.hasArg(options::OPT_fno_sycl_esimd_build_host_code)) CmdArgs.push_back("-fno-sycl-esimd-build-host-code"); } - if (Args.hasFlag(options::OPT_fsycl_esimd_force_stateless_mem, - options::OPT_fno_sycl_esimd_force_stateless_mem, false)) - CmdArgs.push_back("-fsycl-esimd-force-stateless-mem"); const auto DeviceTraitsMacrosArgs = D.getDeviceTraitsMacrosArgs(); for (const auto &Arg : DeviceTraitsMacrosArgs) { @@ -10425,9 +10426,9 @@ void SYCLPostLink::ConstructJob(Compilation &C, const JobAction &JA, addArgs(CmdArgs, TCArgs, {"-device-globals"}); // Make ESIMD accessors use stateless memory accesses. - if (TCArgs.hasFlag(options::OPT_fsycl_esimd_force_stateless_mem, - options::OPT_fno_sycl_esimd_force_stateless_mem, false)) - addArgs(CmdArgs, TCArgs, {"-lower-esimd-force-stateless-mem"}); + if (TCArgs.hasFlag(options::OPT_fno_sycl_esimd_force_stateless_mem, + options::OPT_fsycl_esimd_force_stateless_mem, false)) + addArgs(CmdArgs, TCArgs, {"-lower-esimd-force-stateless-mem=false"}); // Add output file table file option assert(Output.isFilename() && "output must be a filename"); diff --git a/clang/test/Driver/sycl-esimd-force-stateless-mem.cpp b/clang/test/Driver/sycl-esimd-force-stateless-mem.cpp index 90e506a86f53c..df34824038551 100644 --- a/clang/test/Driver/sycl-esimd-force-stateless-mem.cpp +++ b/clang/test/Driver/sycl-esimd-force-stateless-mem.cpp @@ -1,14 +1,17 @@ /// Verify that the driver option is translated to corresponding options /// to host/device compilation and sycl-post-link. -// RUN: %clang -### -fsycl -fsycl-esimd-force-stateless-mem \ -// RUN: %s 2>&1 | FileCheck -check-prefix=CHECK-PASS-TO-COMPS %s -// CHECK-PASS-TO-COMPS: clang{{.*}} "-fsycl-esimd-force-stateless-mem" -// CHECK-PASS-TO-COMPS: sycl-post-link{{.*}} "-lower-esimd-force-stateless-mem" -// CHECK-PASS-TO-COMPS: clang{{.*}} "-fsycl-is-host" {{.*}}"-fsycl-esimd-force-stateless-mem" -" -/// Verify that stateless memory accesses mapping is not enforced by default +// Case1: Check that the enforcing is turned on by default. +// Actually, only sycl-post-link gets an additional flag in this case. // RUN: %clang -### -fsycl %s 2>&1 | FileCheck -check-prefix=CHECK-DEFAULT %s -// CHECK-DEFAULT-NOT: clang{{.*}} "-fsycl-esimd-force-stateless-mem" +// CHECK-DEFAULT-NOT: clang{{.*}} "sycl-esimd-force-stateless-mem" // CHECK-DEFAULT-NOT: sycl-post-link{{.*}} "-lower-esimd-force-stateless-mem" +// CHECK-DEFAULT-NOT: clang{{.*}} "-fsycl-is-host" {{.*}}"sycl-esimd-force-stateless-mem" + +// Case2: Check that -fno-sycl-esimd-force-stateless-mem is handled correctly - +// i.e. sycl-post-link gets nothing and clang gets corresponding -fno... option. +// RUN: %clang -### -fsycl -fno-sycl-esimd-force-stateless-mem %s 2>&1 | FileCheck -check-prefix=CHECK-NEG %s +// CHECK-NEG: clang{{.*}} "-fno-sycl-esimd-force-stateless-mem" +// CHECK-NEG: sycl-post-link{{.*}} "-lower-esimd-force-stateless-mem=false" +// CHECK-NEG-NOT: clang{{.*}} "-fsycl-is-host" {{.*}}"sycl-esimd-force-stateless-mem" diff --git a/clang/test/Preprocessor/sycl-esimd-force-stateless-mem.cpp b/clang/test/Preprocessor/sycl-esimd-force-stateless-mem.cpp index 61dcfb25f6e7d..d8db457c50762 100644 --- a/clang/test/Preprocessor/sycl-esimd-force-stateless-mem.cpp +++ b/clang/test/Preprocessor/sycl-esimd-force-stateless-mem.cpp @@ -1,11 +1,13 @@ /// This test checks that the macro __ESIMD_FORCE_STATELESS_MEM is automatically -/// defined only if the option -fsycl-esimd-force-stateless-mem is used. +/// defined by default with -fsycl-is-device or -fsycl-is-host. // RUN: %clang_cc1 %s -fsycl-is-device -fsycl-esimd-force-stateless-mem -E -dM | FileCheck --check-prefix=CHECK-OPT %s +// RUN: %clang_cc1 %s -fsycl-is-device -E -dM | FileCheck --check-prefix=CHECK-OPT %s +// RUN: %clang_cc1 %s -fsycl-is-host -E -dM | FileCheck --check-prefix=CHECK-OPT %s // RUN: %clang_cc1 %s -E -dM | FileCheck --check-prefix=CHECK-NOOPT %s -// RUN: %clang_cc1 %s -fsycl-is-device -E -dM | FileCheck --check-prefix=CHECK-NOOPT %s -// RUN: %clang_cc1 %s -fsycl-is-host -E -dM | FileCheck --check-prefix=CHECK-NOOPT %s +// RUN: %clang_cc1 %s -fsycl-is-device -fno-sycl-esimd-force-stateless-mem -E -dM | FileCheck --check-prefix=CHECK-NOOPT %s +// RUN: %clang_cc1 %s -fsycl-is-host -fno-sycl-esimd-force-stateless-mem -E -dM | FileCheck --check-prefix=CHECK-NOOPT %s // CHECK-OPT:#define __ESIMD_FORCE_STATELESS_MEM 1 // CHECK-NOOPT-NOT:#define __ESIMD_FORCE_STATELESS_MEM 1 diff --git a/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMD.cpp b/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMD.cpp index 6ec1102f402ba..0f9649cf9a94b 100644 --- a/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMD.cpp +++ b/llvm/lib/SYCLLowerIR/ESIMD/LowerESIMD.cpp @@ -58,7 +58,7 @@ using namespace llvm::esimd; cl::opt ForceStatelessMem( "lower-esimd-force-stateless-mem", llvm::cl::Optional, llvm::cl::Hidden, llvm::cl::desc("Use stateless API for accessor based API."), - llvm::cl::init(false)); + llvm::cl::init(true)); namespace { SmallPtrSet collectGenXVolatileTypes(Module &); diff --git a/sycl/test/esimd/lsc.cpp b/sycl/test/esimd/lsc.cpp index 5f4028715950c..10b6d331e03e7 100644 --- a/sycl/test/esimd/lsc.cpp +++ b/sycl/test/esimd/lsc.cpp @@ -1,9 +1,9 @@ // RUN: %clangxx -O0 -fsycl -fno-sycl-esimd-force-stateless-mem -fsycl-device-only -Xclang -emit-llvm %s -o %t -// RUN: sycl-post-link -split-esimd -lower-esimd -O0 -S %t -o %t.table +// RUN: sycl-post-link -split-esimd -lower-esimd -lower-esimd-force-stateless-mem=false -O0 -S %t -o %t.table // RUN: FileCheck %s -input-file=%t_esimd_0.ll --check-prefixes=CHECK,CHECK-STATEFUL // RUN: %clangxx -O0 -fsycl -fsycl-esimd-force-stateless-mem -fsycl-device-only -Xclang -emit-llvm %s -o %t -// RUN: sycl-post-link -split-esimd -lower-esimd -lower-esimd-force-stateless-mem -O0 -S %t -o %t.table +// RUN: sycl-post-link -split-esimd -lower-esimd -O0 -S %t -o %t.table // RUN: FileCheck %s -input-file=%t_esimd_0.ll --check-prefixes=CHECK,CHECK-STATELESS // Checks ESIMD intrinsic translation.