1 //===-- RISCVRegisterInfo.cpp - RISC-V Register 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 RISC-V implementation of the TargetRegisterInfo class. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "RISCVRegisterInfo.h" 14 #include "RISCV.h" 15 #include "RISCVSubtarget.h" 16 #include "llvm/ADT/SmallSet.h" 17 #include "llvm/BinaryFormat/Dwarf.h" 18 #include "llvm/CodeGen/MachineFrameInfo.h" 19 #include "llvm/CodeGen/MachineFunction.h" 20 #include "llvm/CodeGen/MachineInstrBuilder.h" 21 #include "llvm/CodeGen/RegisterScavenging.h" 22 #include "llvm/CodeGen/TargetFrameLowering.h" 23 #include "llvm/CodeGen/TargetInstrInfo.h" 24 #include "llvm/IR/DebugInfoMetadata.h" 25 #include "llvm/Support/ErrorHandling.h" 26 27 #define GET_REGINFO_TARGET_DESC 28 #include "RISCVGenRegisterInfo.inc" 29 30 using namespace llvm; 31 32 static cl::opt<bool> DisableCostPerUse("riscv-disable-cost-per-use", 33 cl::init(false), cl::Hidden); 34 static cl::opt<bool> 35 DisableRegAllocHints("riscv-disable-regalloc-hints", cl::Hidden, 36 cl::init(false), 37 cl::desc("Disable two address hints for register " 38 "allocation")); 39 40 static_assert(RISCV::X1 == RISCV::X0 + 1, "Register list not consecutive"); 41 static_assert(RISCV::X31 == RISCV::X0 + 31, "Register list not consecutive"); 42 static_assert(RISCV::F1_H == RISCV::F0_H + 1, "Register list not consecutive"); 43 static_assert(RISCV::F31_H == RISCV::F0_H + 31, 44 "Register list not consecutive"); 45 static_assert(RISCV::F1_F == RISCV::F0_F + 1, "Register list not consecutive"); 46 static_assert(RISCV::F31_F == RISCV::F0_F + 31, 47 "Register list not consecutive"); 48 static_assert(RISCV::F1_D == RISCV::F0_D + 1, "Register list not consecutive"); 49 static_assert(RISCV::F31_D == RISCV::F0_D + 31, 50 "Register list not consecutive"); 51 static_assert(RISCV::F1_Q == RISCV::F0_Q + 1, "Register list not consecutive"); 52 static_assert(RISCV::F31_Q == RISCV::F0_Q + 31, 53 "Register list not consecutive"); 54 static_assert(RISCV::V1 == RISCV::V0 + 1, "Register list not consecutive"); 55 static_assert(RISCV::V31 == RISCV::V0 + 31, "Register list not consecutive"); 56 57 RISCVRegisterInfo::RISCVRegisterInfo(unsigned HwMode) 58 : RISCVGenRegisterInfo(RISCV::X1, /*DwarfFlavour*/0, /*EHFlavor*/0, 59 /*PC*/0, HwMode) {} 60 61 const MCPhysReg * 62 RISCVRegisterInfo::getIPRACSRegs(const MachineFunction *MF) const { 63 return CSR_IPRA_SaveList; 64 } 65 66 const MCPhysReg * 67 RISCVRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const { 68 auto &Subtarget = MF->getSubtarget<RISCVSubtarget>(); 69 if (MF->getFunction().getCallingConv() == CallingConv::GHC) 70 return CSR_NoRegs_SaveList; 71 if (MF->getFunction().getCallingConv() == CallingConv::PreserveMost) 72 return Subtarget.hasStdExtE() ? CSR_RT_MostRegs_RVE_SaveList 73 : CSR_RT_MostRegs_SaveList; 74 if (MF->getFunction().hasFnAttribute("interrupt")) { 75 if (Subtarget.hasVInstructions()) { 76 if (Subtarget.hasStdExtD()) 77 return Subtarget.hasStdExtE() ? CSR_XLEN_F64_V_Interrupt_RVE_SaveList 78 : CSR_XLEN_F64_V_Interrupt_SaveList; 79 if (Subtarget.hasStdExtF()) 80 return Subtarget.hasStdExtE() ? CSR_XLEN_F32_V_Interrupt_RVE_SaveList 81 : CSR_XLEN_F32_V_Interrupt_SaveList; 82 return Subtarget.hasStdExtE() ? CSR_XLEN_V_Interrupt_RVE_SaveList 83 : CSR_XLEN_V_Interrupt_SaveList; 84 } 85 if (Subtarget.hasStdExtD()) 86 return Subtarget.hasStdExtE() ? CSR_XLEN_F64_Interrupt_RVE_SaveList 87 : CSR_XLEN_F64_Interrupt_SaveList; 88 if (Subtarget.hasStdExtF()) 89 return Subtarget.hasStdExtE() ? CSR_XLEN_F32_Interrupt_RVE_SaveList 90 : CSR_XLEN_F32_Interrupt_SaveList; 91 return Subtarget.hasStdExtE() ? CSR_Interrupt_RVE_SaveList 92 : CSR_Interrupt_SaveList; 93 } 94 95 bool HasVectorCSR = 96 MF->getFunction().getCallingConv() == CallingConv::RISCV_VectorCall && 97 Subtarget.hasVInstructions(); 98 99 switch (Subtarget.getTargetABI()) { 100 default: 101 llvm_unreachable("Unrecognized ABI"); 102 case RISCVABI::ABI_ILP32E: 103 case RISCVABI::ABI_LP64E: 104 return CSR_ILP32E_LP64E_SaveList; 105 case RISCVABI::ABI_ILP32: 106 case RISCVABI::ABI_LP64: 107 if (HasVectorCSR) 108 return CSR_ILP32_LP64_V_SaveList; 109 return CSR_ILP32_LP64_SaveList; 110 case RISCVABI::ABI_ILP32F: 111 case RISCVABI::ABI_LP64F: 112 if (HasVectorCSR) 113 return CSR_ILP32F_LP64F_V_SaveList; 114 return CSR_ILP32F_LP64F_SaveList; 115 case RISCVABI::ABI_ILP32D: 116 case RISCVABI::ABI_LP64D: 117 if (HasVectorCSR) 118 return CSR_ILP32D_LP64D_V_SaveList; 119 return CSR_ILP32D_LP64D_SaveList; 120 } 121 } 122 123 BitVector RISCVRegisterInfo::getReservedRegs(const MachineFunction &MF) const { 124 const RISCVFrameLowering *TFI = getFrameLowering(MF); 125 BitVector Reserved(getNumRegs()); 126 auto &Subtarget = MF.getSubtarget<RISCVSubtarget>(); 127 128 for (size_t Reg = 0; Reg < getNumRegs(); Reg++) { 129 // Mark any GPRs requested to be reserved as such 130 if (Subtarget.isRegisterReservedByUser(Reg)) 131 markSuperRegs(Reserved, Reg); 132 133 // Mark all the registers defined as constant in TableGen as reserved. 134 if (isConstantPhysReg(Reg)) 135 markSuperRegs(Reserved, Reg); 136 } 137 138 // Use markSuperRegs to ensure any register aliases are also reserved 139 markSuperRegs(Reserved, RISCV::X2_H); // sp 140 markSuperRegs(Reserved, RISCV::X3_H); // gp 141 markSuperRegs(Reserved, RISCV::X4_H); // tp 142 if (TFI->hasFP(MF)) 143 markSuperRegs(Reserved, RISCV::X8_H); // fp 144 // Reserve the base register if we need to realign the stack and allocate 145 // variable-sized objects at runtime. 146 if (TFI->hasBP(MF)) 147 markSuperRegs(Reserved, RISCVABI::getBPReg()); // bp 148 149 // Additionally reserve dummy register used to form the register pair 150 // beginning with 'x0' for instructions that take register pairs. 151 markSuperRegs(Reserved, RISCV::DUMMY_REG_PAIR_WITH_X0); 152 153 // There are only 16 GPRs for RVE. 154 if (Subtarget.hasStdExtE()) 155 for (MCPhysReg Reg = RISCV::X16_H; Reg <= RISCV::X31_H; Reg++) 156 markSuperRegs(Reserved, Reg); 157 158 // V registers for code generation. We handle them manually. 159 markSuperRegs(Reserved, RISCV::VL); 160 markSuperRegs(Reserved, RISCV::VTYPE); 161 markSuperRegs(Reserved, RISCV::VXSAT); 162 markSuperRegs(Reserved, RISCV::VXRM); 163 164 // Floating point environment registers. 165 markSuperRegs(Reserved, RISCV::FRM); 166 markSuperRegs(Reserved, RISCV::FFLAGS); 167 168 // SiFive VCIX state registers. 169 markSuperRegs(Reserved, RISCV::SF_VCIX_STATE); 170 171 if (MF.getFunction().getCallingConv() == CallingConv::GRAAL) { 172 if (Subtarget.hasStdExtE()) 173 report_fatal_error("Graal reserved registers do not exist in RVE"); 174 markSuperRegs(Reserved, RISCV::X23_H); 175 markSuperRegs(Reserved, RISCV::X27_H); 176 } 177 178 // Shadow stack pointer. 179 markSuperRegs(Reserved, RISCV::SSP); 180 181 assert(checkAllSuperRegsMarked(Reserved)); 182 return Reserved; 183 } 184 185 bool RISCVRegisterInfo::isAsmClobberable(const MachineFunction &MF, 186 MCRegister PhysReg) const { 187 return !MF.getSubtarget().isRegisterReservedByUser(PhysReg); 188 } 189 190 const uint32_t *RISCVRegisterInfo::getNoPreservedMask() const { 191 return CSR_NoRegs_RegMask; 192 } 193 194 void RISCVRegisterInfo::adjustReg(MachineBasicBlock &MBB, 195 MachineBasicBlock::iterator II, 196 const DebugLoc &DL, Register DestReg, 197 Register SrcReg, StackOffset Offset, 198 MachineInstr::MIFlag Flag, 199 MaybeAlign RequiredAlign) const { 200 201 if (DestReg == SrcReg && !Offset.getFixed() && !Offset.getScalable()) 202 return; 203 204 MachineFunction &MF = *MBB.getParent(); 205 MachineRegisterInfo &MRI = MF.getRegInfo(); 206 const RISCVSubtarget &ST = MF.getSubtarget<RISCVSubtarget>(); 207 const RISCVInstrInfo *TII = ST.getInstrInfo(); 208 209 // Optimize compile time offset case 210 if (Offset.getScalable()) { 211 if (auto VLEN = ST.getRealVLen()) { 212 // 1. Multiply the number of v-slots by the (constant) length of register 213 const int64_t VLENB = *VLEN / 8; 214 assert(Offset.getScalable() % RISCV::RVVBytesPerBlock == 0 && 215 "Reserve the stack by the multiple of one vector size."); 216 const int64_t NumOfVReg = Offset.getScalable() / 8; 217 const int64_t FixedOffset = NumOfVReg * VLENB; 218 if (!isInt<32>(FixedOffset)) { 219 report_fatal_error( 220 "Frame size outside of the signed 32-bit range not supported"); 221 } 222 Offset = StackOffset::getFixed(FixedOffset + Offset.getFixed()); 223 } 224 } 225 226 bool KillSrcReg = false; 227 228 if (Offset.getScalable()) { 229 unsigned ScalableAdjOpc = RISCV::ADD; 230 int64_t ScalableValue = Offset.getScalable(); 231 if (ScalableValue < 0) { 232 ScalableValue = -ScalableValue; 233 ScalableAdjOpc = RISCV::SUB; 234 } 235 // Get vlenb and multiply vlen with the number of vector registers. 236 Register ScratchReg = DestReg; 237 if (DestReg == SrcReg) 238 ScratchReg = MRI.createVirtualRegister(&RISCV::GPRRegClass); 239 240 assert(ScalableValue > 0 && "There is no need to get VLEN scaled value."); 241 assert(ScalableValue % RISCV::RVVBytesPerBlock == 0 && 242 "Reserve the stack by the multiple of one vector size."); 243 assert(isInt<32>(ScalableValue / RISCV::RVVBytesPerBlock) && 244 "Expect the number of vector registers within 32-bits."); 245 uint32_t NumOfVReg = ScalableValue / RISCV::RVVBytesPerBlock; 246 // Only use vsetvli rather than vlenb if adjusting in the prologue or 247 // epilogue, otherwise it may disturb the VTYPE and VL status. 248 bool IsPrologueOrEpilogue = 249 Flag == MachineInstr::FrameSetup || Flag == MachineInstr::FrameDestroy; 250 bool UseVsetvliRatherThanVlenb = 251 IsPrologueOrEpilogue && ST.preferVsetvliOverReadVLENB(); 252 if (UseVsetvliRatherThanVlenb && (NumOfVReg == 1 || NumOfVReg == 2 || 253 NumOfVReg == 4 || NumOfVReg == 8)) { 254 BuildMI(MBB, II, DL, TII->get(RISCV::PseudoReadVLENBViaVSETVLIX0), 255 ScratchReg) 256 .addImm(NumOfVReg) 257 .setMIFlag(Flag); 258 BuildMI(MBB, II, DL, TII->get(ScalableAdjOpc), DestReg) 259 .addReg(SrcReg) 260 .addReg(ScratchReg, RegState::Kill) 261 .setMIFlag(Flag); 262 } else { 263 if (UseVsetvliRatherThanVlenb) 264 BuildMI(MBB, II, DL, TII->get(RISCV::PseudoReadVLENBViaVSETVLIX0), 265 ScratchReg) 266 .addImm(1) 267 .setMIFlag(Flag); 268 else 269 BuildMI(MBB, II, DL, TII->get(RISCV::PseudoReadVLENB), ScratchReg) 270 .setMIFlag(Flag); 271 272 if (ScalableAdjOpc == RISCV::ADD && ST.hasStdExtZba() && 273 (NumOfVReg == 2 || NumOfVReg == 4 || NumOfVReg == 8)) { 274 unsigned Opc = NumOfVReg == 2 275 ? RISCV::SH1ADD 276 : (NumOfVReg == 4 ? RISCV::SH2ADD : RISCV::SH3ADD); 277 BuildMI(MBB, II, DL, TII->get(Opc), DestReg) 278 .addReg(ScratchReg, RegState::Kill) 279 .addReg(SrcReg) 280 .setMIFlag(Flag); 281 } else { 282 TII->mulImm(MF, MBB, II, DL, ScratchReg, NumOfVReg, Flag); 283 BuildMI(MBB, II, DL, TII->get(ScalableAdjOpc), DestReg) 284 .addReg(SrcReg) 285 .addReg(ScratchReg, RegState::Kill) 286 .setMIFlag(Flag); 287 } 288 } 289 SrcReg = DestReg; 290 KillSrcReg = true; 291 } 292 293 int64_t Val = Offset.getFixed(); 294 if (DestReg == SrcReg && Val == 0) 295 return; 296 297 const uint64_t Align = RequiredAlign.valueOrOne().value(); 298 299 if (isInt<12>(Val)) { 300 BuildMI(MBB, II, DL, TII->get(RISCV::ADDI), DestReg) 301 .addReg(SrcReg, getKillRegState(KillSrcReg)) 302 .addImm(Val) 303 .setMIFlag(Flag); 304 return; 305 } 306 307 // Use the QC_E_ADDI instruction from the Xqcilia extension that can take a 308 // signed 26-bit immediate. 309 if (ST.hasVendorXqcilia() && isInt<26>(Val)) { 310 // The one case where using this instruction is sub-optimal is if Val can be 311 // materialized with a single compressible LUI and following add/sub is also 312 // compressible. Avoid doing this if that is the case. 313 int Hi20 = (Val & 0xFFFFF000) >> 12; 314 bool IsCompressLUI = 315 ((Val & 0xFFF) == 0) && (Hi20 != 0) && 316 (isUInt<5>(Hi20) || (Hi20 >= 0xfffe0 && Hi20 <= 0xfffff)); 317 bool IsCompressAddSub = 318 (SrcReg == DestReg) && 319 ((Val > 0 && RISCV::GPRNoX0RegClass.contains(SrcReg)) || 320 (Val < 0 && RISCV::GPRCRegClass.contains(SrcReg))); 321 322 if (!(IsCompressLUI && IsCompressAddSub)) { 323 BuildMI(MBB, II, DL, TII->get(RISCV::QC_E_ADDI), DestReg) 324 .addReg(SrcReg, getKillRegState(KillSrcReg)) 325 .addImm(Val) 326 .setMIFlag(Flag); 327 return; 328 } 329 } 330 331 // Try to split the offset across two ADDIs. We need to keep the intermediate 332 // result aligned after each ADDI. We need to determine the maximum value we 333 // can put in each ADDI. In the negative direction, we can use -2048 which is 334 // always sufficiently aligned. In the positive direction, we need to find the 335 // largest 12-bit immediate that is aligned. Exclude -4096 since it can be 336 // created with LUI. 337 assert(Align < 2048 && "Required alignment too large"); 338 int64_t MaxPosAdjStep = 2048 - Align; 339 if (Val > -4096 && Val <= (2 * MaxPosAdjStep)) { 340 int64_t FirstAdj = Val < 0 ? -2048 : MaxPosAdjStep; 341 Val -= FirstAdj; 342 BuildMI(MBB, II, DL, TII->get(RISCV::ADDI), DestReg) 343 .addReg(SrcReg, getKillRegState(KillSrcReg)) 344 .addImm(FirstAdj) 345 .setMIFlag(Flag); 346 BuildMI(MBB, II, DL, TII->get(RISCV::ADDI), DestReg) 347 .addReg(DestReg, RegState::Kill) 348 .addImm(Val) 349 .setMIFlag(Flag); 350 return; 351 } 352 353 // Use shNadd if doing so lets us materialize a 12 bit immediate with a single 354 // instruction. This saves 1 instruction over the full lui/addi+add fallback 355 // path. We avoid anything which can be done with a single lui as it might 356 // be compressible. Note that the sh1add case is fully covered by the 2x addi 357 // case just above and is thus omitted. 358 if (ST.hasStdExtZba() && (Val & 0xFFF) != 0) { 359 unsigned Opc = 0; 360 if (isShiftedInt<12, 3>(Val)) { 361 Opc = RISCV::SH3ADD; 362 Val = Val >> 3; 363 } else if (isShiftedInt<12, 2>(Val)) { 364 Opc = RISCV::SH2ADD; 365 Val = Val >> 2; 366 } 367 if (Opc) { 368 Register ScratchReg = MRI.createVirtualRegister(&RISCV::GPRRegClass); 369 TII->movImm(MBB, II, DL, ScratchReg, Val, Flag); 370 BuildMI(MBB, II, DL, TII->get(Opc), DestReg) 371 .addReg(ScratchReg, RegState::Kill) 372 .addReg(SrcReg, getKillRegState(KillSrcReg)) 373 .setMIFlag(Flag); 374 return; 375 } 376 } 377 378 unsigned Opc = RISCV::ADD; 379 if (Val < 0) { 380 Val = -Val; 381 Opc = RISCV::SUB; 382 } 383 384 Register ScratchReg = MRI.createVirtualRegister(&RISCV::GPRRegClass); 385 TII->movImm(MBB, II, DL, ScratchReg, Val, Flag); 386 BuildMI(MBB, II, DL, TII->get(Opc), DestReg) 387 .addReg(SrcReg, getKillRegState(KillSrcReg)) 388 .addReg(ScratchReg, RegState::Kill) 389 .setMIFlag(Flag); 390 } 391 392 // Split a VSPILLx_Mx pseudo into multiple whole register stores separated by 393 // LMUL*VLENB bytes. 394 void RISCVRegisterInfo::lowerVSPILL(MachineBasicBlock::iterator II) const { 395 DebugLoc DL = II->getDebugLoc(); 396 MachineBasicBlock &MBB = *II->getParent(); 397 MachineFunction &MF = *MBB.getParent(); 398 MachineRegisterInfo &MRI = MF.getRegInfo(); 399 const RISCVSubtarget &STI = MF.getSubtarget<RISCVSubtarget>(); 400 const TargetInstrInfo *TII = STI.getInstrInfo(); 401 const TargetRegisterInfo *TRI = STI.getRegisterInfo(); 402 403 auto ZvlssegInfo = RISCV::isRVVSpillForZvlsseg(II->getOpcode()); 404 unsigned NF = ZvlssegInfo->first; 405 unsigned LMUL = ZvlssegInfo->second; 406 assert(NF * LMUL <= 8 && "Invalid NF/LMUL combinations."); 407 unsigned Opcode, SubRegIdx; 408 switch (LMUL) { 409 default: 410 llvm_unreachable("LMUL must be 1, 2, or 4."); 411 case 1: 412 Opcode = RISCV::VS1R_V; 413 SubRegIdx = RISCV::sub_vrm1_0; 414 break; 415 case 2: 416 Opcode = RISCV::VS2R_V; 417 SubRegIdx = RISCV::sub_vrm2_0; 418 break; 419 case 4: 420 Opcode = RISCV::VS4R_V; 421 SubRegIdx = RISCV::sub_vrm4_0; 422 break; 423 } 424 static_assert(RISCV::sub_vrm1_7 == RISCV::sub_vrm1_0 + 7, 425 "Unexpected subreg numbering"); 426 static_assert(RISCV::sub_vrm2_3 == RISCV::sub_vrm2_0 + 3, 427 "Unexpected subreg numbering"); 428 static_assert(RISCV::sub_vrm4_1 == RISCV::sub_vrm4_0 + 1, 429 "Unexpected subreg numbering"); 430 431 Register VL = MRI.createVirtualRegister(&RISCV::GPRRegClass); 432 // Optimize for constant VLEN. 433 if (auto VLEN = STI.getRealVLen()) { 434 const int64_t VLENB = *VLEN / 8; 435 int64_t Offset = VLENB * LMUL; 436 STI.getInstrInfo()->movImm(MBB, II, DL, VL, Offset); 437 } else { 438 BuildMI(MBB, II, DL, TII->get(RISCV::PseudoReadVLENB), VL); 439 uint32_t ShiftAmount = Log2_32(LMUL); 440 if (ShiftAmount != 0) 441 BuildMI(MBB, II, DL, TII->get(RISCV::SLLI), VL) 442 .addReg(VL) 443 .addImm(ShiftAmount); 444 } 445 446 Register SrcReg = II->getOperand(0).getReg(); 447 Register Base = II->getOperand(1).getReg(); 448 bool IsBaseKill = II->getOperand(1).isKill(); 449 Register NewBase = MRI.createVirtualRegister(&RISCV::GPRRegClass); 450 451 auto *OldMMO = *(II->memoperands_begin()); 452 LocationSize OldLoc = OldMMO->getSize(); 453 assert(OldLoc.isPrecise() && OldLoc.getValue().isKnownMultipleOf(NF)); 454 TypeSize NewSize = OldLoc.getValue().divideCoefficientBy(NF); 455 auto *NewMMO = MF.getMachineMemOperand(OldMMO, OldMMO->getOffset(), NewSize); 456 for (unsigned I = 0; I < NF; ++I) { 457 // Adding implicit-use of super register to describe we are using part of 458 // super register, that prevents machine verifier complaining when part of 459 // subreg is undef, see comment in MachineVerifier::checkLiveness for more 460 // detail. 461 BuildMI(MBB, II, DL, TII->get(Opcode)) 462 .addReg(TRI->getSubReg(SrcReg, SubRegIdx + I)) 463 .addReg(Base, getKillRegState(I == NF - 1)) 464 .addMemOperand(NewMMO) 465 .addReg(SrcReg, RegState::Implicit); 466 if (I != NF - 1) 467 BuildMI(MBB, II, DL, TII->get(RISCV::ADD), NewBase) 468 .addReg(Base, getKillRegState(I != 0 || IsBaseKill)) 469 .addReg(VL, getKillRegState(I == NF - 2)); 470 Base = NewBase; 471 } 472 II->eraseFromParent(); 473 } 474 475 // Split a VSPILLx_Mx pseudo into multiple whole register loads separated by 476 // LMUL*VLENB bytes. 477 void RISCVRegisterInfo::lowerVRELOAD(MachineBasicBlock::iterator II) const { 478 DebugLoc DL = II->getDebugLoc(); 479 MachineBasicBlock &MBB = *II->getParent(); 480 MachineFunction &MF = *MBB.getParent(); 481 MachineRegisterInfo &MRI = MF.getRegInfo(); 482 const RISCVSubtarget &STI = MF.getSubtarget<RISCVSubtarget>(); 483 const TargetInstrInfo *TII = STI.getInstrInfo(); 484 const TargetRegisterInfo *TRI = STI.getRegisterInfo(); 485 486 auto ZvlssegInfo = RISCV::isRVVSpillForZvlsseg(II->getOpcode()); 487 unsigned NF = ZvlssegInfo->first; 488 unsigned LMUL = ZvlssegInfo->second; 489 assert(NF * LMUL <= 8 && "Invalid NF/LMUL combinations."); 490 unsigned Opcode, SubRegIdx; 491 switch (LMUL) { 492 default: 493 llvm_unreachable("LMUL must be 1, 2, or 4."); 494 case 1: 495 Opcode = RISCV::VL1RE8_V; 496 SubRegIdx = RISCV::sub_vrm1_0; 497 break; 498 case 2: 499 Opcode = RISCV::VL2RE8_V; 500 SubRegIdx = RISCV::sub_vrm2_0; 501 break; 502 case 4: 503 Opcode = RISCV::VL4RE8_V; 504 SubRegIdx = RISCV::sub_vrm4_0; 505 break; 506 } 507 static_assert(RISCV::sub_vrm1_7 == RISCV::sub_vrm1_0 + 7, 508 "Unexpected subreg numbering"); 509 static_assert(RISCV::sub_vrm2_3 == RISCV::sub_vrm2_0 + 3, 510 "Unexpected subreg numbering"); 511 static_assert(RISCV::sub_vrm4_1 == RISCV::sub_vrm4_0 + 1, 512 "Unexpected subreg numbering"); 513 514 Register VL = MRI.createVirtualRegister(&RISCV::GPRRegClass); 515 // Optimize for constant VLEN. 516 if (auto VLEN = STI.getRealVLen()) { 517 const int64_t VLENB = *VLEN / 8; 518 int64_t Offset = VLENB * LMUL; 519 STI.getInstrInfo()->movImm(MBB, II, DL, VL, Offset); 520 } else { 521 BuildMI(MBB, II, DL, TII->get(RISCV::PseudoReadVLENB), VL); 522 uint32_t ShiftAmount = Log2_32(LMUL); 523 if (ShiftAmount != 0) 524 BuildMI(MBB, II, DL, TII->get(RISCV::SLLI), VL) 525 .addReg(VL) 526 .addImm(ShiftAmount); 527 } 528 529 Register DestReg = II->getOperand(0).getReg(); 530 Register Base = II->getOperand(1).getReg(); 531 bool IsBaseKill = II->getOperand(1).isKill(); 532 Register NewBase = MRI.createVirtualRegister(&RISCV::GPRRegClass); 533 auto *OldMMO = *(II->memoperands_begin()); 534 LocationSize OldLoc = OldMMO->getSize(); 535 assert(OldLoc.isPrecise() && OldLoc.getValue().isKnownMultipleOf(NF)); 536 TypeSize NewSize = OldLoc.getValue().divideCoefficientBy(NF); 537 auto *NewMMO = MF.getMachineMemOperand(OldMMO, OldMMO->getOffset(), NewSize); 538 for (unsigned I = 0; I < NF; ++I) { 539 BuildMI(MBB, II, DL, TII->get(Opcode), 540 TRI->getSubReg(DestReg, SubRegIdx + I)) 541 .addReg(Base, getKillRegState(I == NF - 1)) 542 .addMemOperand(NewMMO); 543 if (I != NF - 1) 544 BuildMI(MBB, II, DL, TII->get(RISCV::ADD), NewBase) 545 .addReg(Base, getKillRegState(I != 0 || IsBaseKill)) 546 .addReg(VL, getKillRegState(I == NF - 2)); 547 Base = NewBase; 548 } 549 II->eraseFromParent(); 550 } 551 552 bool RISCVRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, 553 int SPAdj, unsigned FIOperandNum, 554 RegScavenger *RS) const { 555 assert(SPAdj == 0 && "Unexpected non-zero SPAdj value"); 556 557 MachineInstr &MI = *II; 558 MachineFunction &MF = *MI.getParent()->getParent(); 559 MachineRegisterInfo &MRI = MF.getRegInfo(); 560 DebugLoc DL = MI.getDebugLoc(); 561 562 int FrameIndex = MI.getOperand(FIOperandNum).getIndex(); 563 Register FrameReg; 564 StackOffset Offset = 565 getFrameLowering(MF)->getFrameIndexReference(MF, FrameIndex, FrameReg); 566 bool IsRVVSpill = RISCV::isRVVSpill(MI); 567 if (!IsRVVSpill) 568 Offset += StackOffset::getFixed(MI.getOperand(FIOperandNum + 1).getImm()); 569 570 if (!isInt<32>(Offset.getFixed())) { 571 report_fatal_error( 572 "Frame offsets outside of the signed 32-bit range not supported"); 573 } 574 575 if (!IsRVVSpill) { 576 int64_t Val = Offset.getFixed(); 577 int64_t Lo12 = SignExtend64<12>(Val); 578 unsigned Opc = MI.getOpcode(); 579 if (Opc == RISCV::ADDI && !isInt<12>(Val)) { 580 // We chose to emit the canonical immediate sequence rather than folding 581 // the offset into the using add under the theory that doing so doesn't 582 // save dynamic instruction count and some target may fuse the canonical 583 // 32 bit immediate sequence. We still need to clear the portion of the 584 // offset encoded in the immediate. 585 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0); 586 } else if ((Opc == RISCV::PREFETCH_I || Opc == RISCV::PREFETCH_R || 587 Opc == RISCV::PREFETCH_W) && 588 (Lo12 & 0b11111) != 0) { 589 // Prefetch instructions require the offset to be 32 byte aligned. 590 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0); 591 } else if ((Opc == RISCV::PseudoRV32ZdinxLD || 592 Opc == RISCV::PseudoRV32ZdinxSD) && 593 Lo12 >= 2044) { 594 // This instruction will be split into 2 instructions. The second 595 // instruction will add 4 to the immediate. If that would overflow 12 596 // bits, we can't fold the offset. 597 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0); 598 } else { 599 // We can encode an add with 12 bit signed immediate in the immediate 600 // operand of our user instruction. As a result, the remaining 601 // offset can by construction, at worst, a LUI and a ADD. 602 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Lo12); 603 Offset = StackOffset::get((uint64_t)Val - (uint64_t)Lo12, 604 Offset.getScalable()); 605 } 606 } 607 608 if (Offset.getScalable() || Offset.getFixed()) { 609 Register DestReg; 610 if (MI.getOpcode() == RISCV::ADDI) 611 DestReg = MI.getOperand(0).getReg(); 612 else 613 DestReg = MRI.createVirtualRegister(&RISCV::GPRRegClass); 614 adjustReg(*II->getParent(), II, DL, DestReg, FrameReg, Offset, 615 MachineInstr::NoFlags, std::nullopt); 616 MI.getOperand(FIOperandNum).ChangeToRegister(DestReg, /*IsDef*/false, 617 /*IsImp*/false, 618 /*IsKill*/true); 619 } else { 620 MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg, /*IsDef*/false, 621 /*IsImp*/false, 622 /*IsKill*/false); 623 } 624 625 // If after materializing the adjustment, we have a pointless ADDI, remove it 626 if (MI.getOpcode() == RISCV::ADDI && 627 MI.getOperand(0).getReg() == MI.getOperand(1).getReg() && 628 MI.getOperand(2).getImm() == 0) { 629 MI.eraseFromParent(); 630 return true; 631 } 632 633 // Handle spill/fill of synthetic register classes for segment operations to 634 // ensure correctness in the edge case one gets spilled. There are many 635 // possible optimizations here, but given the extreme rarity of such spills, 636 // we prefer simplicity of implementation for now. 637 switch (MI.getOpcode()) { 638 case RISCV::PseudoVSPILL2_M1: 639 case RISCV::PseudoVSPILL2_M2: 640 case RISCV::PseudoVSPILL2_M4: 641 case RISCV::PseudoVSPILL3_M1: 642 case RISCV::PseudoVSPILL3_M2: 643 case RISCV::PseudoVSPILL4_M1: 644 case RISCV::PseudoVSPILL4_M2: 645 case RISCV::PseudoVSPILL5_M1: 646 case RISCV::PseudoVSPILL6_M1: 647 case RISCV::PseudoVSPILL7_M1: 648 case RISCV::PseudoVSPILL8_M1: 649 lowerVSPILL(II); 650 return true; 651 case RISCV::PseudoVRELOAD2_M1: 652 case RISCV::PseudoVRELOAD2_M2: 653 case RISCV::PseudoVRELOAD2_M4: 654 case RISCV::PseudoVRELOAD3_M1: 655 case RISCV::PseudoVRELOAD3_M2: 656 case RISCV::PseudoVRELOAD4_M1: 657 case RISCV::PseudoVRELOAD4_M2: 658 case RISCV::PseudoVRELOAD5_M1: 659 case RISCV::PseudoVRELOAD6_M1: 660 case RISCV::PseudoVRELOAD7_M1: 661 case RISCV::PseudoVRELOAD8_M1: 662 lowerVRELOAD(II); 663 return true; 664 } 665 666 return false; 667 } 668 669 bool RISCVRegisterInfo::requiresVirtualBaseRegisters( 670 const MachineFunction &MF) const { 671 return true; 672 } 673 674 // Returns true if the instruction's frame index reference would be better 675 // served by a base register other than FP or SP. 676 // Used by LocalStackSlotAllocation pass to determine which frame index 677 // references it should create new base registers for. 678 bool RISCVRegisterInfo::needsFrameBaseReg(MachineInstr *MI, 679 int64_t Offset) const { 680 unsigned FIOperandNum = 0; 681 for (; !MI->getOperand(FIOperandNum).isFI(); FIOperandNum++) 682 assert(FIOperandNum < MI->getNumOperands() && 683 "Instr doesn't have FrameIndex operand"); 684 685 // For RISC-V, The machine instructions that include a FrameIndex operand 686 // are load/store, ADDI instructions. 687 unsigned MIFrm = RISCVII::getFormat(MI->getDesc().TSFlags); 688 if (MIFrm != RISCVII::InstFormatI && MIFrm != RISCVII::InstFormatS) 689 return false; 690 // We only generate virtual base registers for loads and stores, so 691 // return false for everything else. 692 if (!MI->mayLoad() && !MI->mayStore()) 693 return false; 694 695 const MachineFunction &MF = *MI->getMF(); 696 const MachineFrameInfo &MFI = MF.getFrameInfo(); 697 const RISCVFrameLowering *TFI = getFrameLowering(MF); 698 const MachineRegisterInfo &MRI = MF.getRegInfo(); 699 700 if (TFI->hasFP(MF) && !shouldRealignStack(MF)) { 701 auto &Subtarget = MF.getSubtarget<RISCVSubtarget>(); 702 // Estimate the stack size used to store callee saved registers( 703 // excludes reserved registers). 704 unsigned CalleeSavedSize = 0; 705 for (const MCPhysReg *R = MRI.getCalleeSavedRegs(); MCPhysReg Reg = *R; 706 ++R) { 707 if (Subtarget.isRegisterReservedByUser(Reg)) 708 continue; 709 710 if (RISCV::GPRRegClass.contains(Reg)) 711 CalleeSavedSize += getSpillSize(RISCV::GPRRegClass); 712 else if (RISCV::FPR64RegClass.contains(Reg)) 713 CalleeSavedSize += getSpillSize(RISCV::FPR64RegClass); 714 else if (RISCV::FPR32RegClass.contains(Reg)) 715 CalleeSavedSize += getSpillSize(RISCV::FPR32RegClass); 716 // Ignore vector registers. 717 } 718 719 int64_t MaxFPOffset = Offset - CalleeSavedSize; 720 return !isFrameOffsetLegal(MI, RISCV::X8, MaxFPOffset); 721 } 722 723 // Assume 128 bytes spill slots size to estimate the maximum possible 724 // offset relative to the stack pointer. 725 // FIXME: The 128 is copied from ARM. We should run some statistics and pick a 726 // real one for RISC-V. 727 int64_t MaxSPOffset = Offset + 128; 728 MaxSPOffset += MFI.getLocalFrameSize(); 729 return !isFrameOffsetLegal(MI, RISCV::X2, MaxSPOffset); 730 } 731 732 // Determine whether a given base register plus offset immediate is 733 // encodable to resolve a frame index. 734 bool RISCVRegisterInfo::isFrameOffsetLegal(const MachineInstr *MI, 735 Register BaseReg, 736 int64_t Offset) const { 737 unsigned FIOperandNum = 0; 738 while (!MI->getOperand(FIOperandNum).isFI()) { 739 FIOperandNum++; 740 assert(FIOperandNum < MI->getNumOperands() && 741 "Instr does not have a FrameIndex operand!"); 742 } 743 744 Offset += getFrameIndexInstrOffset(MI, FIOperandNum); 745 return isInt<12>(Offset); 746 } 747 748 // Insert defining instruction(s) for a pointer to FrameIdx before 749 // insertion point I. 750 // Return materialized frame pointer. 751 Register RISCVRegisterInfo::materializeFrameBaseRegister(MachineBasicBlock *MBB, 752 int FrameIdx, 753 int64_t Offset) const { 754 MachineBasicBlock::iterator MBBI = MBB->begin(); 755 DebugLoc DL; 756 if (MBBI != MBB->end()) 757 DL = MBBI->getDebugLoc(); 758 MachineFunction *MF = MBB->getParent(); 759 MachineRegisterInfo &MFI = MF->getRegInfo(); 760 const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo(); 761 762 Register BaseReg = MFI.createVirtualRegister(&RISCV::GPRRegClass); 763 BuildMI(*MBB, MBBI, DL, TII->get(RISCV::ADDI), BaseReg) 764 .addFrameIndex(FrameIdx) 765 .addImm(Offset); 766 return BaseReg; 767 } 768 769 // Resolve a frame index operand of an instruction to reference the 770 // indicated base register plus offset instead. 771 void RISCVRegisterInfo::resolveFrameIndex(MachineInstr &MI, Register BaseReg, 772 int64_t Offset) const { 773 unsigned FIOperandNum = 0; 774 while (!MI.getOperand(FIOperandNum).isFI()) { 775 FIOperandNum++; 776 assert(FIOperandNum < MI.getNumOperands() && 777 "Instr does not have a FrameIndex operand!"); 778 } 779 780 Offset += getFrameIndexInstrOffset(&MI, FIOperandNum); 781 // FrameIndex Operands are always represented as a 782 // register followed by an immediate. 783 MI.getOperand(FIOperandNum).ChangeToRegister(BaseReg, false); 784 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Offset); 785 } 786 787 // Get the offset from the referenced frame index in the instruction, 788 // if there is one. 789 int64_t RISCVRegisterInfo::getFrameIndexInstrOffset(const MachineInstr *MI, 790 int Idx) const { 791 assert((RISCVII::getFormat(MI->getDesc().TSFlags) == RISCVII::InstFormatI || 792 RISCVII::getFormat(MI->getDesc().TSFlags) == RISCVII::InstFormatS) && 793 "The MI must be I or S format."); 794 assert(MI->getOperand(Idx).isFI() && "The Idx'th operand of MI is not a " 795 "FrameIndex operand"); 796 return MI->getOperand(Idx + 1).getImm(); 797 } 798 799 Register RISCVRegisterInfo::getFrameRegister(const MachineFunction &MF) const { 800 const TargetFrameLowering *TFI = getFrameLowering(MF); 801 return TFI->hasFP(MF) ? RISCV::X8 : RISCV::X2; 802 } 803 804 StringRef RISCVRegisterInfo::getRegAsmName(MCRegister Reg) const { 805 if (Reg == RISCV::SF_VCIX_STATE) 806 return "sf.vcix_state"; 807 return TargetRegisterInfo::getRegAsmName(Reg); 808 } 809 810 const uint32_t * 811 RISCVRegisterInfo::getCallPreservedMask(const MachineFunction & MF, 812 CallingConv::ID CC) const { 813 auto &Subtarget = MF.getSubtarget<RISCVSubtarget>(); 814 815 if (CC == CallingConv::GHC) 816 return CSR_NoRegs_RegMask; 817 RISCVABI::ABI ABI = Subtarget.getTargetABI(); 818 if (CC == CallingConv::PreserveMost) { 819 if (ABI == RISCVABI::ABI_ILP32E || ABI == RISCVABI::ABI_LP64E) 820 return CSR_RT_MostRegs_RVE_RegMask; 821 return CSR_RT_MostRegs_RegMask; 822 } 823 switch (ABI) { 824 default: 825 llvm_unreachable("Unrecognized ABI"); 826 case RISCVABI::ABI_ILP32E: 827 case RISCVABI::ABI_LP64E: 828 return CSR_ILP32E_LP64E_RegMask; 829 case RISCVABI::ABI_ILP32: 830 case RISCVABI::ABI_LP64: 831 if (CC == CallingConv::RISCV_VectorCall) 832 return CSR_ILP32_LP64_V_RegMask; 833 return CSR_ILP32_LP64_RegMask; 834 case RISCVABI::ABI_ILP32F: 835 case RISCVABI::ABI_LP64F: 836 if (CC == CallingConv::RISCV_VectorCall) 837 return CSR_ILP32F_LP64F_V_RegMask; 838 return CSR_ILP32F_LP64F_RegMask; 839 case RISCVABI::ABI_ILP32D: 840 case RISCVABI::ABI_LP64D: 841 if (CC == CallingConv::RISCV_VectorCall) 842 return CSR_ILP32D_LP64D_V_RegMask; 843 return CSR_ILP32D_LP64D_RegMask; 844 } 845 } 846 847 const TargetRegisterClass * 848 RISCVRegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC, 849 const MachineFunction &) const { 850 if (RC == &RISCV::VMV0RegClass) 851 return &RISCV::VRRegClass; 852 if (RC == &RISCV::VRNoV0RegClass) 853 return &RISCV::VRRegClass; 854 if (RC == &RISCV::VRM2NoV0RegClass) 855 return &RISCV::VRM2RegClass; 856 if (RC == &RISCV::VRM4NoV0RegClass) 857 return &RISCV::VRM4RegClass; 858 if (RC == &RISCV::VRM8NoV0RegClass) 859 return &RISCV::VRM8RegClass; 860 return RC; 861 } 862 863 void RISCVRegisterInfo::getOffsetOpcodes(const StackOffset &Offset, 864 SmallVectorImpl<uint64_t> &Ops) const { 865 // VLENB is the length of a vector register in bytes. We use <vscale x 8 x i8> 866 // to represent one vector register. The dwarf offset is 867 // VLENB * scalable_offset / 8. 868 assert(Offset.getScalable() % 8 == 0 && "Invalid frame offset"); 869 870 // Add fixed-sized offset using existing DIExpression interface. 871 DIExpression::appendOffset(Ops, Offset.getFixed()); 872 873 unsigned VLENB = getDwarfRegNum(RISCV::VLENB, true); 874 int64_t VLENBSized = Offset.getScalable() / 8; 875 if (VLENBSized > 0) { 876 Ops.push_back(dwarf::DW_OP_constu); 877 Ops.push_back(VLENBSized); 878 Ops.append({dwarf::DW_OP_bregx, VLENB, 0ULL}); 879 Ops.push_back(dwarf::DW_OP_mul); 880 Ops.push_back(dwarf::DW_OP_plus); 881 } else if (VLENBSized < 0) { 882 Ops.push_back(dwarf::DW_OP_constu); 883 Ops.push_back(-VLENBSized); 884 Ops.append({dwarf::DW_OP_bregx, VLENB, 0ULL}); 885 Ops.push_back(dwarf::DW_OP_mul); 886 Ops.push_back(dwarf::DW_OP_minus); 887 } 888 } 889 890 unsigned 891 RISCVRegisterInfo::getRegisterCostTableIndex(const MachineFunction &MF) const { 892 return MF.getSubtarget<RISCVSubtarget>().hasStdExtZca() && !DisableCostPerUse 893 ? 1 894 : 0; 895 } 896 897 float RISCVRegisterInfo::getSpillWeightScaleFactor( 898 const TargetRegisterClass *RC) const { 899 return getRegClassWeight(RC).RegWeight; 900 } 901 902 // Add two address hints to improve chances of being able to use a compressed 903 // instruction. 904 bool RISCVRegisterInfo::getRegAllocationHints( 905 Register VirtReg, ArrayRef<MCPhysReg> Order, 906 SmallVectorImpl<MCPhysReg> &Hints, const MachineFunction &MF, 907 const VirtRegMap *VRM, const LiveRegMatrix *Matrix) const { 908 const MachineRegisterInfo *MRI = &MF.getRegInfo(); 909 auto &Subtarget = MF.getSubtarget<RISCVSubtarget>(); 910 911 bool BaseImplRetVal = TargetRegisterInfo::getRegAllocationHints( 912 VirtReg, Order, Hints, MF, VRM, Matrix); 913 914 if (!VRM || DisableRegAllocHints) 915 return BaseImplRetVal; 916 917 // Add any two address hints after any copy hints. 918 SmallSet<Register, 4> TwoAddrHints; 919 920 auto tryAddHint = [&](const MachineOperand &VRRegMO, const MachineOperand &MO, 921 bool NeedGPRC) -> void { 922 Register Reg = MO.getReg(); 923 Register PhysReg = Reg.isPhysical() ? Reg : Register(VRM->getPhys(Reg)); 924 // TODO: Support GPRPair subregisters? Need to be careful with even/odd 925 // registers. If the virtual register is an odd register of a pair and the 926 // physical register is even (or vice versa), we should not add the hint. 927 if (PhysReg && (!NeedGPRC || RISCV::GPRCRegClass.contains(PhysReg)) && 928 !MO.getSubReg() && !VRRegMO.getSubReg()) { 929 if (!MRI->isReserved(PhysReg) && !is_contained(Hints, PhysReg)) 930 TwoAddrHints.insert(PhysReg); 931 } 932 }; 933 934 // This is all of the compressible binary instructions. If an instruction 935 // needs GPRC register class operands \p NeedGPRC will be set to true. 936 auto isCompressible = [&Subtarget](const MachineInstr &MI, bool &NeedGPRC) { 937 NeedGPRC = false; 938 switch (MI.getOpcode()) { 939 default: 940 return false; 941 case RISCV::AND: 942 case RISCV::OR: 943 case RISCV::XOR: 944 case RISCV::SUB: 945 case RISCV::ADDW: 946 case RISCV::SUBW: 947 NeedGPRC = true; 948 return true; 949 case RISCV::ANDI: { 950 NeedGPRC = true; 951 if (!MI.getOperand(2).isImm()) 952 return false; 953 int64_t Imm = MI.getOperand(2).getImm(); 954 if (isInt<6>(Imm)) 955 return true; 956 // c.zext.b 957 return Subtarget.hasStdExtZcb() && Imm == 255; 958 } 959 case RISCV::SRAI: 960 case RISCV::SRLI: 961 NeedGPRC = true; 962 return true; 963 case RISCV::ADD: 964 case RISCV::SLLI: 965 return true; 966 case RISCV::ADDI: 967 case RISCV::ADDIW: 968 return MI.getOperand(2).isImm() && isInt<6>(MI.getOperand(2).getImm()); 969 case RISCV::MUL: 970 case RISCV::SEXT_B: 971 case RISCV::SEXT_H: 972 case RISCV::ZEXT_H_RV32: 973 case RISCV::ZEXT_H_RV64: 974 // c.mul, c.sext.b, c.sext.h, c.zext.h 975 NeedGPRC = true; 976 return Subtarget.hasStdExtZcb(); 977 case RISCV::ADD_UW: 978 // c.zext.w 979 NeedGPRC = true; 980 return Subtarget.hasStdExtZcb() && MI.getOperand(2).isReg() && 981 MI.getOperand(2).getReg() == RISCV::X0; 982 case RISCV::XORI: 983 // c.not 984 NeedGPRC = true; 985 return Subtarget.hasStdExtZcb() && MI.getOperand(2).isImm() && 986 MI.getOperand(2).getImm() == -1; 987 } 988 }; 989 990 // Returns true if this operand is compressible. For non-registers it always 991 // returns true. Immediate range was already checked in isCompressible. 992 // For registers, it checks if the register is a GPRC register. reg-reg 993 // instructions that require GPRC need all register operands to be GPRC. 994 auto isCompressibleOpnd = [&](const MachineOperand &MO) { 995 if (!MO.isReg()) 996 return true; 997 Register Reg = MO.getReg(); 998 Register PhysReg = Reg.isPhysical() ? Reg : Register(VRM->getPhys(Reg)); 999 return PhysReg && RISCV::GPRCRegClass.contains(PhysReg); 1000 }; 1001 1002 for (auto &MO : MRI->reg_nodbg_operands(VirtReg)) { 1003 const MachineInstr &MI = *MO.getParent(); 1004 unsigned OpIdx = MO.getOperandNo(); 1005 bool NeedGPRC; 1006 if (isCompressible(MI, NeedGPRC)) { 1007 if (OpIdx == 0 && MI.getOperand(1).isReg()) { 1008 if (!NeedGPRC || MI.getNumExplicitOperands() < 3 || 1009 MI.getOpcode() == RISCV::ADD_UW || 1010 isCompressibleOpnd(MI.getOperand(2))) 1011 tryAddHint(MO, MI.getOperand(1), NeedGPRC); 1012 if (MI.isCommutable() && MI.getOperand(2).isReg() && 1013 (!NeedGPRC || isCompressibleOpnd(MI.getOperand(1)))) 1014 tryAddHint(MO, MI.getOperand(2), NeedGPRC); 1015 } else if (OpIdx == 1 && (!NeedGPRC || MI.getNumExplicitOperands() < 3 || 1016 isCompressibleOpnd(MI.getOperand(2)))) { 1017 tryAddHint(MO, MI.getOperand(0), NeedGPRC); 1018 } else if (MI.isCommutable() && OpIdx == 2 && 1019 (!NeedGPRC || isCompressibleOpnd(MI.getOperand(1)))) { 1020 tryAddHint(MO, MI.getOperand(0), NeedGPRC); 1021 } 1022 } 1023 1024 // Add a hint if it would allow auipc/lui+addi(w) fusion. 1025 if ((MI.getOpcode() == RISCV::ADDIW || MI.getOpcode() == RISCV::ADDI) && 1026 MI.getOperand(1).isReg()) { 1027 const MachineBasicBlock &MBB = *MI.getParent(); 1028 MachineBasicBlock::const_iterator I = MI.getIterator(); 1029 // Is the previous instruction a LUI or AUIPC that can be fused? 1030 if (I != MBB.begin()) { 1031 I = skipDebugInstructionsBackward(std::prev(I), MBB.begin()); 1032 if (((I->getOpcode() == RISCV::LUI && Subtarget.hasLUIADDIFusion()) || 1033 (I->getOpcode() == RISCV::AUIPC && 1034 Subtarget.hasAUIPCADDIFusion())) && 1035 I->getOperand(0).getReg() == MI.getOperand(1).getReg()) { 1036 if (OpIdx == 0) 1037 tryAddHint(MO, MI.getOperand(1), /*NeedGPRC=*/false); 1038 else 1039 tryAddHint(MO, MI.getOperand(0), /*NeedGPRC=*/false); 1040 } 1041 } 1042 } 1043 } 1044 1045 for (MCPhysReg OrderReg : Order) 1046 if (TwoAddrHints.count(OrderReg)) 1047 Hints.push_back(OrderReg); 1048 1049 return BaseImplRetVal; 1050 } 1051