llir-opt  0.0.1
Low-Level Post-Link Optimiser for OCaml and C
symbolic_frame.h
1 // This file if part of the llir-opt project.
2 // Licensing information can be found in the LICENSE file.
3 // (C) 2018 Nandor Licker. All rights reserved.
4 
5 #pragma once
6 
7 #include <map>
8 #include <set>
9 #include <unordered_map>
10 
11 #include <llvm/ADT/iterator.h>
12 #include <llvm/ADT/iterator_range.h>
13 
14 #include "core/dag.h"
15 #include "core/func.h"
16 #include "passes/pre_eval/symbolic_value.h"
17 
18 class SymbolicContext;
19 class SymbolicFrameObject;
20 class SymbolicFrame;
21 class MemoryStoreInst;
22 class SymbolicSummary;
23 
24 
25 
30 public:
32  using ObjectMap = std::map<unsigned, ID<SymbolicObject>>;
33 
35  struct object_iterator : llvm::iterator_adaptor_base
36  < object_iterator
37  , ObjectMap::const_iterator
38  , std::random_access_iterator_tag
39  , ID<SymbolicObject>
40  >
41  {
42  explicit object_iterator(ObjectMap::const_iterator it)
43  : iterator_adaptor_base(it)
44  {
45  }
46 
47  ID<SymbolicObject> operator*() const { return this->I->second; }
48  ID<SymbolicObject> operator->() const { return operator*(); }
49  };
50 
51 public:
54  SymbolicSummary &ctx,
55  DAGFunc &func,
56  unsigned index,
57  llvm::ArrayRef<SymbolicValue> args,
58  llvm::ArrayRef<ID<SymbolicObject>> objects
59  );
60 
63  SymbolicSummary &ctx,
64  unsigned index,
65  llvm::ArrayRef<ID<SymbolicObject>> objects
66  );
67 
69  Func *GetFunc() { return func_ ? &func_->GetFunc() : nullptr; }
71  const Func *GetFunc() const
72  {
73  return const_cast<SymbolicFrame *>(this)->GetFunc();
74  }
75 
77  ID<SymbolicFrame> GetIndex() const { return index_; }
78 
80  void Leave();
82  bool IsValid() const { return valid_; }
83 
89  bool Set(Ref<Inst> i, const SymbolicValue &value);
90 
92  const SymbolicValue &Find(ConstRef<Inst> inst);
95 
97  unsigned GetNumArgs() const { return args_.size(); }
98 
100  const SymbolicValue &Arg(unsigned index) { return args_[index]; }
101 
103  ID<SymbolicObject> GetObject(unsigned object);
104 
106  void Merge(const SymbolicFrame &that);
107 
112  bool FindBypassed(
113  std::set<DAGBlock *> &nodes,
114  std::set<SymbolicContext *> &ctx,
115  DAGBlock *start,
116  DAGBlock *end
117  );
118 
121  std::set<DAGBlock *> &nodes,
122  std::set<SymbolicContext *> &ctx,
123  Block *start,
124  Block *end)
125  {
126  return FindBypassed(nodes, ctx, GetNode(start), GetNode(end));
127  }
128 
131 
133  Block *GetCurrentBlock() const { return current_; }
134 
136  DAGBlock *GetNode(Block *block) { return (*func_)[block]; }
137 
139  bool Limited(Block *block);
141  void Continue(Block *node);
142 
144  void Bypass(DAGBlock *node, const SymbolicContext &ctx);
145 
147  bool IsBypassed(Block *node) { return IsBypassed(GetNode(node)); }
149  bool IsBypassed(DAGBlock *node) { return bypass_.find(node) != bypass_.end(); }
151  bool IsExecuted(Block *block) { return executed_.count(block); }
153  void Approximate(Block *block) { executed_.insert(block); }
154 
156  DAGBlock *Find(Block *block) { return (*func_)[block]; }
157 
159  llvm::iterator_range<DAGFunc::node_iterator> nodes()
160  {
161  return llvm::make_range(func_->begin(), func_->end());
162  }
163 
165  object_iterator object_begin() { return object_iterator(objects_.begin()); }
166  object_iterator object_end() { return object_iterator(objects_.end()); }
167  llvm::iterator_range<object_iterator> objects()
168  {
169  return llvm::make_range(object_begin(), object_end());
170  }
171 
172 private:
174  SymbolicSummary &state_;
176  DAGFunc *func_;
178  unsigned index_;
180  bool valid_;
182  std::vector<SymbolicValue> args_;
184  ObjectMap objects_;
186  std::unordered_map<ConstRef<Inst>, SymbolicValue> values_;
188  Block *current_;
190  std::unordered_map<DAGBlock *, std::shared_ptr<SymbolicContext>> bypass_;
192  std::set<Block *> executed_;
194  std::unordered_map<Block *, unsigned> counts_;
195 };
SymbolicFrame::ObjectMap
std::map< unsigned, ID< SymbolicObject > > ObjectMap
Mapping from indices to frame objects.
Definition: symbolic_frame.h:32
SymbolicContext
Definition: symbolic_context.h:28
SymbolicFrame::Limited
bool Limited(Block *block)
Check whether the counter of a loop expired.
Definition: symbolic_frame.cpp:163
Func
Definition: func.h:30
SymbolicFrame::SymbolicFrame
SymbolicFrame(SymbolicSummary &ctx, DAGFunc &func, unsigned index, llvm::ArrayRef< SymbolicValue > args, llvm::ArrayRef< ID< SymbolicObject >> objects)
Create a new frame.
Definition: symbolic_frame.cpp:22
SymbolicValue
Definition: symbolic_value.h:24
SymbolicFrame::GetFunc
const Func * GetFunc() const
Return the function.
Definition: symbolic_frame.h:71
SymbolicFrame::IsExecuted
bool IsExecuted(Block *block)
Check whether the nodes was executed.
Definition: symbolic_frame.h:151
ConstRef< Inst >
SymbolicFrame::Approximate
void Approximate(Block *block)
Mask a node as approximated.
Definition: symbolic_frame.h:153
SymbolicFrame::FindBypassed
bool FindBypassed(std::set< DAGBlock * > &nodes, std::set< SymbolicContext * > &ctx, Block *start, Block *end)
Find bypasses for a node pair.
Definition: symbolic_frame.h:120
SymbolicFrame::Leave
void Leave()
De-activate the frame.
Definition: symbolic_frame.cpp:58
ID< SymbolicObject >
DAGFunc
Definition: dag.h:75
SymbolicFrame::GetNode
DAGBlock * GetNode(Block *block)
Return the node for a block.
Definition: symbolic_frame.h:136
SymbolicFrame::IsBypassed
bool IsBypassed(Block *node)
Check whether the node was bypassed.
Definition: symbolic_frame.h:147
SymbolicSummary
Definition: symbolic_summary.h:17
SymbolicFrame::Arg
const SymbolicValue & Arg(unsigned index)
Return the value of an argument.
Definition: symbolic_frame.h:100
SymbolicFrame::IsValid
bool IsValid() const
Check if the frame is valid.
Definition: symbolic_frame.h:82
SymbolicFrame::IsBypassed
bool IsBypassed(DAGBlock *node)
Check whether the node was bypassed.
Definition: symbolic_frame.h:149
SymbolicFrame::GetNumArgs
unsigned GetNumArgs() const
Returns the number of arguments.
Definition: symbolic_frame.h:97
SymbolicFrame::Find
const SymbolicValue & Find(ConstRef< Inst > inst)
Return the value an instruction was mapped to.
Definition: symbolic_frame.cpp:86
SymbolicFrame::nodes
llvm::iterator_range< DAGFunc::node_iterator > nodes()
Iterator over the nodes of the function.
Definition: symbolic_frame.h:159
SymbolicFrame::object_iterator
Iterator over objects.
Definition: symbolic_frame.h:35
SymbolicFrame::GetBypass
SymbolicContext * GetBypass(DAGBlock *node)
Return the bypassed context for the current node.
Definition: symbolic_frame.cpp:156
SymbolicFrame::Set
bool Set(Ref< Inst > i, const SymbolicValue &value)
Definition: symbolic_frame.cpp:68
Ref
Definition: ref.h:63
SymbolicFrame::GetObject
ID< SymbolicObject > GetObject(unsigned object)
Return a specific object.
Definition: symbolic_frame.cpp:105
SymbolicFrame::FindBypassed
bool FindBypassed(std::set< DAGBlock * > &nodes, std::set< SymbolicContext * > &ctx, DAGBlock *start, DAGBlock *end)
Definition: symbolic_frame.cpp:128
SymbolicFrame
Definition: symbolic_frame.h:29
SymbolicFrame::Continue
void Continue(Block *node)
Enter a node for execution.
Definition: symbolic_frame.cpp:169
Block
Definition: block.h:29
SymbolicFrame::FindOpt
const SymbolicValue * FindOpt(ConstRef< Inst > inst)
Return the value, if it was already defined.
Definition: symbolic_frame.cpp:94
SymbolicFrame::Bypass
void Bypass(DAGBlock *node, const SymbolicContext &ctx)
Bypass a node.
Definition: symbolic_frame.cpp:176
DAGBlock
Definition: dag.h:20
SymbolicFrame::GetIndex
ID< SymbolicFrame > GetIndex() const
Return the index.
Definition: symbolic_frame.h:77
SymbolicFrame::object_begin
object_iterator object_begin()
Iterator over objects.
Definition: symbolic_frame.h:165
SymbolicFrame::Merge
void Merge(const SymbolicFrame &that)
Merges another frame into this one.
Definition: symbolic_frame.cpp:113
SymbolicFrame::Find
DAGBlock * Find(Block *block)
Find the node which contains a block.
Definition: symbolic_frame.h:156
SymbolicFrame::GetCurrentBlock
Block * GetCurrentBlock() const
Return the current node.
Definition: symbolic_frame.h:133
SymbolicFrame::GetFunc
Func * GetFunc()
Return the function.
Definition: symbolic_frame.h:69