1 //===-- RISCVFrameLowering.cpp - RISCV Frame Information ------------------===// 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 TargetFrameLowering class. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "RISCVFrameLowering.h" 14 #include "RISCVMachineFunctionInfo.h" 15 #include "RISCVSubtarget.h" 16 #include "llvm/BinaryFormat/Dwarf.h" 17 #include "llvm/CodeGen/MachineFrameInfo.h" 18 #include "llvm/CodeGen/MachineFunction.h" 19 #include "llvm/CodeGen/MachineInstrBuilder.h" 20 #include "llvm/CodeGen/MachineRegisterInfo.h" 21 #include "llvm/CodeGen/RegisterScavenging.h" 22 #include "llvm/IR/DiagnosticInfo.h" 23 #include "llvm/MC/MCDwarf.h" 24 #include "llvm/Support/LEB128.h" 25 26 #include <algorithm> 27 28 using namespace llvm; 29 30 // For now we use x18, a.k.a s2, as pointer to shadow call stack. 31 // User should explicitly set -ffixed-x18 and not use x18 in their asm. 32 static void emitSCSPrologue(MachineFunction &MF, MachineBasicBlock &MBB, 33 MachineBasicBlock::iterator MI, 34 const DebugLoc &DL) { 35 if (!MF.getFunction().hasFnAttribute(Attribute::ShadowCallStack)) 36 return; 37 38 const auto &STI = MF.getSubtarget<RISCVSubtarget>(); 39 Register RAReg = STI.getRegisterInfo()->getRARegister(); 40 41 // Do not save RA to the SCS if it's not saved to the regular stack, 42 // i.e. RA is not at risk of being overwritten. 43 std::vector<CalleeSavedInfo> &CSI = MF.getFrameInfo().getCalleeSavedInfo(); 44 if (llvm::none_of( 45 CSI, [&](CalleeSavedInfo &CSR) { return CSR.getReg() == RAReg; })) 46 return; 47 48 Register SCSPReg = RISCVABI::getSCSPReg(); 49 50 auto &Ctx = MF.getFunction().getContext(); 51 if (!STI.isRegisterReservedByUser(SCSPReg)) { 52 Ctx.diagnose(DiagnosticInfoUnsupported{ 53 MF.getFunction(), "x18 not reserved by user for Shadow Call Stack."}); 54 return; 55 } 56 57 const auto *RVFI = MF.getInfo<RISCVMachineFunctionInfo>(); 58 if (RVFI->useSaveRestoreLibCalls(MF)) { 59 Ctx.diagnose(DiagnosticInfoUnsupported{ 60 MF.getFunction(), 61 "Shadow Call Stack cannot be combined with Save/Restore LibCalls."}); 62 return; 63 } 64 65 const RISCVInstrInfo *TII = STI.getInstrInfo(); 66 bool IsRV64 = STI.hasFeature(RISCV::Feature64Bit); 67 int64_t SlotSize = STI.getXLen() / 8; 68 // Store return address to shadow call stack 69 // s[w|d] ra, 0(s2) 70 // addi s2, s2, [4|8] 71 BuildMI(MBB, MI, DL, TII->get(IsRV64 ? RISCV::SD : RISCV::SW)) 72 .addReg(RAReg) 73 .addReg(SCSPReg) 74 .addImm(0) 75 .setMIFlag(MachineInstr::FrameSetup); 76 BuildMI(MBB, MI, DL, TII->get(RISCV::ADDI)) 77 .addReg(SCSPReg, RegState::Define) 78 .addReg(SCSPReg) 79 .addImm(SlotSize) 80 .setMIFlag(MachineInstr::FrameSetup); 81 } 82 83 static void emitSCSEpilogue(MachineFunction &MF, MachineBasicBlock &MBB, 84 MachineBasicBlock::iterator MI, 85 const DebugLoc &DL) { 86 if (!MF.getFunction().hasFnAttribute(Attribute::ShadowCallStack)) 87 return; 88 89 const auto &STI = MF.getSubtarget<RISCVSubtarget>(); 90 Register RAReg = STI.getRegisterInfo()->getRARegister(); 91 92 // See emitSCSPrologue() above. 93 std::vector<CalleeSavedInfo> &CSI = MF.getFrameInfo().getCalleeSavedInfo(); 94 if (llvm::none_of( 95 CSI, [&](CalleeSavedInfo &CSR) { return CSR.getReg() == RAReg; })) 96 return; 97 98 Register SCSPReg = RISCVABI::getSCSPReg(); 99 100 auto &Ctx = MF.getFunction().getContext(); 101 if (!STI.isRegisterReservedByUser(SCSPReg)) { 102 Ctx.diagnose(DiagnosticInfoUnsupported{ 103 MF.getFunction(), "x18 not reserved by user for Shadow Call Stack."}); 104 return; 105 } 106 107 const auto *RVFI = MF.getInfo<RISCVMachineFunctionInfo>(); 108 if (RVFI->useSaveRestoreLibCalls(MF)) { 109 Ctx.diagnose(DiagnosticInfoUnsupported{ 110 MF.getFunction(), 111 "Shadow Call Stack cannot be combined with Save/Restore LibCalls."}); 112 return; 113 } 114 115 const RISCVInstrInfo *TII = STI.getInstrInfo(); 116 bool IsRV64 = STI.hasFeature(RISCV::Feature64Bit); 117 int64_t SlotSize = STI.getXLen() / 8; 118 // Load return address from shadow call stack 119 // l[w|d] ra, -[4|8](s2) 120 // addi s2, s2, -[4|8] 121 BuildMI(MBB, MI, DL, TII->get(IsRV64 ? RISCV::LD : RISCV::LW)) 122 .addReg(RAReg, RegState::Define) 123 .addReg(SCSPReg) 124 .addImm(-SlotSize) 125 .setMIFlag(MachineInstr::FrameDestroy); 126 BuildMI(MBB, MI, DL, TII->get(RISCV::ADDI)) 127 .addReg(SCSPReg, RegState::Define) 128 .addReg(SCSPReg) 129 .addImm(-SlotSize) 130 .setMIFlag(MachineInstr::FrameDestroy); 131 } 132 133 // Get the ID of the libcall used for spilling and restoring callee saved 134 // registers. The ID is representative of the number of registers saved or 135 // restored by the libcall, except it is zero-indexed - ID 0 corresponds to a 136 // single register. 137 static int getLibCallID(const MachineFunction &MF, 138 const std::vector<CalleeSavedInfo> &CSI) { 139 const auto *RVFI = MF.getInfo<RISCVMachineFunctionInfo>(); 140 141 if (CSI.empty() || !RVFI->useSaveRestoreLibCalls(MF)) 142 return -1; 143 144 Register MaxReg = RISCV::NoRegister; 145 for (auto &CS : CSI) 146 // RISCVRegisterInfo::hasReservedSpillSlot assigns negative frame indexes to 147 // registers which can be saved by libcall. 148 if (CS.getFrameIdx() < 0) 149 MaxReg = std::max(MaxReg.id(), CS.getReg().id()); 150 151 if (MaxReg == RISCV::NoRegister) 152 return -1; 153 154 switch (MaxReg) { 155 default: 156 llvm_unreachable("Something has gone wrong!"); 157 case /*s11*/ RISCV::X27: return 12; 158 case /*s10*/ RISCV::X26: return 11; 159 case /*s9*/ RISCV::X25: return 10; 160 case /*s8*/ RISCV::X24: return 9; 161 case /*s7*/ RISCV::X23: return 8; 162 case /*s6*/ RISCV::X22: return 7; 163 case /*s5*/ RISCV::X21: return 6; 164 case /*s4*/ RISCV::X20: return 5; 165 case /*s3*/ RISCV::X19: return 4; 166 case /*s2*/ RISCV::X18: return 3; 167 case /*s1*/ RISCV::X9: return 2; 168 case /*s0*/ RISCV::X8: return 1; 169 case /*ra*/ RISCV::X1: return 0; 170 } 171 } 172 173 // Get the name of the libcall used for spilling callee saved registers. 174 // If this function will not use save/restore libcalls, then return a nullptr. 175 static const char * 176 getSpillLibCallName(const MachineFunction &MF, 177 const std::vector<CalleeSavedInfo> &CSI) { 178 static const char *const SpillLibCalls[] = { 179 "__riscv_save_0", 180 "__riscv_save_1", 181 "__riscv_save_2", 182 "__riscv_save_3", 183 "__riscv_save_4", 184 "__riscv_save_5", 185 "__riscv_save_6", 186 "__riscv_save_7", 187 "__riscv_save_8", 188 "__riscv_save_9", 189 "__riscv_save_10", 190 "__riscv_save_11", 191 "__riscv_save_12" 192 }; 193 194 int LibCallID = getLibCallID(MF, CSI); 195 if (LibCallID == -1) 196 return nullptr; 197 return SpillLibCalls[LibCallID]; 198 } 199 200 // Get the name of the libcall used for restoring callee saved registers. 201 // If this function will not use save/restore libcalls, then return a nullptr. 202 static const char * 203 getRestoreLibCallName(const MachineFunction &MF, 204 const std::vector<CalleeSavedInfo> &CSI) { 205 static const char *const RestoreLibCalls[] = { 206 "__riscv_restore_0", 207 "__riscv_restore_1", 208 "__riscv_restore_2", 209 "__riscv_restore_3", 210 "__riscv_restore_4", 211 "__riscv_restore_5", 212 "__riscv_restore_6", 213 "__riscv_restore_7", 214 "__riscv_restore_8", 215 "__riscv_restore_9", 216 "__riscv_restore_10", 217 "__riscv_restore_11", 218 "__riscv_restore_12" 219 }; 220 221 int LibCallID = getLibCallID(MF, CSI); 222 if (LibCallID == -1) 223 return nullptr; 224 return RestoreLibCalls[LibCallID]; 225 } 226 227 // Return true if the specified function should have a dedicated frame 228 // pointer register. This is true if frame pointer elimination is 229 // disabled, if it needs dynamic stack realignment, if the function has 230 // variable sized allocas, or if the frame address is taken. 231 bool RISCVFrameLowering::hasFP(const MachineFunction &MF) const { 232 const TargetRegisterInfo *RegInfo = MF.getSubtarget().getRegisterInfo(); 233 234 const MachineFrameInfo &MFI = MF.getFrameInfo(); 235 return MF.getTarget().Options.DisableFramePointerElim(MF) || 236 RegInfo->hasStackRealignment(MF) || MFI.hasVarSizedObjects() || 237 MFI.isFrameAddressTaken(); 238 } 239 240 bool RISCVFrameLowering::hasBP(const MachineFunction &MF) const { 241 const MachineFrameInfo &MFI = MF.getFrameInfo(); 242 const TargetRegisterInfo *TRI = STI.getRegisterInfo(); 243 244 // If we do not reserve stack space for outgoing arguments in prologue, 245 // we will adjust the stack pointer before call instruction. After the 246 // adjustment, we can not use SP to access the stack objects for the 247 // arguments. Instead, use BP to access these stack objects. 248 return (MFI.hasVarSizedObjects() || 249 (!hasReservedCallFrame(MF) && (!MFI.isMaxCallFrameSizeComputed() || 250 MFI.getMaxCallFrameSize() != 0))) && 251 TRI->hasStackRealignment(MF); 252 } 253 254 // Determines the size of the frame and maximum call frame size. 255 void RISCVFrameLowering::determineFrameLayout(MachineFunction &MF) const { 256 MachineFrameInfo &MFI = MF.getFrameInfo(); 257 auto *RVFI = MF.getInfo<RISCVMachineFunctionInfo>(); 258 259 // Get the number of bytes to allocate from the FrameInfo. 260 uint64_t FrameSize = MFI.getStackSize(); 261 262 // Get the alignment. 263 Align StackAlign = getStackAlign(); 264 265 // Make sure the frame is aligned. 266 FrameSize = alignTo(FrameSize, StackAlign); 267 268 // Update frame info. 269 MFI.setStackSize(FrameSize); 270 271 // When using SP or BP to access stack objects, we may require extra padding 272 // to ensure the bottom of the RVV stack is correctly aligned within the main 273 // stack. We calculate this as the amount required to align the scalar local 274 // variable section up to the RVV alignment. 275 const TargetRegisterInfo *TRI = STI.getRegisterInfo(); 276 if (RVFI->getRVVStackSize() && (!hasFP(MF) || TRI->hasStackRealignment(MF))) { 277 int ScalarLocalVarSize = FrameSize - RVFI->getCalleeSavedStackSize() - 278 RVFI->getVarArgsSaveSize(); 279 if (auto RVVPadding = 280 offsetToAlignment(ScalarLocalVarSize, RVFI->getRVVStackAlign())) 281 RVFI->setRVVPadding(RVVPadding); 282 } 283 } 284 285 // Returns the stack size including RVV padding (when required), rounded back 286 // up to the required stack alignment. 287 uint64_t RISCVFrameLowering::getStackSizeWithRVVPadding( 288 const MachineFunction &MF) const { 289 const MachineFrameInfo &MFI = MF.getFrameInfo(); 290 auto *RVFI = MF.getInfo<RISCVMachineFunctionInfo>(); 291 return alignTo(MFI.getStackSize() + RVFI->getRVVPadding(), getStackAlign()); 292 } 293 294 // Returns the register used to hold the frame pointer. 295 static Register getFPReg(const RISCVSubtarget &STI) { return RISCV::X8; } 296 297 // Returns the register used to hold the stack pointer. 298 static Register getSPReg(const RISCVSubtarget &STI) { return RISCV::X2; } 299 300 static SmallVector<CalleeSavedInfo, 8> 301 getNonLibcallCSI(const MachineFunction &MF, 302 const std::vector<CalleeSavedInfo> &CSI) { 303 const MachineFrameInfo &MFI = MF.getFrameInfo(); 304 SmallVector<CalleeSavedInfo, 8> NonLibcallCSI; 305 306 for (auto &CS : CSI) { 307 int FI = CS.getFrameIdx(); 308 if (FI >= 0 && MFI.getStackID(FI) == TargetStackID::Default) 309 NonLibcallCSI.push_back(CS); 310 } 311 312 return NonLibcallCSI; 313 } 314 315 void RISCVFrameLowering::adjustStackForRVV(MachineFunction &MF, 316 MachineBasicBlock &MBB, 317 MachineBasicBlock::iterator MBBI, 318 const DebugLoc &DL, int64_t Amount, 319 MachineInstr::MIFlag Flag) const { 320 assert(Amount != 0 && "Did not need to adjust stack pointer for RVV."); 321 322 const Register SPReg = getSPReg(STI); 323 324 // Optimize compile time offset case 325 StackOffset Offset = StackOffset::getScalable(Amount); 326 if (STI.getRealMinVLen() == STI.getRealMaxVLen()) { 327 // 1. Multiply the number of v-slots by the (constant) length of register 328 const int64_t VLENB = STI.getRealMinVLen() / 8; 329 assert(Amount % 8 == 0 && 330 "Reserve the stack by the multiple of one vector size."); 331 const int64_t NumOfVReg = Amount / 8; 332 const int64_t FixedOffset = NumOfVReg * VLENB; 333 if (!isInt<32>(FixedOffset)) { 334 report_fatal_error( 335 "Frame size outside of the signed 32-bit range not supported"); 336 } 337 Offset = StackOffset::getFixed(FixedOffset); 338 } 339 340 const RISCVRegisterInfo &RI = *STI.getRegisterInfo(); 341 // We must keep the stack pointer aligned through any intermediate 342 // updates. 343 RI.adjustReg(MBB, MBBI, DL, SPReg, SPReg, Offset, 344 Flag, getStackAlign()); 345 } 346 347 static MCCFIInstruction createDefCFAExpression(const TargetRegisterInfo &TRI, 348 Register Reg, 349 uint64_t FixedOffset, 350 uint64_t ScalableOffset) { 351 assert(ScalableOffset != 0 && "Did not need to adjust CFA for RVV"); 352 SmallString<64> Expr; 353 std::string CommentBuffer; 354 llvm::raw_string_ostream Comment(CommentBuffer); 355 // Build up the expression (Reg + FixedOffset + ScalableOffset * VLENB). 356 unsigned DwarfReg = TRI.getDwarfRegNum(Reg, true); 357 Expr.push_back((uint8_t)(dwarf::DW_OP_breg0 + DwarfReg)); 358 Expr.push_back(0); 359 if (Reg == RISCV::X2) 360 Comment << "sp"; 361 else 362 Comment << printReg(Reg, &TRI); 363 364 uint8_t buffer[16]; 365 if (FixedOffset) { 366 Expr.push_back(dwarf::DW_OP_consts); 367 Expr.append(buffer, buffer + encodeSLEB128(FixedOffset, buffer)); 368 Expr.push_back((uint8_t)dwarf::DW_OP_plus); 369 Comment << " + " << FixedOffset; 370 } 371 372 Expr.push_back((uint8_t)dwarf::DW_OP_consts); 373 Expr.append(buffer, buffer + encodeSLEB128(ScalableOffset, buffer)); 374 375 unsigned DwarfVlenb = TRI.getDwarfRegNum(RISCV::VLENB, true); 376 Expr.push_back((uint8_t)dwarf::DW_OP_bregx); 377 Expr.append(buffer, buffer + encodeULEB128(DwarfVlenb, buffer)); 378 Expr.push_back(0); 379 380 Expr.push_back((uint8_t)dwarf::DW_OP_mul); 381 Expr.push_back((uint8_t)dwarf::DW_OP_plus); 382 383 Comment << " + " << ScalableOffset << " * vlenb"; 384 385 SmallString<64> DefCfaExpr; 386 DefCfaExpr.push_back(dwarf::DW_CFA_def_cfa_expression); 387 DefCfaExpr.append(buffer, buffer + encodeULEB128(Expr.size(), buffer)); 388 DefCfaExpr.append(Expr.str()); 389 390 return MCCFIInstruction::createEscape(nullptr, DefCfaExpr.str(), 391 Comment.str()); 392 } 393 394 void RISCVFrameLowering::emitPrologue(MachineFunction &MF, 395 MachineBasicBlock &MBB) const { 396 MachineFrameInfo &MFI = MF.getFrameInfo(); 397 auto *RVFI = MF.getInfo<RISCVMachineFunctionInfo>(); 398 const RISCVRegisterInfo *RI = STI.getRegisterInfo(); 399 const RISCVInstrInfo *TII = STI.getInstrInfo(); 400 MachineBasicBlock::iterator MBBI = MBB.begin(); 401 402 Register FPReg = getFPReg(STI); 403 Register SPReg = getSPReg(STI); 404 Register BPReg = RISCVABI::getBPReg(); 405 406 // Debug location must be unknown since the first debug location is used 407 // to determine the end of the prologue. 408 DebugLoc DL; 409 410 // All calls are tail calls in GHC calling conv, and functions have no 411 // prologue/epilogue. 412 if (MF.getFunction().getCallingConv() == CallingConv::GHC) 413 return; 414 415 // Emit prologue for shadow call stack. 416 emitSCSPrologue(MF, MBB, MBBI, DL); 417 418 // Since spillCalleeSavedRegisters may have inserted a libcall, skip past 419 // any instructions marked as FrameSetup 420 while (MBBI != MBB.end() && MBBI->getFlag(MachineInstr::FrameSetup)) 421 ++MBBI; 422 423 // Determine the correct frame layout 424 determineFrameLayout(MF); 425 426 // If libcalls are used to spill and restore callee-saved registers, the frame 427 // has two sections; the opaque section managed by the libcalls, and the 428 // section managed by MachineFrameInfo which can also hold callee saved 429 // registers in fixed stack slots, both of which have negative frame indices. 430 // This gets even more complicated when incoming arguments are passed via the 431 // stack, as these too have negative frame indices. An example is detailed 432 // below: 433 // 434 // | incoming arg | <- FI[-3] 435 // | libcallspill | 436 // | calleespill | <- FI[-2] 437 // | calleespill | <- FI[-1] 438 // | this_frame | <- FI[0] 439 // 440 // For negative frame indices, the offset from the frame pointer will differ 441 // depending on which of these groups the frame index applies to. 442 // The following calculates the correct offset knowing the number of callee 443 // saved registers spilt by the two methods. 444 if (int LibCallRegs = getLibCallID(MF, MFI.getCalleeSavedInfo()) + 1) { 445 // Calculate the size of the frame managed by the libcall. The libcalls are 446 // implemented such that the stack will always be 16 byte aligned. 447 unsigned LibCallFrameSize = alignTo((STI.getXLen() / 8) * LibCallRegs, 16); 448 RVFI->setLibCallStackSize(LibCallFrameSize); 449 } 450 451 // FIXME (note copied from Lanai): This appears to be overallocating. Needs 452 // investigation. Get the number of bytes to allocate from the FrameInfo. 453 uint64_t StackSize = getStackSizeWithRVVPadding(MF); 454 uint64_t RealStackSize = StackSize + RVFI->getLibCallStackSize(); 455 uint64_t RVVStackSize = RVFI->getRVVStackSize(); 456 457 // Early exit if there is no need to allocate on the stack 458 if (RealStackSize == 0 && !MFI.adjustsStack() && RVVStackSize == 0) 459 return; 460 461 // If the stack pointer has been marked as reserved, then produce an error if 462 // the frame requires stack allocation 463 if (STI.isRegisterReservedByUser(SPReg)) 464 MF.getFunction().getContext().diagnose(DiagnosticInfoUnsupported{ 465 MF.getFunction(), "Stack pointer required, but has been reserved."}); 466 467 uint64_t FirstSPAdjustAmount = getFirstSPAdjustAmount(MF); 468 // Split the SP adjustment to reduce the offsets of callee saved spill. 469 if (FirstSPAdjustAmount) { 470 StackSize = FirstSPAdjustAmount; 471 RealStackSize = FirstSPAdjustAmount; 472 } 473 474 // Allocate space on the stack if necessary. 475 RI->adjustReg(MBB, MBBI, DL, SPReg, SPReg, StackOffset::getFixed(-StackSize), 476 MachineInstr::FrameSetup, getStackAlign()); 477 478 // Emit ".cfi_def_cfa_offset RealStackSize" 479 unsigned CFIIndex = MF.addFrameInst( 480 MCCFIInstruction::cfiDefCfaOffset(nullptr, RealStackSize)); 481 BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION)) 482 .addCFIIndex(CFIIndex) 483 .setMIFlag(MachineInstr::FrameSetup); 484 485 const auto &CSI = MFI.getCalleeSavedInfo(); 486 487 // The frame pointer is callee-saved, and code has been generated for us to 488 // save it to the stack. We need to skip over the storing of callee-saved 489 // registers as the frame pointer must be modified after it has been saved 490 // to the stack, not before. 491 // FIXME: assumes exactly one instruction is used to save each callee-saved 492 // register. 493 std::advance(MBBI, getNonLibcallCSI(MF, CSI).size()); 494 495 // Iterate over list of callee-saved registers and emit .cfi_offset 496 // directives. 497 for (const auto &Entry : CSI) { 498 int FrameIdx = Entry.getFrameIdx(); 499 int64_t Offset; 500 // Offsets for objects with fixed locations (IE: those saved by libcall) are 501 // simply calculated from the frame index. 502 if (FrameIdx < 0) 503 Offset = FrameIdx * (int64_t) STI.getXLen() / 8; 504 else 505 Offset = MFI.getObjectOffset(Entry.getFrameIdx()) - 506 RVFI->getLibCallStackSize(); 507 Register Reg = Entry.getReg(); 508 unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createOffset( 509 nullptr, RI->getDwarfRegNum(Reg, true), Offset)); 510 BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION)) 511 .addCFIIndex(CFIIndex) 512 .setMIFlag(MachineInstr::FrameSetup); 513 } 514 515 // Generate new FP. 516 if (hasFP(MF)) { 517 if (STI.isRegisterReservedByUser(FPReg)) 518 MF.getFunction().getContext().diagnose(DiagnosticInfoUnsupported{ 519 MF.getFunction(), "Frame pointer required, but has been reserved."}); 520 // The frame pointer does need to be reserved from register allocation. 521 assert(MF.getRegInfo().isReserved(FPReg) && "FP not reserved"); 522 523 RI->adjustReg(MBB, MBBI, DL, FPReg, SPReg, 524 StackOffset::getFixed(RealStackSize - RVFI->getVarArgsSaveSize()), 525 MachineInstr::FrameSetup, getStackAlign()); 526 527 // Emit ".cfi_def_cfa $fp, RVFI->getVarArgsSaveSize()" 528 unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::cfiDefCfa( 529 nullptr, RI->getDwarfRegNum(FPReg, true), RVFI->getVarArgsSaveSize())); 530 BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION)) 531 .addCFIIndex(CFIIndex) 532 .setMIFlag(MachineInstr::FrameSetup); 533 } 534 535 // Emit the second SP adjustment after saving callee saved registers. 536 if (FirstSPAdjustAmount) { 537 uint64_t SecondSPAdjustAmount = 538 getStackSizeWithRVVPadding(MF) - FirstSPAdjustAmount; 539 assert(SecondSPAdjustAmount > 0 && 540 "SecondSPAdjustAmount should be greater than zero"); 541 RI->adjustReg(MBB, MBBI, DL, SPReg, SPReg, 542 StackOffset::getFixed(-SecondSPAdjustAmount), 543 MachineInstr::FrameSetup, getStackAlign()); 544 545 // If we are using a frame-pointer, and thus emitted ".cfi_def_cfa fp, 0", 546 // don't emit an sp-based .cfi_def_cfa_offset 547 if (!hasFP(MF)) { 548 // Emit ".cfi_def_cfa_offset StackSize" 549 unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::cfiDefCfaOffset( 550 nullptr, getStackSizeWithRVVPadding(MF))); 551 BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION)) 552 .addCFIIndex(CFIIndex) 553 .setMIFlag(MachineInstr::FrameSetup); 554 } 555 } 556 557 if (RVVStackSize) { 558 adjustStackForRVV(MF, MBB, MBBI, DL, -RVVStackSize, 559 MachineInstr::FrameSetup); 560 if (!hasFP(MF)) { 561 // Emit .cfi_def_cfa_expression "sp + StackSize + RVVStackSize * vlenb". 562 unsigned CFIIndex = MF.addFrameInst(createDefCFAExpression( 563 *RI, SPReg, getStackSizeWithRVVPadding(MF), RVVStackSize / 8)); 564 BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION)) 565 .addCFIIndex(CFIIndex) 566 .setMIFlag(MachineInstr::FrameSetup); 567 } 568 } 569 570 if (hasFP(MF)) { 571 // Realign Stack 572 const RISCVRegisterInfo *RI = STI.getRegisterInfo(); 573 if (RI->hasStackRealignment(MF)) { 574 Align MaxAlignment = MFI.getMaxAlign(); 575 576 const RISCVInstrInfo *TII = STI.getInstrInfo(); 577 if (isInt<12>(-(int)MaxAlignment.value())) { 578 BuildMI(MBB, MBBI, DL, TII->get(RISCV::ANDI), SPReg) 579 .addReg(SPReg) 580 .addImm(-(int)MaxAlignment.value()) 581 .setMIFlag(MachineInstr::FrameSetup); 582 } else { 583 unsigned ShiftAmount = Log2(MaxAlignment); 584 Register VR = 585 MF.getRegInfo().createVirtualRegister(&RISCV::GPRRegClass); 586 BuildMI(MBB, MBBI, DL, TII->get(RISCV::SRLI), VR) 587 .addReg(SPReg) 588 .addImm(ShiftAmount) 589 .setMIFlag(MachineInstr::FrameSetup); 590 BuildMI(MBB, MBBI, DL, TII->get(RISCV::SLLI), SPReg) 591 .addReg(VR) 592 .addImm(ShiftAmount) 593 .setMIFlag(MachineInstr::FrameSetup); 594 } 595 // FP will be used to restore the frame in the epilogue, so we need 596 // another base register BP to record SP after re-alignment. SP will 597 // track the current stack after allocating variable sized objects. 598 if (hasBP(MF)) { 599 // move BP, SP 600 BuildMI(MBB, MBBI, DL, TII->get(RISCV::ADDI), BPReg) 601 .addReg(SPReg) 602 .addImm(0) 603 .setMIFlag(MachineInstr::FrameSetup); 604 } 605 } 606 } 607 } 608 609 void RISCVFrameLowering::emitEpilogue(MachineFunction &MF, 610 MachineBasicBlock &MBB) const { 611 const RISCVRegisterInfo *RI = STI.getRegisterInfo(); 612 MachineFrameInfo &MFI = MF.getFrameInfo(); 613 auto *RVFI = MF.getInfo<RISCVMachineFunctionInfo>(); 614 Register FPReg = getFPReg(STI); 615 Register SPReg = getSPReg(STI); 616 617 // All calls are tail calls in GHC calling conv, and functions have no 618 // prologue/epilogue. 619 if (MF.getFunction().getCallingConv() == CallingConv::GHC) 620 return; 621 622 // Get the insert location for the epilogue. If there were no terminators in 623 // the block, get the last instruction. 624 MachineBasicBlock::iterator MBBI = MBB.end(); 625 DebugLoc DL; 626 if (!MBB.empty()) { 627 MBBI = MBB.getLastNonDebugInstr(); 628 if (MBBI != MBB.end()) 629 DL = MBBI->getDebugLoc(); 630 631 MBBI = MBB.getFirstTerminator(); 632 633 // If callee-saved registers are saved via libcall, place stack adjustment 634 // before this call. 635 while (MBBI != MBB.begin() && 636 std::prev(MBBI)->getFlag(MachineInstr::FrameDestroy)) 637 --MBBI; 638 } 639 640 const auto &CSI = getNonLibcallCSI(MF, MFI.getCalleeSavedInfo()); 641 642 // Skip to before the restores of callee-saved registers 643 // FIXME: assumes exactly one instruction is used to restore each 644 // callee-saved register. 645 auto LastFrameDestroy = MBBI; 646 if (!CSI.empty()) 647 LastFrameDestroy = std::prev(MBBI, CSI.size()); 648 649 uint64_t StackSize = getStackSizeWithRVVPadding(MF); 650 uint64_t RealStackSize = StackSize + RVFI->getLibCallStackSize(); 651 uint64_t FPOffset = RealStackSize - RVFI->getVarArgsSaveSize(); 652 uint64_t RVVStackSize = RVFI->getRVVStackSize(); 653 654 // Restore the stack pointer using the value of the frame pointer. Only 655 // necessary if the stack pointer was modified, meaning the stack size is 656 // unknown. 657 // 658 // In order to make sure the stack point is right through the EH region, 659 // we also need to restore stack pointer from the frame pointer if we 660 // don't preserve stack space within prologue/epilogue for outgoing variables, 661 // normally it's just checking the variable sized object is present or not 662 // is enough, but we also don't preserve that at prologue/epilogue when 663 // have vector objects in stack. 664 if (RI->hasStackRealignment(MF) || MFI.hasVarSizedObjects() || 665 !hasReservedCallFrame(MF)) { 666 assert(hasFP(MF) && "frame pointer should not have been eliminated"); 667 RI->adjustReg(MBB, LastFrameDestroy, DL, SPReg, FPReg, 668 StackOffset::getFixed(-FPOffset), 669 MachineInstr::FrameDestroy, getStackAlign()); 670 } else { 671 if (RVVStackSize) 672 adjustStackForRVV(MF, MBB, LastFrameDestroy, DL, RVVStackSize, 673 MachineInstr::FrameDestroy); 674 } 675 676 uint64_t FirstSPAdjustAmount = getFirstSPAdjustAmount(MF); 677 if (FirstSPAdjustAmount) { 678 uint64_t SecondSPAdjustAmount = 679 getStackSizeWithRVVPadding(MF) - FirstSPAdjustAmount; 680 assert(SecondSPAdjustAmount > 0 && 681 "SecondSPAdjustAmount should be greater than zero"); 682 683 RI->adjustReg(MBB, LastFrameDestroy, DL, SPReg, SPReg, 684 StackOffset::getFixed(SecondSPAdjustAmount), 685 MachineInstr::FrameDestroy, getStackAlign()); 686 } 687 688 if (FirstSPAdjustAmount) 689 StackSize = FirstSPAdjustAmount; 690 691 // Deallocate stack 692 RI->adjustReg(MBB, MBBI, DL, SPReg, SPReg, StackOffset::getFixed(StackSize), 693 MachineInstr::FrameDestroy, getStackAlign()); 694 695 // Emit epilogue for shadow call stack. 696 emitSCSEpilogue(MF, MBB, MBBI, DL); 697 } 698 699 StackOffset 700 RISCVFrameLowering::getFrameIndexReference(const MachineFunction &MF, int FI, 701 Register &FrameReg) const { 702 const MachineFrameInfo &MFI = MF.getFrameInfo(); 703 const TargetRegisterInfo *RI = MF.getSubtarget().getRegisterInfo(); 704 const auto *RVFI = MF.getInfo<RISCVMachineFunctionInfo>(); 705 706 // Callee-saved registers should be referenced relative to the stack 707 // pointer (positive offset), otherwise use the frame pointer (negative 708 // offset). 709 const auto &CSI = getNonLibcallCSI(MF, MFI.getCalleeSavedInfo()); 710 int MinCSFI = 0; 711 int MaxCSFI = -1; 712 StackOffset Offset; 713 auto StackID = MFI.getStackID(FI); 714 715 assert((StackID == TargetStackID::Default || 716 StackID == TargetStackID::ScalableVector) && 717 "Unexpected stack ID for the frame object."); 718 if (StackID == TargetStackID::Default) { 719 Offset = 720 StackOffset::getFixed(MFI.getObjectOffset(FI) - getOffsetOfLocalArea() + 721 MFI.getOffsetAdjustment()); 722 } else if (StackID == TargetStackID::ScalableVector) { 723 Offset = StackOffset::getScalable(MFI.getObjectOffset(FI)); 724 } 725 726 uint64_t FirstSPAdjustAmount = getFirstSPAdjustAmount(MF); 727 728 if (CSI.size()) { 729 MinCSFI = CSI[0].getFrameIdx(); 730 MaxCSFI = CSI[CSI.size() - 1].getFrameIdx(); 731 } 732 733 if (FI >= MinCSFI && FI <= MaxCSFI) { 734 FrameReg = RISCV::X2; 735 736 if (FirstSPAdjustAmount) 737 Offset += StackOffset::getFixed(FirstSPAdjustAmount); 738 else 739 Offset += StackOffset::getFixed(getStackSizeWithRVVPadding(MF)); 740 return Offset; 741 } 742 743 if (RI->hasStackRealignment(MF) && !MFI.isFixedObjectIndex(FI)) { 744 // If the stack was realigned, the frame pointer is set in order to allow 745 // SP to be restored, so we need another base register to record the stack 746 // after realignment. 747 // |--------------------------| -- <-- FP 748 // | callee-allocated save | | <----| 749 // | area for register varargs| | | 750 // |--------------------------| | | 751 // | callee-saved registers | | | 752 // |--------------------------| -- | 753 // | realignment (the size of | | | 754 // | this area is not counted | | | 755 // | in MFI.getStackSize()) | | | 756 // |--------------------------| -- |-- MFI.getStackSize() 757 // | RVV alignment padding | | | 758 // | (not counted in | | | 759 // | MFI.getStackSize() but | | | 760 // | counted in | | | 761 // | RVFI.getRVVStackSize()) | | | 762 // |--------------------------| -- | 763 // | RVV objects | | | 764 // | (not counted in | | | 765 // | MFI.getStackSize()) | | | 766 // |--------------------------| -- | 767 // | padding before RVV | | | 768 // | (not counted in | | | 769 // | MFI.getStackSize() or in | | | 770 // | RVFI.getRVVStackSize()) | | | 771 // |--------------------------| -- | 772 // | scalar local variables | | <----' 773 // |--------------------------| -- <-- BP (if var sized objects present) 774 // | VarSize objects | | 775 // |--------------------------| -- <-- SP 776 if (hasBP(MF)) { 777 FrameReg = RISCVABI::getBPReg(); 778 } else { 779 // VarSize objects must be empty in this case! 780 assert(!MFI.hasVarSizedObjects()); 781 FrameReg = RISCV::X2; 782 } 783 } else { 784 FrameReg = RI->getFrameRegister(MF); 785 } 786 787 if (FrameReg == getFPReg(STI)) { 788 Offset += StackOffset::getFixed(RVFI->getVarArgsSaveSize()); 789 if (FI >= 0) 790 Offset -= StackOffset::getFixed(RVFI->getLibCallStackSize()); 791 // When using FP to access scalable vector objects, we need to minus 792 // the frame size. 793 // 794 // |--------------------------| -- <-- FP 795 // | callee-allocated save | | 796 // | area for register varargs| | 797 // |--------------------------| | 798 // | callee-saved registers | | 799 // |--------------------------| | MFI.getStackSize() 800 // | scalar local variables | | 801 // |--------------------------| -- (Offset of RVV objects is from here.) 802 // | RVV objects | 803 // |--------------------------| 804 // | VarSize objects | 805 // |--------------------------| <-- SP 806 if (MFI.getStackID(FI) == TargetStackID::ScalableVector) { 807 assert(!RI->hasStackRealignment(MF) && 808 "Can't index across variable sized realign"); 809 // We don't expect any extra RVV alignment padding, as the stack size 810 // and RVV object sections should be correct aligned in their own 811 // right. 812 assert(MFI.getStackSize() == getStackSizeWithRVVPadding(MF) && 813 "Inconsistent stack layout"); 814 Offset -= StackOffset::getFixed(MFI.getStackSize()); 815 } 816 return Offset; 817 } 818 819 // This case handles indexing off both SP and BP. 820 // If indexing off SP, there must not be any var sized objects 821 assert(FrameReg == RISCVABI::getBPReg() || !MFI.hasVarSizedObjects()); 822 823 // When using SP to access frame objects, we need to add RVV stack size. 824 // 825 // |--------------------------| -- <-- FP 826 // | callee-allocated save | | <----| 827 // | area for register varargs| | | 828 // |--------------------------| | | 829 // | callee-saved registers | | | 830 // |--------------------------| -- | 831 // | RVV alignment padding | | | 832 // | (not counted in | | | 833 // | MFI.getStackSize() but | | | 834 // | counted in | | | 835 // | RVFI.getRVVStackSize()) | | | 836 // |--------------------------| -- | 837 // | RVV objects | | |-- MFI.getStackSize() 838 // | (not counted in | | | 839 // | MFI.getStackSize()) | | | 840 // |--------------------------| -- | 841 // | padding before RVV | | | 842 // | (not counted in | | | 843 // | MFI.getStackSize()) | | | 844 // |--------------------------| -- | 845 // | scalar local variables | | <----' 846 // |--------------------------| -- <-- BP (if var sized objects present) 847 // | VarSize objects | | 848 // |--------------------------| -- <-- SP 849 // 850 // The total amount of padding surrounding RVV objects is described by 851 // RVV->getRVVPadding() and it can be zero. It allows us to align the RVV 852 // objects to the required alignment. 853 if (MFI.getStackID(FI) == TargetStackID::Default) { 854 if (MFI.isFixedObjectIndex(FI)) { 855 assert(!RI->hasStackRealignment(MF) && 856 "Can't index across variable sized realign"); 857 Offset += StackOffset::get(getStackSizeWithRVVPadding(MF) + 858 RVFI->getLibCallStackSize(), 859 RVFI->getRVVStackSize()); 860 } else { 861 Offset += StackOffset::getFixed(MFI.getStackSize()); 862 } 863 } else if (MFI.getStackID(FI) == TargetStackID::ScalableVector) { 864 // Ensure the base of the RVV stack is correctly aligned: add on the 865 // alignment padding. 866 int ScalarLocalVarSize = 867 MFI.getStackSize() - RVFI->getCalleeSavedStackSize() - 868 RVFI->getVarArgsSaveSize() + RVFI->getRVVPadding(); 869 Offset += StackOffset::get(ScalarLocalVarSize, RVFI->getRVVStackSize()); 870 } 871 return Offset; 872 } 873 874 void RISCVFrameLowering::determineCalleeSaves(MachineFunction &MF, 875 BitVector &SavedRegs, 876 RegScavenger *RS) const { 877 TargetFrameLowering::determineCalleeSaves(MF, SavedRegs, RS); 878 // Unconditionally spill RA and FP only if the function uses a frame 879 // pointer. 880 if (hasFP(MF)) { 881 SavedRegs.set(RISCV::X1); 882 SavedRegs.set(RISCV::X8); 883 } 884 // Mark BP as used if function has dedicated base pointer. 885 if (hasBP(MF)) 886 SavedRegs.set(RISCVABI::getBPReg()); 887 888 // If interrupt is enabled and there are calls in the handler, 889 // unconditionally save all Caller-saved registers and 890 // all FP registers, regardless whether they are used. 891 MachineFrameInfo &MFI = MF.getFrameInfo(); 892 893 if (MF.getFunction().hasFnAttribute("interrupt") && MFI.hasCalls()) { 894 895 static const MCPhysReg CSRegs[] = { RISCV::X1, /* ra */ 896 RISCV::X5, RISCV::X6, RISCV::X7, /* t0-t2 */ 897 RISCV::X10, RISCV::X11, /* a0-a1, a2-a7 */ 898 RISCV::X12, RISCV::X13, RISCV::X14, RISCV::X15, RISCV::X16, RISCV::X17, 899 RISCV::X28, RISCV::X29, RISCV::X30, RISCV::X31, 0 /* t3-t6 */ 900 }; 901 902 for (unsigned i = 0; CSRegs[i]; ++i) 903 SavedRegs.set(CSRegs[i]); 904 905 if (MF.getSubtarget<RISCVSubtarget>().hasStdExtF()) { 906 907 // If interrupt is enabled, this list contains all FP registers. 908 const MCPhysReg * Regs = MF.getRegInfo().getCalleeSavedRegs(); 909 910 for (unsigned i = 0; Regs[i]; ++i) 911 if (RISCV::FPR16RegClass.contains(Regs[i]) || 912 RISCV::FPR32RegClass.contains(Regs[i]) || 913 RISCV::FPR64RegClass.contains(Regs[i])) 914 SavedRegs.set(Regs[i]); 915 } 916 } 917 } 918 919 std::pair<int64_t, Align> 920 RISCVFrameLowering::assignRVVStackObjectOffsets(MachineFunction &MF) const { 921 MachineFrameInfo &MFI = MF.getFrameInfo(); 922 // Create a buffer of RVV objects to allocate. 923 SmallVector<int, 8> ObjectsToAllocate; 924 for (int I = 0, E = MFI.getObjectIndexEnd(); I != E; ++I) { 925 unsigned StackID = MFI.getStackID(I); 926 if (StackID != TargetStackID::ScalableVector) 927 continue; 928 if (MFI.isDeadObjectIndex(I)) 929 continue; 930 931 ObjectsToAllocate.push_back(I); 932 } 933 934 // The minimum alignment is 16 bytes. 935 Align RVVStackAlign(16); 936 const auto &ST = MF.getSubtarget<RISCVSubtarget>(); 937 938 if (!ST.hasVInstructions()) { 939 assert(ObjectsToAllocate.empty() && 940 "Can't allocate scalable-vector objects without V instructions"); 941 return std::make_pair(0, RVVStackAlign); 942 } 943 944 // Allocate all RVV locals and spills 945 int64_t Offset = 0; 946 for (int FI : ObjectsToAllocate) { 947 // ObjectSize in bytes. 948 int64_t ObjectSize = MFI.getObjectSize(FI); 949 auto ObjectAlign = std::max(Align(8), MFI.getObjectAlign(FI)); 950 // If the data type is the fractional vector type, reserve one vector 951 // register for it. 952 if (ObjectSize < 8) 953 ObjectSize = 8; 954 Offset = alignTo(Offset + ObjectSize, ObjectAlign); 955 MFI.setObjectOffset(FI, -Offset); 956 // Update the maximum alignment of the RVV stack section 957 RVVStackAlign = std::max(RVVStackAlign, ObjectAlign); 958 } 959 960 // Ensure the alignment of the RVV stack. Since we want the most-aligned 961 // object right at the bottom (i.e., any padding at the top of the frame), 962 // readjust all RVV objects down by the alignment padding. 963 uint64_t StackSize = Offset; 964 if (auto AlignmentPadding = offsetToAlignment(StackSize, RVVStackAlign)) { 965 StackSize += AlignmentPadding; 966 for (int FI : ObjectsToAllocate) 967 MFI.setObjectOffset(FI, MFI.getObjectOffset(FI) - AlignmentPadding); 968 } 969 970 return std::make_pair(StackSize, RVVStackAlign); 971 } 972 973 static unsigned getScavSlotsNumForRVV(MachineFunction &MF) { 974 // For RVV spill, scalable stack offsets computing requires up to two scratch 975 // registers 976 static constexpr unsigned ScavSlotsNumRVVSpillScalableObject = 2; 977 978 // For RVV spill, non-scalable stack offsets computing requires up to one 979 // scratch register. 980 static constexpr unsigned ScavSlotsNumRVVSpillNonScalableObject = 1; 981 982 // ADDI instruction's destination register can be used for computing 983 // offsets. So Scalable stack offsets require up to one scratch register. 984 static constexpr unsigned ScavSlotsADDIScalableObject = 1; 985 986 static constexpr unsigned MaxScavSlotsNumKnown = 987 std::max({ScavSlotsADDIScalableObject, ScavSlotsNumRVVSpillScalableObject, 988 ScavSlotsNumRVVSpillNonScalableObject}); 989 990 unsigned MaxScavSlotsNum = 0; 991 if (!MF.getSubtarget<RISCVSubtarget>().hasVInstructions()) 992 return false; 993 for (const MachineBasicBlock &MBB : MF) 994 for (const MachineInstr &MI : MBB) { 995 bool IsRVVSpill = RISCV::isRVVSpill(MI); 996 for (auto &MO : MI.operands()) { 997 if (!MO.isFI()) 998 continue; 999 bool IsScalableVectorID = MF.getFrameInfo().getStackID(MO.getIndex()) == 1000 TargetStackID::ScalableVector; 1001 if (IsRVVSpill) { 1002 MaxScavSlotsNum = std::max( 1003 MaxScavSlotsNum, IsScalableVectorID 1004 ? ScavSlotsNumRVVSpillScalableObject 1005 : ScavSlotsNumRVVSpillNonScalableObject); 1006 } else if (MI.getOpcode() == RISCV::ADDI && IsScalableVectorID) { 1007 MaxScavSlotsNum = 1008 std::max(MaxScavSlotsNum, ScavSlotsADDIScalableObject); 1009 } 1010 } 1011 if (MaxScavSlotsNum == MaxScavSlotsNumKnown) 1012 return MaxScavSlotsNumKnown; 1013 } 1014 return MaxScavSlotsNum; 1015 } 1016 1017 static bool hasRVVFrameObject(const MachineFunction &MF) { 1018 // Originally, the function will scan all the stack objects to check whether 1019 // if there is any scalable vector object on the stack or not. However, it 1020 // causes errors in the register allocator. In issue 53016, it returns false 1021 // before RA because there is no RVV stack objects. After RA, it returns true 1022 // because there are spilling slots for RVV values during RA. It will not 1023 // reserve BP during register allocation and generate BP access in the PEI 1024 // pass due to the inconsistent behavior of the function. 1025 // 1026 // The function is changed to use hasVInstructions() as the return value. It 1027 // is not precise, but it can make the register allocation correct. 1028 // 1029 // FIXME: Find a better way to make the decision or revisit the solution in 1030 // D103622. 1031 // 1032 // Refer to https://github.com/llvm/llvm-project/issues/53016. 1033 return MF.getSubtarget<RISCVSubtarget>().hasVInstructions(); 1034 } 1035 1036 static unsigned estimateFunctionSizeInBytes(const MachineFunction &MF, 1037 const RISCVInstrInfo &TII) { 1038 unsigned FnSize = 0; 1039 for (auto &MBB : MF) { 1040 for (auto &MI : MBB) { 1041 // Far branches over 20-bit offset will be relaxed in branch relaxation 1042 // pass. In the worst case, conditional branches will be relaxed into 1043 // the following instruction sequence. Unconditional branches are 1044 // relaxed in the same way, with the exception that there is no first 1045 // branch instruction. 1046 // 1047 // foo 1048 // bne t5, t6, .rev_cond # `TII->getInstSizeInBytes(MI)` bytes 1049 // sd s11, 0(sp) # 4 bytes, or 2 bytes in RVC 1050 // jump .restore, s11 # 8 bytes 1051 // .rev_cond 1052 // bar 1053 // j .dest_bb # 4 bytes, or 2 bytes in RVC 1054 // .restore: 1055 // ld s11, 0(sp) # 4 bytes, or 2 bytes in RVC 1056 // .dest: 1057 // baz 1058 if (MI.isConditionalBranch()) 1059 FnSize += TII.getInstSizeInBytes(MI); 1060 if (MI.isConditionalBranch() || MI.isUnconditionalBranch()) { 1061 if (MF.getSubtarget<RISCVSubtarget>().hasStdExtC()) 1062 FnSize += 2 + 8 + 2 + 2; 1063 else 1064 FnSize += 4 + 8 + 4 + 4; 1065 continue; 1066 } 1067 1068 FnSize += TII.getInstSizeInBytes(MI); 1069 } 1070 } 1071 return FnSize; 1072 } 1073 1074 void RISCVFrameLowering::processFunctionBeforeFrameFinalized( 1075 MachineFunction &MF, RegScavenger *RS) const { 1076 const RISCVRegisterInfo *RegInfo = 1077 MF.getSubtarget<RISCVSubtarget>().getRegisterInfo(); 1078 const RISCVInstrInfo *TII = MF.getSubtarget<RISCVSubtarget>().getInstrInfo(); 1079 MachineFrameInfo &MFI = MF.getFrameInfo(); 1080 const TargetRegisterClass *RC = &RISCV::GPRRegClass; 1081 auto *RVFI = MF.getInfo<RISCVMachineFunctionInfo>(); 1082 1083 int64_t RVVStackSize; 1084 Align RVVStackAlign; 1085 std::tie(RVVStackSize, RVVStackAlign) = assignRVVStackObjectOffsets(MF); 1086 1087 RVFI->setRVVStackSize(RVVStackSize); 1088 RVFI->setRVVStackAlign(RVVStackAlign); 1089 1090 if (hasRVVFrameObject(MF)) { 1091 // Ensure the entire stack is aligned to at least the RVV requirement: some 1092 // scalable-vector object alignments are not considered by the 1093 // target-independent code. 1094 MFI.ensureMaxAlignment(RVVStackAlign); 1095 } 1096 1097 unsigned ScavSlotsNum = 0; 1098 1099 // estimateStackSize has been observed to under-estimate the final stack 1100 // size, so give ourselves wiggle-room by checking for stack size 1101 // representable an 11-bit signed field rather than 12-bits. 1102 if (!isInt<11>(MFI.estimateStackSize(MF))) 1103 ScavSlotsNum = 1; 1104 1105 // Far branches over 20-bit offset require a spill slot for scratch register. 1106 bool IsLargeFunction = !isInt<20>(estimateFunctionSizeInBytes(MF, *TII)); 1107 if (IsLargeFunction) 1108 ScavSlotsNum = std::max(ScavSlotsNum, 1u); 1109 1110 // RVV loads & stores have no capacity to hold the immediate address offsets 1111 // so we must always reserve an emergency spill slot if the MachineFunction 1112 // contains any RVV spills. 1113 ScavSlotsNum = std::max(ScavSlotsNum, getScavSlotsNumForRVV(MF)); 1114 1115 for (unsigned I = 0; I < ScavSlotsNum; I++) { 1116 int FI = MFI.CreateStackObject(RegInfo->getSpillSize(*RC), 1117 RegInfo->getSpillAlign(*RC), false); 1118 RS->addScavengingFrameIndex(FI); 1119 1120 if (IsLargeFunction && RVFI->getBranchRelaxationScratchFrameIndex() == -1) 1121 RVFI->setBranchRelaxationScratchFrameIndex(FI); 1122 } 1123 1124 if (MFI.getCalleeSavedInfo().empty() || RVFI->useSaveRestoreLibCalls(MF)) { 1125 RVFI->setCalleeSavedStackSize(0); 1126 return; 1127 } 1128 1129 unsigned Size = 0; 1130 for (const auto &Info : MFI.getCalleeSavedInfo()) { 1131 int FrameIdx = Info.getFrameIdx(); 1132 if (MFI.getStackID(FrameIdx) != TargetStackID::Default) 1133 continue; 1134 1135 Size += MFI.getObjectSize(FrameIdx); 1136 } 1137 RVFI->setCalleeSavedStackSize(Size); 1138 } 1139 1140 // Not preserve stack space within prologue for outgoing variables when the 1141 // function contains variable size objects or there are vector objects accessed 1142 // by the frame pointer. 1143 // Let eliminateCallFramePseudoInstr preserve stack space for it. 1144 bool RISCVFrameLowering::hasReservedCallFrame(const MachineFunction &MF) const { 1145 return !MF.getFrameInfo().hasVarSizedObjects() && 1146 !(hasFP(MF) && hasRVVFrameObject(MF)); 1147 } 1148 1149 // Eliminate ADJCALLSTACKDOWN, ADJCALLSTACKUP pseudo instructions. 1150 MachineBasicBlock::iterator RISCVFrameLowering::eliminateCallFramePseudoInstr( 1151 MachineFunction &MF, MachineBasicBlock &MBB, 1152 MachineBasicBlock::iterator MI) const { 1153 Register SPReg = RISCV::X2; 1154 DebugLoc DL = MI->getDebugLoc(); 1155 1156 if (!hasReservedCallFrame(MF)) { 1157 // If space has not been reserved for a call frame, ADJCALLSTACKDOWN and 1158 // ADJCALLSTACKUP must be converted to instructions manipulating the stack 1159 // pointer. This is necessary when there is a variable length stack 1160 // allocation (e.g. alloca), which means it's not possible to allocate 1161 // space for outgoing arguments from within the function prologue. 1162 int64_t Amount = MI->getOperand(0).getImm(); 1163 1164 if (Amount != 0) { 1165 // Ensure the stack remains aligned after adjustment. 1166 Amount = alignSPAdjust(Amount); 1167 1168 if (MI->getOpcode() == RISCV::ADJCALLSTACKDOWN) 1169 Amount = -Amount; 1170 1171 const RISCVRegisterInfo &RI = *STI.getRegisterInfo(); 1172 RI.adjustReg(MBB, MI, DL, SPReg, SPReg, StackOffset::getFixed(Amount), 1173 MachineInstr::NoFlags, getStackAlign()); 1174 } 1175 } 1176 1177 return MBB.erase(MI); 1178 } 1179 1180 // We would like to split the SP adjustment to reduce prologue/epilogue 1181 // as following instructions. In this way, the offset of the callee saved 1182 // register could fit in a single store. 1183 // add sp,sp,-2032 1184 // sw ra,2028(sp) 1185 // sw s0,2024(sp) 1186 // sw s1,2020(sp) 1187 // sw s3,2012(sp) 1188 // sw s4,2008(sp) 1189 // add sp,sp,-64 1190 uint64_t 1191 RISCVFrameLowering::getFirstSPAdjustAmount(const MachineFunction &MF) const { 1192 const auto *RVFI = MF.getInfo<RISCVMachineFunctionInfo>(); 1193 const MachineFrameInfo &MFI = MF.getFrameInfo(); 1194 const std::vector<CalleeSavedInfo> &CSI = MFI.getCalleeSavedInfo(); 1195 uint64_t StackSize = getStackSizeWithRVVPadding(MF); 1196 1197 // Disable SplitSPAdjust if save-restore libcall is used. The callee-saved 1198 // registers will be pushed by the save-restore libcalls, so we don't have to 1199 // split the SP adjustment in this case. 1200 if (RVFI->getLibCallStackSize()) 1201 return 0; 1202 1203 // Return the FirstSPAdjustAmount if the StackSize can not fit in a signed 1204 // 12-bit and there exists a callee-saved register needing to be pushed. 1205 if (!isInt<12>(StackSize) && (CSI.size() > 0)) { 1206 // FirstSPAdjustAmount is chosen as (2048 - StackAlign) because 2048 will 1207 // cause sp = sp + 2048 in the epilogue to be split into multiple 1208 // instructions. Offsets smaller than 2048 can fit in a single load/store 1209 // instruction, and we have to stick with the stack alignment. 2048 has 1210 // 16-byte alignment. The stack alignment for RV32 and RV64 is 16 and for 1211 // RV32E it is 4. So (2048 - StackAlign) will satisfy the stack alignment. 1212 return 2048 - getStackAlign().value(); 1213 } 1214 return 0; 1215 } 1216 1217 bool RISCVFrameLowering::spillCalleeSavedRegisters( 1218 MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, 1219 ArrayRef<CalleeSavedInfo> CSI, const TargetRegisterInfo *TRI) const { 1220 if (CSI.empty()) 1221 return true; 1222 1223 MachineFunction *MF = MBB.getParent(); 1224 const TargetInstrInfo &TII = *MF->getSubtarget().getInstrInfo(); 1225 DebugLoc DL; 1226 if (MI != MBB.end() && !MI->isDebugInstr()) 1227 DL = MI->getDebugLoc(); 1228 1229 const char *SpillLibCall = getSpillLibCallName(*MF, CSI); 1230 if (SpillLibCall) { 1231 // Add spill libcall via non-callee-saved register t0. 1232 BuildMI(MBB, MI, DL, TII.get(RISCV::PseudoCALLReg), RISCV::X5) 1233 .addExternalSymbol(SpillLibCall, RISCVII::MO_CALL) 1234 .setMIFlag(MachineInstr::FrameSetup); 1235 1236 // Add registers spilled in libcall as liveins. 1237 for (auto &CS : CSI) 1238 MBB.addLiveIn(CS.getReg()); 1239 } 1240 1241 // Manually spill values not spilled by libcall. 1242 const auto &NonLibcallCSI = getNonLibcallCSI(*MF, CSI); 1243 for (auto &CS : NonLibcallCSI) { 1244 // Insert the spill to the stack frame. 1245 Register Reg = CS.getReg(); 1246 const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(Reg); 1247 TII.storeRegToStackSlot(MBB, MI, Reg, !MBB.isLiveIn(Reg), CS.getFrameIdx(), 1248 RC, TRI, Register()); 1249 } 1250 1251 return true; 1252 } 1253 1254 bool RISCVFrameLowering::restoreCalleeSavedRegisters( 1255 MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, 1256 MutableArrayRef<CalleeSavedInfo> CSI, const TargetRegisterInfo *TRI) const { 1257 if (CSI.empty()) 1258 return true; 1259 1260 MachineFunction *MF = MBB.getParent(); 1261 const TargetInstrInfo &TII = *MF->getSubtarget().getInstrInfo(); 1262 DebugLoc DL; 1263 if (MI != MBB.end() && !MI->isDebugInstr()) 1264 DL = MI->getDebugLoc(); 1265 1266 // Manually restore values not restored by libcall. 1267 // Keep the same order as in the prologue. There is no need to reverse the 1268 // order in the epilogue. In addition, the return address will be restored 1269 // first in the epilogue. It increases the opportunity to avoid the 1270 // load-to-use data hazard between loading RA and return by RA. 1271 // loadRegFromStackSlot can insert multiple instructions. 1272 const auto &NonLibcallCSI = getNonLibcallCSI(*MF, CSI); 1273 for (auto &CS : NonLibcallCSI) { 1274 Register Reg = CS.getReg(); 1275 const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(Reg); 1276 TII.loadRegFromStackSlot(MBB, MI, Reg, CS.getFrameIdx(), RC, TRI, 1277 Register()); 1278 assert(MI != MBB.begin() && "loadRegFromStackSlot didn't insert any code!"); 1279 } 1280 1281 const char *RestoreLibCall = getRestoreLibCallName(*MF, CSI); 1282 if (RestoreLibCall) { 1283 // Add restore libcall via tail call. 1284 MachineBasicBlock::iterator NewMI = 1285 BuildMI(MBB, MI, DL, TII.get(RISCV::PseudoTAIL)) 1286 .addExternalSymbol(RestoreLibCall, RISCVII::MO_CALL) 1287 .setMIFlag(MachineInstr::FrameDestroy); 1288 1289 // Remove trailing returns, since the terminator is now a tail call to the 1290 // restore function. 1291 if (MI != MBB.end() && MI->getOpcode() == RISCV::PseudoRET) { 1292 NewMI->copyImplicitOps(*MF, *MI); 1293 MI->eraseFromParent(); 1294 } 1295 } 1296 1297 return true; 1298 } 1299 1300 bool RISCVFrameLowering::enableShrinkWrapping(const MachineFunction &MF) const { 1301 // Keep the conventional code flow when not optimizing. 1302 if (MF.getFunction().hasOptNone()) 1303 return false; 1304 1305 return true; 1306 } 1307 1308 bool RISCVFrameLowering::canUseAsPrologue(const MachineBasicBlock &MBB) const { 1309 MachineBasicBlock *TmpMBB = const_cast<MachineBasicBlock *>(&MBB); 1310 const MachineFunction *MF = MBB.getParent(); 1311 const auto *RVFI = MF->getInfo<RISCVMachineFunctionInfo>(); 1312 1313 if (!RVFI->useSaveRestoreLibCalls(*MF)) 1314 return true; 1315 1316 // Inserting a call to a __riscv_save libcall requires the use of the register 1317 // t0 (X5) to hold the return address. Therefore if this register is already 1318 // used we can't insert the call. 1319 1320 RegScavenger RS; 1321 RS.enterBasicBlock(*TmpMBB); 1322 return !RS.isRegUsed(RISCV::X5); 1323 } 1324 1325 bool RISCVFrameLowering::canUseAsEpilogue(const MachineBasicBlock &MBB) const { 1326 const MachineFunction *MF = MBB.getParent(); 1327 MachineBasicBlock *TmpMBB = const_cast<MachineBasicBlock *>(&MBB); 1328 const auto *RVFI = MF->getInfo<RISCVMachineFunctionInfo>(); 1329 1330 if (!RVFI->useSaveRestoreLibCalls(*MF)) 1331 return true; 1332 1333 // Using the __riscv_restore libcalls to restore CSRs requires a tail call. 1334 // This means if we still need to continue executing code within this function 1335 // the restore cannot take place in this basic block. 1336 1337 if (MBB.succ_size() > 1) 1338 return false; 1339 1340 MachineBasicBlock *SuccMBB = 1341 MBB.succ_empty() ? TmpMBB->getFallThrough() : *MBB.succ_begin(); 1342 1343 // Doing a tail call should be safe if there are no successors, because either 1344 // we have a returning block or the end of the block is unreachable, so the 1345 // restore will be eliminated regardless. 1346 if (!SuccMBB) 1347 return true; 1348 1349 // The successor can only contain a return, since we would effectively be 1350 // replacing the successor with our own tail return at the end of our block. 1351 return SuccMBB->isReturnBlock() && SuccMBB->size() == 1; 1352 } 1353 1354 bool RISCVFrameLowering::isSupportedStackID(TargetStackID::Value ID) const { 1355 switch (ID) { 1356 case TargetStackID::Default: 1357 case TargetStackID::ScalableVector: 1358 return true; 1359 case TargetStackID::NoAlloc: 1360 case TargetStackID::SGPRSpill: 1361 case TargetStackID::WasmLocal: 1362 return false; 1363 } 1364 llvm_unreachable("Invalid TargetStackID::Value"); 1365 } 1366 1367 TargetStackID::Value RISCVFrameLowering::getStackIDForScalableVectors() const { 1368 return TargetStackID::ScalableVector; 1369 } 1370