//===- MayAliasSet.h  - May-alias Set for Base Pointers ---------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines two classes: MayAliasSet and MayAliasSetInfo.
// MayAliasSet contains the base pointers of access functions in SCoP that
// may/must alias each others. And MayAliasSetInfo will compute and hold these
// MayAliasSets in every SCoP in a function.
//
// The difference between MayAliasSet and the original LLVM AliasSet is that
// the LLVM AliasSets are disjoint, but MayAliasSets are not.
//
// Suppose we have the following LLVM IR:
// define void @f(i32* noalias nocapture %a, i32* noalias nocapture %b)nounwind{
// bb.nph:
//   %0 = tail call i32 (...)* @rnd() nounwind
//   %1 = icmp eq i32 %0, 0
//   %ptr0 = select i1 %1, i32* %b, i32* %a
//   %2 = load i32* %ptr0, align 4
//   %3 = load i32* %a, align 4
//   %4 = load i32* %b, align 4
//   ret void
// }
//
// The LLVM AliasSetTracker constructs only one LLVM AliasSet that contains
// ptr0, a and b, but MayAliasSetInfo is supposed to build two MayAliasSets:
// {a, ptr0} and {b, ptr0}.
//
// Take the above LLVM IR for example, the MayAliasSetInfo builds two set:
// A: {a, ptr0} and B: {b, ptr0} and constructs base pointer to MayAliasSet
// mapping like:
// a -> A
// b -> B
// ptr0 -> A, B
//
// After that, SCoPInfo pass will build a access function for each MayAliasSet,
// so "%2 = load i32* %ptr0, align 4" will be translated to "read A" and
// "read B", while "%3 = load i32* %a, align 4" will be translated to "read A",
// and "%4 = load i32* %b, align 4" will be translated to "read B". This means
// we can treat the MayAliasSet as the identifier of the virtual array of memory
// access in SCoPs.
//
//===----------------------------------------------------------------------===//

#ifndef POLLY_MAY_ALIAS_SET_H
#define POLLY_MAY_ALIAS_SET_H

#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/Support/Allocator.h"
#include <map>

namespace llvm {
class Value;
class AliasAnalysis;
class raw_ostream;
}

using namespace llvm;

namespace polly {
class MayAliasSetInfo;
class TempScop;

//===----------------------------------------------------------------------===//
/// @brief MayAliasSet of pointers in SCoPs.
///
/// Note: Pointers in MayAliasSet only must-alias with each other now.
class MayAliasSet {
  // DO NOT IMPLEMENT
  MayAliasSet(const MayAliasSet &);
  // DO NOT IMPLEMENT
  const MayAliasSet &operator=(const MayAliasSet &);

  // TODO: Use CallbackVH to update the set when some base pointers are deleted
  // by some pass.
  SmallPtrSet<const Value *, 8> MustAliasPtrs;

  MayAliasSet() {}

  friend class MayAliasSetInfo;

public:

  /// @name Must Alias Pointer Iterators
  ///
  /// These iterators iterate over all must alias pointers in the set.
  //@{
  typedef SmallPtrSetIterator<const Value *> const_iterator;
  const_iterator mustalias_begin() const { return MustAliasPtrs.begin(); }
  const_iterator mustalias_end() const { return MustAliasPtrs.end(); }
  //@}

  /// @brief Add a must alias pointer to this set.
  ///
  /// @param V The pointer to add.
  void addMustAliasPtr(const Value *V) { MustAliasPtrs.insert(V); }

  void print(raw_ostream &OS) const;
  void dump() const;
};

//===----------------------------------------------------------------------===//
/// @brief Compute and manage the may-alias sets in a TempSCoP or SCoP.
class MayAliasSetInfo {
  // DO NOT IMPLEMENT
  MayAliasSetInfo(const MayAliasSetInfo &);
  // DO NOT IMPLEMENT
  const MayAliasSetInfo &operator=(const MayAliasSetInfo &);

  SpecificBumpPtrAllocator<MayAliasSet> MayASAllocator;

  // Mapping the pointers to their may-alias sets.
  typedef std::multimap<const Value *, MayAliasSet *> MayAliasSetMapType;
  MayAliasSetMapType BasePtrMap;

public:
  MayAliasSetInfo() {}

  /// @name MayAliasSet Iterators
  ///
  /// These iterators iterate over all may-alias sets referring to a base
  /// pointer.
  //@{
  typedef MayAliasSetMapType::iterator alias_iterator;
  typedef MayAliasSetMapType::const_iterator const_alias_iterator;

  alias_iterator alias_begin(const Value *BasePtr) {
    return BasePtrMap.lower_bound(BasePtr);
  }

  alias_iterator alias_end(const Value *BasePtr) {
    return BasePtrMap.upper_bound(BasePtr);
  }

  const_alias_iterator alias_begin(const Value *BasePtr) const {
    return BasePtrMap.lower_bound(BasePtr);
  }

  const_alias_iterator alias_end(const Value *BasePtr) const {
    return BasePtrMap.upper_bound(BasePtr);
  }
  //@}

  /// @brief Build MayAliasSets in a SCoP.
  ///
  /// @param Scop The SCoP to build MayAliasSets in.
  /// @param AA   The AliasAnalaysis provides the alias information.
  void buildMayAliasSets(TempScop &Scop, AliasAnalysis &AA);
};
}

#endif
