8 #include "core/block.h"
10 #include "core/constant.h"
11 #include "core/func.h"
12 #include "core/inst_visitor.h"
13 #include "core/insts.h"
14 #include "core/prog.h"
15 #include "passes/sccp/lattice.h"
36 void Visit(
Block *block)
38 for (
auto &inst : *block) {
44 void Visit(
Inst &inst)
46 assert(executable_.count(inst.
getParent()) &&
"bb not yet visited");
51 bool CanEvaluate(CallSite &site);
53 void MarkOverdefinedCall(TailCallInst &site);
55 void MarkCall(CallSite &site,
Func &callee,
Block *cont);
58 bool MarkBlock(
Block *block);
62 bool MarkOverdefined(
Inst &inst)
65 for (
unsigned i = 0, n = inst.
GetNumRets(); i < n; ++i) {
76 void VisitArgInst(ArgInst &inst)
override;
77 void VisitCallInst(CallInst &inst)
override;
78 void VisitTailCallInst(TailCallInst &inst)
override;
79 void VisitInvokeInst(InvokeInst &inst)
override;
80 void VisitReturnInst(ReturnInst &inst)
override;
81 void VisitLoadInst(LoadInst &inst)
override;
82 void VisitBinaryInst(BinaryInst &inst)
override;
83 void VisitCmpInst(CmpInst &inst)
override;
84 void VisitUnaryInst(UnaryInst &inst)
override;
85 void VisitJumpInst(JumpInst &inst)
override;
86 void VisitJumpCondInst(JumpCondInst &inst)
override;
87 void VisitSwitchInst(SwitchInst &inst)
override;
88 void VisitSelectInst(SelectInst &inst)
override;
89 void VisitFrameInst(FrameInst &inst)
override;
90 void VisitMovInst(
MovInst &inst)
override;
91 void VisitUndefInst(UndefInst &inst)
override;
92 void VisitPhiInst(
PhiInst &inst)
override;
93 void VisitInst(
Inst &inst)
override;
95 void VisitX86_CpuIdInst(X86_CpuIdInst &inst)
override;
102 std::queue<Inst *> bottomList_;
104 std::queue<Block *> blockList_;
106 std::queue<Inst *> instList_;
109 std::unordered_map<Ref<Inst>,
Lattice> values_;
111 std::set<std::pair<Block *, Block *>> edges_;
113 std::set<const Block *> executable_;
115 std::map<const Func *, std::map<unsigned, std::set<ArgInst *>>> args_;
117 std::map<const Func *, std::set<std::pair<CallSite *, Block *>>> calls_;
119 using ResultMap = std::map<unsigned, std::pair<Type, Lattice>>;
121 std::map<const Func *, ResultMap> returns_;