Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ESIMD] Enable -fsycl-esimd-force-stateless-mem by default #9452

Merged
6 changes: 3 additions & 3 deletions clang/include/clang/Driver/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -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<SetTrue, [], [ClangOption], "Enforce using stateless memory accesses. "
"Convert stateful accesses via SYCL accessors to stateless within ESIMD kernels. "
"Disabled by default. (experimental)">,
NegFlag<SetFalse, [], [ClangOption], "Do not enforce using stateless memory accesses. (experimental)">,
"Enabled by default.">,
NegFlag<SetFalse, [], [ClangOption], "Do not enforce using stateless memory accesses.">,
BothFlags<[], [ClangOption, CLOption, DXCOption, CC1Option], "">>;
// TODO: Remove this option once ESIMD headers are updated to
// guard vectors to be device only.
Expand Down
13 changes: 7 additions & 6 deletions clang/lib/Driver/ToolChains/Clang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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");
Expand Down
19 changes: 11 additions & 8 deletions clang/test/Driver/sycl-esimd-force-stateless-mem.cpp
Original file line number Diff line number Diff line change
@@ -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"
8 changes: 5 additions & 3 deletions clang/test/Preprocessor/sycl-esimd-force-stateless-mem.cpp
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion llvm/lib/SYCLLowerIR/ESIMD/LowerESIMD.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ using namespace llvm::esimd;
cl::opt<bool> 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<Type *, 4> collectGenXVolatileTypes(Module &);
Expand Down
4 changes: 2 additions & 2 deletions sycl/test/esimd/lsc.cpp
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
Loading