From 77889e2c2592e5f1f948ad04af39d6c10896f031 Mon Sep 17 00:00:00 2001 From: Alexey Bader Date: Thu, 6 Aug 2020 18:19:29 +0300 Subject: [PATCH 1/2] [SYCL] Disable createIndVarSimplifyPass in SYCL mode. --- clang/lib/Driver/ToolChains/Clang.cpp | 4 ++++ llvm/lib/Transforms/IPO/PassManagerBuilder.cpp | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index c47bf377f0ad5..0fe0a6e65d76a 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4106,6 +4106,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (!Args.hasFlag(options::OPT_fsycl_std_optimizations, options::OPT_fno_sycl_std_optimizations, true)) CmdArgs.push_back("-fno-sycl-std-optimizations"); + else { + CmdArgs.push_back("-mllvm"); + CmdArgs.push_back("-sycl-opt"); + } // Pass the triple of host when doing SYCL auto AuxT = llvm::Triple(llvm::sys::getProcessTriple()); diff --git a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp index 0062532e25dad..229b0f1783ae2 100644 --- a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp +++ b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp @@ -68,6 +68,11 @@ static cl::opt RunLoopRerolling("reroll-loops", cl::Hidden, cl::desc("Run the loop rerolling pass")); +// TODO: pass -fsycl-std-optimizations option value though CodeGen options. +static cl::opt + SYCLOptimizationMode("sycl-opt", cl::init(false), cl::Hidden, + cl::desc("Enable SYCL optimization mode.")); + static cl::opt RunNewGVN("enable-newgvn", cl::init(false), cl::Hidden, cl::desc("Run the NewGVN pass")); @@ -429,7 +434,12 @@ void PassManagerBuilder::addFunctionSimplificationPasses( MPM.add(createCFGSimplificationPass()); MPM.add(createInstructionCombiningPass()); // We resume loop passes creating a second loop pipeline here. - MPM.add(createIndVarSimplifyPass()); // Canonicalize indvars + // TODO: this pass hurts performance due to promotions of induction variables + // from 32-bit value to 64-bit values. I assume it's because SPIR is a virtual + // target with unlimited # of registers and pass doesn't take into account + // that on real HW this promotion is not beneficial. + if (!SYCLOptimizationMode) + MPM.add(createIndVarSimplifyPass()); // Canonicalize indvars MPM.add(createLoopIdiomPass()); // Recognize idioms like memset. addExtensionsToPM(EP_LateLoopOptimizations, MPM); MPM.add(createLoopDeletionPass()); // Delete dead loops From 64c72df99c8cf9963357afa47840582087b66765 Mon Sep 17 00:00:00 2001 From: Alexey Bader Date: Fri, 7 Aug 2020 15:17:26 +0300 Subject: [PATCH 2/2] Configure pass manager for SPIR target --- clang/lib/Driver/ToolChains/Clang.cpp | 3 ++- llvm/lib/Transforms/IPO/PassManagerBuilder.cpp | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 0fe0a6e65d76a..2793f6bc30341 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4106,7 +4106,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (!Args.hasFlag(options::OPT_fsycl_std_optimizations, options::OPT_fno_sycl_std_optimizations, true)) CmdArgs.push_back("-fno-sycl-std-optimizations"); - else { + else if (RawTriple.isSPIR()) { + // Set `sycl-opt` option to configure LLVM passes for SPIR target CmdArgs.push_back("-mllvm"); CmdArgs.push_back("-sycl-opt"); } diff --git a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp index 229b0f1783ae2..bd67026106d07 100644 --- a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp +++ b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp @@ -68,7 +68,6 @@ static cl::opt RunLoopRerolling("reroll-loops", cl::Hidden, cl::desc("Run the loop rerolling pass")); -// TODO: pass -fsycl-std-optimizations option value though CodeGen options. static cl::opt SYCLOptimizationMode("sycl-opt", cl::init(false), cl::Hidden, cl::desc("Enable SYCL optimization mode."));