//===-- SpeculateAnalyses.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
/// Contains the Analyses and Result Interpretation to select likely functions
/// to Speculatively compile before they are called. [Purely Experimentation]
//===----------------------------------------------------------------------===//

#ifndef LLVM_EXECUTIONENGINE_ORC_SPECULATEANALYSES_H
#define LLVM_EXECUTIONENGINE_ORC_SPECULATEANALYSES_H

#include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/ExecutionEngine/Orc/Core.h"
#include "llvm/ExecutionEngine/Orc/Speculation.h"

#include <vector>

namespace llvm {

namespace orc {

// Provides common code.
class SpeculateQuery {
protected:
  void findCalles(const BasicBlock *, DenseSet<StringRef> &);
  bool isStraightLine(const Function &F);

public:
  using ResultTy = Optional<DenseMap<StringRef, DenseSet<StringRef>>>;
};

// Direct calls in high frequency basic blocks are extracted.
class BlockFreqQuery : public SpeculateQuery {
  size_t numBBToGet(size_t);

public:
  // Find likely next executables based on IR Block Frequency
  ResultTy operator()(Function &F);
};

// This Query generates a sequence of basic blocks which follows the order of
// execution.
// A handful of BB with higher block frequencies are taken, then path to entry
// and end BB are discovered by traversing up & down the CFG.
class SequenceBBQuery : public SpeculateQuery {
  struct WalkDirection {
    bool Upward = true, Downward = true;
    // the block associated contain a call
    bool CallerBlock = false;
  };

public:
  using VisitedBlocksInfoTy = DenseMap<const BasicBlock *, WalkDirection>;
  using BlockListTy = SmallVector<const BasicBlock *, 8>;
  using BackEdgesInfoTy =
      SmallVector<std::pair<const BasicBlock *, const BasicBlock *>, 8>;
  using BlockFreqInfoTy =
      SmallVector<std::pair<const BasicBlock *, uint64_t>, 8>;

private:
  std::size_t getHottestBlocks(std::size_t TotalBlocks);
  BlockListTy rearrangeBB(const Function &, const BlockListTy &);
  BlockListTy queryCFG(Function &, const BlockListTy &);
  void traverseToEntryBlock(const BasicBlock *, const BlockListTy &,
                            const BackEdgesInfoTy &,
                            const BranchProbabilityInfo *,
                            VisitedBlocksInfoTy &);
  void traverseToExitBlock(const BasicBlock *, const BlockListTy &,
                           const BackEdgesInfoTy &,
                           const BranchProbabilityInfo *,
                           VisitedBlocksInfoTy &);

public:
  ResultTy operator()(Function &F);
};

} // namespace orc
} // namespace llvm

#endif // LLVM_EXECUTIONENGINE_ORC_SPECULATEANALYSES_H
