From 9ca82947a96294da91c990d6d8aad41199561650 Mon Sep 17 00:00:00 2001 From: Alexey Sachkov Date: Tue, 1 Sep 2020 13:07:44 +0300 Subject: [PATCH 1/3] [SYCL] Disable SLP Vectorizer in early optimizations --- llvm/lib/Transforms/IPO/PassManagerBuilder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp index 5c32e251588f..ccd469f3938d 100644 --- a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp +++ b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp @@ -799,7 +799,7 @@ void PassManagerBuilder::populateModulePassManager( .needCanonicalLoops(false) .sinkCommonInsts(true))); - if (SLPVectorize) { + if (SLPVectorize && !SYCLOptimizationMode) { MPM.add(createSLPVectorizerPass()); // Vectorize parallel scalar chains. if (OptLevel > 1 && ExtraVectorizerPasses) { MPM.add(createEarlyCSEPass()); From 5367ac3fec5dfb819c0aa23a4d505771be52d75e Mon Sep 17 00:00:00 2001 From: Alexey Sachkov Date: Tue, 1 Sep 2020 14:58:51 +0300 Subject: [PATCH 2/3] [SYCL] Refactoring Moved changes to clang driver, added test --- clang/lib/Driver/ToolChains/Clang.cpp | 9 +++++++++ clang/test/Driver/sycl-device-optimizations.cpp | 11 +++++++++++ llvm/lib/Transforms/IPO/PassManagerBuilder.cpp | 2 +- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 064acb6de4b1..f3981a34d5d2 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -5984,10 +5984,17 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, options::OPT_fno_gnu_inline_asm, true)) CmdArgs.push_back("-fno-gnu-inline-asm"); + bool EnableSYCLEarlyOptimizations = + Args.hasFlag(options::OPT_fsycl_early_optimizations, + options::OPT_fno_sycl_early_optimizations, + Triple.getSubArch() != llvm::Triple::SPIRSubArch_fpga); + // Enable vectorization per default according to the optimization level // selected. For optimization levels that want vectorization we use the alias // option to simplify the hasFlag logic. bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false); + if (UseSYCLTriple && EnableSYCLEarlyOptimizations) + EnableVec = false; // But disable vectorization for SYCL device code OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group : options::OPT_fvectorize; if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption, @@ -5996,6 +6003,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // -fslp-vectorize is enabled based on the optimization level selected. bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true); + if (UseSYCLTriple && EnableSYCLEarlyOptimizations) + EnableSLPVec = false; // But disable vectorization for SYCL device code OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize; if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption, diff --git a/clang/test/Driver/sycl-device-optimizations.cpp b/clang/test/Driver/sycl-device-optimizations.cpp index 71e1f345df65..ee4747c52e28 100644 --- a/clang/test/Driver/sycl-device-optimizations.cpp +++ b/clang/test/Driver/sycl-device-optimizations.cpp @@ -36,3 +36,14 @@ // RUN: | FileCheck -check-prefix=CHECK-DAE %s // CHECK-DAE: clang{{.*}} "-fenable-sycl-dae" // CHECK-DAE: sycl-post-link{{.*}} "-emit-param-info" + +/// Check that vectorizers are disabled by default: +// RUN: %clang -### -fsycl %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-VEC-DEFAULT %s +// CHECK-VEC-DEFAULT-NOT: -vectorize-loops +// CHECK-VEC-DEFAULT-NOT: -vectorize-slp +/// Check that vectorizers can still be enabled manually: +// RUN: %clang -### -fsycl -fvectorize -fslp-vectorize %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-VEC-ENABLE %s +// CHECK-VEC-ENABLE: -vectorize-loops +// CHECK-VEC-ENABLE: -vectorize-slp diff --git a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp index ccd469f3938d..5c32e251588f 100644 --- a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp +++ b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp @@ -799,7 +799,7 @@ void PassManagerBuilder::populateModulePassManager( .needCanonicalLoops(false) .sinkCommonInsts(true))); - if (SLPVectorize && !SYCLOptimizationMode) { + if (SLPVectorize) { MPM.add(createSLPVectorizerPass()); // Vectorize parallel scalar chains. if (OptLevel > 1 && ExtraVectorizerPasses) { MPM.add(createEarlyCSEPass()); From 522528219014f169c05885ec58d85732b69f5a70 Mon Sep 17 00:00:00 2001 From: Alexey Sachkov Date: Thu, 3 Sep 2020 20:05:10 +0300 Subject: [PATCH 3/3] Apply suggestions --- clang/test/Driver/sycl-device-optimizations.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/clang/test/Driver/sycl-device-optimizations.cpp b/clang/test/Driver/sycl-device-optimizations.cpp index ee4747c52e28..7399454a9b3a 100644 --- a/clang/test/Driver/sycl-device-optimizations.cpp +++ b/clang/test/Driver/sycl-device-optimizations.cpp @@ -40,10 +40,9 @@ /// Check that vectorizers are disabled by default: // RUN: %clang -### -fsycl %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHECK-VEC-DEFAULT %s -// CHECK-VEC-DEFAULT-NOT: -vectorize-loops -// CHECK-VEC-DEFAULT-NOT: -vectorize-slp +// CHECK-VEC-DEFAULT-NOT: clang{{.*}} "-fsycl-is-device"{{.*}} "-vectorize-loops" +// CHECK-VEC-DEFAULT-NOT: clang{{.*}} "-fsycl-is-device"{{.*}} "-vectorize-slp" /// Check that vectorizers can still be enabled manually: // RUN: %clang -### -fsycl -fvectorize -fslp-vectorize %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHECK-VEC-ENABLE %s -// CHECK-VEC-ENABLE: -vectorize-loops -// CHECK-VEC-ENABLE: -vectorize-slp +// CHECK-VEC-ENABLE: clang{{.*}} "-fsycl-is-device"{{.*}}"-vectorize-loops"{{.*}}"-vectorize-slp"