blob: 68fa287228405227cab8d4d241617699b8d7dd2c [file] [log] [blame]
//===- 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