#ifndef __ALIAS__HELPER__H
#define __ALIAS__HELPER__H

#include "CommonTypes.hpp"
#include <stddef.h>

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

enum AliasType
{
  NoAlias,
  MayAlias,
  MustAlias
};

class AliasHelper
{
public:
  AliasHelper(llvm::AliasAnalysis &AA);

  bool alias(const llvm::Value * v1,
             const llvm::Value * v2,
             AliasType t);
  bool alias(const llvm::Value * v,
             const value_set & vs,
             AliasType t);
  bool alias(const value_set & vs,
             const llvm::Value * v,
             AliasType t);
  bool alias(const value_set & vs1,
             const value_set & vs2,
             AliasType t);

private:
  bool must_alias(const llvm::Value* v1, size_t v1size,
                  const llvm::Value* v2, size_t v2size);
  bool may_alias(const llvm::Value* v1, size_t v1size,
                 const llvm::Value* v2, size_t v2size);
  bool no_alias(const llvm::Value* v1, size_t v1size,
                const llvm::Value* v2, size_t v2size);

private:
  llvm::AliasAnalysis &_AA;
};
#endif // __ALIAS__HELPER__H
