//===-------------------- NVPTXAliasAnalysis.h ------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
/// \file
/// This is the NVPTX address space based alias analysis pass.
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIB_TARGET_NVPTX_NVPTXALIASANALYSIS_H
#define LLVM_LIB_TARGET_NVPTX_NVPTXALIASANALYSIS_H

#include "llvm/Analysis/AliasAnalysis.h"

namespace llvm {

class MemoryLocation;

class NVPTXAAResult : public AAResultBase {
public:
  NVPTXAAResult() {}
  NVPTXAAResult(NVPTXAAResult &&Arg) : AAResultBase(std::move(Arg)) {}

  /// Handle invalidation events from the new pass manager.
  ///
  /// By definition, this result is stateless and so remains valid.
  bool invalidate(Function &, const PreservedAnalyses &,
                  FunctionAnalysisManager::Invalidator &Inv) {
    return false;
  }

  AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB,
                    AAQueryInfo &AAQI, const Instruction *CtxI = nullptr);

  ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI,
                               bool IgnoreLocals);

  MemoryEffects getMemoryEffects(const CallBase *Call, AAQueryInfo &AAQI);

  MemoryEffects getMemoryEffects(const Function *F) {
    return MemoryEffects::unknown();
  }
};

/// Analysis pass providing a never-invalidated alias analysis result.
class NVPTXAA : public AnalysisInfoMixin<NVPTXAA> {
  friend AnalysisInfoMixin<NVPTXAA>;

  static AnalysisKey Key;

public:
  using Result = NVPTXAAResult;

  NVPTXAAResult run(Function &F, AnalysisManager<Function> &AM) {
    return NVPTXAAResult();
  }
};

/// Legacy wrapper pass to provide the NVPTXAAResult object.
class NVPTXAAWrapperPass : public ImmutablePass {
  std::unique_ptr<NVPTXAAResult> Result;

public:
  static char ID;

  NVPTXAAWrapperPass();

  NVPTXAAResult &getResult() { return *Result; }
  const NVPTXAAResult &getResult() const { return *Result; }

  bool doInitialization(Module &M) override {
    Result.reset(new NVPTXAAResult());
    return false;
  }

  bool doFinalization(Module &M) override {
    Result.reset();
    return false;
  }

  void getAnalysisUsage(AnalysisUsage &AU) const override;
};

// Wrapper around ExternalAAWrapperPass so that the default
// constructor gets the callback.
class NVPTXExternalAAWrapper : public ExternalAAWrapperPass {
public:
  static char ID;

  NVPTXExternalAAWrapper()
      : ExternalAAWrapperPass([](Pass &P, Function &, AAResults &AAR) {
          if (auto *WrapperPass =
                  P.getAnalysisIfAvailable<NVPTXAAWrapperPass>())
            AAR.addAAResult(WrapperPass->getResult());
        }) {}
};

ImmutablePass *createNVPTXAAWrapperPass();
ImmutablePass *createNVPTXExternalAAWrapperPass();

} // end namespace llvm

#endif // LLVM_LIB_TARGET_NVPTX_NVPTXALIASANALYSIS_H
