//===- llvm/Analysis/LoopDependenceAnalysis.h --------------- -*- C++ -*---===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// LoopDependenceAnalysis is an LLVM pass that analyses dependences in memory
// accesses in loops.
//
// Please note that this is work in progress and the interface is subject to
// change.
//
// TODO: adapt as interface progresses
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_ANALYSIS_LOOP_DEPENDENCE_ANALYSIS_H
#define LLVM_ANALYSIS_LOOP_DEPENDENCE_ANALYSIS_H

#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Analysis/LoopPass.h"
#include "llvm/Support/Allocator.h"

namespace llvm {

class AliasAnalysis;
class AnalysisUsage;
class ScalarEvolution;
class SCEV;
class Value;
class raw_ostream;

class LoopDependenceAnalysis : public LoopPass {
  AliasAnalysis *AA;
  ScalarEvolution *SE;

  /// L - The loop we are currently analysing.
  Loop *L;

  /// TODO: doc
  enum DependenceResult { Independent = 0, Dependent = 1, Unknown = 2 };

  /// TODO: doc
  struct Subscript {
    /// TODO: Add distance, direction, breaking conditions, ...
  };

  /// DependencePair - Represents a data dependence relation between to memory
  /// reference instructions.
  struct DependencePair : public FastFoldingSetNode {
    Value *A;
    Value *B;
    DependenceResult Result;
    SmallVector<Subscript, 4> Subscripts;

    DependencePair(const FoldingSetNodeID &ID, Value *a, Value *b) :
        FastFoldingSetNode(ID), A(a), B(b), Result(Unknown), Subscripts() {}
  };

  /// findOrInsertDependencePair - Return true if a DependencePair for the
  /// given Values already exists, false if a new DependencePair had to be
  /// created. The third argument is set to the pair found or created.
  bool findOrInsertDependencePair(Value*, Value*, DependencePair*&);

  /// getLoops - Collect all loops of the loop nest L in which
  /// a given SCEV is variant.
  void getLoops(const SCEV*, DenseSet<const Loop*>*) const;

  /// isLoopInvariant - True if a given SCEV is invariant in all loops of the
  /// loop nest starting at the innermost loop L.
  bool isLoopInvariant(const SCEV*) const;

  /// isAffine - An SCEV is affine with respect to the loop nest starting at
  /// the innermost loop L if it is of the form A+B*X where A, B are invariant
  /// in the loop nest and X is a induction variable in the loop nest.
  bool isAffine(const SCEV*) const;

  /// TODO: doc
  bool isZIVPair(const SCEV*, const SCEV*) const;
  bool isSIVPair(const SCEV*, const SCEV*) const;
  DependenceResult analyseZIV(const SCEV*, const SCEV*, Subscript*) const;
  DependenceResult analyseSIV(const SCEV*, const SCEV*, Subscript*) const;
  DependenceResult analyseMIV(const SCEV*, const SCEV*, Subscript*) const;
  DependenceResult analyseSubscript(const SCEV*, const SCEV*, Subscript*) const;
  DependenceResult analysePair(DependencePair*) const;

public:
  static char ID; // Class identification, replacement for typeinfo
  LoopDependenceAnalysis() : LoopPass(ID) {
    initializeLoopDependenceAnalysisPass(*PassRegistry::getPassRegistry());
  }

  /// isDependencePair - Check whether two values can possibly give rise to
  /// a data dependence: that is the case if both are instructions accessing
  /// memory and at least one of those accesses is a write.
  bool isDependencePair(const Value*, const Value*) const;

  /// depends - Return a boolean indicating if there is a data dependence
  /// between two instructions.
  bool depends(Value*, Value*);

  bool runOnLoop(Loop*, LPPassManager&);
  virtual void releaseMemory();
  virtual void getAnalysisUsage(AnalysisUsage&) const;
  void print(raw_ostream&, const Module* = 0) const;

private:
  FoldingSet<DependencePair> Pairs;
  BumpPtrAllocator PairAllocator;
}; // class LoopDependenceAnalysis

// createLoopDependenceAnalysisPass - This creates an instance of the
// LoopDependenceAnalysis pass.
//
LoopPass *createLoopDependenceAnalysisPass();

} // namespace llvm

#endif /* LLVM_ANALYSIS_LOOP_DEPENDENCE_ANALYSIS_H */
