llir-opt  0.0.1
Low-Level Post-Link Optimiser for OCaml and C
step.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 "core/inst_visitor.h"
8 #include "core/target.h"
9 #include "passes/tags/tagged_type.h"
10 
11 
12 
13 namespace tags {
14 
15 class RegisterAnalysis;
16 
20 class Step final : public InstVisitor<void> {
21 public:
22  enum class Kind {
23  REFINE,
24  FORWARD,
25  };
26 
27 public:
28  Step(RegisterAnalysis &analysis, const Target *target, Kind kind)
29  : analysis_(analysis)
30  , target_(target)
31  , kind_(kind)
32  {}
33 
34 private:
35  void VisitCallSite(CallSite &i) override;
36  void VisitMovInst(MovInst &i) override;
37  void VisitAddInst(AddInst &i) override;
38  void VisitSubInst(SubInst &i) override;
39  void VisitMulInst(MulInst &i) override;
40  void VisitMultiplyInst(MultiplyInst &i) override;
41  void VisitDivisionRemainderInst(DivisionRemainderInst &i) override;
42  void VisitAndInst(AndInst &i) override;
43  void VisitXorInst(XorInst &i) override;
44  void VisitOrInst(OrInst &i) override;
45  void VisitShiftRightInst(ShiftRightInst &i) override;
46  void VisitSllInst(SllInst &i) override;
47  void VisitRotlInst(RotlInst &i) override;
48  void VisitExtensionInst(ExtensionInst &i) override;
49  void VisitTruncInst(TruncInst &i) override;
50  void VisitBitCastInst(BitCastInst &i) override;
51  void VisitByteSwapInst(ByteSwapInst &i) override;
52  void VisitMemoryExchangeInst(MemoryExchangeInst &i) override;
53  void VisitMemoryCompareExchangeInst(MemoryCompareExchangeInst &i) override;
54  void VisitCmpInst(CmpInst &i) override;
55  void VisitSelectInst(SelectInst &i) override;
56  void VisitPhiInst(PhiInst &i) override;
57  void VisitReturnInst(ReturnInst &i) override;
58 
59  // Instructions with no effect.
60  void VisitTerminatorInst(TerminatorInst &i) override {}
61  void VisitSetInst(SetInst &i) override {}
62  void VisitX86_OutInst(X86_OutInst &i) override {}
63  void VisitX86_WrMsrInst(X86_WrMsrInst &i) override {}
64  void VisitX86_LidtInst(X86_LidtInst &i) override {}
65  void VisitX86_LgdtInst(X86_LgdtInst &i) override {}
66  void VisitX86_LtrInst(X86_LtrInst &i) override {}
67  void VisitX86_FPUControlInst(X86_FPUControlInst &i) override {}
68 
69  // Values do not change since init.
70  void VisitArgInst(ArgInst &i) override {}
71  void VisitLandingPadInst(LandingPadInst &i) override {}
72  void VisitLoadInst(LoadInst &i) override {}
73  void VisitBitCountInst(BitCountInst &i) override {}
74  void VisitVaStartInst(VaStartInst &i) override {}
75  void VisitFrameInst(FrameInst &i) override {}
76  void VisitAllocaInst(AllocaInst &i) override {}
77  void VisitGetInst(GetInst &i) override {}
78  void VisitUndefInst(UndefInst &i) override {}
79  void VisitCopySignInst(CopySignInst &i) override {}
80  void VisitFloatInst(FloatInst &i) override {}
81  void VisitX86_RdTscInst(X86_RdTscInst &i) override {}
82  void VisitStoreInst(StoreInst &i) override {}
83  void VisitNegInst(NegInst &i) override {}
84  void VisitRotateInst(RotateInst &i) override {}
85  void VisitSyscallInst(SyscallInst &i) override {}
86  void VisitCloneInst(CloneInst &i) override {}
87 
88  // All instruction classes should be handled.
89  void VisitInst(Inst &i) override;
90 
91 private:
92  TaggedType Infer(Type ty);
93  TaggedType Clamp(TaggedType type, Type ty);
94  TaggedType Add(TaggedType vl, TaggedType vr);
95  TaggedType Mul(TaggedType vl, TaggedType vr);
96  TaggedType Sub(TaggedType vl, TaggedType vr);
97  TaggedType And(Type ty, TaggedType vl, TaggedType vr);
98  TaggedType Xor(TaggedType vl, TaggedType vr);
99  TaggedType Or(TaggedType vl, TaggedType vr);
100  TaggedType Shr(Type ty, TaggedType vl, TaggedType vr);
101  TaggedType Shl(Type ty, TaggedType vl, TaggedType vr);
102  TaggedType Ext(Type ty, TaggedType arg);
103  TaggedType Trunc(Type ty, TaggedType arg);
104 
105 private:
107  bool Mark(Ref<Inst> inst, const TaggedType &type);
109  void Return(
110  Func *from,
111  const Inst *inst,
112  const std::vector<TaggedType> &values
113  );
114 private:
116  RegisterAnalysis &analysis_;
118  const Target *target_;
120  Kind kind_;
121 };
122 
123 } // end namespace
Inst
Definition: inst.h:53
Func
Definition: func.h:30
Target
Definition: target.h:24
tags::Step
Definition: step.h:20
MovInst
Definition: mov.h:17
tags::RegisterAnalysis
Definition: register_analysis.h:37
InstVisitor
Definition: inst_visitor.h:15
Ref
Definition: ref.h:63
tags::TaggedType
Definition: tagged_type.h:17
PhiInst
Definition: phi.h:14