//===------ DeLICM.cpp -----------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // Undo the effect of Loop Invariant Code Motion (LICM) and // GVN Partial Redundancy Elimination (PRE) on SCoP-level. // // Namely, remove register/scalar dependencies by mapping them back to array // elements. // //===----------------------------------------------------------------------===// #include "polly/DeLICM.h" #include "polly/ScopInfo.h" #include "polly/ScopPass.h" #define DEBUG_TYPE "polly-delicm" using namespace polly; using namespace llvm; namespace { class DeLICM : public ScopPass { private: DeLICM(const DeLICM &) = delete; const DeLICM &operator=(const DeLICM &) = delete; public: static char ID; explicit DeLICM() : ScopPass(ID) {} virtual void getAnalysisUsage(AnalysisUsage &AU) const override { AU.addRequiredTransitive(); AU.setPreservesAll(); } virtual bool runOnScop(Scop &S) override { // Free resources for previous scop's computation, if not yet done. releaseMemory(); // TODO: Run DeLICM algorithm return false; } virtual void printScop(raw_ostream &OS, Scop &S) const override { OS << "DeLICM result:\n"; // TODO: Print analysis results and performed transformation details } virtual void releaseMemory() override { // TODO: Release resources (eg. shared_ptr to isl_ctx) } }; char DeLICM::ID; } // anonymous namespace Pass *polly::createDeLICMPass() { return new DeLICM(); } INITIALIZE_PASS_BEGIN(DeLICM, "polly-delicm", "Polly - DeLICM/DePRE", false, false) INITIALIZE_PASS_DEPENDENCY(ScopInfoWrapperPass) INITIALIZE_PASS_END(DeLICM, "polly-delicm", "Polly - DeLICM/DePRE", false, false)