Index: CMakeLists.txt =================================================================== --- CMakeLists.txt +++ CMakeLists.txt @@ -111,14 +111,6 @@ set(GPU_CODEGEN TRUE) endif(POLLY_ENABLE_GPGPU_CODEGEN) -option(POLLY_ENABLE_SCOPLIB "Enable SCoPLib library for scop import/export" ON) -if (POLLY_ENABLE_SCOPLIB) - FIND_PACKAGE(SCoPLib) - if(SCOPLIB_FOUND) - set(POLLY_LINK_LIBS ${POLLY_LINK_LIBS} ${SCOPLIB_LIBRARY}) - endif(SCOPLIB_FOUND) -endif(POLLY_ENABLE_SCOPLIB) - if (CLOOG_FOUND) INCLUDE_DIRECTORIES( ${CLOOG_INCLUDE_DIR} ) endif(CLOOG_FOUND) @@ -135,11 +127,6 @@ INCLUDE_DIRECTORIES( ${CUDALIB_INCLUDE_DIR} ) endif(CUDALIB_FOUND) -if (SCOPLIB_FOUND) - INCLUDE_DIRECTORIES( ${SCOPLIB_INCLUDE_DIR} ) -endif(SCOPLIB_FOUND) - - include_directories( BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/include Index: Makefile.config.in =================================================================== --- Makefile.config.in +++ Makefile.config.in @@ -30,16 +30,12 @@ PLUTO_FOUND := @pluto_found@ CLOOG_FOUND := @cloog_found@ -SCOPLIB_FOUND := @scoplib_found@ CUDALIB_FOUND := @cuda_found@ # Set include directroys -POLLY_INC := @gmp_inc@ @isl_inc@ \ - @cloog_inc@ @scoplib_inc@ @cuda_inc@\ - @pluto_inc@ -I$(POLLY_SRC_ROOT)/lib/JSON/include +POLLY_INC := @gmp_inc@ @isl_inc@ @cloog_inc@ @cuda_inc@\ + @pluto_inc@ -I$(POLLY_SRC_ROOT)/lib/JSON/include -POLLY_LD := @gmp_ld@ @isl_ld@ @cloog_ld@ @scoplib_ld@ \ - @scoplib_rpath@ @cuda_ld@ @pluto_ld@ +POLLY_LD := @gmp_ld@ @isl_ld@ @cloog_ld@ @cuda_ld@ @pluto_ld@ -POLLY_LIB := @gmp_lib@ @isl_lib@ @cloog_lib@ @scoplib_lib@ \ - @cuda_lib@ @pluto_lib@ +POLLY_LIB := @gmp_lib@ @isl_lib@ @cloog_lib@ @cuda_lib@ @pluto_lib@ Index: autoconf/configure.ac =================================================================== --- autoconf/configure.ac +++ autoconf/configure.ac @@ -99,19 +99,6 @@ AS_IF([test "x$pluto_found" = "xyes"], [AC_DEFINE([PLUTO_FOUND],[1],[Define if pluto found])]) -dnl Check that we have scoplib. -find_lib_and_headers([scoplib], [scoplib/scop.h], [scoplib]) -AS_IF([test "x$scoplib_found" = "xyes"], - [AC_DEFINE([SCOPLIB_FOUND],[1],[Define if scoplib found])]) - -if test "x$scoplib_found" = "xyes"; then : - scoplib_rpath="-Wl,-rpath=$given_lib_path" -else - scoplib_rpath="" -fi - -AC_SUBST(scoplib_rpath) - dnl Check if CUDA lib there dnl Disable the build of polly, even if it is checked out into tools/polly. AC_ARG_ENABLE(polly_gpu_codegen, Index: cmake/FindSCoPLib.cmake =================================================================== --- cmake/FindSCoPLib.cmake +++ /dev/null @@ -1,19 +0,0 @@ -FIND_PATH(SCOPLIB_INCLUDE_DIR scoplib/scop.h) - -FIND_LIBRARY(SCOPLIB_LIBRARY NAMES scoplib) - -IF (SCOPLIB_INCLUDE_DIR AND SCOPLIB_LIBRARY) - SET(SCOPLIB_FOUND TRUE) -ENDIF (SCOPLIB_INCLUDE_DIR AND SCOPLIB_LIBRARY) - - -IF (SCOPLIB_FOUND) - IF (NOT Isl_FIND_QUIETLY) - MESSAGE(STATUS "Found SCoPLib: ${SCOPLIB_LIBRARY}") - ENDIF (NOT Isl_FIND_QUIETLY) -ELSE (SCOPLIB_FOUND) - IF (Isl_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "Could not find SCoPLib") - ENDIF (Isl_FIND_REQUIRED) -ENDIF (SCOPLIB_FOUND) - Index: configure =================================================================== --- configure +++ configure @@ -591,11 +591,6 @@ cuda_lib cuda_inc cuda_found -scoplib_rpath -scoplib_ld -scoplib_lib -scoplib_inc -scoplib_found pluto_ld pluto_lib pluto_inc @@ -668,7 +663,6 @@ with_isl with_cloog with_pluto -with_scoplib enable_polly_gpu_codegen with_cuda ' @@ -1302,7 +1296,6 @@ --with-isl prefix of isl --with-cloog prefix of cloog --with-pluto prefix of pluto - --with-scoplib prefix of scoplib --with-cuda prefix of cuda Some influential environment variables: @@ -2773,88 +2766,6 @@ OLD_LDFLAGS=$LDFLAGS; OLD_LIBS=$LIBS; - LIBS="$LIBS -lscoplib"; - - # Get include path and lib path - -# Check whether --with-scoplib was given. -if test "${with_scoplib+set}" = set; then : - withval=$with_scoplib; given_inc_path="$withval/include"; CXXFLAGS="-I$given_inc_path $CXXFLAGS"; - given_lib_path="$withval/lib"; LDFLAGS="-L$given_lib_path $LDFLAGS" -else - given_inc_path=inc_not_give_scoplib; - given_lib_path=lib_not_give_scoplib - -fi - - # Check for library and headers works - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for scoplib: scoplib/scop.h in $given_inc_path, and libscoplib in $given_lib_path" >&5 -$as_echo_n "checking for scoplib: scoplib/scop.h in $given_inc_path, and libscoplib in $given_lib_path... " >&6; } - - # try to compile a file that includes a header of the library - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -; - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } - scoplib_found="yes" - - if test "x$given_inc_path" != "xinc_not_give_scoplib"; then : - scoplib_inc="-I$given_inc_path" - -fi - scoplib_lib="-lscoplib" - - if test "x$given_lib_path" != "xlib_not_give_scoplib"; then : - scoplib_ld="-L$given_lib_path" - -fi -else - if test "x" = "xrequired"; then : - as_fn_error $? "scoplib required but not found" "$LINENO" 5 -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 -$as_echo "not found" >&6; } -fi - -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - # reset original CXXFLAGS - CXXFLAGS=$OLD_CXXFLAGS - LDFLAGS=$OLD_LDFLAGS; - LIBS=$OLD_LIBS - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -if test "x$scoplib_found" = "xyes"; then : - -$as_echo "#define SCOPLIB_FOUND 1" >>confdefs.h - -fi - -if test "x$scoplib_found" = "xyes"; then : - scoplib_rpath="-Wl,-rpath=$given_lib_path" -else - scoplib_rpath="" -fi - - - # Check whether --enable-polly_gpu_codegen was given. if test "${enable_polly_gpu_codegen+set}" = set; then : enableval=$enable_polly_gpu_codegen; Index: include/polly/Config/config.h.in =================================================================== --- include/polly/Config/config.h.in +++ include/polly/Config/config.h.in @@ -32,6 +32,3 @@ /* Define if pluto found */ #undef PLUTO_FOUND - -/* Define if scoplib found */ -#undef SCOPLIB_FOUND Index: include/polly/LinkAllPasses.h =================================================================== --- include/polly/LinkAllPasses.h +++ include/polly/LinkAllPasses.h @@ -53,12 +53,6 @@ llvm::Pass *createIslScheduleOptimizerPass(); llvm::Pass *createTempScopInfoPass(); -#ifdef SCOPLIB_FOUND -llvm::Pass *createPoccPass(); -llvm::Pass *createScopLibExporterPass(); -llvm::Pass *createScopLibImporterPass(); -#endif - extern char &IndependentBlocksID; extern char &CodePreparationID; } @@ -100,11 +94,6 @@ polly::createIslScheduleOptimizerPass(); polly::createTempScopInfoPass(); -#ifdef SCOPLIB_FOUND - polly::createPoccPass(); - polly::createScopLibExporterPass(); - polly::createScopLibImporterPass(); -#endif } } PollyForcePassLinking; // Force link by creating a global definition. } @@ -126,9 +115,6 @@ void initializePlutoOptimizerPass(llvm::PassRegistry &); #endif void initializePollyCanonicalizePass(llvm::PassRegistry &); -#ifdef SCOPLIB_FOUND -void initializePoccPass(llvm::PassRegistry &); -#endif void initializePollyIndVarSimplifyPass(llvm::PassRegistry &); } Index: include/polly/ScopLib.h =================================================================== --- include/polly/ScopLib.h +++ /dev/null @@ -1,70 +0,0 @@ -//===- ScopLib.h - ScopLib interface ----------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Scoplib interface. -// -// The scoplib interface allows to import/export a scop using scoplib. -//===----------------------------------------------------------------------===// - -#ifndef POLLY_SCOPLIB_H -#define POLLY_SCOPLIB_H - -#include "isl/ctx.h" - -#include "scoplib/scop.h" - -#include - -namespace llvm { -class Value; -} - -struct isl_constraint; -struct isl_basic_map; -struct isl_basic_set; -struct isl_map; -struct isl_set; - -namespace polly { -class Dependences; -class ScopStmt; -class Scop; -class ScopLib { - Scop *PollyScop; - scoplib_scop_p scoplib; - Dependences *D; - - std::map ArrayMap; - - void initializeArrays(); - void initializeParameters(); - void initializeScattering(); - void initializeStatements(); - scoplib_statement_p initializeStatement(ScopStmt *stmt); - void freeStatement(scoplib_statement_p stmt); - static int accessToMatrix_constraint(isl_constraint *c, void *user); - static int accessToMatrix_basic_map(isl_basic_map *bmap, void *user); - scoplib_matrix_p createAccessMatrix(ScopStmt *S, bool isRead); - static int domainToMatrix_constraint(isl_constraint *c, void *user); - static int domainToMatrix_basic_set(isl_basic_set *bset, void *user); - scoplib_matrix_p domainToMatrix(__isl_take isl_set *set); - static int scatteringToMatrix_constraint(isl_constraint *c, void *user); - static int scatteringToMatrix_basic_map(isl_basic_map *bmap, void *user); - scoplib_matrix_p scatteringToMatrix(__isl_take isl_map *map); - -public: - ScopLib(Scop *S); - ScopLib(Scop *S, FILE *F, Dependences *D); - ~ScopLib(); - void print(FILE *F); - bool updateScattering(); -}; -} - -#endif /* POLLY_SCOPLIB_H */ Index: lib/CMakeLists.txt =================================================================== --- lib/CMakeLists.txt +++ lib/CMakeLists.txt @@ -26,14 +26,6 @@ CodeGen/PTXGenerator.cpp) endif (GPU_CODEGEN) -if (SCOPLIB_FOUND) - set(POLLY_SCOPLIB_FILES - Transform/Pocc.cpp - Exchange/ScopLib.cpp - Exchange/ScopLibExporter.cpp - Exchange/ScopLibImporter.cpp) -endif (SCOPLIB_FOUND) - add_polly_library(Polly Analysis/Dependences.cpp Analysis/ScopDetection.cpp @@ -51,7 +43,6 @@ CodeGen/RuntimeDebugBuilder.cpp ${GPGPU_CODEGEN_FILES} Exchange/JSONExporter.cpp - ${POLLY_SCOPLIB_FILES} Support/GICHelper.cpp Support/SCEVValidator.cpp Support/RegisterPasses.cpp Index: lib/Exchange/ScopLib.cpp =================================================================== --- lib/Exchange/ScopLib.cpp +++ /dev/null @@ -1,767 +0,0 @@ -//===- ScopLib.cpp - ScopLib interface ------------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// ScopLib Interface -// -//===----------------------------------------------------------------------===// - -#include "polly/LinkAllPasses.h" - -#ifdef SCOPLIB_FOUND - -#include "polly/Dependences.h" -#include "polly/ScopLib.h" -#include "polly/ScopInfo.h" - -#include "stdio.h" -#include "isl/set.h" -#include "isl/map.h" -#include "isl/constraint.h" -#include "isl/val_gmp.h" - -using namespace llvm; - -namespace polly { - -ScopLib::ScopLib(Scop *S) : PollyScop(S) { - scoplib = scoplib_scop_malloc(); - - initializeArrays(); - initializeParameters(); - initializeScattering(); - initializeStatements(); -} - -ScopLib::ScopLib(Scop *S, FILE *F, Dependences *dep) : PollyScop(S), D(dep) { - scoplib = scoplib_scop_read(F); -} - -void ScopLib::initializeParameters() { - scoplib->nb_parameters = PollyScop->getNumParams(); - scoplib->parameters = - (char **)malloc(sizeof(char *) * scoplib->nb_parameters); - - for (int i = 0; i < scoplib->nb_parameters; ++i) { - scoplib->parameters[i] = (char *)malloc(sizeof(char *) * 20); - sprintf(scoplib->parameters[i], "p_%d", i); - } -} - -void ScopLib::initializeArrays() { - int nb_arrays = 0; - - for (ScopStmt *Stmt : *PollyScop) - for (MemoryAccess *MA : *Stmt) { - const Value *BaseAddr = MA->getBaseAddr(); - if (ArrayMap.find(BaseAddr) == ArrayMap.end()) { - ArrayMap.insert(std::make_pair(BaseAddr, nb_arrays)); - ++nb_arrays; - } - } - - scoplib->nb_arrays = nb_arrays; - scoplib->arrays = (char **)malloc(sizeof(char *) * nb_arrays); - - for (int i = 0; i < nb_arrays; ++i) - for (std::map::iterator VI = ArrayMap.begin(), - VE = ArrayMap.end(); - VI != VE; ++VI) - if ((*VI).second == i) { - const Value *V = (*VI).first; - std::string name = V->getName(); - scoplib->arrays[i] = (char *)malloc(sizeof(char *) * (name.size() + 1)); - strcpy(scoplib->arrays[i], name.c_str()); - } -} - -void ScopLib::initializeScattering() {} - -scoplib_statement_p ScopLib::initializeStatement(ScopStmt *stmt) { - scoplib_statement_p Stmt = scoplib_statement_malloc(); - - // Domain & Schedule - Stmt->domain = scoplib_matrix_list_malloc(); - Stmt->domain->elt = domainToMatrix(stmt->getDomain()); - Stmt->schedule = scatteringToMatrix(stmt->getScattering()); - - // Statement name - std::string entryName; - raw_string_ostream OS(entryName); - stmt->getBasicBlock()->printAsOperand(OS, false); - entryName = OS.str(); - Stmt->body = (char *)malloc(sizeof(char) * (entryName.size() + 1)); - strcpy(Stmt->body, entryName.c_str()); - - // Iterator names - Stmt->nb_iterators = stmt->getNumIterators(); - Stmt->iterators = (char **)malloc(sizeof(char *) * Stmt->nb_iterators); - - for (int i = 0; i < Stmt->nb_iterators; ++i) { - Stmt->iterators[i] = (char *)malloc(sizeof(char *) * 20); - sprintf(Stmt->iterators[i], "i_%d", i); - } - - // Memory Accesses - Stmt->read = createAccessMatrix(stmt, true); - Stmt->write = createAccessMatrix(stmt, false); - - return Stmt; -} - -void ScopLib::initializeStatements() { - for (Scop::reverse_iterator SI = PollyScop->rbegin(), SE = PollyScop->rend(); - SI != SE; ++SI) { - scoplib_statement_p stmt = initializeStatement(*SI); - stmt->next = scoplib->statement; - scoplib->statement = stmt; - } -} - -void ScopLib::freeStatement(scoplib_statement_p stmt) { - if (stmt->read) - scoplib_matrix_free(stmt->read); - stmt->read = nullptr; - - if (stmt->write) - scoplib_matrix_free(stmt->write); - stmt->write = nullptr; - - scoplib_matrix_list_p current = stmt->domain; - while (current) { - scoplib_matrix_list_p next = current->next; - current->next = nullptr; - scoplib_matrix_free(current->elt); - current->elt = nullptr; - scoplib_matrix_list_free(current); - current = next; - } - stmt->domain = nullptr; - - if (stmt->schedule) - scoplib_matrix_free(stmt->schedule); - stmt->schedule = nullptr; - - for (int i = 0; i < stmt->nb_iterators; ++i) - free(stmt->iterators[i]); - - free(stmt->iterators); - stmt->iterators = nullptr; - stmt->nb_iterators = 0; - - scoplib_statement_free(stmt); -} - -void ScopLib::print(FILE *F) { scoplib_scop_print_dot_scop(F, scoplib); } - -/// Add an isl constraint to an ScopLib matrix. -/// -/// @param user The matrix -/// @param c The constraint -int ScopLib::domainToMatrix_constraint(isl_constraint *c, void *user) { - scoplib_matrix_p m = (scoplib_matrix_p)user; - - int nb_params = isl_constraint_dim(c, isl_dim_param); - int nb_vars = isl_constraint_dim(c, isl_dim_set); - int nb_div = isl_constraint_dim(c, isl_dim_div); - - assert(!nb_div && "Existentially quantified variables not yet supported"); - - scoplib_vector_p vec = scoplib_vector_malloc(nb_params + nb_vars + 2); - - // Assign type - if (isl_constraint_is_equality(c)) - scoplib_vector_tag_equality(vec); - else - scoplib_vector_tag_inequality(vec); - - isl_val *v; - - // Assign variables - for (int i = 0; i < nb_vars; ++i) { - v = isl_constraint_get_coefficient_val(c, isl_dim_set, i); - SCOPVAL_init(vec->p[i + 1]); - isl_val_get_num_gmp(v, vec->p[i + 1]); - isl_val_free(v); - } - - // Assign parameters - for (int i = 0; i < nb_params; ++i) { - v = isl_constraint_get_coefficient_val(c, isl_dim_param, i); - SCOPVAL_init(vec->p[nb_vars + i + 1]); - isl_val_get_num_gmp(v, vec->p[nb_vars + i + 1]); - isl_val_free(v); - } - - // Assign constant - v = isl_constraint_get_constant_val(c); - SCOPVAL_init(vec->p[nb_params + nb_vars + 1]); - isl_val_get_num_gmp(v, vec->p[nb_params + nb_vars + 1]); - - scoplib_matrix_insert_vector(m, vec, m->NbRows); - - scoplib_vector_free(vec); - isl_constraint_free(c); - isl_val_free(v); - - return 0; -} - -/// Add an isl basic set to a ScopLib matrix_list -/// -/// @param bset The basic set to add -/// @param user The matrix list we should add the basic set to -/// -/// XXX: At the moment this function expects just a matrix, as support -/// for matrix lists is currently not available in ScopLib. So union of -/// polyhedron are not yet supported -int ScopLib::domainToMatrix_basic_set(isl_basic_set *bset, void *user) { - scoplib_matrix_p m = (scoplib_matrix_p)user; - assert(!m->NbRows && "Union of polyhedron not yet supported"); - - isl_basic_set_foreach_constraint(bset, &domainToMatrix_constraint, user); - isl_basic_set_free(bset); - return 0; -} - -/// Translate a isl_set to a ScopLib matrix. -/// -/// @param PS The set to be translated -/// @return A ScopLib Matrix -scoplib_matrix_p ScopLib::domainToMatrix(__isl_take isl_set *set) { - set = isl_set_compute_divs(set); - set = isl_set_align_divs(set); - - // Initialize the matrix. - unsigned NbRows, NbColumns; - NbRows = 0; - NbColumns = isl_set_n_dim(set) + isl_set_n_param(set) + 2; - scoplib_matrix_p matrix = scoplib_matrix_malloc(NbRows, NbColumns); - - // Copy the content into the matrix. - isl_set_foreach_basic_set(set, &domainToMatrix_basic_set, matrix); - - isl_set_free(set); - - return matrix; -} - -/// Add an isl constraint to an ScopLib matrix. -/// -/// @param user The matrix -/// @param c The constraint -int ScopLib::scatteringToMatrix_constraint(isl_constraint *c, void *user) { - scoplib_matrix_p m = (scoplib_matrix_p)user; - - int nb_params = isl_constraint_dim(c, isl_dim_param); - int nb_in = isl_constraint_dim(c, isl_dim_in); - int nb_div = isl_constraint_dim(c, isl_dim_div); - - assert(!nb_div && "Existentially quantified variables not yet supported"); - - scoplib_vector_p vec = scoplib_vector_malloc(nb_params + nb_in + 2); - - // Assign type - if (isl_constraint_is_equality(c)) - scoplib_vector_tag_equality(vec); - else - scoplib_vector_tag_inequality(vec); - - isl_val *v; - - // Assign variables - for (int i = 0; i < nb_in; ++i) { - v = isl_constraint_get_coefficient_val(c, isl_dim_in, i); - SCOPVAL_init(vec->p[i + 1]); - isl_val_get_num_gmp(v, vec->p[i + 1]); - isl_val_free(v); - } - - // Assign parameters - for (int i = 0; i < nb_params; ++i) { - v = isl_constraint_get_coefficient_val(c, isl_dim_param, i); - SCOPVAL_init(vec->p[nb_in + i + 1]); - isl_val_get_num_gmp(v, vec->p[nb_in + i + 1]); - isl_val_free(v); - } - - // Assign constant - v = isl_constraint_get_constant_val(c); - SCOPVAL_init(vec->p[nb_in + nb_params + 1]); - isl_val_get_num_gmp(v, vec->p[nb_in + nb_params + 1]); - - scoplib_vector_p null = scoplib_vector_malloc(nb_params + nb_in + 2); - - vec = scoplib_vector_sub(null, vec); - scoplib_matrix_insert_vector(m, vec, 0); - - scoplib_vector_free(null); - scoplib_vector_free(vec); - isl_constraint_free(c); - isl_val_free(v); - - return 0; -} - -/// Add an isl basic map to a ScopLib matrix_list -/// -/// @param bmap The basic map to add -/// @param user The matrix list we should add the basic map to -/// -/// XXX: At the moment this function expects just a matrix, as support -/// for matrix lists is currently not available in ScopLib. So union of -/// polyhedron are not yet supported -int ScopLib::scatteringToMatrix_basic_map(isl_basic_map *bmap, void *user) { - scoplib_matrix_p m = (scoplib_matrix_p)user; - assert(!m->NbRows && "Union of polyhedron not yet supported"); - - isl_basic_map_foreach_constraint(bmap, &scatteringToMatrix_constraint, user); - isl_basic_map_free(bmap); - return 0; -} - -/// Translate a isl_map to a ScopLib matrix. -/// -/// @param map The map to be translated -/// @return A ScopLib Matrix -scoplib_matrix_p ScopLib::scatteringToMatrix(__isl_take isl_map *map) { - map = isl_map_compute_divs(map); - map = isl_map_align_divs(map); - - // Initialize the matrix. - unsigned NbRows, NbColumns; - NbRows = 0; - NbColumns = isl_map_n_in(map) + isl_map_n_param(map) + 2; - scoplib_matrix_p matrix = scoplib_matrix_malloc(NbRows, NbColumns); - - // Copy the content into the matrix. - isl_map_foreach_basic_map(map, &scatteringToMatrix_basic_map, matrix); - - // Only keep the relevant rows. - scoplib_matrix_p reduced = - scoplib_matrix_ncopy(matrix, isl_map_n_in(map) * 2 + 1); - - scoplib_matrix_free(matrix); - isl_map_free(map); - - return reduced; -} - -/// Add an isl constraint to an ScopLib matrix. -/// -/// @param user The matrix -/// @param c The constraint -int ScopLib::accessToMatrix_constraint(isl_constraint *c, void *user) { - scoplib_matrix_p m = (scoplib_matrix_p)user; - - int nb_params = isl_constraint_dim(c, isl_dim_param); - int nb_in = isl_constraint_dim(c, isl_dim_in); - int nb_div = isl_constraint_dim(c, isl_dim_div); - - assert(!nb_div && "Existentially quantified variables not yet supported"); - - scoplib_vector_p vec = scoplib_vector_malloc(nb_params + nb_in + 2); - - isl_val *v; - - // The access dimension has to be one. - v = isl_constraint_get_coefficient_val(c, isl_dim_out, 0); - assert((isl_val_is_one(v) || isl_val_is_negone(v)) && - "Access relations not supported in scoplib"); - bool inverse = isl_val_is_one(v); - isl_val_free(v); - - // Assign variables - for (int i = 0; i < nb_in; ++i) { - v = isl_constraint_get_coefficient_val(c, isl_dim_in, i); - - if (inverse) - v = isl_val_neg(v); - - SCOPVAL_init(vec->p[i + 1]); - isl_val_get_num_gmp(v, vec->p[i + 1]); - isl_val_free(v); - } - - // Assign parameters - for (int i = 0; i < nb_params; ++i) { - v = isl_constraint_get_coefficient_val(c, isl_dim_param, i); - - if (inverse) - v = isl_val_neg(v); - - SCOPVAL_init(vec->p[nb_in + i + 1]); - isl_val_get_num_gmp(v, vec->p[nb_in + i + 1]); - isl_val_free(v); - } - - // Assign constant - v = isl_constraint_get_constant_val(c); - - if (inverse) - v = isl_val_neg(v); - - SCOPVAL_init(vec->p[nb_in + nb_params + 1]); - isl_val_get_num_gmp(v, vec->p[nb_in + nb_params + 1]); - - scoplib_matrix_insert_vector(m, vec, m->NbRows); - - scoplib_vector_free(vec); - isl_constraint_free(c); - isl_val_free(v); - - return 0; -} - -/// Add an isl basic map to a ScopLib matrix_list -/// -/// @param bmap The basic map to add -/// @param user The matrix list we should add the basic map to -/// -/// XXX: At the moment this function expects just a matrix, as support -/// for matrix lists is currently not available in ScopLib. So union of -/// polyhedron are not yet supported -int ScopLib::accessToMatrix_basic_map(isl_basic_map *bmap, void *user) { - isl_basic_map_foreach_constraint(bmap, &accessToMatrix_constraint, user); - isl_basic_map_free(bmap); - return 0; -} - -/// Create the memory access matrix for scoplib -/// -/// @param S The polly statement the access matrix is created for. -/// @param isRead Are we looking for read or write accesses? -/// @param ArrayMap A map translating from the memory references to the scoplib -/// indeces -/// -/// @return The memory access matrix, as it is required by scoplib. -scoplib_matrix_p ScopLib::createAccessMatrix(ScopStmt *S, bool isRead) { - unsigned NbColumns = S->getNumIterators() + S->getNumParams() + 2; - scoplib_matrix_p m = scoplib_matrix_malloc(0, NbColumns); - - for (MemoryAccess *MA : *S) - if (MA->isRead() == isRead) { - // Extract the access function. - isl_map *AccessRelation = MA->getAccessRelation(); - isl_map_foreach_basic_map(AccessRelation, &accessToMatrix_basic_map, m); - isl_map_free(AccessRelation); - - // Set the index of the memory access base element. - std::map::iterator BA = - ArrayMap.find(MA->getBaseAddr()); - SCOPVAL_set_si(m->p[m->NbRows - 1][0], (*BA).second + 1); - } - - return m; -} - -ScopLib::~ScopLib() { - if (!scoplib) - return; - - // Free array names. - for (int i = 0; i < scoplib->nb_arrays; ++i) - free(scoplib->arrays[i]); - - free(scoplib->arrays); - scoplib->arrays = nullptr; - scoplib->nb_arrays = 0; - - // Free parameters - for (int i = 0; i < scoplib->nb_parameters; ++i) - free(scoplib->parameters[i]); - - free(scoplib->parameters); - scoplib->parameters = nullptr; - scoplib->nb_parameters = 0; - - scoplib_statement_p stmt = scoplib->statement; - - // Free Statements - while (stmt) { - scoplib_statement_p TempStmt = stmt->next; - stmt->next = nullptr; - freeStatement(stmt); - stmt = TempStmt; - } - - scoplib->statement = nullptr; - - scoplib_scop_free(scoplib); -} -/// @brief Create an isl constraint from a row of ScopLib integers. -/// -/// @param row An array of isl/ScopLib integers. -/// @param Space An isl space object, describing how to spilt the dimensions. -/// -/// @return An isl constraint representing this integer array. -isl_constraint *constraintFromMatrixRow(mpz_t *row, - __isl_take isl_space *Space) { - isl_constraint *c; - isl_ctx *ctx; - - ctx = isl_space_get_ctx(Space); - unsigned NbIn = isl_space_dim(Space, isl_dim_in); - unsigned NbParam = isl_space_dim(Space, isl_dim_param); - - if (SCOPVAL_zero_p(row[0])) - c = isl_equality_alloc(isl_local_space_from_space(Space)); - else - c = isl_inequality_alloc(isl_local_space_from_space(Space)); - - unsigned current_column = 1; - - isl_val *v; - - for (unsigned j = 0; j < NbIn; ++j) { - v = isl_val_int_from_gmp(ctx, row[current_column++]); - c = isl_constraint_set_coefficient_val(c, isl_dim_in, j, v); - } - - for (unsigned j = 0; j < NbParam; ++j) { - v = isl_val_int_from_gmp(ctx, row[current_column++]); - c = isl_constraint_set_coefficient_val(c, isl_dim_param, j, v); - } - - v = isl_val_int_from_gmp(ctx, row[current_column]); - c = isl_constraint_set_constant_val(c, v); - - return c; -} - -/// @brief Create an isl map from a ScopLib matrix. -/// -/// @param m The ScopLib matrix to translate. -/// @param Space The dimensions that are contained in the ScopLib matrix. -/// -/// @return An isl map representing m. -isl_map *mapFromMatrix(scoplib_matrix_p m, __isl_take isl_space *Space, - unsigned scatteringDims) { - isl_basic_map *bmap = isl_basic_map_universe(isl_space_copy(Space)); - - for (unsigned i = 0; i < m->NbRows; ++i) { - isl_constraint *c; - c = constraintFromMatrixRow(m->p[i], isl_space_copy(Space)); - c = isl_constraint_set_coefficient_si(c, isl_dim_out, i, -1); - bmap = isl_basic_map_add_constraint(bmap, c); - } - - for (unsigned i = m->NbRows; i < scatteringDims; i++) { - isl_constraint *c; - c = isl_equality_alloc(isl_local_space_from_space(isl_space_copy(Space))); - c = isl_constraint_set_coefficient_si(c, isl_dim_out, i, 1); - bmap = isl_basic_map_add_constraint(bmap, c); - } - - isl_space_free(Space); - - return isl_map_from_basic_map(bmap); -} -/// @brief Create an isl constraint from a row of ScopLib integers. -/// -/// @param row An array of isl/ScopLib integers. -/// @param Space An isl space object, describing how to spilt the dimensions. -/// -/// @return An isl constraint representing this integer array. -isl_constraint *constraintFromMatrixRowFull(mpz_t *row, - __isl_take isl_space *Space) { - isl_constraint *c; - isl_ctx *ctx = isl_space_get_ctx(Space); - - unsigned NbOut = isl_space_dim(Space, isl_dim_out); - unsigned NbIn = isl_space_dim(Space, isl_dim_in); - unsigned NbParam = isl_space_dim(Space, isl_dim_param); - - isl_local_space *LSpace = isl_local_space_from_space(Space); - - if (SCOPVAL_zero_p(row[0])) - c = isl_equality_alloc(LSpace); - else - c = isl_inequality_alloc(LSpace); - - unsigned current_column = 1; - - isl_val *v; - - for (unsigned j = 0; j < NbOut; ++j) { - v = isl_val_int_from_gmp(ctx, row[current_column++]); - c = isl_constraint_set_coefficient_val(c, isl_dim_out, j, v); - } - - for (unsigned j = 0; j < NbIn; ++j) { - v = isl_val_int_from_gmp(ctx, row[current_column++]); - c = isl_constraint_set_coefficient_val(c, isl_dim_in, j, v); - } - - for (unsigned j = 0; j < NbParam; ++j) { - v = isl_val_int_from_gmp(ctx, row[current_column++]); - c = isl_constraint_set_coefficient_val(c, isl_dim_param, j, v); - } - - v = isl_val_int_from_gmp(ctx, row[current_column]); - c = isl_constraint_set_constant_val(c, v); - - return c; -} - -/// @brief Create an isl map from a ScopLib matrix. -/// -/// @param m The ScopLib matrix to translate. -/// @param Space The dimensions that are contained in the ScopLib matrix. -/// -/// @return An isl map representing m. -isl_map *mapFromMatrix(scoplib_matrix_p m, __isl_take isl_space *Space) { - isl_basic_map *bmap = isl_basic_map_universe(isl_space_copy(Space)); - - for (unsigned i = 0; i < m->NbRows; ++i) { - isl_constraint *c; - - c = constraintFromMatrixRowFull(m->p[i], isl_space_copy(Space)); - bmap = isl_basic_map_add_constraint(bmap, c); - } - - isl_space_free(Space); - - return isl_map_from_basic_map(bmap); -} - -/// @brief Create a new scattering for PollyStmt. -/// -/// @param m The matrix describing the new scattering. -/// @param PollyStmt The statement to create the scattering for. -/// -/// @return An isl_map describing the scattering. -isl_map *scatteringForStmt(scoplib_matrix_p m, ScopStmt *PollyStmt, - int scatteringDims) { - unsigned NbParam = PollyStmt->getNumParams(); - unsigned NbIterators = PollyStmt->getNumIterators(); - unsigned NbScattering; - - if (scatteringDims == -1) - NbScattering = m->NbColumns - 2 - NbParam - NbIterators; - else - NbScattering = scatteringDims; - - isl_ctx *ctx = PollyStmt->getParent()->getIslCtx(); - isl_space *Space = isl_dim_alloc(ctx, NbParam, NbIterators, NbScattering); - - isl_space *ParamSpace = PollyStmt->getParent()->getParamSpace(); - - // We need to copy the isl_ids for the parameter dimensions to the new - // map. Without doing this the current map would have different - // ids then the new one, even though both are named identically. - for (unsigned i = 0; i < isl_space_dim(Space, isl_dim_param); i++) { - isl_id *id = isl_space_get_dim_id(ParamSpace, isl_dim_param, i); - Space = isl_space_set_dim_id(Space, isl_dim_param, i, id); - } - - isl_space_free(ParamSpace); - - Space = isl_space_set_tuple_name(Space, isl_dim_out, "scattering"); - Space = isl_space_set_tuple_id(Space, isl_dim_in, PollyStmt->getDomainId()); - - if (scatteringDims == -1) - return mapFromMatrix(m, Space); - - return mapFromMatrix(m, Space, scatteringDims); -} - -unsigned maxScattering(scoplib_statement_p stmt) { - unsigned max = 0; - - while (stmt) { - max = std::max(max, stmt->schedule->NbRows); - stmt = stmt->next; - } - - return max; -} - -typedef Dependences::StatementToIslMapTy StatementToIslMapTy; - -void freeStmtToIslMap(StatementToIslMapTy *Map) { - for (StatementToIslMapTy::iterator MI = Map->begin(), ME = Map->end(); - MI != ME; ++MI) - isl_map_free(MI->second); - - delete (Map); -} - -/// @brief Read the new scattering from the scoplib description. -/// -/// @S The Scop to update -/// @OScop The ScopLib data structure describing the new scattering. -/// @return A map that contains for each Statement the new scattering. -StatementToIslMapTy *readScattering(Scop *S, scoplib_scop_p OScop) { - StatementToIslMapTy &NewScattering = *(new StatementToIslMapTy()); - - scoplib_statement_p stmt = OScop->statement; - - // Check if we have dimensions for each scattering or if each row - // represents a scattering dimension. - int numScatteringDims = -1; - ScopStmt *pollyStmt = *S->begin(); - - if (stmt->schedule->NbColumns == - 2 + pollyStmt->getNumParams() + pollyStmt->getNumIterators()) { - numScatteringDims = maxScattering(stmt); - } - - for (Scop::iterator SI = S->begin(), SE = S->end(); SI != SE; ++SI) { - if (!stmt) { - errs() << "Not enough statements available in ScopLib file\n"; - freeStmtToIslMap(&NewScattering); - return nullptr; - } - - NewScattering[*SI] = - scatteringForStmt(stmt->schedule, *SI, numScatteringDims); - stmt = stmt->next; - } - - if (stmt) { - errs() << "Too many statements in ScopLib file\n"; - freeStmtToIslMap(&NewScattering); - return nullptr; - } - - return &NewScattering; -} - -/// @brief Update the scattering in a Scop using the scoplib description of -/// the scattering. -bool ScopLib::updateScattering() { - if (!scoplib) - return false; - - StatementToIslMapTy *NewScattering = readScattering(PollyScop, scoplib); - - if (!NewScattering) - return false; - - if (!D->isValidScattering(NewScattering)) { - freeStmtToIslMap(NewScattering); - errs() << "ScopLib file contains a scattering that changes the " - << "dependences. Use -disable-polly-legality to continue anyways\n"; - return false; - } - - for (Scop::iterator SI = PollyScop->begin(), SE = PollyScop->end(); SI != SE; - ++SI) { - ScopStmt *Stmt = *SI; - - if (NewScattering->find(Stmt) != NewScattering->end()) - Stmt->setScattering(isl_map_copy((*NewScattering)[Stmt])); - } - - freeStmtToIslMap(NewScattering); - return true; -} -} - -#endif Index: lib/Exchange/ScopLibExporter.cpp =================================================================== --- lib/Exchange/ScopLibExporter.cpp +++ /dev/null @@ -1,93 +0,0 @@ -//===-- ScopLibExporter.cpp - Export Scops with scoplib ----------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Export the Scops build by ScopInfo pass to text file. -// -//===----------------------------------------------------------------------===// - -#include "polly/LinkAllPasses.h" - -#ifdef SCOPLIB_FOUND - -#include "polly/Options.h" -#include "polly/ScopInfo.h" -#include "polly/ScopPass.h" -#include "polly/ScopLib.h" - -#include "stdio.h" -#include "isl/set.h" -#include "isl/constraint.h" - -using namespace llvm; -using namespace polly; - -namespace { -static cl::opt - ExportDir("polly-export-scoplib-dir", - cl::desc("The directory to export the .scoplib files to."), - cl::Hidden, cl::value_desc("Directory path"), cl::ValueRequired, - cl::init("."), cl::cat(PollyCategory)); - -class ScopLibExporter : public ScopPass { - Scop *S; - - std::string getFileName(Scop *S) const; - -public: - static char ID; - explicit ScopLibExporter() : ScopPass(ID) {} - - virtual bool runOnScop(Scop &scop); - void getAnalysisUsage(AnalysisUsage &AU) const; -}; -} - -char ScopLibExporter::ID = 0; - -std::string ScopLibExporter::getFileName(Scop *S) const { - std::string FunctionName = S->getRegion().getEntry()->getParent()->getName(); - std::string FileName = FunctionName + "___" + S->getNameStr() + ".scoplib"; - return FileName; -} - -bool ScopLibExporter::runOnScop(Scop &scop) { - S = &scop; - Region *R = &S->getRegion(); - - std::string FileName = ExportDir + "/" + getFileName(S); - FILE *F = fopen(FileName.c_str(), "w"); - - if (!F) { - errs() << "Cannot open file: " << FileName << "\n"; - errs() << "Skipping export.\n"; - return false; - } - - ScopLib scoplib(S); - scoplib.print(F); - fclose(F); - - std::string FunctionName = R->getEntry()->getParent()->getName(); - errs() << "Writing Scop '" << R->getNameStr() << "' in function '" - << FunctionName << "' to '" << FileName << "'.\n"; - - return false; -} - -void ScopLibExporter::getAnalysisUsage(AnalysisUsage &AU) const { - ScopPass::getAnalysisUsage(AU); -} - -static RegisterPass - A("polly-export-scoplib", "Polly - Export Scops with ScopLib library" - " (Writes a .scoplib file for each Scop)"); - -Pass *polly::createScopLibExporterPass() { return new ScopLibExporter(); } - -#endif Index: lib/Exchange/ScopLibImporter.cpp =================================================================== --- lib/Exchange/ScopLibImporter.cpp +++ /dev/null @@ -1,116 +0,0 @@ -//===-- ScopLibImporter.cpp - Import Scops with scoplib. -----------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// Import modified .scop files into Polly. This allows to change the schedule of -// statements. -// -//===----------------------------------------------------------------------===// - -#include "polly/LinkAllPasses.h" - -#ifdef SCOPLIB_FOUND - -#include "polly/Dependences.h" -#include "polly/Options.h" -#include "polly/ScopInfo.h" -#include "polly/ScopLib.h" - -#define SCOPLIB_INT_T_IS_MP -#include "scoplib/scop.h" - -#include "isl/set.h" -#include "isl/constraint.h" - -using namespace llvm; -using namespace polly; - -namespace { -static cl::opt - ImportDir("polly-import-scoplib-dir", - cl::desc("The directory to import the .scoplib files from."), - cl::Hidden, cl::value_desc("Directory path"), cl::ValueRequired, - cl::init("."), cl::cat(PollyCategory)); - -static cl::opt - ImportPostfix("polly-import-scoplib-postfix", - cl::desc("Postfix to append to the import .scoplib files."), - cl::Hidden, cl::value_desc("File postfix"), cl::ValueRequired, - cl::init(""), cl::cat(PollyCategory)); - -struct ScopLibImporter : public RegionPass { - static char ID; - Scop *S; - Dependences *D; - explicit ScopLibImporter() : RegionPass(ID) {} - - bool updateScattering(Scop *S, scoplib_scop_p OScop); - std::string getFileName(Scop *S) const; - virtual bool runOnRegion(Region *R, RGPassManager &RGM); - virtual void print(raw_ostream &OS, const Module *) const; - void getAnalysisUsage(AnalysisUsage &AU) const; -}; -} - -char ScopLibImporter::ID = 0; - -namespace { -std::string ScopLibImporter::getFileName(Scop *S) const { - std::string FunctionName = S->getRegion().getEntry()->getParent()->getName(); - std::string FileName = FunctionName + "___" + S->getNameStr() + ".scoplib"; - return FileName; -} - -void ScopLibImporter::print(raw_ostream &OS, const Module *) const {} - -bool ScopLibImporter::runOnRegion(Region *R, RGPassManager &RGM) { - S = getAnalysis().getScop(); - D = &getAnalysis(); - - if (!S) - return false; - - std::string FileName = ImportDir + "/" + getFileName(S) + ImportPostfix; - FILE *F = fopen(FileName.c_str(), "r"); - - if (!F) { - errs() << "Cannot open file: " << FileName << "\n"; - errs() << "Skipping import.\n"; - return false; - } - - std::string FunctionName = R->getEntry()->getParent()->getName(); - errs() << "Reading Scop '" << R->getNameStr() << "' in function '" - << FunctionName << "' from '" << FileName << "'.\n"; - - ScopLib scoplib(S, F, D); - bool UpdateSuccessfull = scoplib.updateScattering(); - fclose(F); - - if (!UpdateSuccessfull) { - errs() << "Update failed" - << "\n"; - } - - return false; -} - -void ScopLibImporter::getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - AU.addRequired(); - AU.addRequired(); -} -} - -static RegisterPass - A("polly-import-scoplib", "Polly - Import Scops with ScopLib library" - " (Reads a .scoplib file for each Scop)"); - -Pass *polly::createScopLibImporterPass() { return new ScopLibImporter(); } - -#endif Index: lib/Makefile =================================================================== --- lib/Makefile +++ lib/Makefile @@ -31,13 +31,6 @@ POLLY_PLUTO_FILES= Transform/Pluto.cpp endif -ifeq ($(SCOPLIB_FOUND), yes) -POLLY_SCOPLIB_FILES= Exchange/ScopLib.cpp \ - Exchange/ScopLibExporter.cpp \ - Exchange/ScopLibImporter.cpp \ - Transform/Pocc.cpp -endif - ISL_CODEGEN_FILES= CodeGen/IslAst.cpp \ CodeGen/IslExprBuilder.cpp \ CodeGen/IslCodeGeneration.cpp @@ -74,8 +67,7 @@ ${ISL_CODEGEN_FILES} \ ${CLOOG_FILES} \ ${POLLY_JSON_FILES} \ - ${POLLY_PLUTO_FILES} \ - ${POLLY_SCOPLIB_FILES} + ${POLLY_PLUTO_FILES} # # Include Makefile.common so we know what to do. Index: lib/Support/RegisterPasses.cpp =================================================================== --- lib/Support/RegisterPasses.cpp +++ lib/Support/RegisterPasses.cpp @@ -51,9 +51,6 @@ #ifdef PLUTO_FOUND OPTIMIZER_PLUTO, #endif -#ifdef SCOPLIB_FOUND - OPTIMIZER_POCC, -#endif OPTIMIZER_ISL }; @@ -64,9 +61,6 @@ #ifdef PLUTO_FOUND clEnumValN(OPTIMIZER_PLUTO, "pluto", "The Pluto scheduling optimizer"), #endif -#ifdef SCOPLIB_FOUND - clEnumValN(OPTIMIZER_POCC, "pocc", "The PoCC scheduling optimizer"), -#endif clEnumValN(OPTIMIZER_ISL, "isl", "The isl scheduling optimizer"), clEnumValEnd), cl::Hidden, cl::init(OPTIMIZER_ISL), cl::ZeroOrMore, @@ -169,9 +163,6 @@ initializeJSONImporterPass(Registry); initializeIslAstInfoPass(Registry); initializeIslScheduleOptimizerPass(Registry); -#ifdef SCOPLIB_FOUND - initializePoccPass(Registry); -#endif initializePollyIndVarSimplifyPass(Registry); initializePollyCanonicalizePass(Registry); initializeScopDetectionPass(Registry); @@ -198,7 +189,7 @@ /// /// For certain parts of the Polly optimizer, several alternatives are provided: /// -/// As scheduling optimizer we support PoCC (http://pocc.sourceforge.net), PLUTO +/// As scheduling optimizer we support PLUTO /// (http://pluto-compiler.sourceforge.net) as well as the isl scheduling /// optimizer (http://freecode.com/projects/isl). The isl optimizer is the /// default optimizer. @@ -233,12 +224,6 @@ case OPTIMIZER_NONE: break; /* Do nothing */ -#ifdef SCOPLIB_FOUND - case OPTIMIZER_POCC: - PM.add(polly::createPoccPass()); - break; -#endif - #ifdef PLUTO_FOUND case OPTIMIZER_PLUTO: PM.add(polly::createPlutoOptimizerPass()); Index: lib/Transform/Pocc.cpp =================================================================== --- lib/Transform/Pocc.cpp +++ /dev/null @@ -1,282 +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" -#include "polly/ScopLib.h" -#include "llvm/Support/Debug.h" -#include "llvm/Support/Path.h" -#include "llvm/Support/Program.h" -#include "llvm/Support/MemoryBuffer.h" -#include "llvm/ADT/SmallString.h" - -#include "isl/space.h" -#include "isl/map.h" -#include "isl/constraint.h" - -#include -#include - -using namespace llvm; -using namespace polly; - -#define DEBUG_TYPE "polly-opt-pocc" - -static cl::opt 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 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(); - - // 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 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 (const char *Arg : arguments) - if (Arg) - errs() << " " << Arg; - 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 (ScopStmt *Stmt : S) { - isl_map *scat = Stmt->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 (ScopStmt *Stmt : S) { - isl_map *scat = Stmt->getScattering(); - int scatDims = Stmt->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)); - Stmt->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 { - std::unique_ptr stdoutBuffer; - std::unique_ptr stderrBuffer; - - OS << "Command line: "; - - for (const char *Arg : arguments) - if (Arg) - OS << " " << Arg; - - OS << "\n"; - - if (std::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 (std::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(); -} - -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 */ Index: www/documentation/passes.html =================================================================== --- www/documentation/passes.html +++ www/documentation/passes.html @@ -1,4 +1,4 @@ - @@ -29,16 +29,16 @@

Middle End