summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Grosser <tobias@grosser.es>2016-07-13 15:54:58 +0000
committerTobias Grosser <tobias@grosser.es>2016-07-13 15:54:58 +0000
commit9dfe4e7c0552c5cb2d1218efde271617a69c3827 (patch)
tree34c34bb394ac2621bfa8cb32ad9d1b93f4d0157e
parenta041239bb7d38cf95493a31cf30e320798357cbb (diff)
downloadbcm5719-llvm-9dfe4e7c0552c5cb2d1218efde271617a69c3827.tar.gz
bcm5719-llvm-9dfe4e7c0552c5cb2d1218efde271617a69c3827.zip
Add accelerator code generation pass skeleton
Add a new pass to serve as basis for automatic accelerator mapping in Polly. The pass structure and the analyses preserved are copied from CodeGeneration.cpp, as we will rely on IslNodeBuilder and IslExprBuilder for LLVM-IR code generation. Polly's accelerator code generation is enabled with -polly-target=gpu I would like to use this commit as opportunity to thank Yabin Hu for his work in the context of two Google summer of code projects during which he implemented initial prototypes of the Polly accelerator code generation -- in parts this code is already available in todays Polly (e.g., tools/GPURuntime). More will come as part of the upcoming Polly ACC changes. Reviewers: Meinersbur Subscribers: pollydev, llvm-commits Differential Revision: http://reviews.llvm.org/D22036 llvm-svn: 275275
-rw-r--r--polly/include/polly/LinkAllPasses.h3
-rw-r--r--polly/lib/CMakeLists.txt4
-rw-r--r--polly/lib/CodeGen/PPCGCodeGeneration.cpp82
-rw-r--r--polly/lib/Support/RegisterPasses.cpp43
4 files changed, 118 insertions, 14 deletions
diff --git a/polly/include/polly/LinkAllPasses.h b/polly/include/polly/LinkAllPasses.h
index b5fed125d26..6f92fe098b7 100644
--- a/polly/include/polly/LinkAllPasses.h
+++ b/polly/include/polly/LinkAllPasses.h
@@ -42,6 +42,7 @@ llvm::Pass *createScopInfoRegionPassPass();
llvm::Pass *createScopInfoWrapperPassPass();
llvm::Pass *createIslAstInfoPass();
llvm::Pass *createCodeGenerationPass();
+llvm::Pass *createPPCGCodeGenerationPass();
llvm::Pass *createIslScheduleOptimizerPass();
extern char &CodePreparationID;
@@ -71,6 +72,7 @@ struct PollyForcePassLinking {
polly::createPollyCanonicalizePass();
polly::createIslAstInfoPass();
polly::createCodeGenerationPass();
+ polly::createPPCGCodeGenerationPass();
polly::createIslScheduleOptimizerPass();
}
} PollyForcePassLinking; // Force link by creating a global definition.
@@ -84,6 +86,7 @@ void initializeJSONExporterPass(llvm::PassRegistry &);
void initializeJSONImporterPass(llvm::PassRegistry &);
void initializeIslAstInfoPass(llvm::PassRegistry &);
void initializeCodeGenerationPass(llvm::PassRegistry &);
+void initializePPCGCodeGenerationPass(llvm::PassRegistry &);
void initializeIslScheduleOptimizerPass(llvm::PassRegistry &);
void initializePollyCanonicalizePass(llvm::PassRegistry &);
} // namespace llvm
diff --git a/polly/lib/CMakeLists.txt b/polly/lib/CMakeLists.txt
index ac4dee29159..26f0d8db371 100644
--- a/polly/lib/CMakeLists.txt
+++ b/polly/lib/CMakeLists.txt
@@ -13,7 +13,9 @@ set(ISL_CODEGEN_FILES
CodeGen/CodeGeneration.cpp)
if (GPU_CODEGEN)
- set (GPGPU_CODEGEN_FILES)
+ set (GPGPU_CODEGEN_FILES
+ CodeGen/PPCGCodeGeneration.cpp
+ )
endif (GPU_CODEGEN)
# Compile ISL into a separate library.
diff --git a/polly/lib/CodeGen/PPCGCodeGeneration.cpp b/polly/lib/CodeGen/PPCGCodeGeneration.cpp
new file mode 100644
index 00000000000..8fa3b7a2843
--- /dev/null
+++ b/polly/lib/CodeGen/PPCGCodeGeneration.cpp
@@ -0,0 +1,82 @@
+//===------ PPCGCodeGeneration.cpp - Polly Accelerator Code Generation. ---===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Take a scop created by ScopInfo and map it to GPU code using the ppcg
+// GPU mapping strategy.
+//
+//===----------------------------------------------------------------------===//
+
+#include "polly/CodeGen/IslNodeBuilder.h"
+#include "polly/DependenceInfo.h"
+#include "polly/LinkAllPasses.h"
+#include "polly/ScopInfo.h"
+#include "llvm/Analysis/AliasAnalysis.h"
+#include "llvm/Analysis/BasicAliasAnalysis.h"
+#include "llvm/Analysis/GlobalsModRef.h"
+#include "llvm/Analysis/PostDominators.h"
+#include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
+
+#include "llvm/Support/Debug.h"
+
+using namespace polly;
+using namespace llvm;
+
+#define DEBUG_TYPE "polly-codegen-ppcg"
+
+namespace {
+class PPCGCodeGeneration : public ScopPass {
+public:
+ static char ID;
+
+ PPCGCodeGeneration() : ScopPass(ID) {}
+
+ bool runOnScop(Scop &S) override { return true; }
+
+ void printScop(raw_ostream &, Scop &) const override {}
+
+ void getAnalysisUsage(AnalysisUsage &AU) const override {
+ AU.addRequired<DominatorTreeWrapperPass>();
+ AU.addRequired<RegionInfoPass>();
+ AU.addRequired<ScalarEvolutionWrapperPass>();
+ AU.addRequired<ScopDetection>();
+ AU.addRequired<ScopInfoRegionPass>();
+ AU.addRequired<LoopInfoWrapperPass>();
+
+ AU.addPreserved<AAResultsWrapperPass>();
+ AU.addPreserved<BasicAAWrapperPass>();
+ AU.addPreserved<LoopInfoWrapperPass>();
+ AU.addPreserved<DominatorTreeWrapperPass>();
+ AU.addPreserved<GlobalsAAWrapperPass>();
+ AU.addPreserved<PostDominatorTreeWrapperPass>();
+ AU.addPreserved<ScopDetection>();
+ AU.addPreserved<ScalarEvolutionWrapperPass>();
+ AU.addPreserved<SCEVAAWrapperPass>();
+
+ // FIXME: We do not yet add regions for the newly generated code to the
+ // region tree.
+ AU.addPreserved<RegionInfoPass>();
+ AU.addPreserved<ScopInfoRegionPass>();
+ }
+};
+}
+
+char PPCGCodeGeneration::ID = 1;
+
+Pass *polly::createPPCGCodeGenerationPass() { return new PPCGCodeGeneration(); }
+
+INITIALIZE_PASS_BEGIN(PPCGCodeGeneration, "polly-codegen-ppcg",
+ "Polly - Apply PPCG translation to SCOP", false, false)
+INITIALIZE_PASS_DEPENDENCY(DependenceInfo);
+INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass);
+INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass);
+INITIALIZE_PASS_DEPENDENCY(RegionInfoPass);
+INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass);
+INITIALIZE_PASS_DEPENDENCY(ScopDetection);
+INITIALIZE_PASS_END(PPCGCodeGeneration, "polly-codegen-ppcg",
+ "Polly - Apply PPCG translation to SCOP", false, false)
diff --git a/polly/lib/Support/RegisterPasses.cpp b/polly/lib/Support/RegisterPasses.cpp
index 9d3dee8f7b3..94ef4fc486e 100644
--- a/polly/lib/Support/RegisterPasses.cpp
+++ b/polly/lib/Support/RegisterPasses.cpp
@@ -86,6 +86,14 @@ static cl::opt<CodeGenChoice> CodeGenerator(
clEnumValEnd),
cl::Hidden, cl::init(CODEGEN_ISL), cl::ZeroOrMore, cl::cat(PollyCategory));
+enum TargetChoice { TARGET_CPU, TARGET_GPU };
+static cl::opt<TargetChoice>
+ Target("polly-target", cl::desc("The hardware to target"),
+ cl::values(clEnumValN(TARGET_CPU, "cpu", "generate CPU code"),
+ clEnumValN(TARGET_GPU, "gpu", "generate GPU code"),
+ clEnumValEnd),
+ cl::init(TARGET_CPU), cl::ZeroOrMore, cl::cat(PollyCategory));
+
VectorizerChoice polly::PollyVectorizerChoice;
static cl::opt<polly::VectorizerChoice, true> Vectorizer(
"polly-vectorizer", cl::desc("Select the vectorization strategy"),
@@ -145,6 +153,7 @@ static cl::opt<bool>
namespace polly {
void initializePollyPasses(PassRegistry &Registry) {
initializeCodeGenerationPass(Registry);
+ initializePPCGCodeGenerationPass(Registry);
initializeCodePreparationPass(Registry);
initializeDeadCodeElimPass(Registry);
initializeDependenceInfoPass(Registry);
@@ -209,24 +218,32 @@ void registerPollyPasses(llvm::legacy::PassManagerBase &PM) {
if (DeadCodeElim)
PM.add(polly::createDeadCodeElimPass());
- switch (Optimizer) {
- case OPTIMIZER_NONE:
- break; /* Do nothing */
-
- case OPTIMIZER_ISL:
- PM.add(polly::createIslScheduleOptimizerPass());
- break;
+ if (Target == TARGET_GPU) {
+ // GPU generation provides its own scheduling optimization strategy.
+ } else {
+ switch (Optimizer) {
+ case OPTIMIZER_NONE:
+ break; /* Do nothing */
+
+ case OPTIMIZER_ISL:
+ PM.add(polly::createIslScheduleOptimizerPass());
+ break;
+ }
}
if (ExportJScop)
PM.add(polly::createJSONExporterPass());
- switch (CodeGenerator) {
- case CODEGEN_ISL:
- PM.add(polly::createCodeGenerationPass());
- break;
- case CODEGEN_NONE:
- break;
+ if (Target == TARGET_GPU) {
+ PM.add(polly::createPPCGCodeGenerationPass());
+ } else {
+ switch (CodeGenerator) {
+ case CODEGEN_ISL:
+ PM.add(polly::createCodeGenerationPass());
+ break;
+ case CODEGEN_NONE:
+ break;
+ }
}
// FIXME: This dummy ModulePass keeps some programs from miscompiling,
OpenPOWER on IntegriCloud