bool Interchange::runOnScop(Scop &S) { if (std::distance(S.begin(), S.end()) != 2) // One statement besides the final statement return false; for (Scop::iterator SI = S.begin(), SE = S.end(); SI != SE; ++SI) { ScopStmt *Stmt = *SI; if (!Stmt->isReduction()) continue; isl_map *Scattering = isl_map_copy(Stmt->getScattering()); const std::string MapString = "{scattering[i0, i1, i2, i3, i4] -> scattering[i0, i3, i2, i1, i4]}"; isl_map *Map = isl_map_read_from_str(Stmt->getIslContext(), MapString.c_str(), -1); isl_map_add_dims(Map, isl_dim_param, Stmt->getNumParams()); Scattering = isl_map_apply_range(Scattering, Map); Stmt->setScattering(Scattering); DEBUG( isl_printer *p = isl_printer_to_str(S.getCtx()); isl_printer_print_map(p, Scattering); dbgs() << isl_printer_get_str(p) << '\n'; isl_printer_flush(p); isl_printer_free(p); ); }
/// @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 OpenScop file\n"; freeStmtToIslMap(&NewScattering); return NULL; } NewScattering[*SI] = scatteringForStmt(stmt->schedule, *SI, numScatteringDims); stmt = stmt->next; } if (stmt) { errs() << "Too many statements in OpenScop file\n"; freeStmtToIslMap(&NewScattering); return NULL; } return &NewScattering; }