summaryrefslogtreecommitdiffstats
path: root/polly/lib/Pocc.cpp
diff options
context:
space:
mode:
authorAndreas Simbuerger <simbuerg@fim.uni-passau.de>2014-03-11 21:25:59 +0000
committerAndreas Simbuerger <simbuerg@fim.uni-passau.de>2014-03-11 21:25:59 +0000
commit19523ed2bec3805b197b3085d579642646559b94 (patch)
tree4d436c7811267cbce3294317b68b72913515119e /polly/lib/Pocc.cpp
parent8600ebc74da811b1f2b6c11c31a0c60b7923360a (diff)
downloadbcm5719-llvm-19523ed2bec3805b197b3085d579642646559b94.tar.gz
bcm5719-llvm-19523ed2bec3805b197b3085d579642646559b94.zip
Move transformations into own directory
Move all transformations into their own directory. CMakeLists are adjusted accordingly. llvm-svn: 203607
Diffstat (limited to 'polly/lib/Pocc.cpp')
-rw-r--r--polly/lib/Pocc.cpp284
1 files changed, 0 insertions, 284 deletions
diff --git a/polly/lib/Pocc.cpp b/polly/lib/Pocc.cpp
deleted file mode 100644
index d083fc1ab71..00000000000
--- a/polly/lib/Pocc.cpp
+++ /dev/null
@@ -1,284 +0,0 @@
-//===- Pocc.cpp - Pocc interface ----------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// Pocc[1] interface.
-//
-// Pocc, the polyhedral compilation collection is a collection of polyhedral
-// tools. It is used as an optimizer in polly
-//
-// [1] http://www-roc.inria.fr/~pouchet/software/pocc/
-//
-//===----------------------------------------------------------------------===//
-
-#include "polly/LinkAllPasses.h"
-
-#ifdef SCOPLIB_FOUND
-#include "polly/CodeGen/CodeGeneration.h"
-#include "polly/Dependences.h"
-#include "polly/Options.h"
-#include "polly/ScheduleOptimizer.h"
-#include "polly/ScopInfo.h"
-
-#define DEBUG_TYPE "polly-opt-pocc"
-#include "llvm/Support/Debug.h"
-#include "llvm/Support/Path.h"
-#include "llvm/Support/Program.h"
-#include "llvm/Support/MemoryBuffer.h"
-#include "llvm/Support/system_error.h"
-#include "llvm/ADT/OwningPtr.h"
-#include "llvm/ADT/SmallString.h"
-
-#include "polly/ScopLib.h"
-
-#include "isl/space.h"
-#include "isl/map.h"
-#include "isl/constraint.h"
-
-using namespace llvm;
-using namespace polly;
-
-static cl::opt<std::string> PlutoFuse("pluto-fuse", cl::desc(""), cl::Hidden,
- cl::value_desc("Set fuse mode of Pluto"),
- cl::init("maxfuse"),
- cl::cat(PollyCategory));
-
-namespace {
-
-class Pocc : public ScopPass {
- SmallString<128> PlutoStderr;
- SmallString<128> PlutoStdout;
- std::vector<const char *> arguments;
-
-public:
- static char ID;
- explicit Pocc() : ScopPass(ID) {}
-
- std::string getFileName(Region *R) const;
- virtual bool runOnScop(Scop &S);
- void printScop(llvm::raw_ostream &OS) const;
- void getAnalysisUsage(AnalysisUsage &AU) const;
-
-private:
- bool runTransform(Scop &S);
-};
-}
-
-char Pocc::ID = 0;
-bool Pocc::runTransform(Scop &S) {
- Dependences *D = &getAnalysis<Dependences>();
-
- // Create the scop file.
- SmallString<128> TempDir;
- SmallString<128> ScopFile;
- llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/true, TempDir);
- ScopFile = TempDir;
- llvm::sys::path::append(ScopFile, "polly.scop");
-
- FILE *F = fopen(ScopFile.c_str(), "w");
-
- arguments.clear();
-
- if (!F) {
- errs() << "Cannot open file: " << TempDir.c_str() << "\n";
- errs() << "Skipping export.\n";
- return false;
- }
-
- ScopLib scoplib(&S);
- scoplib.print(F);
- fclose(F);
-
- // Execute pocc
- std::string pocc = sys::FindProgramByName("pocc");
-
- arguments.push_back("pocc");
- arguments.push_back("--read-scop");
- arguments.push_back(ScopFile.c_str());
- arguments.push_back("--pluto-tile-scat");
- arguments.push_back("--candl-dep-isl-simp");
- arguments.push_back("--cloogify-scheds");
- arguments.push_back("--output-scop");
- arguments.push_back("--pluto");
- arguments.push_back("--pluto-bounds");
- arguments.push_back("10");
- arguments.push_back("--pluto-fuse");
-
- arguments.push_back(PlutoFuse.c_str());
-
- if (!DisablePollyTiling)
- arguments.push_back("--pluto-tile");
-
- if (PollyVectorizerChoice != VECTORIZER_NONE)
- arguments.push_back("--pluto-prevector");
-
- arguments.push_back(0);
-
- PlutoStdout = TempDir;
- llvm::sys::path::append(PlutoStdout, "pluto.stdout");
- PlutoStderr = TempDir;
- llvm::sys::path::append(PlutoStderr, "pluto.stderr");
-
- std::vector<llvm::StringRef> Redirect;
- Redirect.push_back(0);
- Redirect.push_back(PlutoStdout.c_str());
- Redirect.push_back(PlutoStderr.c_str());
-
- sys::ExecuteAndWait(pocc, &arguments[0], 0,
- (const llvm::StringRef **)&Redirect[0]);
-
- // Read the created scop file
- SmallString<128> NewScopFile;
- NewScopFile = TempDir;
- llvm::sys::path::append(NewScopFile, "polly.pocc.c.scop");
-
- FILE *poccFile = fopen(NewScopFile.c_str(), "r");
- ScopLib newScoplib(&S, poccFile, D);
-
- if (!newScoplib.updateScattering()) {
- errs() << "Failure when calculating the optimization with "
- "the following command: ";
- for (std::vector<const char *>::const_iterator AI = arguments.begin(),
- AE = arguments.end();
- AI != AE; ++AI)
- if (*AI)
- errs() << " " << *AI;
- errs() << "\n";
- return false;
- } else
- fclose(poccFile);
-
- if (PollyVectorizerChoice == VECTORIZER_NONE)
- return false;
-
- // Find the innermost dimension that is not a constant dimension. This
- // dimension will be vectorized.
- unsigned scatterDims = S.getScatterDim();
- int lastLoop = scatterDims - 1;
-
- while (lastLoop) {
- bool isSingleValued = true;
-
- for (Scop::iterator SI = S.begin(), SE = S.end(); SI != SE; ++SI) {
- isl_map *scat = (*SI)->getScattering();
- isl_map *projected = isl_map_project_out(scat, isl_dim_out, lastLoop,
- scatterDims - lastLoop);
-
- if (!isl_map_is_bijective(projected)) {
- isSingleValued = false;
- break;
- }
- }
-
- if (!isSingleValued)
- break;
-
- lastLoop--;
- }
-
- // Strip mine the innermost loop.
- for (Scop::iterator SI = S.begin(), SE = S.end(); SI != SE; ++SI) {
- isl_map *scat = (*SI)->getScattering();
- int scatDims = (*SI)->getNumScattering();
- isl_space *Space = isl_space_alloc(S.getIslCtx(), S.getNumParams(),
- scatDims, scatDims + 1);
- isl_basic_map *map = isl_basic_map_universe(isl_space_copy(Space));
- isl_local_space *LSpace = isl_local_space_from_space(Space);
-
- for (int i = 0; i <= lastLoop - 1; i++) {
- isl_constraint *c = isl_equality_alloc(isl_local_space_copy(LSpace));
-
- isl_constraint_set_coefficient_si(c, isl_dim_in, i, 1);
- isl_constraint_set_coefficient_si(c, isl_dim_out, i, -1);
-
- map = isl_basic_map_add_constraint(map, c);
- }
-
- for (int i = lastLoop; i < scatDims; i++) {
- isl_constraint *c = isl_equality_alloc(isl_local_space_copy(LSpace));
-
- isl_constraint_set_coefficient_si(c, isl_dim_in, i, 1);
- isl_constraint_set_coefficient_si(c, isl_dim_out, i + 1, -1);
-
- map = isl_basic_map_add_constraint(map, c);
- }
-
- isl_constraint *c;
-
- int vectorWidth = 4;
- c = isl_inequality_alloc(isl_local_space_copy(LSpace));
- isl_constraint_set_coefficient_si(c, isl_dim_out, lastLoop, -vectorWidth);
- isl_constraint_set_coefficient_si(c, isl_dim_out, lastLoop + 1, 1);
- map = isl_basic_map_add_constraint(map, c);
-
- c = isl_inequality_alloc(LSpace);
- isl_constraint_set_coefficient_si(c, isl_dim_out, lastLoop, vectorWidth);
- isl_constraint_set_coefficient_si(c, isl_dim_out, lastLoop + 1, -1);
- isl_constraint_set_constant_si(c, vectorWidth - 1);
- map = isl_basic_map_add_constraint(map, c);
-
- isl_map *transform = isl_map_from_basic_map(map);
- transform = isl_map_set_tuple_name(transform, isl_dim_out, "scattering");
- transform = isl_map_set_tuple_name(transform, isl_dim_in, "scattering");
-
- scat = isl_map_apply_range(scat, isl_map_copy(transform));
- (*SI)->setScattering(scat);
- }
-
- return false;
-}
-bool Pocc::runOnScop(Scop &S) {
- bool Result = runTransform(S);
- DEBUG(printScop(dbgs()));
-
- return Result;
-}
-
-void Pocc::printScop(raw_ostream &OS) const {
- OwningPtr<MemoryBuffer> stdoutBuffer;
- OwningPtr<MemoryBuffer> stderrBuffer;
-
- OS << "Command line: ";
-
- for (std::vector<const char *>::const_iterator AI = arguments.begin(),
- AE = arguments.end();
- AI != AE; ++AI)
- if (*AI)
- OS << " " << *AI;
-
- OS << "\n";
-
- if (error_code ec = MemoryBuffer::getFile(PlutoStdout.str(), stdoutBuffer))
- OS << "Could not open pocc stdout file: " + ec.message() << "\n";
- else {
- OS << "pocc stdout: " << stdoutBuffer->getBufferIdentifier() << "\n";
- OS << stdoutBuffer->getBuffer() << "\n";
- }
-
- if (error_code ec = MemoryBuffer::getFile(PlutoStderr.str(), stderrBuffer))
- OS << "Could not open pocc stderr file: " + ec.message() << "\n";
- else {
- OS << "pocc stderr: " << PlutoStderr << "\n";
- OS << stderrBuffer->getBuffer() << "\n";
- }
-}
-
-void Pocc::getAnalysisUsage(AnalysisUsage &AU) const {
- ScopPass::getAnalysisUsage(AU);
- AU.addRequired<Dependences>();
-}
-
-Pass *polly::createPoccPass() { return new Pocc(); }
-
-INITIALIZE_PASS_BEGIN(Pocc, "polly-opt-pocc",
- "Polly - Optimize the scop using pocc", false, false);
-INITIALIZE_PASS_DEPENDENCY(Dependences);
-INITIALIZE_PASS_DEPENDENCY(ScopInfo);
-INITIALIZE_PASS_END(Pocc, "polly-opt-pocc",
- "Polly - Optimize the scop using pocc", false, false)
-#endif /* SCOPLIB_FOUND */
OpenPOWER on IntegriCloud