1 //===-- RISCVInstrInfo.cpp - RISCV Instruction Information ------*- 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 //
9 // This file contains the RISCV implementation of the TargetInstrInfo class.
10 //
11 //===----------------------------------------------------------------------===//
12
13 #include "RISCVInstrInfo.h"
14 #include "MCTargetDesc/RISCVMatInt.h"
15 #include "RISCV.h"
16 #include "RISCVMachineFunctionInfo.h"
17 #include "RISCVSubtarget.h"
18 #include "RISCVTargetMachine.h"
19 #include "llvm/ADT/STLExtras.h"
20 #include "llvm/ADT/SmallVector.h"
21 #include "llvm/Analysis/MemoryLocation.h"
22 #include "llvm/CodeGen/MachineFunctionPass.h"
23 #include "llvm/CodeGen/MachineInstrBuilder.h"
24 #include "llvm/CodeGen/MachineRegisterInfo.h"
25 #include "llvm/CodeGen/RegisterScavenging.h"
26 #include "llvm/MC/MCInstBuilder.h"
27 #include "llvm/Support/ErrorHandling.h"
28 #include "llvm/Support/TargetRegistry.h"
29
30 using namespace llvm;
31
32 #define GEN_CHECK_COMPRESS_INSTR
33 #include "RISCVGenCompressInstEmitter.inc"
34
35 #define GET_INSTRINFO_CTOR_DTOR
36 #include "RISCVGenInstrInfo.inc"
37
38 namespace llvm {
39 namespace RISCVVPseudosTable {
40
41 using namespace RISCV;
42
43 #define GET_RISCVVPseudosTable_IMPL
44 #include "RISCVGenSearchableTables.inc"
45
46 } // namespace RISCVVPseudosTable
47 } // namespace llvm
48
RISCVInstrInfo(RISCVSubtarget & STI)49 RISCVInstrInfo::RISCVInstrInfo(RISCVSubtarget &STI)
50 : RISCVGenInstrInfo(RISCV::ADJCALLSTACKDOWN, RISCV::ADJCALLSTACKUP),
51 STI(STI) {}
52
getNop() const53 MCInst RISCVInstrInfo::getNop() const {
54 if (STI.getFeatureBits()[RISCV::FeatureStdExtC])
55 return MCInstBuilder(RISCV::C_NOP);
56 return MCInstBuilder(RISCV::ADDI)
57 .addReg(RISCV::X0)
58 .addReg(RISCV::X0)
59 .addImm(0);
60 }
61
isLoadFromStackSlot(const MachineInstr & MI,int & FrameIndex) const62 unsigned RISCVInstrInfo::isLoadFromStackSlot(const MachineInstr &MI,
63 int &FrameIndex) const {
64 switch (MI.getOpcode()) {
65 default:
66 return 0;
67 case RISCV::LB:
68 case RISCV::LBU:
69 case RISCV::LH:
70 case RISCV::LHU:
71 case RISCV::FLH:
72 case RISCV::LW:
73 case RISCV::FLW:
74 case RISCV::LWU:
75 case RISCV::LD:
76 case RISCV::FLD:
77 break;
78 }
79
80 if (MI.getOperand(1).isFI() && MI.getOperand(2).isImm() &&
81 MI.getOperand(2).getImm() == 0) {
82 FrameIndex = MI.getOperand(1).getIndex();
83 return MI.getOperand(0).getReg();
84 }
85
86 return 0;
87 }
88
isStoreToStackSlot(const MachineInstr & MI,int & FrameIndex) const89 unsigned RISCVInstrInfo::isStoreToStackSlot(const MachineInstr &MI,
90 int &FrameIndex) const {
91 switch (MI.getOpcode()) {
92 default:
93 return 0;
94 case RISCV::SB:
95 case RISCV::SH:
96 case RISCV::SW:
97 case RISCV::FSH:
98 case RISCV::FSW:
99 case RISCV::SD:
100 case RISCV::FSD:
101 break;
102 }
103
104 if (MI.getOperand(1).isFI() && MI.getOperand(2).isImm() &&
105 MI.getOperand(2).getImm() == 0) {
106 FrameIndex = MI.getOperand(1).getIndex();
107 return MI.getOperand(0).getReg();
108 }
109
110 return 0;
111 }
112
forwardCopyWillClobberTuple(unsigned DstReg,unsigned SrcReg,unsigned NumRegs)113 static bool forwardCopyWillClobberTuple(unsigned DstReg, unsigned SrcReg,
114 unsigned NumRegs) {
115 // We really want the positive remainder mod 32 here, that happens to be
116 // easily obtainable with a mask.
117 return ((DstReg - SrcReg) & 0x1f) < NumRegs;
118 }
119
copyPhysReg(MachineBasicBlock & MBB,MachineBasicBlock::iterator MBBI,const DebugLoc & DL,MCRegister DstReg,MCRegister SrcReg,bool KillSrc) const120 void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
121 MachineBasicBlock::iterator MBBI,
122 const DebugLoc &DL, MCRegister DstReg,
123 MCRegister SrcReg, bool KillSrc) const {
124 if (RISCV::GPRRegClass.contains(DstReg, SrcReg)) {
125 BuildMI(MBB, MBBI, DL, get(RISCV::ADDI), DstReg)
126 .addReg(SrcReg, getKillRegState(KillSrc))
127 .addImm(0);
128 return;
129 }
130
131 // FPR->FPR copies and VR->VR copies.
132 unsigned Opc;
133 bool IsScalableVector = true;
134 unsigned NF = 1;
135 unsigned LMul = 1;
136 unsigned SubRegIdx = RISCV::sub_vrm1_0;
137 if (RISCV::FPR16RegClass.contains(DstReg, SrcReg)) {
138 Opc = RISCV::FSGNJ_H;
139 IsScalableVector = false;
140 } else if (RISCV::FPR32RegClass.contains(DstReg, SrcReg)) {
141 Opc = RISCV::FSGNJ_S;
142 IsScalableVector = false;
143 } else if (RISCV::FPR64RegClass.contains(DstReg, SrcReg)) {
144 Opc = RISCV::FSGNJ_D;
145 IsScalableVector = false;
146 } else if (RISCV::VRRegClass.contains(DstReg, SrcReg)) {
147 Opc = RISCV::PseudoVMV1R_V;
148 } else if (RISCV::VRM2RegClass.contains(DstReg, SrcReg)) {
149 Opc = RISCV::PseudoVMV2R_V;
150 } else if (RISCV::VRM4RegClass.contains(DstReg, SrcReg)) {
151 Opc = RISCV::PseudoVMV4R_V;
152 } else if (RISCV::VRM8RegClass.contains(DstReg, SrcReg)) {
153 Opc = RISCV::PseudoVMV8R_V;
154 } else if (RISCV::VRN2M1RegClass.contains(DstReg, SrcReg)) {
155 Opc = RISCV::PseudoVMV1R_V;
156 SubRegIdx = RISCV::sub_vrm1_0;
157 NF = 2;
158 LMul = 1;
159 } else if (RISCV::VRN2M2RegClass.contains(DstReg, SrcReg)) {
160 Opc = RISCV::PseudoVMV2R_V;
161 SubRegIdx = RISCV::sub_vrm2_0;
162 NF = 2;
163 LMul = 2;
164 } else if (RISCV::VRN2M4RegClass.contains(DstReg, SrcReg)) {
165 Opc = RISCV::PseudoVMV4R_V;
166 SubRegIdx = RISCV::sub_vrm4_0;
167 NF = 2;
168 LMul = 4;
169 } else if (RISCV::VRN3M1RegClass.contains(DstReg, SrcReg)) {
170 Opc = RISCV::PseudoVMV1R_V;
171 SubRegIdx = RISCV::sub_vrm1_0;
172 NF = 3;
173 LMul = 1;
174 } else if (RISCV::VRN3M2RegClass.contains(DstReg, SrcReg)) {
175 Opc = RISCV::PseudoVMV2R_V;
176 SubRegIdx = RISCV::sub_vrm2_0;
177 NF = 3;
178 LMul = 2;
179 } else if (RISCV::VRN4M1RegClass.contains(DstReg, SrcReg)) {
180 Opc = RISCV::PseudoVMV1R_V;
181 SubRegIdx = RISCV::sub_vrm1_0;
182 NF = 4;
183 LMul = 1;
184 } else if (RISCV::VRN4M2RegClass.contains(DstReg, SrcReg)) {
185 Opc = RISCV::PseudoVMV2R_V;
186 SubRegIdx = RISCV::sub_vrm2_0;
187 NF = 4;
188 LMul = 2;
189 } else if (RISCV::VRN5M1RegClass.contains(DstReg, SrcReg)) {
190 Opc = RISCV::PseudoVMV1R_V;
191 SubRegIdx = RISCV::sub_vrm1_0;
192 NF = 5;
193 LMul = 1;
194 } else if (RISCV::VRN6M1RegClass.contains(DstReg, SrcReg)) {
195 Opc = RISCV::PseudoVMV1R_V;
196 SubRegIdx = RISCV::sub_vrm1_0;
197 NF = 6;
198 LMul = 1;
199 } else if (RISCV::VRN7M1RegClass.contains(DstReg, SrcReg)) {
200 Opc = RISCV::PseudoVMV1R_V;
201 SubRegIdx = RISCV::sub_vrm1_0;
202 NF = 7;
203 LMul = 1;
204 } else if (RISCV::VRN8M1RegClass.contains(DstReg, SrcReg)) {
205 Opc = RISCV::PseudoVMV1R_V;
206 SubRegIdx = RISCV::sub_vrm1_0;
207 NF = 8;
208 LMul = 1;
209 } else {
210 llvm_unreachable("Impossible reg-to-reg copy");
211 }
212
213 if (IsScalableVector) {
214 if (NF == 1) {
215 BuildMI(MBB, MBBI, DL, get(Opc), DstReg)
216 .addReg(SrcReg, getKillRegState(KillSrc));
217 } else {
218 const TargetRegisterInfo *TRI = STI.getRegisterInfo();
219
220 int I = 0, End = NF, Incr = 1;
221 unsigned SrcEncoding = TRI->getEncodingValue(SrcReg);
222 unsigned DstEncoding = TRI->getEncodingValue(DstReg);
223 if (forwardCopyWillClobberTuple(DstEncoding, SrcEncoding, NF * LMul)) {
224 I = NF - 1;
225 End = -1;
226 Incr = -1;
227 }
228
229 for (; I != End; I += Incr) {
230 BuildMI(MBB, MBBI, DL, get(Opc), TRI->getSubReg(DstReg, SubRegIdx + I))
231 .addReg(TRI->getSubReg(SrcReg, SubRegIdx + I),
232 getKillRegState(KillSrc));
233 }
234 }
235 } else {
236 BuildMI(MBB, MBBI, DL, get(Opc), DstReg)
237 .addReg(SrcReg, getKillRegState(KillSrc))
238 .addReg(SrcReg, getKillRegState(KillSrc));
239 }
240 }
241
storeRegToStackSlot(MachineBasicBlock & MBB,MachineBasicBlock::iterator I,Register SrcReg,bool IsKill,int FI,const TargetRegisterClass * RC,const TargetRegisterInfo * TRI) const242 void RISCVInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
243 MachineBasicBlock::iterator I,
244 Register SrcReg, bool IsKill, int FI,
245 const TargetRegisterClass *RC,
246 const TargetRegisterInfo *TRI) const {
247 DebugLoc DL;
248 if (I != MBB.end())
249 DL = I->getDebugLoc();
250
251 MachineFunction *MF = MBB.getParent();
252 MachineFrameInfo &MFI = MF->getFrameInfo();
253
254 unsigned Opcode;
255 bool IsScalableVector = true;
256 bool IsZvlsseg = true;
257 if (RISCV::GPRRegClass.hasSubClassEq(RC)) {
258 Opcode = TRI->getRegSizeInBits(RISCV::GPRRegClass) == 32 ?
259 RISCV::SW : RISCV::SD;
260 IsScalableVector = false;
261 } else if (RISCV::FPR16RegClass.hasSubClassEq(RC)) {
262 Opcode = RISCV::FSH;
263 IsScalableVector = false;
264 } else if (RISCV::FPR32RegClass.hasSubClassEq(RC)) {
265 Opcode = RISCV::FSW;
266 IsScalableVector = false;
267 } else if (RISCV::FPR64RegClass.hasSubClassEq(RC)) {
268 Opcode = RISCV::FSD;
269 IsScalableVector = false;
270 } else if (RISCV::VRRegClass.hasSubClassEq(RC)) {
271 Opcode = RISCV::PseudoVSPILL_M1;
272 IsZvlsseg = false;
273 } else if (RISCV::VRM2RegClass.hasSubClassEq(RC)) {
274 Opcode = RISCV::PseudoVSPILL_M2;
275 IsZvlsseg = false;
276 } else if (RISCV::VRM4RegClass.hasSubClassEq(RC)) {
277 Opcode = RISCV::PseudoVSPILL_M4;
278 IsZvlsseg = false;
279 } else if (RISCV::VRM8RegClass.hasSubClassEq(RC)) {
280 Opcode = RISCV::PseudoVSPILL_M8;
281 IsZvlsseg = false;
282 } else if (RISCV::VRN2M1RegClass.hasSubClassEq(RC))
283 Opcode = RISCV::PseudoVSPILL2_M1;
284 else if (RISCV::VRN2M2RegClass.hasSubClassEq(RC))
285 Opcode = RISCV::PseudoVSPILL2_M2;
286 else if (RISCV::VRN2M4RegClass.hasSubClassEq(RC))
287 Opcode = RISCV::PseudoVSPILL2_M4;
288 else if (RISCV::VRN3M1RegClass.hasSubClassEq(RC))
289 Opcode = RISCV::PseudoVSPILL3_M1;
290 else if (RISCV::VRN3M2RegClass.hasSubClassEq(RC))
291 Opcode = RISCV::PseudoVSPILL3_M2;
292 else if (RISCV::VRN4M1RegClass.hasSubClassEq(RC))
293 Opcode = RISCV::PseudoVSPILL4_M1;
294 else if (RISCV::VRN4M2RegClass.hasSubClassEq(RC))
295 Opcode = RISCV::PseudoVSPILL4_M2;
296 else if (RISCV::VRN5M1RegClass.hasSubClassEq(RC))
297 Opcode = RISCV::PseudoVSPILL5_M1;
298 else if (RISCV::VRN6M1RegClass.hasSubClassEq(RC))
299 Opcode = RISCV::PseudoVSPILL6_M1;
300 else if (RISCV::VRN7M1RegClass.hasSubClassEq(RC))
301 Opcode = RISCV::PseudoVSPILL7_M1;
302 else if (RISCV::VRN8M1RegClass.hasSubClassEq(RC))
303 Opcode = RISCV::PseudoVSPILL8_M1;
304 else
305 llvm_unreachable("Can't store this register to stack slot");
306
307 if (IsScalableVector) {
308 MachineMemOperand *MMO = MF->getMachineMemOperand(
309 MachinePointerInfo::getFixedStack(*MF, FI), MachineMemOperand::MOStore,
310 MemoryLocation::UnknownSize, MFI.getObjectAlign(FI));
311
312 MFI.setStackID(FI, TargetStackID::ScalableVector);
313 auto MIB = BuildMI(MBB, I, DL, get(Opcode))
314 .addReg(SrcReg, getKillRegState(IsKill))
315 .addFrameIndex(FI)
316 .addMemOperand(MMO);
317 if (IsZvlsseg) {
318 // For spilling/reloading Zvlsseg registers, append the dummy field for
319 // the scaled vector length. The argument will be used when expanding
320 // these pseudo instructions.
321 MIB.addReg(RISCV::X0);
322 }
323 } else {
324 MachineMemOperand *MMO = MF->getMachineMemOperand(
325 MachinePointerInfo::getFixedStack(*MF, FI), MachineMemOperand::MOStore,
326 MFI.getObjectSize(FI), MFI.getObjectAlign(FI));
327
328 BuildMI(MBB, I, DL, get(Opcode))
329 .addReg(SrcReg, getKillRegState(IsKill))
330 .addFrameIndex(FI)
331 .addImm(0)
332 .addMemOperand(MMO);
333 }
334 }
335
loadRegFromStackSlot(MachineBasicBlock & MBB,MachineBasicBlock::iterator I,Register DstReg,int FI,const TargetRegisterClass * RC,const TargetRegisterInfo * TRI) const336 void RISCVInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
337 MachineBasicBlock::iterator I,
338 Register DstReg, int FI,
339 const TargetRegisterClass *RC,
340 const TargetRegisterInfo *TRI) const {
341 DebugLoc DL;
342 if (I != MBB.end())
343 DL = I->getDebugLoc();
344
345 MachineFunction *MF = MBB.getParent();
346 MachineFrameInfo &MFI = MF->getFrameInfo();
347
348 unsigned Opcode;
349 bool IsScalableVector = true;
350 bool IsZvlsseg = true;
351 if (RISCV::GPRRegClass.hasSubClassEq(RC)) {
352 Opcode = TRI->getRegSizeInBits(RISCV::GPRRegClass) == 32 ?
353 RISCV::LW : RISCV::LD;
354 IsScalableVector = false;
355 } else if (RISCV::FPR16RegClass.hasSubClassEq(RC)) {
356 Opcode = RISCV::FLH;
357 IsScalableVector = false;
358 } else if (RISCV::FPR32RegClass.hasSubClassEq(RC)) {
359 Opcode = RISCV::FLW;
360 IsScalableVector = false;
361 } else if (RISCV::FPR64RegClass.hasSubClassEq(RC)) {
362 Opcode = RISCV::FLD;
363 IsScalableVector = false;
364 } else if (RISCV::VRRegClass.hasSubClassEq(RC)) {
365 Opcode = RISCV::PseudoVRELOAD_M1;
366 IsZvlsseg = false;
367 } else if (RISCV::VRM2RegClass.hasSubClassEq(RC)) {
368 Opcode = RISCV::PseudoVRELOAD_M2;
369 IsZvlsseg = false;
370 } else if (RISCV::VRM4RegClass.hasSubClassEq(RC)) {
371 Opcode = RISCV::PseudoVRELOAD_M4;
372 IsZvlsseg = false;
373 } else if (RISCV::VRM8RegClass.hasSubClassEq(RC)) {
374 Opcode = RISCV::PseudoVRELOAD_M8;
375 IsZvlsseg = false;
376 } else if (RISCV::VRN2M1RegClass.hasSubClassEq(RC))
377 Opcode = RISCV::PseudoVRELOAD2_M1;
378 else if (RISCV::VRN2M2RegClass.hasSubClassEq(RC))
379 Opcode = RISCV::PseudoVRELOAD2_M2;
380 else if (RISCV::VRN2M4RegClass.hasSubClassEq(RC))
381 Opcode = RISCV::PseudoVRELOAD2_M4;
382 else if (RISCV::VRN3M1RegClass.hasSubClassEq(RC))
383 Opcode = RISCV::PseudoVRELOAD3_M1;
384 else if (RISCV::VRN3M2RegClass.hasSubClassEq(RC))
385 Opcode = RISCV::PseudoVRELOAD3_M2;
386 else if (RISCV::VRN4M1RegClass.hasSubClassEq(RC))
387 Opcode = RISCV::PseudoVRELOAD4_M1;
388 else if (RISCV::VRN4M2RegClass.hasSubClassEq(RC))
389 Opcode = RISCV::PseudoVRELOAD4_M2;
390 else if (RISCV::VRN5M1RegClass.hasSubClassEq(RC))
391 Opcode = RISCV::PseudoVRELOAD5_M1;
392 else if (RISCV::VRN6M1RegClass.hasSubClassEq(RC))
393 Opcode = RISCV::PseudoVRELOAD6_M1;
394 else if (RISCV::VRN7M1RegClass.hasSubClassEq(RC))
395 Opcode = RISCV::PseudoVRELOAD7_M1;
396 else if (RISCV::VRN8M1RegClass.hasSubClassEq(RC))
397 Opcode = RISCV::PseudoVRELOAD8_M1;
398 else
399 llvm_unreachable("Can't load this register from stack slot");
400
401 if (IsScalableVector) {
402 MachineMemOperand *MMO = MF->getMachineMemOperand(
403 MachinePointerInfo::getFixedStack(*MF, FI), MachineMemOperand::MOLoad,
404 MemoryLocation::UnknownSize, MFI.getObjectAlign(FI));
405
406 MFI.setStackID(FI, TargetStackID::ScalableVector);
407 auto MIB = BuildMI(MBB, I, DL, get(Opcode), DstReg)
408 .addFrameIndex(FI)
409 .addMemOperand(MMO);
410 if (IsZvlsseg) {
411 // For spilling/reloading Zvlsseg registers, append the dummy field for
412 // the scaled vector length. The argument will be used when expanding
413 // these pseudo instructions.
414 MIB.addReg(RISCV::X0);
415 }
416 } else {
417 MachineMemOperand *MMO = MF->getMachineMemOperand(
418 MachinePointerInfo::getFixedStack(*MF, FI), MachineMemOperand::MOLoad,
419 MFI.getObjectSize(FI), MFI.getObjectAlign(FI));
420
421 BuildMI(MBB, I, DL, get(Opcode), DstReg)
422 .addFrameIndex(FI)
423 .addImm(0)
424 .addMemOperand(MMO);
425 }
426 }
427
movImm(MachineBasicBlock & MBB,MachineBasicBlock::iterator MBBI,const DebugLoc & DL,Register DstReg,uint64_t Val,MachineInstr::MIFlag Flag) const428 void RISCVInstrInfo::movImm(MachineBasicBlock &MBB,
429 MachineBasicBlock::iterator MBBI,
430 const DebugLoc &DL, Register DstReg, uint64_t Val,
431 MachineInstr::MIFlag Flag) const {
432 MachineFunction *MF = MBB.getParent();
433 MachineRegisterInfo &MRI = MF->getRegInfo();
434 bool IsRV64 = MF->getSubtarget<RISCVSubtarget>().is64Bit();
435 Register SrcReg = RISCV::X0;
436 Register Result = MRI.createVirtualRegister(&RISCV::GPRRegClass);
437 unsigned Num = 0;
438
439 if (!IsRV64 && !isInt<32>(Val))
440 report_fatal_error("Should only materialize 32-bit constants for RV32");
441
442 RISCVMatInt::InstSeq Seq = RISCVMatInt::generateInstSeq(Val, IsRV64);
443 assert(Seq.size() > 0);
444
445 for (RISCVMatInt::Inst &Inst : Seq) {
446 // Write the final result to DstReg if it's the last instruction in the Seq.
447 // Otherwise, write the result to the temp register.
448 if (++Num == Seq.size())
449 Result = DstReg;
450
451 if (Inst.Opc == RISCV::LUI) {
452 BuildMI(MBB, MBBI, DL, get(RISCV::LUI), Result)
453 .addImm(Inst.Imm)
454 .setMIFlag(Flag);
455 } else {
456 BuildMI(MBB, MBBI, DL, get(Inst.Opc), Result)
457 .addReg(SrcReg, RegState::Kill)
458 .addImm(Inst.Imm)
459 .setMIFlag(Flag);
460 }
461 // Only the first instruction has X0 as its source.
462 SrcReg = Result;
463 }
464 }
465
466 // The contents of values added to Cond are not examined outside of
467 // RISCVInstrInfo, giving us flexibility in what to push to it. For RISCV, we
468 // push BranchOpcode, Reg1, Reg2.
parseCondBranch(MachineInstr & LastInst,MachineBasicBlock * & Target,SmallVectorImpl<MachineOperand> & Cond)469 static void parseCondBranch(MachineInstr &LastInst, MachineBasicBlock *&Target,
470 SmallVectorImpl<MachineOperand> &Cond) {
471 // Block ends with fall-through condbranch.
472 assert(LastInst.getDesc().isConditionalBranch() &&
473 "Unknown conditional branch");
474 Target = LastInst.getOperand(2).getMBB();
475 Cond.push_back(MachineOperand::CreateImm(LastInst.getOpcode()));
476 Cond.push_back(LastInst.getOperand(0));
477 Cond.push_back(LastInst.getOperand(1));
478 }
479
getOppositeBranchOpcode(int Opc)480 static unsigned getOppositeBranchOpcode(int Opc) {
481 switch (Opc) {
482 default:
483 llvm_unreachable("Unrecognized conditional branch");
484 case RISCV::BEQ:
485 return RISCV::BNE;
486 case RISCV::BNE:
487 return RISCV::BEQ;
488 case RISCV::BLT:
489 return RISCV::BGE;
490 case RISCV::BGE:
491 return RISCV::BLT;
492 case RISCV::BLTU:
493 return RISCV::BGEU;
494 case RISCV::BGEU:
495 return RISCV::BLTU;
496 }
497 }
498
analyzeBranch(MachineBasicBlock & MBB,MachineBasicBlock * & TBB,MachineBasicBlock * & FBB,SmallVectorImpl<MachineOperand> & Cond,bool AllowModify) const499 bool RISCVInstrInfo::analyzeBranch(MachineBasicBlock &MBB,
500 MachineBasicBlock *&TBB,
501 MachineBasicBlock *&FBB,
502 SmallVectorImpl<MachineOperand> &Cond,
503 bool AllowModify) const {
504 TBB = FBB = nullptr;
505 Cond.clear();
506
507 // If the block has no terminators, it just falls into the block after it.
508 MachineBasicBlock::iterator I = MBB.getLastNonDebugInstr();
509 if (I == MBB.end() || !isUnpredicatedTerminator(*I))
510 return false;
511
512 // Count the number of terminators and find the first unconditional or
513 // indirect branch.
514 MachineBasicBlock::iterator FirstUncondOrIndirectBr = MBB.end();
515 int NumTerminators = 0;
516 for (auto J = I.getReverse(); J != MBB.rend() && isUnpredicatedTerminator(*J);
517 J++) {
518 NumTerminators++;
519 if (J->getDesc().isUnconditionalBranch() ||
520 J->getDesc().isIndirectBranch()) {
521 FirstUncondOrIndirectBr = J.getReverse();
522 }
523 }
524
525 // If AllowModify is true, we can erase any terminators after
526 // FirstUncondOrIndirectBR.
527 if (AllowModify && FirstUncondOrIndirectBr != MBB.end()) {
528 while (std::next(FirstUncondOrIndirectBr) != MBB.end()) {
529 std::next(FirstUncondOrIndirectBr)->eraseFromParent();
530 NumTerminators--;
531 }
532 I = FirstUncondOrIndirectBr;
533 }
534
535 // We can't handle blocks that end in an indirect branch.
536 if (I->getDesc().isIndirectBranch())
537 return true;
538
539 // We can't handle blocks with more than 2 terminators.
540 if (NumTerminators > 2)
541 return true;
542
543 // Handle a single unconditional branch.
544 if (NumTerminators == 1 && I->getDesc().isUnconditionalBranch()) {
545 TBB = getBranchDestBlock(*I);
546 return false;
547 }
548
549 // Handle a single conditional branch.
550 if (NumTerminators == 1 && I->getDesc().isConditionalBranch()) {
551 parseCondBranch(*I, TBB, Cond);
552 return false;
553 }
554
555 // Handle a conditional branch followed by an unconditional branch.
556 if (NumTerminators == 2 && std::prev(I)->getDesc().isConditionalBranch() &&
557 I->getDesc().isUnconditionalBranch()) {
558 parseCondBranch(*std::prev(I), TBB, Cond);
559 FBB = getBranchDestBlock(*I);
560 return false;
561 }
562
563 // Otherwise, we can't handle this.
564 return true;
565 }
566
removeBranch(MachineBasicBlock & MBB,int * BytesRemoved) const567 unsigned RISCVInstrInfo::removeBranch(MachineBasicBlock &MBB,
568 int *BytesRemoved) const {
569 if (BytesRemoved)
570 *BytesRemoved = 0;
571 MachineBasicBlock::iterator I = MBB.getLastNonDebugInstr();
572 if (I == MBB.end())
573 return 0;
574
575 if (!I->getDesc().isUnconditionalBranch() &&
576 !I->getDesc().isConditionalBranch())
577 return 0;
578
579 // Remove the branch.
580 if (BytesRemoved)
581 *BytesRemoved += getInstSizeInBytes(*I);
582 I->eraseFromParent();
583
584 I = MBB.end();
585
586 if (I == MBB.begin())
587 return 1;
588 --I;
589 if (!I->getDesc().isConditionalBranch())
590 return 1;
591
592 // Remove the branch.
593 if (BytesRemoved)
594 *BytesRemoved += getInstSizeInBytes(*I);
595 I->eraseFromParent();
596 return 2;
597 }
598
599 // Inserts a branch into the end of the specific MachineBasicBlock, returning
600 // the number of instructions inserted.
insertBranch(MachineBasicBlock & MBB,MachineBasicBlock * TBB,MachineBasicBlock * FBB,ArrayRef<MachineOperand> Cond,const DebugLoc & DL,int * BytesAdded) const601 unsigned RISCVInstrInfo::insertBranch(
602 MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB,
603 ArrayRef<MachineOperand> Cond, const DebugLoc &DL, int *BytesAdded) const {
604 if (BytesAdded)
605 *BytesAdded = 0;
606
607 // Shouldn't be a fall through.
608 assert(TBB && "insertBranch must not be told to insert a fallthrough");
609 assert((Cond.size() == 3 || Cond.size() == 0) &&
610 "RISCV branch conditions have two components!");
611
612 // Unconditional branch.
613 if (Cond.empty()) {
614 MachineInstr &MI = *BuildMI(&MBB, DL, get(RISCV::PseudoBR)).addMBB(TBB);
615 if (BytesAdded)
616 *BytesAdded += getInstSizeInBytes(MI);
617 return 1;
618 }
619
620 // Either a one or two-way conditional branch.
621 unsigned Opc = Cond[0].getImm();
622 MachineInstr &CondMI =
623 *BuildMI(&MBB, DL, get(Opc)).add(Cond[1]).add(Cond[2]).addMBB(TBB);
624 if (BytesAdded)
625 *BytesAdded += getInstSizeInBytes(CondMI);
626
627 // One-way conditional branch.
628 if (!FBB)
629 return 1;
630
631 // Two-way conditional branch.
632 MachineInstr &MI = *BuildMI(&MBB, DL, get(RISCV::PseudoBR)).addMBB(FBB);
633 if (BytesAdded)
634 *BytesAdded += getInstSizeInBytes(MI);
635 return 2;
636 }
637
insertIndirectBranch(MachineBasicBlock & MBB,MachineBasicBlock & DestBB,const DebugLoc & DL,int64_t BrOffset,RegScavenger * RS) const638 unsigned RISCVInstrInfo::insertIndirectBranch(MachineBasicBlock &MBB,
639 MachineBasicBlock &DestBB,
640 const DebugLoc &DL,
641 int64_t BrOffset,
642 RegScavenger *RS) const {
643 assert(RS && "RegScavenger required for long branching");
644 assert(MBB.empty() &&
645 "new block should be inserted for expanding unconditional branch");
646 assert(MBB.pred_size() == 1);
647
648 MachineFunction *MF = MBB.getParent();
649 MachineRegisterInfo &MRI = MF->getRegInfo();
650
651 if (!isInt<32>(BrOffset))
652 report_fatal_error(
653 "Branch offsets outside of the signed 32-bit range not supported");
654
655 // FIXME: A virtual register must be used initially, as the register
656 // scavenger won't work with empty blocks (SIInstrInfo::insertIndirectBranch
657 // uses the same workaround).
658 Register ScratchReg = MRI.createVirtualRegister(&RISCV::GPRRegClass);
659 auto II = MBB.end();
660
661 MachineInstr &MI = *BuildMI(MBB, II, DL, get(RISCV::PseudoJump))
662 .addReg(ScratchReg, RegState::Define | RegState::Dead)
663 .addMBB(&DestBB, RISCVII::MO_CALL);
664
665 RS->enterBasicBlockEnd(MBB);
666 unsigned Scav = RS->scavengeRegisterBackwards(RISCV::GPRRegClass,
667 MI.getIterator(), false, 0);
668 MRI.replaceRegWith(ScratchReg, Scav);
669 MRI.clearVirtRegs();
670 RS->setRegUsed(Scav);
671 return 8;
672 }
673
reverseBranchCondition(SmallVectorImpl<MachineOperand> & Cond) const674 bool RISCVInstrInfo::reverseBranchCondition(
675 SmallVectorImpl<MachineOperand> &Cond) const {
676 assert((Cond.size() == 3) && "Invalid branch condition!");
677 Cond[0].setImm(getOppositeBranchOpcode(Cond[0].getImm()));
678 return false;
679 }
680
681 MachineBasicBlock *
getBranchDestBlock(const MachineInstr & MI) const682 RISCVInstrInfo::getBranchDestBlock(const MachineInstr &MI) const {
683 assert(MI.getDesc().isBranch() && "Unexpected opcode!");
684 // The branch target is always the last operand.
685 int NumOp = MI.getNumExplicitOperands();
686 return MI.getOperand(NumOp - 1).getMBB();
687 }
688
isBranchOffsetInRange(unsigned BranchOp,int64_t BrOffset) const689 bool RISCVInstrInfo::isBranchOffsetInRange(unsigned BranchOp,
690 int64_t BrOffset) const {
691 unsigned XLen = STI.getXLen();
692 // Ideally we could determine the supported branch offset from the
693 // RISCVII::FormMask, but this can't be used for Pseudo instructions like
694 // PseudoBR.
695 switch (BranchOp) {
696 default:
697 llvm_unreachable("Unexpected opcode!");
698 case RISCV::BEQ:
699 case RISCV::BNE:
700 case RISCV::BLT:
701 case RISCV::BGE:
702 case RISCV::BLTU:
703 case RISCV::BGEU:
704 return isIntN(13, BrOffset);
705 case RISCV::JAL:
706 case RISCV::PseudoBR:
707 return isIntN(21, BrOffset);
708 case RISCV::PseudoJump:
709 return isIntN(32, SignExtend64(BrOffset + 0x800, XLen));
710 }
711 }
712
getInstSizeInBytes(const MachineInstr & MI) const713 unsigned RISCVInstrInfo::getInstSizeInBytes(const MachineInstr &MI) const {
714 unsigned Opcode = MI.getOpcode();
715
716 switch (Opcode) {
717 default: {
718 if (MI.getParent() && MI.getParent()->getParent()) {
719 const auto MF = MI.getMF();
720 const auto &TM = static_cast<const RISCVTargetMachine &>(MF->getTarget());
721 const MCRegisterInfo &MRI = *TM.getMCRegisterInfo();
722 const MCSubtargetInfo &STI = *TM.getMCSubtargetInfo();
723 const RISCVSubtarget &ST = MF->getSubtarget<RISCVSubtarget>();
724 if (isCompressibleInst(MI, &ST, MRI, STI))
725 return 2;
726 }
727 return get(Opcode).getSize();
728 }
729 case TargetOpcode::EH_LABEL:
730 case TargetOpcode::IMPLICIT_DEF:
731 case TargetOpcode::KILL:
732 case TargetOpcode::DBG_VALUE:
733 return 0;
734 // These values are determined based on RISCVExpandAtomicPseudoInsts,
735 // RISCVExpandPseudoInsts and RISCVMCCodeEmitter, depending on where the
736 // pseudos are expanded.
737 case RISCV::PseudoCALLReg:
738 case RISCV::PseudoCALL:
739 case RISCV::PseudoJump:
740 case RISCV::PseudoTAIL:
741 case RISCV::PseudoLLA:
742 case RISCV::PseudoLA:
743 case RISCV::PseudoLA_TLS_IE:
744 case RISCV::PseudoLA_TLS_GD:
745 return 8;
746 case RISCV::PseudoAtomicLoadNand32:
747 case RISCV::PseudoAtomicLoadNand64:
748 return 20;
749 case RISCV::PseudoMaskedAtomicSwap32:
750 case RISCV::PseudoMaskedAtomicLoadAdd32:
751 case RISCV::PseudoMaskedAtomicLoadSub32:
752 return 28;
753 case RISCV::PseudoMaskedAtomicLoadNand32:
754 return 32;
755 case RISCV::PseudoMaskedAtomicLoadMax32:
756 case RISCV::PseudoMaskedAtomicLoadMin32:
757 return 44;
758 case RISCV::PseudoMaskedAtomicLoadUMax32:
759 case RISCV::PseudoMaskedAtomicLoadUMin32:
760 return 36;
761 case RISCV::PseudoCmpXchg32:
762 case RISCV::PseudoCmpXchg64:
763 return 16;
764 case RISCV::PseudoMaskedCmpXchg32:
765 return 32;
766 case TargetOpcode::INLINEASM:
767 case TargetOpcode::INLINEASM_BR: {
768 const MachineFunction &MF = *MI.getParent()->getParent();
769 const auto &TM = static_cast<const RISCVTargetMachine &>(MF.getTarget());
770 return getInlineAsmLength(MI.getOperand(0).getSymbolName(),
771 *TM.getMCAsmInfo());
772 }
773 case RISCV::PseudoVSPILL2_M1:
774 case RISCV::PseudoVSPILL2_M2:
775 case RISCV::PseudoVSPILL2_M4:
776 case RISCV::PseudoVSPILL3_M1:
777 case RISCV::PseudoVSPILL3_M2:
778 case RISCV::PseudoVSPILL4_M1:
779 case RISCV::PseudoVSPILL4_M2:
780 case RISCV::PseudoVSPILL5_M1:
781 case RISCV::PseudoVSPILL6_M1:
782 case RISCV::PseudoVSPILL7_M1:
783 case RISCV::PseudoVSPILL8_M1:
784 case RISCV::PseudoVRELOAD2_M1:
785 case RISCV::PseudoVRELOAD2_M2:
786 case RISCV::PseudoVRELOAD2_M4:
787 case RISCV::PseudoVRELOAD3_M1:
788 case RISCV::PseudoVRELOAD3_M2:
789 case RISCV::PseudoVRELOAD4_M1:
790 case RISCV::PseudoVRELOAD4_M2:
791 case RISCV::PseudoVRELOAD5_M1:
792 case RISCV::PseudoVRELOAD6_M1:
793 case RISCV::PseudoVRELOAD7_M1:
794 case RISCV::PseudoVRELOAD8_M1: {
795 // The values are determined based on expandVSPILL and expandVRELOAD that
796 // expand the pseudos depending on NF.
797 unsigned NF = isRVVSpillForZvlsseg(Opcode)->first;
798 return 4 * (2 * NF - 1);
799 }
800 }
801 }
802
isAsCheapAsAMove(const MachineInstr & MI) const803 bool RISCVInstrInfo::isAsCheapAsAMove(const MachineInstr &MI) const {
804 const unsigned Opcode = MI.getOpcode();
805 switch (Opcode) {
806 default:
807 break;
808 case RISCV::FSGNJ_D:
809 case RISCV::FSGNJ_S:
810 // The canonical floating-point move is fsgnj rd, rs, rs.
811 return MI.getOperand(1).isReg() && MI.getOperand(2).isReg() &&
812 MI.getOperand(1).getReg() == MI.getOperand(2).getReg();
813 case RISCV::ADDI:
814 case RISCV::ORI:
815 case RISCV::XORI:
816 return (MI.getOperand(1).isReg() &&
817 MI.getOperand(1).getReg() == RISCV::X0) ||
818 (MI.getOperand(2).isImm() && MI.getOperand(2).getImm() == 0);
819 }
820 return MI.isAsCheapAsAMove();
821 }
822
823 Optional<DestSourcePair>
isCopyInstrImpl(const MachineInstr & MI) const824 RISCVInstrInfo::isCopyInstrImpl(const MachineInstr &MI) const {
825 if (MI.isMoveReg())
826 return DestSourcePair{MI.getOperand(0), MI.getOperand(1)};
827 switch (MI.getOpcode()) {
828 default:
829 break;
830 case RISCV::ADDI:
831 // Operand 1 can be a frameindex but callers expect registers
832 if (MI.getOperand(1).isReg() && MI.getOperand(2).isImm() &&
833 MI.getOperand(2).getImm() == 0)
834 return DestSourcePair{MI.getOperand(0), MI.getOperand(1)};
835 break;
836 case RISCV::FSGNJ_D:
837 case RISCV::FSGNJ_S:
838 // The canonical floating-point move is fsgnj rd, rs, rs.
839 if (MI.getOperand(1).isReg() && MI.getOperand(2).isReg() &&
840 MI.getOperand(1).getReg() == MI.getOperand(2).getReg())
841 return DestSourcePair{MI.getOperand(0), MI.getOperand(1)};
842 break;
843 }
844 return None;
845 }
846
verifyInstruction(const MachineInstr & MI,StringRef & ErrInfo) const847 bool RISCVInstrInfo::verifyInstruction(const MachineInstr &MI,
848 StringRef &ErrInfo) const {
849 const MCInstrInfo *MCII = STI.getInstrInfo();
850 MCInstrDesc const &Desc = MCII->get(MI.getOpcode());
851
852 for (auto &OI : enumerate(Desc.operands())) {
853 unsigned OpType = OI.value().OperandType;
854 if (OpType >= RISCVOp::OPERAND_FIRST_RISCV_IMM &&
855 OpType <= RISCVOp::OPERAND_LAST_RISCV_IMM) {
856 const MachineOperand &MO = MI.getOperand(OI.index());
857 if (MO.isImm()) {
858 int64_t Imm = MO.getImm();
859 bool Ok;
860 switch (OpType) {
861 default:
862 llvm_unreachable("Unexpected operand type");
863 case RISCVOp::OPERAND_UIMM4:
864 Ok = isUInt<4>(Imm);
865 break;
866 case RISCVOp::OPERAND_UIMM5:
867 Ok = isUInt<5>(Imm);
868 break;
869 case RISCVOp::OPERAND_UIMM12:
870 Ok = isUInt<12>(Imm);
871 break;
872 case RISCVOp::OPERAND_SIMM12:
873 Ok = isInt<12>(Imm);
874 break;
875 case RISCVOp::OPERAND_UIMM20:
876 Ok = isUInt<20>(Imm);
877 break;
878 case RISCVOp::OPERAND_UIMMLOG2XLEN:
879 if (STI.getTargetTriple().isArch64Bit())
880 Ok = isUInt<6>(Imm);
881 else
882 Ok = isUInt<5>(Imm);
883 break;
884 }
885 if (!Ok) {
886 ErrInfo = "Invalid immediate";
887 return false;
888 }
889 }
890 }
891 }
892
893 return true;
894 }
895
896 // Return true if get the base operand, byte offset of an instruction and the
897 // memory width. Width is the size of memory that is being loaded/stored.
getMemOperandWithOffsetWidth(const MachineInstr & LdSt,const MachineOperand * & BaseReg,int64_t & Offset,unsigned & Width,const TargetRegisterInfo * TRI) const898 bool RISCVInstrInfo::getMemOperandWithOffsetWidth(
899 const MachineInstr &LdSt, const MachineOperand *&BaseReg, int64_t &Offset,
900 unsigned &Width, const TargetRegisterInfo *TRI) const {
901 if (!LdSt.mayLoadOrStore())
902 return false;
903
904 // Here we assume the standard RISC-V ISA, which uses a base+offset
905 // addressing mode. You'll need to relax these conditions to support custom
906 // load/stores instructions.
907 if (LdSt.getNumExplicitOperands() != 3)
908 return false;
909 if (!LdSt.getOperand(1).isReg() || !LdSt.getOperand(2).isImm())
910 return false;
911
912 if (!LdSt.hasOneMemOperand())
913 return false;
914
915 Width = (*LdSt.memoperands_begin())->getSize();
916 BaseReg = &LdSt.getOperand(1);
917 Offset = LdSt.getOperand(2).getImm();
918 return true;
919 }
920
areMemAccessesTriviallyDisjoint(const MachineInstr & MIa,const MachineInstr & MIb) const921 bool RISCVInstrInfo::areMemAccessesTriviallyDisjoint(
922 const MachineInstr &MIa, const MachineInstr &MIb) const {
923 assert(MIa.mayLoadOrStore() && "MIa must be a load or store.");
924 assert(MIb.mayLoadOrStore() && "MIb must be a load or store.");
925
926 if (MIa.hasUnmodeledSideEffects() || MIb.hasUnmodeledSideEffects() ||
927 MIa.hasOrderedMemoryRef() || MIb.hasOrderedMemoryRef())
928 return false;
929
930 // Retrieve the base register, offset from the base register and width. Width
931 // is the size of memory that is being loaded/stored (e.g. 1, 2, 4). If
932 // base registers are identical, and the offset of a lower memory access +
933 // the width doesn't overlap the offset of a higher memory access,
934 // then the memory accesses are different.
935 const TargetRegisterInfo *TRI = STI.getRegisterInfo();
936 const MachineOperand *BaseOpA = nullptr, *BaseOpB = nullptr;
937 int64_t OffsetA = 0, OffsetB = 0;
938 unsigned int WidthA = 0, WidthB = 0;
939 if (getMemOperandWithOffsetWidth(MIa, BaseOpA, OffsetA, WidthA, TRI) &&
940 getMemOperandWithOffsetWidth(MIb, BaseOpB, OffsetB, WidthB, TRI)) {
941 if (BaseOpA->isIdenticalTo(*BaseOpB)) {
942 int LowOffset = std::min(OffsetA, OffsetB);
943 int HighOffset = std::max(OffsetA, OffsetB);
944 int LowWidth = (LowOffset == OffsetA) ? WidthA : WidthB;
945 if (LowOffset + LowWidth <= HighOffset)
946 return true;
947 }
948 }
949 return false;
950 }
951
952 std::pair<unsigned, unsigned>
decomposeMachineOperandsTargetFlags(unsigned TF) const953 RISCVInstrInfo::decomposeMachineOperandsTargetFlags(unsigned TF) const {
954 const unsigned Mask = RISCVII::MO_DIRECT_FLAG_MASK;
955 return std::make_pair(TF & Mask, TF & ~Mask);
956 }
957
958 ArrayRef<std::pair<unsigned, const char *>>
getSerializableDirectMachineOperandTargetFlags() const959 RISCVInstrInfo::getSerializableDirectMachineOperandTargetFlags() const {
960 using namespace RISCVII;
961 static const std::pair<unsigned, const char *> TargetFlags[] = {
962 {MO_CALL, "riscv-call"},
963 {MO_PLT, "riscv-plt"},
964 {MO_LO, "riscv-lo"},
965 {MO_HI, "riscv-hi"},
966 {MO_PCREL_LO, "riscv-pcrel-lo"},
967 {MO_PCREL_HI, "riscv-pcrel-hi"},
968 {MO_GOT_HI, "riscv-got-hi"},
969 {MO_TPREL_LO, "riscv-tprel-lo"},
970 {MO_TPREL_HI, "riscv-tprel-hi"},
971 {MO_TPREL_ADD, "riscv-tprel-add"},
972 {MO_TLS_GOT_HI, "riscv-tls-got-hi"},
973 {MO_TLS_GD_HI, "riscv-tls-gd-hi"}};
974 return makeArrayRef(TargetFlags);
975 }
isFunctionSafeToOutlineFrom(MachineFunction & MF,bool OutlineFromLinkOnceODRs) const976 bool RISCVInstrInfo::isFunctionSafeToOutlineFrom(
977 MachineFunction &MF, bool OutlineFromLinkOnceODRs) const {
978 const Function &F = MF.getFunction();
979
980 // Can F be deduplicated by the linker? If it can, don't outline from it.
981 if (!OutlineFromLinkOnceODRs && F.hasLinkOnceODRLinkage())
982 return false;
983
984 // Don't outline from functions with section markings; the program could
985 // expect that all the code is in the named section.
986 if (F.hasSection())
987 return false;
988
989 // It's safe to outline from MF.
990 return true;
991 }
992
isMBBSafeToOutlineFrom(MachineBasicBlock & MBB,unsigned & Flags) const993 bool RISCVInstrInfo::isMBBSafeToOutlineFrom(MachineBasicBlock &MBB,
994 unsigned &Flags) const {
995 // More accurate safety checking is done in getOutliningCandidateInfo.
996 return true;
997 }
998
999 // Enum values indicating how an outlined call should be constructed.
1000 enum MachineOutlinerConstructionID {
1001 MachineOutlinerDefault
1002 };
1003
getOutliningCandidateInfo(std::vector<outliner::Candidate> & RepeatedSequenceLocs) const1004 outliner::OutlinedFunction RISCVInstrInfo::getOutliningCandidateInfo(
1005 std::vector<outliner::Candidate> &RepeatedSequenceLocs) const {
1006
1007 // First we need to filter out candidates where the X5 register (IE t0) can't
1008 // be used to setup the function call.
1009 auto CannotInsertCall = [](outliner::Candidate &C) {
1010 const TargetRegisterInfo *TRI = C.getMF()->getSubtarget().getRegisterInfo();
1011
1012 C.initLRU(*TRI);
1013 LiveRegUnits LRU = C.LRU;
1014 return !LRU.available(RISCV::X5);
1015 };
1016
1017 llvm::erase_if(RepeatedSequenceLocs, CannotInsertCall);
1018
1019 // If the sequence doesn't have enough candidates left, then we're done.
1020 if (RepeatedSequenceLocs.size() < 2)
1021 return outliner::OutlinedFunction();
1022
1023 unsigned SequenceSize = 0;
1024
1025 auto I = RepeatedSequenceLocs[0].front();
1026 auto E = std::next(RepeatedSequenceLocs[0].back());
1027 for (; I != E; ++I)
1028 SequenceSize += getInstSizeInBytes(*I);
1029
1030 // call t0, function = 8 bytes.
1031 unsigned CallOverhead = 8;
1032 for (auto &C : RepeatedSequenceLocs)
1033 C.setCallInfo(MachineOutlinerDefault, CallOverhead);
1034
1035 // jr t0 = 4 bytes, 2 bytes if compressed instructions are enabled.
1036 unsigned FrameOverhead = 4;
1037 if (RepeatedSequenceLocs[0].getMF()->getSubtarget()
1038 .getFeatureBits()[RISCV::FeatureStdExtC])
1039 FrameOverhead = 2;
1040
1041 return outliner::OutlinedFunction(RepeatedSequenceLocs, SequenceSize,
1042 FrameOverhead, MachineOutlinerDefault);
1043 }
1044
1045 outliner::InstrType
getOutliningType(MachineBasicBlock::iterator & MBBI,unsigned Flags) const1046 RISCVInstrInfo::getOutliningType(MachineBasicBlock::iterator &MBBI,
1047 unsigned Flags) const {
1048 MachineInstr &MI = *MBBI;
1049 MachineBasicBlock *MBB = MI.getParent();
1050 const TargetRegisterInfo *TRI =
1051 MBB->getParent()->getSubtarget().getRegisterInfo();
1052
1053 // Positions generally can't safely be outlined.
1054 if (MI.isPosition()) {
1055 // We can manually strip out CFI instructions later.
1056 if (MI.isCFIInstruction())
1057 return outliner::InstrType::Invisible;
1058
1059 return outliner::InstrType::Illegal;
1060 }
1061
1062 // Don't trust the user to write safe inline assembly.
1063 if (MI.isInlineAsm())
1064 return outliner::InstrType::Illegal;
1065
1066 // We can't outline branches to other basic blocks.
1067 if (MI.isTerminator() && !MBB->succ_empty())
1068 return outliner::InstrType::Illegal;
1069
1070 // We need support for tail calls to outlined functions before return
1071 // statements can be allowed.
1072 if (MI.isReturn())
1073 return outliner::InstrType::Illegal;
1074
1075 // Don't allow modifying the X5 register which we use for return addresses for
1076 // these outlined functions.
1077 if (MI.modifiesRegister(RISCV::X5, TRI) ||
1078 MI.getDesc().hasImplicitDefOfPhysReg(RISCV::X5))
1079 return outliner::InstrType::Illegal;
1080
1081 // Make sure the operands don't reference something unsafe.
1082 for (const auto &MO : MI.operands())
1083 if (MO.isMBB() || MO.isBlockAddress() || MO.isCPI())
1084 return outliner::InstrType::Illegal;
1085
1086 // Don't allow instructions which won't be materialized to impact outlining
1087 // analysis.
1088 if (MI.isMetaInstruction())
1089 return outliner::InstrType::Invisible;
1090
1091 return outliner::InstrType::Legal;
1092 }
1093
buildOutlinedFrame(MachineBasicBlock & MBB,MachineFunction & MF,const outliner::OutlinedFunction & OF) const1094 void RISCVInstrInfo::buildOutlinedFrame(
1095 MachineBasicBlock &MBB, MachineFunction &MF,
1096 const outliner::OutlinedFunction &OF) const {
1097
1098 // Strip out any CFI instructions
1099 bool Changed = true;
1100 while (Changed) {
1101 Changed = false;
1102 auto I = MBB.begin();
1103 auto E = MBB.end();
1104 for (; I != E; ++I) {
1105 if (I->isCFIInstruction()) {
1106 I->removeFromParent();
1107 Changed = true;
1108 break;
1109 }
1110 }
1111 }
1112
1113 MBB.addLiveIn(RISCV::X5);
1114
1115 // Add in a return instruction to the end of the outlined frame.
1116 MBB.insert(MBB.end(), BuildMI(MF, DebugLoc(), get(RISCV::JALR))
1117 .addReg(RISCV::X0, RegState::Define)
1118 .addReg(RISCV::X5)
1119 .addImm(0));
1120 }
1121
insertOutlinedCall(Module & M,MachineBasicBlock & MBB,MachineBasicBlock::iterator & It,MachineFunction & MF,const outliner::Candidate & C) const1122 MachineBasicBlock::iterator RISCVInstrInfo::insertOutlinedCall(
1123 Module &M, MachineBasicBlock &MBB, MachineBasicBlock::iterator &It,
1124 MachineFunction &MF, const outliner::Candidate &C) const {
1125
1126 // Add in a call instruction to the outlined function at the given location.
1127 It = MBB.insert(It,
1128 BuildMI(MF, DebugLoc(), get(RISCV::PseudoCALLReg), RISCV::X5)
1129 .addGlobalAddress(M.getNamedValue(MF.getName()), 0,
1130 RISCVII::MO_CALL));
1131 return It;
1132 }
1133
1134 // clang-format off
1135 #define CASE_VFMA_OPCODE_COMMON(OP, TYPE, LMUL) \
1136 RISCV::PseudoV##OP##_##TYPE##_##LMUL##_COMMUTABLE
1137
1138 #define CASE_VFMA_OPCODE_LMULS(OP, TYPE) \
1139 CASE_VFMA_OPCODE_COMMON(OP, TYPE, MF8): \
1140 case CASE_VFMA_OPCODE_COMMON(OP, TYPE, MF4): \
1141 case CASE_VFMA_OPCODE_COMMON(OP, TYPE, MF2): \
1142 case CASE_VFMA_OPCODE_COMMON(OP, TYPE, M1): \
1143 case CASE_VFMA_OPCODE_COMMON(OP, TYPE, M2): \
1144 case CASE_VFMA_OPCODE_COMMON(OP, TYPE, M4): \
1145 case CASE_VFMA_OPCODE_COMMON(OP, TYPE, M8)
1146
1147 #define CASE_VFMA_SPLATS(OP) \
1148 CASE_VFMA_OPCODE_LMULS(OP, VF16): \
1149 case CASE_VFMA_OPCODE_LMULS(OP, VF32): \
1150 case CASE_VFMA_OPCODE_LMULS(OP, VF64)
1151 // clang-format on
1152
findCommutedOpIndices(const MachineInstr & MI,unsigned & SrcOpIdx1,unsigned & SrcOpIdx2) const1153 bool RISCVInstrInfo::findCommutedOpIndices(const MachineInstr &MI,
1154 unsigned &SrcOpIdx1,
1155 unsigned &SrcOpIdx2) const {
1156 const MCInstrDesc &Desc = MI.getDesc();
1157 if (!Desc.isCommutable())
1158 return false;
1159
1160 switch (MI.getOpcode()) {
1161 case CASE_VFMA_SPLATS(FMADD):
1162 case CASE_VFMA_SPLATS(FMSUB):
1163 case CASE_VFMA_SPLATS(FMACC):
1164 case CASE_VFMA_SPLATS(FMSAC):
1165 case CASE_VFMA_SPLATS(FNMADD):
1166 case CASE_VFMA_SPLATS(FNMSUB):
1167 case CASE_VFMA_SPLATS(FNMACC):
1168 case CASE_VFMA_SPLATS(FNMSAC):
1169 case CASE_VFMA_OPCODE_LMULS(FMACC, VV):
1170 case CASE_VFMA_OPCODE_LMULS(FMSAC, VV):
1171 case CASE_VFMA_OPCODE_LMULS(FNMACC, VV):
1172 case CASE_VFMA_OPCODE_LMULS(FNMSAC, VV): {
1173 // For these instructions we can only swap operand 1 and operand 3 by
1174 // changing the opcode.
1175 unsigned CommutableOpIdx1 = 1;
1176 unsigned CommutableOpIdx2 = 3;
1177 if (!fixCommutedOpIndices(SrcOpIdx1, SrcOpIdx2, CommutableOpIdx1,
1178 CommutableOpIdx2))
1179 return false;
1180 return true;
1181 }
1182 case CASE_VFMA_OPCODE_LMULS(FMADD, VV):
1183 case CASE_VFMA_OPCODE_LMULS(FMSUB, VV):
1184 case CASE_VFMA_OPCODE_LMULS(FNMADD, VV):
1185 case CASE_VFMA_OPCODE_LMULS(FNMSUB, VV): {
1186 // For these instructions we have more freedom. We can commute with the
1187 // other multiplicand or with the addend/subtrahend/minuend.
1188
1189 // Any fixed operand must be from source 1, 2 or 3.
1190 if (SrcOpIdx1 != CommuteAnyOperandIndex && SrcOpIdx1 > 3)
1191 return false;
1192 if (SrcOpIdx2 != CommuteAnyOperandIndex && SrcOpIdx2 > 3)
1193 return false;
1194
1195 // It both ops are fixed one must be the tied source.
1196 if (SrcOpIdx1 != CommuteAnyOperandIndex &&
1197 SrcOpIdx2 != CommuteAnyOperandIndex && SrcOpIdx1 != 1 && SrcOpIdx2 != 1)
1198 return false;
1199
1200 // Look for two different register operands assumed to be commutable
1201 // regardless of the FMA opcode. The FMA opcode is adjusted later if
1202 // needed.
1203 if (SrcOpIdx1 == CommuteAnyOperandIndex ||
1204 SrcOpIdx2 == CommuteAnyOperandIndex) {
1205 // At least one of operands to be commuted is not specified and
1206 // this method is free to choose appropriate commutable operands.
1207 unsigned CommutableOpIdx1 = SrcOpIdx1;
1208 if (SrcOpIdx1 == SrcOpIdx2) {
1209 // Both of operands are not fixed. Set one of commutable
1210 // operands to the tied source.
1211 CommutableOpIdx1 = 1;
1212 } else if (SrcOpIdx1 == CommutableOpIdx1) {
1213 // Only one of the operands is not fixed.
1214 CommutableOpIdx1 = SrcOpIdx2;
1215 }
1216
1217 // CommutableOpIdx1 is well defined now. Let's choose another commutable
1218 // operand and assign its index to CommutableOpIdx2.
1219 unsigned CommutableOpIdx2;
1220 if (CommutableOpIdx1 != 1) {
1221 // If we haven't already used the tied source, we must use it now.
1222 CommutableOpIdx2 = 1;
1223 } else {
1224 Register Op1Reg = MI.getOperand(CommutableOpIdx1).getReg();
1225
1226 // The commuted operands should have different registers.
1227 // Otherwise, the commute transformation does not change anything and
1228 // is useless. We use this as a hint to make our decision.
1229 if (Op1Reg != MI.getOperand(2).getReg())
1230 CommutableOpIdx2 = 2;
1231 else
1232 CommutableOpIdx2 = 3;
1233 }
1234
1235 // Assign the found pair of commutable indices to SrcOpIdx1 and
1236 // SrcOpIdx2 to return those values.
1237 if (!fixCommutedOpIndices(SrcOpIdx1, SrcOpIdx2, CommutableOpIdx1,
1238 CommutableOpIdx2))
1239 return false;
1240 }
1241
1242 return true;
1243 }
1244 }
1245
1246 return TargetInstrInfo::findCommutedOpIndices(MI, SrcOpIdx1, SrcOpIdx2);
1247 }
1248
1249 #define CASE_VFMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, LMUL) \
1250 case RISCV::PseudoV##OLDOP##_##TYPE##_##LMUL##_COMMUTABLE: \
1251 Opc = RISCV::PseudoV##NEWOP##_##TYPE##_##LMUL##_COMMUTABLE; \
1252 break;
1253
1254 #define CASE_VFMA_CHANGE_OPCODE_LMULS(OLDOP, NEWOP, TYPE) \
1255 CASE_VFMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, MF8) \
1256 CASE_VFMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, MF4) \
1257 CASE_VFMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, MF2) \
1258 CASE_VFMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, M1) \
1259 CASE_VFMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, M2) \
1260 CASE_VFMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, M4) \
1261 CASE_VFMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, M8)
1262
1263 #define CASE_VFMA_CHANGE_OPCODE_SPLATS(OLDOP, NEWOP) \
1264 CASE_VFMA_CHANGE_OPCODE_LMULS(OLDOP, NEWOP, VF16) \
1265 CASE_VFMA_CHANGE_OPCODE_LMULS(OLDOP, NEWOP, VF32) \
1266 CASE_VFMA_CHANGE_OPCODE_LMULS(OLDOP, NEWOP, VF64)
1267
commuteInstructionImpl(MachineInstr & MI,bool NewMI,unsigned OpIdx1,unsigned OpIdx2) const1268 MachineInstr *RISCVInstrInfo::commuteInstructionImpl(MachineInstr &MI,
1269 bool NewMI,
1270 unsigned OpIdx1,
1271 unsigned OpIdx2) const {
1272 auto cloneIfNew = [NewMI](MachineInstr &MI) -> MachineInstr & {
1273 if (NewMI)
1274 return *MI.getParent()->getParent()->CloneMachineInstr(&MI);
1275 return MI;
1276 };
1277
1278 switch (MI.getOpcode()) {
1279 case CASE_VFMA_SPLATS(FMACC):
1280 case CASE_VFMA_SPLATS(FMADD):
1281 case CASE_VFMA_SPLATS(FMSAC):
1282 case CASE_VFMA_SPLATS(FMSUB):
1283 case CASE_VFMA_SPLATS(FNMACC):
1284 case CASE_VFMA_SPLATS(FNMADD):
1285 case CASE_VFMA_SPLATS(FNMSAC):
1286 case CASE_VFMA_SPLATS(FNMSUB):
1287 case CASE_VFMA_OPCODE_LMULS(FMACC, VV):
1288 case CASE_VFMA_OPCODE_LMULS(FMSAC, VV):
1289 case CASE_VFMA_OPCODE_LMULS(FNMACC, VV):
1290 case CASE_VFMA_OPCODE_LMULS(FNMSAC, VV): {
1291 // It only make sense to toggle these between clobbering the
1292 // addend/subtrahend/minuend one of the multiplicands.
1293 assert((OpIdx1 == 1 || OpIdx2 == 1) && "Unexpected opcode index");
1294 assert((OpIdx1 == 3 || OpIdx2 == 3) && "Unexpected opcode index");
1295 unsigned Opc;
1296 switch (MI.getOpcode()) {
1297 default:
1298 llvm_unreachable("Unexpected opcode");
1299 CASE_VFMA_CHANGE_OPCODE_SPLATS(FMACC, FMADD)
1300 CASE_VFMA_CHANGE_OPCODE_SPLATS(FMADD, FMACC)
1301 CASE_VFMA_CHANGE_OPCODE_SPLATS(FMSAC, FMSUB)
1302 CASE_VFMA_CHANGE_OPCODE_SPLATS(FMSUB, FMSAC)
1303 CASE_VFMA_CHANGE_OPCODE_SPLATS(FNMACC, FNMADD)
1304 CASE_VFMA_CHANGE_OPCODE_SPLATS(FNMADD, FNMACC)
1305 CASE_VFMA_CHANGE_OPCODE_SPLATS(FNMSAC, FNMSUB)
1306 CASE_VFMA_CHANGE_OPCODE_SPLATS(FNMSUB, FNMSAC)
1307 CASE_VFMA_CHANGE_OPCODE_LMULS(FMACC, FMADD, VV)
1308 CASE_VFMA_CHANGE_OPCODE_LMULS(FMSAC, FMSUB, VV)
1309 CASE_VFMA_CHANGE_OPCODE_LMULS(FNMACC, FNMADD, VV)
1310 CASE_VFMA_CHANGE_OPCODE_LMULS(FNMSAC, FNMSUB, VV)
1311 }
1312
1313 auto &WorkingMI = cloneIfNew(MI);
1314 WorkingMI.setDesc(get(Opc));
1315 return TargetInstrInfo::commuteInstructionImpl(WorkingMI, /*NewMI=*/false,
1316 OpIdx1, OpIdx2);
1317 }
1318 case CASE_VFMA_OPCODE_LMULS(FMADD, VV):
1319 case CASE_VFMA_OPCODE_LMULS(FMSUB, VV):
1320 case CASE_VFMA_OPCODE_LMULS(FNMADD, VV):
1321 case CASE_VFMA_OPCODE_LMULS(FNMSUB, VV): {
1322 assert((OpIdx1 == 1 || OpIdx2 == 1) && "Unexpected opcode index");
1323 // If one of the operands, is the addend we need to change opcode.
1324 // Otherwise we're just swapping 2 of the multiplicands.
1325 if (OpIdx1 == 3 || OpIdx2 == 3) {
1326 unsigned Opc;
1327 switch (MI.getOpcode()) {
1328 default:
1329 llvm_unreachable("Unexpected opcode");
1330 CASE_VFMA_CHANGE_OPCODE_LMULS(FMADD, FMACC, VV)
1331 CASE_VFMA_CHANGE_OPCODE_LMULS(FMSUB, FMSAC, VV)
1332 CASE_VFMA_CHANGE_OPCODE_LMULS(FNMADD, FNMACC, VV)
1333 CASE_VFMA_CHANGE_OPCODE_LMULS(FNMSUB, FNMSAC, VV)
1334 }
1335
1336 auto &WorkingMI = cloneIfNew(MI);
1337 WorkingMI.setDesc(get(Opc));
1338 return TargetInstrInfo::commuteInstructionImpl(WorkingMI, /*NewMI=*/false,
1339 OpIdx1, OpIdx2);
1340 }
1341 // Let the default code handle it.
1342 break;
1343 }
1344 }
1345
1346 return TargetInstrInfo::commuteInstructionImpl(MI, NewMI, OpIdx1, OpIdx2);
1347 }
1348
1349 #undef CASE_VFMA_CHANGE_OPCODE_SPLATS
1350 #undef CASE_VFMA_CHANGE_OPCODE_LMULS
1351 #undef CASE_VFMA_CHANGE_OPCODE_COMMON
1352 #undef CASE_VFMA_SPLATS
1353 #undef CASE_VFMA_OPCODE_LMULS
1354 #undef CASE_VFMA_OPCODE_COMMON
1355
getVLENFactoredAmount(MachineFunction & MF,MachineBasicBlock & MBB,MachineBasicBlock::iterator II,const DebugLoc & DL,int64_t Amount) const1356 Register RISCVInstrInfo::getVLENFactoredAmount(MachineFunction &MF,
1357 MachineBasicBlock &MBB,
1358 MachineBasicBlock::iterator II,
1359 const DebugLoc &DL,
1360 int64_t Amount) const {
1361 assert(Amount > 0 && "There is no need to get VLEN scaled value.");
1362 assert(Amount % 8 == 0 &&
1363 "Reserve the stack by the multiple of one vector size.");
1364
1365 MachineRegisterInfo &MRI = MF.getRegInfo();
1366 const RISCVInstrInfo *TII = MF.getSubtarget<RISCVSubtarget>().getInstrInfo();
1367 int64_t NumOfVReg = Amount / 8;
1368
1369 Register VL = MRI.createVirtualRegister(&RISCV::GPRRegClass);
1370 BuildMI(MBB, II, DL, TII->get(RISCV::PseudoReadVLENB), VL);
1371 assert(isInt<12>(NumOfVReg) &&
1372 "Expect the number of vector registers within 12-bits.");
1373 if (isPowerOf2_32(NumOfVReg)) {
1374 uint32_t ShiftAmount = Log2_32(NumOfVReg);
1375 if (ShiftAmount == 0)
1376 return VL;
1377 BuildMI(MBB, II, DL, TII->get(RISCV::SLLI), VL)
1378 .addReg(VL, RegState::Kill)
1379 .addImm(ShiftAmount);
1380 } else {
1381 Register N = MRI.createVirtualRegister(&RISCV::GPRRegClass);
1382 BuildMI(MBB, II, DL, TII->get(RISCV::ADDI), N)
1383 .addReg(RISCV::X0)
1384 .addImm(NumOfVReg);
1385 if (!MF.getSubtarget<RISCVSubtarget>().hasStdExtM())
1386 MF.getFunction().getContext().diagnose(DiagnosticInfoUnsupported{
1387 MF.getFunction(),
1388 "M-extension must be enabled to calculate the vscaled size/offset."});
1389 BuildMI(MBB, II, DL, TII->get(RISCV::MUL), VL)
1390 .addReg(VL, RegState::Kill)
1391 .addReg(N, RegState::Kill);
1392 }
1393
1394 return VL;
1395 }
1396
1397 Optional<std::pair<unsigned, unsigned>>
isRVVSpillForZvlsseg(unsigned Opcode) const1398 RISCVInstrInfo::isRVVSpillForZvlsseg(unsigned Opcode) const {
1399 switch (Opcode) {
1400 default:
1401 return None;
1402 case RISCV::PseudoVSPILL2_M1:
1403 case RISCV::PseudoVRELOAD2_M1:
1404 return std::make_pair(2u, 1u);
1405 case RISCV::PseudoVSPILL2_M2:
1406 case RISCV::PseudoVRELOAD2_M2:
1407 return std::make_pair(2u, 2u);
1408 case RISCV::PseudoVSPILL2_M4:
1409 case RISCV::PseudoVRELOAD2_M4:
1410 return std::make_pair(2u, 4u);
1411 case RISCV::PseudoVSPILL3_M1:
1412 case RISCV::PseudoVRELOAD3_M1:
1413 return std::make_pair(3u, 1u);
1414 case RISCV::PseudoVSPILL3_M2:
1415 case RISCV::PseudoVRELOAD3_M2:
1416 return std::make_pair(3u, 2u);
1417 case RISCV::PseudoVSPILL4_M1:
1418 case RISCV::PseudoVRELOAD4_M1:
1419 return std::make_pair(4u, 1u);
1420 case RISCV::PseudoVSPILL4_M2:
1421 case RISCV::PseudoVRELOAD4_M2:
1422 return std::make_pair(4u, 2u);
1423 case RISCV::PseudoVSPILL5_M1:
1424 case RISCV::PseudoVRELOAD5_M1:
1425 return std::make_pair(5u, 1u);
1426 case RISCV::PseudoVSPILL6_M1:
1427 case RISCV::PseudoVRELOAD6_M1:
1428 return std::make_pair(6u, 1u);
1429 case RISCV::PseudoVSPILL7_M1:
1430 case RISCV::PseudoVRELOAD7_M1:
1431 return std::make_pair(7u, 1u);
1432 case RISCV::PseudoVSPILL8_M1:
1433 case RISCV::PseudoVRELOAD8_M1:
1434 return std::make_pair(8u, 1u);
1435 }
1436 }
1437