annotate lib/Target/Lanai/LanaiInstrInfo.h @ 145:9987f868744e

fix CbC_llvm
author mir3636
date Tue, 05 Jun 2018 21:59:34 +0900
parents 3a76565eade5
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
1 //===- LanaiInstrInfo.h - Lanai Instruction Information ---------*- C++ -*-===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
2 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
4 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
7 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
9 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
10 // This file contains the Lanai implementation of the TargetInstrInfo class.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
11 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
13
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
14 #ifndef LLVM_LIB_TARGET_LANAI_LANAIINSTRINFO_H
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
15 #define LLVM_LIB_TARGET_LANAI_LANAIINSTRINFO_H
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
16
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
17 #include "LanaiRegisterInfo.h"
134
3a76565eade5 update 5.0.1
mir3636
parents: 120
diff changeset
18 #include "llvm/CodeGen/TargetInstrInfo.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
19
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
20 #define GET_INSTRINFO_HEADER
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
21 #include "LanaiGenInstrInfo.inc"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
22
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
23 namespace llvm {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
24
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
25 class LanaiInstrInfo : public LanaiGenInstrInfo {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
26 const LanaiRegisterInfo RegisterInfo;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
27
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
28 public:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
29 LanaiInstrInfo();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
30
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
31 // getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
32 // such, whenever a client has an instance of instruction info, it should
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
33 // always be able to get register info as well (through this method).
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
34 virtual const LanaiRegisterInfo &getRegisterInfo() const {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
35 return RegisterInfo;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
36 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
37
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
38 bool areMemAccessesTriviallyDisjoint(MachineInstr &MIa, MachineInstr &MIb,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
39 AliasAnalysis *AA) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
40
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
41 unsigned isLoadFromStackSlot(const MachineInstr &MI,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
42 int &FrameIndex) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
43
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
44 unsigned isLoadFromStackSlotPostFE(const MachineInstr &MI,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
45 int &FrameIndex) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
46
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
47 unsigned isStoreToStackSlot(const MachineInstr &MI,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
48 int &FrameIndex) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
49
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
50 void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator Position,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
51 const DebugLoc &DL, unsigned DestinationRegister,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
52 unsigned SourceRegister, bool KillSource) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
53
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
54 void
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
55 storeRegToStackSlot(MachineBasicBlock &MBB,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
56 MachineBasicBlock::iterator Position,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
57 unsigned SourceRegister, bool IsKill, int FrameIndex,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
58 const TargetRegisterClass *RegisterClass,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
59 const TargetRegisterInfo *RegisterInfo) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
60
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
61 void
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
62 loadRegFromStackSlot(MachineBasicBlock &MBB,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
63 MachineBasicBlock::iterator Position,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
64 unsigned DestinationRegister, int FrameIndex,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
65 const TargetRegisterClass *RegisterClass,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
66 const TargetRegisterInfo *RegisterInfo) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
67
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
68 bool expandPostRAPseudo(MachineInstr &MI) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
69
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
70 bool getMemOpBaseRegImmOfs(MachineInstr &LdSt, unsigned &BaseReg,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
71 int64_t &Offset,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
72 const TargetRegisterInfo *TRI) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
73
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
74 bool getMemOpBaseRegImmOfsWidth(MachineInstr &LdSt, unsigned &BaseReg,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
75 int64_t &Offset, unsigned &Width,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
76 const TargetRegisterInfo *TRI) const;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
77
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
78 std::pair<unsigned, unsigned>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
79 decomposeMachineOperandsTargetFlags(unsigned TF) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
80
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
81 ArrayRef<std::pair<unsigned, const char *>>
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
82 getSerializableDirectMachineOperandTargetFlags() const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
83
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
84 bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TrueBlock,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
85 MachineBasicBlock *&FalseBlock,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
86 SmallVectorImpl<MachineOperand> &Condition,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
87 bool AllowModify) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
88
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
89 unsigned removeBranch(MachineBasicBlock &MBB,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
90 int *BytesRemoved = nullptr) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
91
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
92 // For a comparison instruction, return the source registers in SrcReg and
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
93 // SrcReg2 if having two register operands, and the value it compares against
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
94 // in CmpValue. Return true if the comparison instruction can be analyzed.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
95 bool analyzeCompare(const MachineInstr &MI, unsigned &SrcReg,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
96 unsigned &SrcReg2, int &CmpMask,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
97 int &CmpValue) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
98
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
99 // See if the comparison instruction can be converted into something more
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
100 // efficient. E.g., on Lanai register-register instructions can set the flag
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
101 // register, obviating the need for a separate compare.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
102 bool optimizeCompareInstr(MachineInstr &CmpInstr, unsigned SrcReg,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
103 unsigned SrcReg2, int CmpMask, int CmpValue,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
104 const MachineRegisterInfo *MRI) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
105
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
106 // Analyze the given select instruction, returning true if it cannot be
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
107 // understood. It is assumed that MI->isSelect() is true.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
108 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
109 // When successful, return the controlling condition and the operands that
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
110 // determine the true and false result values.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
111 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
112 // Result = SELECT Cond, TrueOp, FalseOp
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
113 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
114 // Lanai can optimize certain select instructions, for example by predicating
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
115 // the instruction defining one of the operands and sets Optimizable to true.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
116 bool analyzeSelect(const MachineInstr &MI,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
117 SmallVectorImpl<MachineOperand> &Cond, unsigned &TrueOp,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
118 unsigned &FalseOp, bool &Optimizable) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
119
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
120 // Given a select instruction that was understood by analyzeSelect and
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
121 // returned Optimizable = true, attempt to optimize MI by merging it with one
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
122 // of its operands. Returns NULL on failure.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
123 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
124 // When successful, returns the new select instruction. The client is
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
125 // responsible for deleting MI.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
126 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
127 // If both sides of the select can be optimized, the TrueOp is modifed.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
128 // PreferFalse is not used.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
129 MachineInstr *optimizeSelect(MachineInstr &MI,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
130 SmallPtrSetImpl<MachineInstr *> &SeenMIs,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
131 bool PreferFalse) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
132
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
133 bool reverseBranchCondition(
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
134 SmallVectorImpl<MachineOperand> &Condition) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
135
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
136 unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TrueBlock,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
137 MachineBasicBlock *FalseBlock,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
138 ArrayRef<MachineOperand> Condition,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
139 const DebugLoc &DL,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
140 int *BytesAdded = nullptr) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
141 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
142
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
143 static inline bool isSPLSOpcode(unsigned Opcode) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
144 switch (Opcode) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
145 case Lanai::LDBs_RI:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
146 case Lanai::LDBz_RI:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
147 case Lanai::LDHs_RI:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
148 case Lanai::LDHz_RI:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
149 case Lanai::STB_RI:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
150 case Lanai::STH_RI:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
151 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
152 default:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
153 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
154 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
155 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
156
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
157 static inline bool isRMOpcode(unsigned Opcode) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
158 switch (Opcode) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
159 case Lanai::LDW_RI:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
160 case Lanai::SW_RI:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
161 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
162 default:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
163 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
164 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
165 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
166
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
167 static inline bool isRRMOpcode(unsigned Opcode) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
168 switch (Opcode) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
169 case Lanai::LDBs_RR:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
170 case Lanai::LDBz_RR:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
171 case Lanai::LDHs_RR:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
172 case Lanai::LDHz_RR:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
173 case Lanai::LDWz_RR:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
174 case Lanai::LDW_RR:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
175 case Lanai::STB_RR:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
176 case Lanai::STH_RR:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
177 case Lanai::SW_RR:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
178 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
179 default:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
180 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
181 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
182 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
183
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
184 } // namespace llvm
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
185
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
186 #endif // LLVM_LIB_TARGET_LANAI_LANAIINSTRINFO_H