1 //===-- X86RegisterInfo.cpp - X86 Register 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 X86 implementation of the TargetRegisterInfo class. 10 // This file is responsible for the frame pointer elimination optimization 11 // on X86. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "X86RegisterInfo.h" 16 #include "X86FrameLowering.h" 17 #include "X86MachineFunctionInfo.h" 18 #include "X86Subtarget.h" 19 #include "llvm/ADT/BitVector.h" 20 #include "llvm/ADT/STLExtras.h" 21 #include "llvm/ADT/SmallSet.h" 22 #include "llvm/CodeGen/LiveRegMatrix.h" 23 #include "llvm/CodeGen/MachineFrameInfo.h" 24 #include "llvm/CodeGen/MachineFunction.h" 25 #include "llvm/CodeGen/MachineFunctionPass.h" 26 #include "llvm/CodeGen/MachineRegisterInfo.h" 27 #include "llvm/CodeGen/TargetFrameLowering.h" 28 #include "llvm/CodeGen/TargetInstrInfo.h" 29 #include "llvm/IR/Constants.h" 30 #include "llvm/IR/Function.h" 31 #include "llvm/IR/Type.h" 32 #include "llvm/Support/CommandLine.h" 33 #include "llvm/Support/ErrorHandling.h" 34 #include "llvm/Target/TargetMachine.h" 35 #include "llvm/Target/TargetOptions.h" 36 37 using namespace llvm; 38 39 #define GET_REGINFO_TARGET_DESC 40 #include "X86GenRegisterInfo.inc" 41 42 static cl::opt<bool> 43 EnableBasePointer("x86-use-base-pointer", cl::Hidden, cl::init(true), 44 cl::desc("Enable use of a base pointer for complex stack frames")); 45 46 X86RegisterInfo::X86RegisterInfo(const Triple &TT) 47 : X86GenRegisterInfo((TT.isArch64Bit() ? X86::RIP : X86::EIP), 48 X86_MC::getDwarfRegFlavour(TT, false), 49 X86_MC::getDwarfRegFlavour(TT, true), 50 (TT.isArch64Bit() ? X86::RIP : X86::EIP)) { 51 X86_MC::initLLVMToSEHAndCVRegMapping(this); 52 53 // Cache some information. 54 Is64Bit = TT.isArch64Bit(); 55 IsWin64 = Is64Bit && TT.isOSWindows(); 56 57 // Use a callee-saved register as the base pointer. These registers must 58 // not conflict with any ABI requirements. For example, in 32-bit mode PIC 59 // requires GOT in the EBX register before function calls via PLT GOT pointer. 60 if (Is64Bit) { 61 SlotSize = 8; 62 // This matches the simplified 32-bit pointer code in the data layout 63 // computation. 64 // FIXME: Should use the data layout? 65 bool Use64BitReg = !TT.isX32(); 66 StackPtr = Use64BitReg ? X86::RSP : X86::ESP; 67 FramePtr = Use64BitReg ? X86::RBP : X86::EBP; 68 BasePtr = Use64BitReg ? X86::RBX : X86::EBX; 69 } else { 70 SlotSize = 4; 71 StackPtr = X86::ESP; 72 FramePtr = X86::EBP; 73 BasePtr = X86::ESI; 74 } 75 } 76 77 int 78 X86RegisterInfo::getSEHRegNum(unsigned i) const { 79 return getEncodingValue(i); 80 } 81 82 const TargetRegisterClass * 83 X86RegisterInfo::getSubClassWithSubReg(const TargetRegisterClass *RC, 84 unsigned Idx) const { 85 // The sub_8bit sub-register index is more constrained in 32-bit mode. 86 // It behaves just like the sub_8bit_hi index. 87 if (!Is64Bit && Idx == X86::sub_8bit) 88 Idx = X86::sub_8bit_hi; 89 90 // Forward to TableGen's default version. 91 return X86GenRegisterInfo::getSubClassWithSubReg(RC, Idx); 92 } 93 94 const TargetRegisterClass * 95 X86RegisterInfo::getMatchingSuperRegClass(const TargetRegisterClass *A, 96 const TargetRegisterClass *B, 97 unsigned SubIdx) const { 98 // The sub_8bit sub-register index is more constrained in 32-bit mode. 99 if (!Is64Bit && SubIdx == X86::sub_8bit) { 100 A = X86GenRegisterInfo::getSubClassWithSubReg(A, X86::sub_8bit_hi); 101 if (!A) 102 return nullptr; 103 } 104 return X86GenRegisterInfo::getMatchingSuperRegClass(A, B, SubIdx); 105 } 106 107 const TargetRegisterClass * 108 X86RegisterInfo::getLargestLegalSuperClass(const TargetRegisterClass *RC, 109 const MachineFunction &MF) const { 110 // Don't allow super-classes of GR8_NOREX. This class is only used after 111 // extracting sub_8bit_hi sub-registers. The H sub-registers cannot be copied 112 // to the full GR8 register class in 64-bit mode, so we cannot allow the 113 // reigster class inflation. 114 // 115 // The GR8_NOREX class is always used in a way that won't be constrained to a 116 // sub-class, so sub-classes like GR8_ABCD_L are allowed to expand to the 117 // full GR8 class. 118 if (RC == &X86::GR8_NOREXRegClass) 119 return RC; 120 121 const X86Subtarget &Subtarget = MF.getSubtarget<X86Subtarget>(); 122 123 const TargetRegisterClass *Super = RC; 124 TargetRegisterClass::sc_iterator I = RC->getSuperClasses(); 125 do { 126 switch (Super->getID()) { 127 case X86::FR32RegClassID: 128 case X86::FR64RegClassID: 129 // If AVX-512 isn't supported we should only inflate to these classes. 130 if (!Subtarget.hasAVX512() && 131 getRegSizeInBits(*Super) == getRegSizeInBits(*RC)) 132 return Super; 133 break; 134 case X86::VR128RegClassID: 135 case X86::VR256RegClassID: 136 // If VLX isn't supported we should only inflate to these classes. 137 if (!Subtarget.hasVLX() && 138 getRegSizeInBits(*Super) == getRegSizeInBits(*RC)) 139 return Super; 140 break; 141 case X86::VR128XRegClassID: 142 case X86::VR256XRegClassID: 143 // If VLX isn't support we shouldn't inflate to these classes. 144 if (Subtarget.hasVLX() && 145 getRegSizeInBits(*Super) == getRegSizeInBits(*RC)) 146 return Super; 147 break; 148 case X86::FR32XRegClassID: 149 case X86::FR64XRegClassID: 150 // If AVX-512 isn't support we shouldn't inflate to these classes. 151 if (Subtarget.hasAVX512() && 152 getRegSizeInBits(*Super) == getRegSizeInBits(*RC)) 153 return Super; 154 break; 155 case X86::GR8RegClassID: 156 case X86::GR16RegClassID: 157 case X86::GR32RegClassID: 158 case X86::GR64RegClassID: 159 case X86::RFP32RegClassID: 160 case X86::RFP64RegClassID: 161 case X86::RFP80RegClassID: 162 case X86::VR512_0_15RegClassID: 163 case X86::VR512RegClassID: 164 // Don't return a super-class that would shrink the spill size. 165 // That can happen with the vector and float classes. 166 if (getRegSizeInBits(*Super) == getRegSizeInBits(*RC)) 167 return Super; 168 } 169 Super = *I++; 170 } while (Super); 171 return RC; 172 } 173 174 const TargetRegisterClass * 175 X86RegisterInfo::getPointerRegClass(const MachineFunction &MF, 176 unsigned Kind) const { 177 const X86Subtarget &Subtarget = MF.getSubtarget<X86Subtarget>(); 178 switch (Kind) { 179 default: llvm_unreachable("Unexpected Kind in getPointerRegClass!"); 180 case 0: // Normal GPRs. 181 if (Subtarget.isTarget64BitLP64()) 182 return &X86::GR64RegClass; 183 // If the target is 64bit but we have been told to use 32bit addresses, 184 // we can still use 64-bit register as long as we know the high bits 185 // are zeros. 186 // Reflect that in the returned register class. 187 if (Is64Bit) { 188 // When the target also allows 64-bit frame pointer and we do have a 189 // frame, this is fine to use it for the address accesses as well. 190 const X86FrameLowering *TFI = getFrameLowering(MF); 191 return TFI->hasFP(MF) && TFI->Uses64BitFramePtr 192 ? &X86::LOW32_ADDR_ACCESS_RBPRegClass 193 : &X86::LOW32_ADDR_ACCESSRegClass; 194 } 195 return &X86::GR32RegClass; 196 case 1: // Normal GPRs except the stack pointer (for encoding reasons). 197 if (Subtarget.isTarget64BitLP64()) 198 return &X86::GR64_NOSPRegClass; 199 // NOSP does not contain RIP, so no special case here. 200 return &X86::GR32_NOSPRegClass; 201 case 2: // NOREX GPRs. 202 if (Subtarget.isTarget64BitLP64()) 203 return &X86::GR64_NOREXRegClass; 204 return &X86::GR32_NOREXRegClass; 205 case 3: // NOREX GPRs except the stack pointer (for encoding reasons). 206 if (Subtarget.isTarget64BitLP64()) 207 return &X86::GR64_NOREX_NOSPRegClass; 208 // NOSP does not contain RIP, so no special case here. 209 return &X86::GR32_NOREX_NOSPRegClass; 210 case 4: // Available for tailcall (not callee-saved GPRs). 211 return getGPRsForTailCall(MF); 212 } 213 } 214 215 bool X86RegisterInfo::shouldRewriteCopySrc(const TargetRegisterClass *DefRC, 216 unsigned DefSubReg, 217 const TargetRegisterClass *SrcRC, 218 unsigned SrcSubReg) const { 219 // Prevent rewriting a copy where the destination size is larger than the 220 // input size. See PR41619. 221 // FIXME: Should this be factored into the base implementation somehow. 222 if (DefRC->hasSuperClassEq(&X86::GR64RegClass) && DefSubReg == 0 && 223 SrcRC->hasSuperClassEq(&X86::GR64RegClass) && SrcSubReg == X86::sub_32bit) 224 return false; 225 226 return TargetRegisterInfo::shouldRewriteCopySrc(DefRC, DefSubReg, 227 SrcRC, SrcSubReg); 228 } 229 230 const TargetRegisterClass * 231 X86RegisterInfo::getGPRsForTailCall(const MachineFunction &MF) const { 232 const Function &F = MF.getFunction(); 233 if (IsWin64 || (F.getCallingConv() == CallingConv::Win64)) 234 return &X86::GR64_TCW64RegClass; 235 else if (Is64Bit) 236 return &X86::GR64_TCRegClass; 237 238 bool hasHipeCC = (F.getCallingConv() == CallingConv::HiPE); 239 if (hasHipeCC) 240 return &X86::GR32RegClass; 241 return &X86::GR32_TCRegClass; 242 } 243 244 const TargetRegisterClass * 245 X86RegisterInfo::getCrossCopyRegClass(const TargetRegisterClass *RC) const { 246 if (RC == &X86::CCRRegClass) { 247 if (Is64Bit) 248 return &X86::GR64RegClass; 249 else 250 return &X86::GR32RegClass; 251 } 252 return RC; 253 } 254 255 unsigned 256 X86RegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC, 257 MachineFunction &MF) const { 258 const X86FrameLowering *TFI = getFrameLowering(MF); 259 260 unsigned FPDiff = TFI->hasFP(MF) ? 1 : 0; 261 switch (RC->getID()) { 262 default: 263 return 0; 264 case X86::GR32RegClassID: 265 return 4 - FPDiff; 266 case X86::GR64RegClassID: 267 return 12 - FPDiff; 268 case X86::VR128RegClassID: 269 return Is64Bit ? 10 : 4; 270 case X86::VR64RegClassID: 271 return 4; 272 } 273 } 274 275 const MCPhysReg * 276 X86RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const { 277 assert(MF && "MachineFunction required"); 278 279 const X86Subtarget &Subtarget = MF->getSubtarget<X86Subtarget>(); 280 const Function &F = MF->getFunction(); 281 bool HasSSE = Subtarget.hasSSE1(); 282 bool HasAVX = Subtarget.hasAVX(); 283 bool HasAVX512 = Subtarget.hasAVX512(); 284 bool CallsEHReturn = MF->callsEHReturn(); 285 286 CallingConv::ID CC = F.getCallingConv(); 287 288 // If attribute NoCallerSavedRegisters exists then we set X86_INTR calling 289 // convention because it has the CSR list. 290 if (MF->getFunction().hasFnAttribute("no_caller_saved_registers")) 291 CC = CallingConv::X86_INTR; 292 293 // If atribute specified, override the CSRs normally specified by the 294 // calling convention and use the empty set instead. 295 if (MF->getFunction().hasFnAttribute("no_callee_saved_registers")) 296 return CSR_NoRegs_SaveList; 297 298 switch (CC) { 299 case CallingConv::GHC: 300 case CallingConv::HiPE: 301 return CSR_NoRegs_SaveList; 302 case CallingConv::AnyReg: 303 if (HasAVX) 304 return CSR_64_AllRegs_AVX_SaveList; 305 return CSR_64_AllRegs_SaveList; 306 case CallingConv::PreserveMost: 307 return CSR_64_RT_MostRegs_SaveList; 308 case CallingConv::PreserveAll: 309 if (HasAVX) 310 return CSR_64_RT_AllRegs_AVX_SaveList; 311 return CSR_64_RT_AllRegs_SaveList; 312 case CallingConv::CXX_FAST_TLS: 313 if (Is64Bit) 314 return MF->getInfo<X86MachineFunctionInfo>()->isSplitCSR() ? 315 CSR_64_CXX_TLS_Darwin_PE_SaveList : CSR_64_TLS_Darwin_SaveList; 316 break; 317 case CallingConv::Intel_OCL_BI: { 318 if (HasAVX512 && IsWin64) 319 return CSR_Win64_Intel_OCL_BI_AVX512_SaveList; 320 if (HasAVX512 && Is64Bit) 321 return CSR_64_Intel_OCL_BI_AVX512_SaveList; 322 if (HasAVX && IsWin64) 323 return CSR_Win64_Intel_OCL_BI_AVX_SaveList; 324 if (HasAVX && Is64Bit) 325 return CSR_64_Intel_OCL_BI_AVX_SaveList; 326 if (!HasAVX && !IsWin64 && Is64Bit) 327 return CSR_64_Intel_OCL_BI_SaveList; 328 break; 329 } 330 case CallingConv::HHVM: 331 return CSR_64_HHVM_SaveList; 332 case CallingConv::X86_RegCall: 333 if (Is64Bit) { 334 if (IsWin64) { 335 return (HasSSE ? CSR_Win64_RegCall_SaveList : 336 CSR_Win64_RegCall_NoSSE_SaveList); 337 } else { 338 return (HasSSE ? CSR_SysV64_RegCall_SaveList : 339 CSR_SysV64_RegCall_NoSSE_SaveList); 340 } 341 } else { 342 return (HasSSE ? CSR_32_RegCall_SaveList : 343 CSR_32_RegCall_NoSSE_SaveList); 344 } 345 case CallingConv::CFGuard_Check: 346 assert(!Is64Bit && "CFGuard check mechanism only used on 32-bit X86"); 347 return (HasSSE ? CSR_Win32_CFGuard_Check_SaveList 348 : CSR_Win32_CFGuard_Check_NoSSE_SaveList); 349 case CallingConv::Cold: 350 if (Is64Bit) 351 return CSR_64_MostRegs_SaveList; 352 break; 353 case CallingConv::Win64: 354 if (!HasSSE) 355 return CSR_Win64_NoSSE_SaveList; 356 return CSR_Win64_SaveList; 357 case CallingConv::SwiftTail: 358 if (!Is64Bit) 359 return CSR_32_SaveList; 360 return IsWin64 ? CSR_Win64_SwiftTail_SaveList : CSR_64_SwiftTail_SaveList; 361 case CallingConv::X86_64_SysV: 362 if (CallsEHReturn) 363 return CSR_64EHRet_SaveList; 364 return CSR_64_SaveList; 365 case CallingConv::X86_INTR: 366 if (Is64Bit) { 367 if (HasAVX512) 368 return CSR_64_AllRegs_AVX512_SaveList; 369 if (HasAVX) 370 return CSR_64_AllRegs_AVX_SaveList; 371 if (HasSSE) 372 return CSR_64_AllRegs_SaveList; 373 return CSR_64_AllRegs_NoSSE_SaveList; 374 } else { 375 if (HasAVX512) 376 return CSR_32_AllRegs_AVX512_SaveList; 377 if (HasAVX) 378 return CSR_32_AllRegs_AVX_SaveList; 379 if (HasSSE) 380 return CSR_32_AllRegs_SSE_SaveList; 381 return CSR_32_AllRegs_SaveList; 382 } 383 default: 384 break; 385 } 386 387 if (Is64Bit) { 388 bool IsSwiftCC = Subtarget.getTargetLowering()->supportSwiftError() && 389 F.getAttributes().hasAttrSomewhere(Attribute::SwiftError); 390 if (IsSwiftCC) 391 return IsWin64 ? CSR_Win64_SwiftError_SaveList 392 : CSR_64_SwiftError_SaveList; 393 394 if (IsWin64) 395 return HasSSE ? CSR_Win64_SaveList : CSR_Win64_NoSSE_SaveList; 396 if (CallsEHReturn) 397 return CSR_64EHRet_SaveList; 398 return CSR_64_SaveList; 399 } 400 401 return CallsEHReturn ? CSR_32EHRet_SaveList : CSR_32_SaveList; 402 } 403 404 const MCPhysReg *X86RegisterInfo::getCalleeSavedRegsViaCopy( 405 const MachineFunction *MF) const { 406 assert(MF && "Invalid MachineFunction pointer."); 407 if (MF->getFunction().getCallingConv() == CallingConv::CXX_FAST_TLS && 408 MF->getInfo<X86MachineFunctionInfo>()->isSplitCSR()) 409 return CSR_64_CXX_TLS_Darwin_ViaCopy_SaveList; 410 return nullptr; 411 } 412 413 const uint32_t * 414 X86RegisterInfo::getCallPreservedMask(const MachineFunction &MF, 415 CallingConv::ID CC) const { 416 const X86Subtarget &Subtarget = MF.getSubtarget<X86Subtarget>(); 417 bool HasSSE = Subtarget.hasSSE1(); 418 bool HasAVX = Subtarget.hasAVX(); 419 bool HasAVX512 = Subtarget.hasAVX512(); 420 421 switch (CC) { 422 case CallingConv::GHC: 423 case CallingConv::HiPE: 424 return CSR_NoRegs_RegMask; 425 case CallingConv::AnyReg: 426 if (HasAVX) 427 return CSR_64_AllRegs_AVX_RegMask; 428 return CSR_64_AllRegs_RegMask; 429 case CallingConv::PreserveMost: 430 return CSR_64_RT_MostRegs_RegMask; 431 case CallingConv::PreserveAll: 432 if (HasAVX) 433 return CSR_64_RT_AllRegs_AVX_RegMask; 434 return CSR_64_RT_AllRegs_RegMask; 435 case CallingConv::CXX_FAST_TLS: 436 if (Is64Bit) 437 return CSR_64_TLS_Darwin_RegMask; 438 break; 439 case CallingConv::Intel_OCL_BI: { 440 if (HasAVX512 && IsWin64) 441 return CSR_Win64_Intel_OCL_BI_AVX512_RegMask; 442 if (HasAVX512 && Is64Bit) 443 return CSR_64_Intel_OCL_BI_AVX512_RegMask; 444 if (HasAVX && IsWin64) 445 return CSR_Win64_Intel_OCL_BI_AVX_RegMask; 446 if (HasAVX && Is64Bit) 447 return CSR_64_Intel_OCL_BI_AVX_RegMask; 448 if (!HasAVX && !IsWin64 && Is64Bit) 449 return CSR_64_Intel_OCL_BI_RegMask; 450 break; 451 } 452 case CallingConv::HHVM: 453 return CSR_64_HHVM_RegMask; 454 case CallingConv::X86_RegCall: 455 if (Is64Bit) { 456 if (IsWin64) { 457 return (HasSSE ? CSR_Win64_RegCall_RegMask : 458 CSR_Win64_RegCall_NoSSE_RegMask); 459 } else { 460 return (HasSSE ? CSR_SysV64_RegCall_RegMask : 461 CSR_SysV64_RegCall_NoSSE_RegMask); 462 } 463 } else { 464 return (HasSSE ? CSR_32_RegCall_RegMask : 465 CSR_32_RegCall_NoSSE_RegMask); 466 } 467 case CallingConv::CFGuard_Check: 468 assert(!Is64Bit && "CFGuard check mechanism only used on 32-bit X86"); 469 return (HasSSE ? CSR_Win32_CFGuard_Check_RegMask 470 : CSR_Win32_CFGuard_Check_NoSSE_RegMask); 471 case CallingConv::Cold: 472 if (Is64Bit) 473 return CSR_64_MostRegs_RegMask; 474 break; 475 case CallingConv::Win64: 476 return CSR_Win64_RegMask; 477 case CallingConv::SwiftTail: 478 if (!Is64Bit) 479 return CSR_32_RegMask; 480 return IsWin64 ? CSR_Win64_SwiftTail_RegMask : CSR_64_SwiftTail_RegMask; 481 case CallingConv::X86_64_SysV: 482 return CSR_64_RegMask; 483 case CallingConv::X86_INTR: 484 if (Is64Bit) { 485 if (HasAVX512) 486 return CSR_64_AllRegs_AVX512_RegMask; 487 if (HasAVX) 488 return CSR_64_AllRegs_AVX_RegMask; 489 if (HasSSE) 490 return CSR_64_AllRegs_RegMask; 491 return CSR_64_AllRegs_NoSSE_RegMask; 492 } else { 493 if (HasAVX512) 494 return CSR_32_AllRegs_AVX512_RegMask; 495 if (HasAVX) 496 return CSR_32_AllRegs_AVX_RegMask; 497 if (HasSSE) 498 return CSR_32_AllRegs_SSE_RegMask; 499 return CSR_32_AllRegs_RegMask; 500 } 501 default: 502 break; 503 } 504 505 // Unlike getCalleeSavedRegs(), we don't have MMI so we can't check 506 // callsEHReturn(). 507 if (Is64Bit) { 508 const Function &F = MF.getFunction(); 509 bool IsSwiftCC = Subtarget.getTargetLowering()->supportSwiftError() && 510 F.getAttributes().hasAttrSomewhere(Attribute::SwiftError); 511 if (IsSwiftCC) 512 return IsWin64 ? CSR_Win64_SwiftError_RegMask : CSR_64_SwiftError_RegMask; 513 514 return IsWin64 ? CSR_Win64_RegMask : CSR_64_RegMask; 515 } 516 517 return CSR_32_RegMask; 518 } 519 520 const uint32_t* 521 X86RegisterInfo::getNoPreservedMask() const { 522 return CSR_NoRegs_RegMask; 523 } 524 525 const uint32_t *X86RegisterInfo::getDarwinTLSCallPreservedMask() const { 526 return CSR_64_TLS_Darwin_RegMask; 527 } 528 529 BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const { 530 BitVector Reserved(getNumRegs()); 531 const X86FrameLowering *TFI = getFrameLowering(MF); 532 533 // Set the floating point control register as reserved. 534 Reserved.set(X86::FPCW); 535 536 // Set the floating point status register as reserved. 537 Reserved.set(X86::FPSW); 538 539 // Set the SIMD floating point control register as reserved. 540 Reserved.set(X86::MXCSR); 541 542 // Set the stack-pointer register and its aliases as reserved. 543 for (const MCPhysReg &SubReg : subregs_inclusive(X86::RSP)) 544 Reserved.set(SubReg); 545 546 // Set the Shadow Stack Pointer as reserved. 547 Reserved.set(X86::SSP); 548 549 // Set the instruction pointer register and its aliases as reserved. 550 for (const MCPhysReg &SubReg : subregs_inclusive(X86::RIP)) 551 Reserved.set(SubReg); 552 553 // Set the frame-pointer register and its aliases as reserved if needed. 554 if (TFI->hasFP(MF)) { 555 for (const MCPhysReg &SubReg : subregs_inclusive(X86::RBP)) 556 Reserved.set(SubReg); 557 } 558 559 // Set the base-pointer register and its aliases as reserved if needed. 560 if (hasBasePointer(MF)) { 561 CallingConv::ID CC = MF.getFunction().getCallingConv(); 562 const uint32_t *RegMask = getCallPreservedMask(MF, CC); 563 if (MachineOperand::clobbersPhysReg(RegMask, getBaseRegister())) 564 report_fatal_error( 565 "Stack realignment in presence of dynamic allocas is not supported with" 566 "this calling convention."); 567 568 Register BasePtr = getX86SubSuperRegister(getBaseRegister(), 64); 569 for (const MCPhysReg &SubReg : subregs_inclusive(BasePtr)) 570 Reserved.set(SubReg); 571 } 572 573 // Mark the segment registers as reserved. 574 Reserved.set(X86::CS); 575 Reserved.set(X86::SS); 576 Reserved.set(X86::DS); 577 Reserved.set(X86::ES); 578 Reserved.set(X86::FS); 579 Reserved.set(X86::GS); 580 581 // Mark the floating point stack registers as reserved. 582 for (unsigned n = 0; n != 8; ++n) 583 Reserved.set(X86::ST0 + n); 584 585 // Reserve the registers that only exist in 64-bit mode. 586 if (!Is64Bit) { 587 // These 8-bit registers are part of the x86-64 extension even though their 588 // super-registers are old 32-bits. 589 Reserved.set(X86::SIL); 590 Reserved.set(X86::DIL); 591 Reserved.set(X86::BPL); 592 Reserved.set(X86::SPL); 593 Reserved.set(X86::SIH); 594 Reserved.set(X86::DIH); 595 Reserved.set(X86::BPH); 596 Reserved.set(X86::SPH); 597 598 for (unsigned n = 0; n != 8; ++n) { 599 // R8, R9, ... 600 for (MCRegAliasIterator AI(X86::R8 + n, this, true); AI.isValid(); ++AI) 601 Reserved.set(*AI); 602 603 // XMM8, XMM9, ... 604 for (MCRegAliasIterator AI(X86::XMM8 + n, this, true); AI.isValid(); ++AI) 605 Reserved.set(*AI); 606 } 607 } 608 if (!Is64Bit || !MF.getSubtarget<X86Subtarget>().hasAVX512()) { 609 for (unsigned n = 16; n != 32; ++n) { 610 for (MCRegAliasIterator AI(X86::XMM0 + n, this, true); AI.isValid(); ++AI) 611 Reserved.set(*AI); 612 } 613 } 614 615 assert(checkAllSuperRegsMarked(Reserved, 616 {X86::SIL, X86::DIL, X86::BPL, X86::SPL, 617 X86::SIH, X86::DIH, X86::BPH, X86::SPH})); 618 return Reserved; 619 } 620 621 bool X86RegisterInfo::isArgumentRegister(const MachineFunction &MF, 622 MCRegister Reg) const { 623 const X86Subtarget &ST = MF.getSubtarget<X86Subtarget>(); 624 const TargetRegisterInfo &TRI = *ST.getRegisterInfo(); 625 auto IsSubReg = [&](MCRegister RegA, MCRegister RegB) { 626 return TRI.isSuperOrSubRegisterEq(RegA, RegB); 627 }; 628 629 if (!ST.is64Bit()) 630 return llvm::any_of( 631 SmallVector<MCRegister>{X86::EAX, X86::ECX, X86::EDX}, 632 [&](MCRegister &RegA) { return IsSubReg(RegA, Reg); }) || 633 (ST.hasMMX() && X86::VR64RegClass.contains(Reg)); 634 635 CallingConv::ID CC = MF.getFunction().getCallingConv(); 636 637 if (CC == CallingConv::X86_64_SysV && IsSubReg(X86::RAX, Reg)) 638 return true; 639 640 if (llvm::any_of( 641 SmallVector<MCRegister>{X86::RDX, X86::RCX, X86::R8, X86::R9}, 642 [&](MCRegister &RegA) { return IsSubReg(RegA, Reg); })) 643 return true; 644 645 if (CC != CallingConv::Win64 && 646 llvm::any_of(SmallVector<MCRegister>{X86::RDI, X86::RSI}, 647 [&](MCRegister &RegA) { return IsSubReg(RegA, Reg); })) 648 return true; 649 650 if (ST.hasSSE1() && 651 llvm::any_of(SmallVector<MCRegister>{X86::XMM0, X86::XMM1, X86::XMM2, 652 X86::XMM3, X86::XMM4, X86::XMM5, 653 X86::XMM6, X86::XMM7}, 654 [&](MCRegister &RegA) { return IsSubReg(RegA, Reg); })) 655 return true; 656 657 return false; 658 } 659 660 bool X86RegisterInfo::isFixedRegister(const MachineFunction &MF, 661 MCRegister PhysReg) const { 662 const X86Subtarget &ST = MF.getSubtarget<X86Subtarget>(); 663 const TargetRegisterInfo &TRI = *ST.getRegisterInfo(); 664 665 // Stack pointer. 666 if (TRI.isSuperOrSubRegisterEq(X86::RSP, PhysReg)) 667 return true; 668 669 // Don't use the frame pointer if it's being used. 670 const X86FrameLowering &TFI = *getFrameLowering(MF); 671 if (TFI.hasFP(MF) && TRI.isSuperOrSubRegisterEq(X86::RBP, PhysReg)) 672 return true; 673 674 return X86GenRegisterInfo::isFixedRegister(MF, PhysReg); 675 } 676 677 void X86RegisterInfo::adjustStackMapLiveOutMask(uint32_t *Mask) const { 678 // Check if the EFLAGS register is marked as live-out. This shouldn't happen, 679 // because the calling convention defines the EFLAGS register as NOT 680 // preserved. 681 // 682 // Unfortunatelly the EFLAGS show up as live-out after branch folding. Adding 683 // an assert to track this and clear the register afterwards to avoid 684 // unnecessary crashes during release builds. 685 assert(!(Mask[X86::EFLAGS / 32] & (1U << (X86::EFLAGS % 32))) && 686 "EFLAGS are not live-out from a patchpoint."); 687 688 // Also clean other registers that don't need preserving (IP). 689 for (auto Reg : {X86::EFLAGS, X86::RIP, X86::EIP, X86::IP}) 690 Mask[Reg / 32] &= ~(1U << (Reg % 32)); 691 } 692 693 //===----------------------------------------------------------------------===// 694 // Stack Frame Processing methods 695 //===----------------------------------------------------------------------===// 696 697 static bool CantUseSP(const MachineFrameInfo &MFI) { 698 return MFI.hasVarSizedObjects() || MFI.hasOpaqueSPAdjustment(); 699 } 700 701 bool X86RegisterInfo::hasBasePointer(const MachineFunction &MF) const { 702 const X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>(); 703 if (X86FI->hasPreallocatedCall()) 704 return true; 705 706 const MachineFrameInfo &MFI = MF.getFrameInfo(); 707 708 if (!EnableBasePointer) 709 return false; 710 711 // When we need stack realignment, we can't address the stack from the frame 712 // pointer. When we have dynamic allocas or stack-adjusting inline asm, we 713 // can't address variables from the stack pointer. MS inline asm can 714 // reference locals while also adjusting the stack pointer. When we can't 715 // use both the SP and the FP, we need a separate base pointer register. 716 bool CantUseFP = hasStackRealignment(MF); 717 return CantUseFP && CantUseSP(MFI); 718 } 719 720 bool X86RegisterInfo::canRealignStack(const MachineFunction &MF) const { 721 if (!TargetRegisterInfo::canRealignStack(MF)) 722 return false; 723 724 const MachineFrameInfo &MFI = MF.getFrameInfo(); 725 const MachineRegisterInfo *MRI = &MF.getRegInfo(); 726 727 // Stack realignment requires a frame pointer. If we already started 728 // register allocation with frame pointer elimination, it is too late now. 729 if (!MRI->canReserveReg(FramePtr)) 730 return false; 731 732 // If a base pointer is necessary. Check that it isn't too late to reserve 733 // it. 734 if (CantUseSP(MFI)) 735 return MRI->canReserveReg(BasePtr); 736 return true; 737 } 738 739 // tryOptimizeLEAtoMOV - helper function that tries to replace a LEA instruction 740 // of the form 'lea (%esp), %ebx' --> 'mov %esp, %ebx'. 741 // TODO: In this case we should be really trying first to entirely eliminate 742 // this instruction which is a plain copy. 743 static bool tryOptimizeLEAtoMOV(MachineBasicBlock::iterator II) { 744 MachineInstr &MI = *II; 745 unsigned Opc = II->getOpcode(); 746 // Check if this is a LEA of the form 'lea (%esp), %ebx' 747 if ((Opc != X86::LEA32r && Opc != X86::LEA64r && Opc != X86::LEA64_32r) || 748 MI.getOperand(2).getImm() != 1 || 749 MI.getOperand(3).getReg() != X86::NoRegister || 750 MI.getOperand(4).getImm() != 0 || 751 MI.getOperand(5).getReg() != X86::NoRegister) 752 return false; 753 Register BasePtr = MI.getOperand(1).getReg(); 754 // In X32 mode, ensure the base-pointer is a 32-bit operand, so the LEA will 755 // be replaced with a 32-bit operand MOV which will zero extend the upper 756 // 32-bits of the super register. 757 if (Opc == X86::LEA64_32r) 758 BasePtr = getX86SubSuperRegister(BasePtr, 32); 759 Register NewDestReg = MI.getOperand(0).getReg(); 760 const X86InstrInfo *TII = 761 MI.getParent()->getParent()->getSubtarget<X86Subtarget>().getInstrInfo(); 762 TII->copyPhysReg(*MI.getParent(), II, MI.getDebugLoc(), NewDestReg, BasePtr, 763 MI.getOperand(1).isKill()); 764 MI.eraseFromParent(); 765 return true; 766 } 767 768 static bool isFuncletReturnInstr(MachineInstr &MI) { 769 switch (MI.getOpcode()) { 770 case X86::CATCHRET: 771 case X86::CLEANUPRET: 772 return true; 773 default: 774 return false; 775 } 776 llvm_unreachable("impossible"); 777 } 778 779 void 780 X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, 781 int SPAdj, unsigned FIOperandNum, 782 RegScavenger *RS) const { 783 MachineInstr &MI = *II; 784 MachineBasicBlock &MBB = *MI.getParent(); 785 MachineFunction &MF = *MBB.getParent(); 786 MachineBasicBlock::iterator MBBI = MBB.getFirstTerminator(); 787 bool IsEHFuncletEpilogue = MBBI == MBB.end() ? false 788 : isFuncletReturnInstr(*MBBI); 789 const X86FrameLowering *TFI = getFrameLowering(MF); 790 int FrameIndex = MI.getOperand(FIOperandNum).getIndex(); 791 792 // Determine base register and offset. 793 int FIOffset; 794 Register BasePtr; 795 if (MI.isReturn()) { 796 assert((!hasStackRealignment(MF) || 797 MF.getFrameInfo().isFixedObjectIndex(FrameIndex)) && 798 "Return instruction can only reference SP relative frame objects"); 799 FIOffset = 800 TFI->getFrameIndexReferenceSP(MF, FrameIndex, BasePtr, 0).getFixed(); 801 } else if (TFI->Is64Bit && (MBB.isEHFuncletEntry() || IsEHFuncletEpilogue)) { 802 FIOffset = TFI->getWin64EHFrameIndexRef(MF, FrameIndex, BasePtr); 803 } else { 804 FIOffset = TFI->getFrameIndexReference(MF, FrameIndex, BasePtr).getFixed(); 805 } 806 807 // LOCAL_ESCAPE uses a single offset, with no register. It only works in the 808 // simple FP case, and doesn't work with stack realignment. On 32-bit, the 809 // offset is from the traditional base pointer location. On 64-bit, the 810 // offset is from the SP at the end of the prologue, not the FP location. This 811 // matches the behavior of llvm.frameaddress. 812 unsigned Opc = MI.getOpcode(); 813 if (Opc == TargetOpcode::LOCAL_ESCAPE) { 814 MachineOperand &FI = MI.getOperand(FIOperandNum); 815 FI.ChangeToImmediate(FIOffset); 816 return; 817 } 818 819 // For LEA64_32r when BasePtr is 32-bits (X32) we can use full-size 64-bit 820 // register as source operand, semantic is the same and destination is 821 // 32-bits. It saves one byte per lea in code since 0x67 prefix is avoided. 822 // Don't change BasePtr since it is used later for stack adjustment. 823 Register MachineBasePtr = BasePtr; 824 if (Opc == X86::LEA64_32r && X86::GR32RegClass.contains(BasePtr)) 825 MachineBasePtr = getX86SubSuperRegister(BasePtr, 64); 826 827 // This must be part of a four operand memory reference. Replace the 828 // FrameIndex with base register. Add an offset to the offset. 829 MI.getOperand(FIOperandNum).ChangeToRegister(MachineBasePtr, false); 830 831 if (BasePtr == StackPtr) 832 FIOffset += SPAdj; 833 834 // The frame index format for stackmaps and patchpoints is different from the 835 // X86 format. It only has a FI and an offset. 836 if (Opc == TargetOpcode::STACKMAP || Opc == TargetOpcode::PATCHPOINT) { 837 assert(BasePtr == FramePtr && "Expected the FP as base register"); 838 int64_t Offset = MI.getOperand(FIOperandNum + 1).getImm() + FIOffset; 839 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Offset); 840 return; 841 } 842 843 if (MI.getOperand(FIOperandNum+3).isImm()) { 844 // Offset is a 32-bit integer. 845 int Imm = (int)(MI.getOperand(FIOperandNum + 3).getImm()); 846 int Offset = FIOffset + Imm; 847 assert((!Is64Bit || isInt<32>((long long)FIOffset + Imm)) && 848 "Requesting 64-bit offset in 32-bit immediate!"); 849 if (Offset != 0 || !tryOptimizeLEAtoMOV(II)) 850 MI.getOperand(FIOperandNum + 3).ChangeToImmediate(Offset); 851 } else { 852 // Offset is symbolic. This is extremely rare. 853 uint64_t Offset = FIOffset + 854 (uint64_t)MI.getOperand(FIOperandNum+3).getOffset(); 855 MI.getOperand(FIOperandNum + 3).setOffset(Offset); 856 } 857 } 858 859 unsigned X86RegisterInfo::findDeadCallerSavedReg( 860 MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI) const { 861 const MachineFunction *MF = MBB.getParent(); 862 if (MF->callsEHReturn()) 863 return 0; 864 865 const TargetRegisterClass &AvailableRegs = *getGPRsForTailCall(*MF); 866 867 if (MBBI == MBB.end()) 868 return 0; 869 870 switch (MBBI->getOpcode()) { 871 default: 872 return 0; 873 case TargetOpcode::PATCHABLE_RET: 874 case X86::RET: 875 case X86::RET32: 876 case X86::RET64: 877 case X86::RETI32: 878 case X86::RETI64: 879 case X86::TCRETURNdi: 880 case X86::TCRETURNri: 881 case X86::TCRETURNmi: 882 case X86::TCRETURNdi64: 883 case X86::TCRETURNri64: 884 case X86::TCRETURNmi64: 885 case X86::EH_RETURN: 886 case X86::EH_RETURN64: { 887 SmallSet<uint16_t, 8> Uses; 888 for (unsigned I = 0, E = MBBI->getNumOperands(); I != E; ++I) { 889 MachineOperand &MO = MBBI->getOperand(I); 890 if (!MO.isReg() || MO.isDef()) 891 continue; 892 Register Reg = MO.getReg(); 893 if (!Reg) 894 continue; 895 for (MCRegAliasIterator AI(Reg, this, true); AI.isValid(); ++AI) 896 Uses.insert(*AI); 897 } 898 899 for (auto CS : AvailableRegs) 900 if (!Uses.count(CS) && CS != X86::RIP && CS != X86::RSP && CS != X86::ESP) 901 return CS; 902 } 903 } 904 905 return 0; 906 } 907 908 Register X86RegisterInfo::getFrameRegister(const MachineFunction &MF) const { 909 const X86FrameLowering *TFI = getFrameLowering(MF); 910 return TFI->hasFP(MF) ? FramePtr : StackPtr; 911 } 912 913 unsigned 914 X86RegisterInfo::getPtrSizedFrameRegister(const MachineFunction &MF) const { 915 const X86Subtarget &Subtarget = MF.getSubtarget<X86Subtarget>(); 916 Register FrameReg = getFrameRegister(MF); 917 if (Subtarget.isTarget64BitILP32()) 918 FrameReg = getX86SubSuperRegister(FrameReg, 32); 919 return FrameReg; 920 } 921 922 unsigned 923 X86RegisterInfo::getPtrSizedStackRegister(const MachineFunction &MF) const { 924 const X86Subtarget &Subtarget = MF.getSubtarget<X86Subtarget>(); 925 Register StackReg = getStackRegister(); 926 if (Subtarget.isTarget64BitILP32()) 927 StackReg = getX86SubSuperRegister(StackReg, 32); 928 return StackReg; 929 } 930 931 static ShapeT getTileShape(Register VirtReg, VirtRegMap *VRM, 932 const MachineRegisterInfo *MRI) { 933 if (VRM->hasShape(VirtReg)) 934 return VRM->getShape(VirtReg); 935 936 const MachineOperand &Def = *MRI->def_begin(VirtReg); 937 MachineInstr *MI = const_cast<MachineInstr *>(Def.getParent()); 938 unsigned OpCode = MI->getOpcode(); 939 switch (OpCode) { 940 default: 941 llvm_unreachable("Unexpected machine instruction on tile register!"); 942 break; 943 case X86::COPY: { 944 Register SrcReg = MI->getOperand(1).getReg(); 945 ShapeT Shape = getTileShape(SrcReg, VRM, MRI); 946 VRM->assignVirt2Shape(VirtReg, Shape); 947 return Shape; 948 } 949 // We only collect the tile shape that is defined. 950 case X86::PTILELOADDV: 951 case X86::PTILELOADDT1V: 952 case X86::PTDPBSSDV: 953 case X86::PTDPBSUDV: 954 case X86::PTDPBUSDV: 955 case X86::PTDPBUUDV: 956 case X86::PTILEZEROV: 957 case X86::PTDPBF16PSV: 958 MachineOperand &MO1 = MI->getOperand(1); 959 MachineOperand &MO2 = MI->getOperand(2); 960 ShapeT Shape(&MO1, &MO2, MRI); 961 VRM->assignVirt2Shape(VirtReg, Shape); 962 return Shape; 963 } 964 } 965 966 bool X86RegisterInfo::getRegAllocationHints(Register VirtReg, 967 ArrayRef<MCPhysReg> Order, 968 SmallVectorImpl<MCPhysReg> &Hints, 969 const MachineFunction &MF, 970 const VirtRegMap *VRM, 971 const LiveRegMatrix *Matrix) const { 972 const MachineRegisterInfo *MRI = &MF.getRegInfo(); 973 const TargetRegisterClass &RC = *MRI->getRegClass(VirtReg); 974 bool BaseImplRetVal = TargetRegisterInfo::getRegAllocationHints( 975 VirtReg, Order, Hints, MF, VRM, Matrix); 976 977 if (RC.getID() != X86::TILERegClassID) 978 return BaseImplRetVal; 979 980 ShapeT VirtShape = getTileShape(VirtReg, const_cast<VirtRegMap *>(VRM), MRI); 981 auto AddHint = [&](MCPhysReg PhysReg) { 982 Register VReg = Matrix->getOneVReg(PhysReg); 983 if (VReg == MCRegister::NoRegister) { // Not allocated yet 984 Hints.push_back(PhysReg); 985 return; 986 } 987 ShapeT PhysShape = getTileShape(VReg, const_cast<VirtRegMap *>(VRM), MRI); 988 if (PhysShape == VirtShape) 989 Hints.push_back(PhysReg); 990 }; 991 992 SmallSet<MCPhysReg, 4> CopyHints; 993 CopyHints.insert(Hints.begin(), Hints.end()); 994 Hints.clear(); 995 for (auto Hint : CopyHints) { 996 if (RC.contains(Hint) && !MRI->isReserved(Hint)) 997 AddHint(Hint); 998 } 999 for (MCPhysReg PhysReg : Order) { 1000 if (!CopyHints.count(PhysReg) && RC.contains(PhysReg) && 1001 !MRI->isReserved(PhysReg)) 1002 AddHint(PhysReg); 1003 } 1004 1005 #define DEBUG_TYPE "tile-hint" 1006 LLVM_DEBUG({ 1007 dbgs() << "Hints for virtual register " << format_hex(VirtReg, 8) << "\n"; 1008 for (auto Hint : Hints) { 1009 dbgs() << "tmm" << Hint << ","; 1010 } 1011 dbgs() << "\n"; 1012 }); 1013 #undef DEBUG_TYPE 1014 1015 return true; 1016 } 1017