From 2effeffa0a925c8bb5fcdc7ce62d1af9078fb0c9 Mon Sep 17 00:00:00 2001 From: Alexey Bader Date: Tue, 25 Aug 2020 12:46:54 +0300 Subject: [PATCH 1/3] [SYCL] Assume SYCL device functions are convergent SYCL device compiler (similar to other SPMD compilers) assumes that functions are convergent by default to avoid invalid transformations. This attribute can be removed if compiler can prove that function does not have convergent operations. --- clang/lib/Frontend/CompilerInvocation.cpp | 3 ++- clang/test/CodeGenSYCL/convergent.cpp | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 clang/test/CodeGenSYCL/convergent.cpp diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 1a8ebbaea126e..d8a1c5189627e 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -2885,7 +2885,8 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, Opts.Coroutines = Opts.CPlusPlus20 || Args.hasArg(OPT_fcoroutines_ts); Opts.ConvergentFunctions = Opts.OpenCL || (Opts.CUDA && Opts.CUDAIsDevice) || - Args.hasArg(OPT_fconvergent_functions); + (Opts.SYCL && Opts.SYCLIsDevice) || + Args.hasArg(OPT_fconvergent_functions); Opts.DoubleSquareBracketAttributes = Args.hasFlag(OPT_fdouble_square_bracket_attributes, diff --git a/clang/test/CodeGenSYCL/convergent.cpp b/clang/test/CodeGenSYCL/convergent.cpp new file mode 100644 index 0000000000000..0576f10f06068 --- /dev/null +++ b/clang/test/CodeGenSYCL/convergent.cpp @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -fsycl -fsycl-is-device -emit-llvm -disable-llvm-passes \ +// RUN: -triple spir64-unknown-unknown-sycldevice -emit-llvm %s -o - | \ +// RUN: FileCheck %s + +// CHECK-DAG: Function Attrs: +// CHECK-DAG-SAME: convergent +// CHECK-DAG-NEXT: define void @_Z3foov +void foo() { + int a = 1; +} + +template +__attribute__((sycl_kernel)) void kernel_single_task(const Func &kernelFunc) { + kernelFunc(); +} + +int main() { + kernel_single_task([]() { foo(); }); + return 0; +} From 4e4ae07461367ea8ab3095a114e55a72aa42a7ed Mon Sep 17 00:00:00 2001 From: Alexey Bader Date: Tue, 25 Aug 2020 14:21:05 +0300 Subject: [PATCH 2/3] Update clang/test/CodeGenSYCL/convergent.cpp Co-authored-by: Mariya Podchishchaeva --- clang/test/CodeGenSYCL/convergent.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/CodeGenSYCL/convergent.cpp b/clang/test/CodeGenSYCL/convergent.cpp index 0576f10f06068..79514773dddc0 100644 --- a/clang/test/CodeGenSYCL/convergent.cpp +++ b/clang/test/CodeGenSYCL/convergent.cpp @@ -9,7 +9,7 @@ void foo() { int a = 1; } -template +template __attribute__((sycl_kernel)) void kernel_single_task(const Func &kernelFunc) { kernelFunc(); } From 7fe05f4d9ec97c9502f1c494c221f050214d64ec Mon Sep 17 00:00:00 2001 From: Alexey Bader Date: Tue, 25 Aug 2020 14:26:28 +0300 Subject: [PATCH 3/3] Apply code review suggestion. --- clang/lib/Frontend/CompilerInvocation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index d8a1c5189627e..09ded29f9367b 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -2885,7 +2885,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, Opts.Coroutines = Opts.CPlusPlus20 || Args.hasArg(OPT_fcoroutines_ts); Opts.ConvergentFunctions = Opts.OpenCL || (Opts.CUDA && Opts.CUDAIsDevice) || - (Opts.SYCL && Opts.SYCLIsDevice) || + Opts.SYCLIsDevice || Args.hasArg(OPT_fconvergent_functions); Opts.DoubleSquareBracketAttributes =