Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===-- SpeculateAnalyses.h  --*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
/// \file
9
/// Contains the Analyses and Result Interpretation to select likely functions
10
/// to Speculatively compile before they are called. [Purely Experimentation]
11
//===----------------------------------------------------------------------===//
12
 
13
#ifndef LLVM_EXECUTIONENGINE_ORC_SPECULATEANALYSES_H
14
#define LLVM_EXECUTIONENGINE_ORC_SPECULATEANALYSES_H
15
 
16
#include "llvm/Analysis/BranchProbabilityInfo.h"
17
#include "llvm/ExecutionEngine/Orc/Core.h"
18
#include "llvm/ExecutionEngine/Orc/Speculation.h"
19
 
20
#include <vector>
21
 
22
namespace llvm {
23
 
24
namespace orc {
25
 
26
// Provides common code.
27
class SpeculateQuery {
28
protected:
29
  void findCalles(const BasicBlock *, DenseSet<StringRef> &);
30
  bool isStraightLine(const Function &F);
31
 
32
public:
33
  using ResultTy = std::optional<DenseMap<StringRef, DenseSet<StringRef>>>;
34
};
35
 
36
// Direct calls in high frequency basic blocks are extracted.
37
class BlockFreqQuery : public SpeculateQuery {
38
  size_t numBBToGet(size_t);
39
 
40
public:
41
  // Find likely next executables based on IR Block Frequency
42
  ResultTy operator()(Function &F);
43
};
44
 
45
// This Query generates a sequence of basic blocks which follows the order of
46
// execution.
47
// A handful of BB with higher block frequencies are taken, then path to entry
48
// and end BB are discovered by traversing up & down the CFG.
49
class SequenceBBQuery : public SpeculateQuery {
50
  struct WalkDirection {
51
    bool Upward = true, Downward = true;
52
    // the block associated contain a call
53
    bool CallerBlock = false;
54
  };
55
 
56
public:
57
  using VisitedBlocksInfoTy = DenseMap<const BasicBlock *, WalkDirection>;
58
  using BlockListTy = SmallVector<const BasicBlock *, 8>;
59
  using BackEdgesInfoTy =
60
      SmallVector<std::pair<const BasicBlock *, const BasicBlock *>, 8>;
61
  using BlockFreqInfoTy =
62
      SmallVector<std::pair<const BasicBlock *, uint64_t>, 8>;
63
 
64
private:
65
  std::size_t getHottestBlocks(std::size_t TotalBlocks);
66
  BlockListTy rearrangeBB(const Function &, const BlockListTy &);
67
  BlockListTy queryCFG(Function &, const BlockListTy &);
68
  void traverseToEntryBlock(const BasicBlock *, const BlockListTy &,
69
                            const BackEdgesInfoTy &,
70
                            const BranchProbabilityInfo *,
71
                            VisitedBlocksInfoTy &);
72
  void traverseToExitBlock(const BasicBlock *, const BlockListTy &,
73
                           const BackEdgesInfoTy &,
74
                           const BranchProbabilityInfo *,
75
                           VisitedBlocksInfoTy &);
76
 
77
public:
78
  ResultTy operator()(Function &F);
79
};
80
 
81
} // namespace orc
82
} // namespace llvm
83
 
84
#endif // LLVM_EXECUTIONENGINE_ORC_SPECULATEANALYSES_H