diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 064acb6de4b17..f3981a34d5d2e 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 71e1f345df652..7399454a9b3ad 100644 --- a/clang/test/Driver/sycl-device-optimizations.cpp +++ b/clang/test/Driver/sycl-device-optimizations.cpp @@ -36,3 +36,13 @@ // 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: 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: clang{{.*}} "-fsycl-is-device"{{.*}}"-vectorize-loops"{{.*}}"-vectorize-slp"