1 //===- DetectDeadLanes.cpp - SubRegister Lane Usage Analysis --*- C++ -*---===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 /// \file 11 /// Analysis that tracks defined/used subregister lanes across COPY instructions 12 /// and instructions that get lowered to a COPY (PHI, REG_SEQUENCE, 13 /// INSERT_SUBREG, EXTRACT_SUBREG). 14 /// The information is used to detect dead definitions and the usage of 15 /// (completely) undefined values and mark the operands as such. 16 /// This pass is necessary because the dead/undef status is not obvious anymore 17 /// when subregisters are involved. 18 /// 19 /// Example: 20 /// %vreg0 = some definition 21 /// %vreg1 = IMPLICIT_DEF 22 /// %vreg2 = REG_SEQUENCE %vreg0, sub0, %vreg1, sub1 23 /// %vreg3 = EXTRACT_SUBREG %vreg2, sub1 24 /// = use %vreg3 25 /// The %vreg0 definition is dead and %vreg3 contains an undefined value. 26 // 27 //===----------------------------------------------------------------------===// 28 29 #include <deque> 30 #include <vector> 31 32 #include "llvm/ADT/BitVector.h" 33 #include "llvm/CodeGen/MachineFunctionPass.h" 34 #include "llvm/CodeGen/MachineRegisterInfo.h" 35 #include "llvm/CodeGen/Passes.h" 36 #include "llvm/InitializePasses.h" 37 #include "llvm/Pass.h" 38 #include "llvm/PassRegistry.h" 39 #include "llvm/Support/Debug.h" 40 #include "llvm/Support/raw_ostream.h" 41 #include "llvm/Target/TargetInstrInfo.h" 42 #include "llvm/Target/TargetRegisterInfo.h" 43 #include "llvm/Target/TargetSubtargetInfo.h" 44 45 using namespace llvm; 46 47 #define DEBUG_TYPE "detect-dead-lanes" 48 49 namespace { 50 51 /// Contains a bitmask of which lanes of a given virtual register are 52 /// defined and which ones are actually used. 53 struct VRegInfo { 54 LaneBitmask UsedLanes; 55 LaneBitmask DefinedLanes; 56 }; 57 58 class DetectDeadLanes : public MachineFunctionPass { 59 public: 60 bool runOnMachineFunction(MachineFunction &MF) override; 61 62 static char ID; 63 DetectDeadLanes() : MachineFunctionPass(ID) {} 64 65 const char *getPassName() const override { return "Detect Dead Lanes"; } 66 67 private: 68 /// Add used lane bits on the register used by operand \p MO. This translates 69 /// the bitmask based on the operands subregister, and puts the register into 70 /// the worklist if any new bits were added. 71 void addUsedLanesOnOperand(const MachineOperand &MO, LaneBitmask UsedLanes); 72 73 /// Given a bitmask \p UsedLanes for the used lanes on a def output of a 74 /// COPY-like instruction determine the lanes used on the use operands 75 /// and call addUsedLanesOnOperand() for them. 76 void transferUsedLanesStep(const MachineOperand &Def, LaneBitmask UsedLanes); 77 78 /// Given a use regiser operand \p Use and a mask of defined lanes, check 79 /// if the operand belongs to a lowersToCopies() instruction, transfer the 80 /// mask to the def and put the instruction into the worklist. 81 void transferDefinedLanesStep(const MachineOperand &Use, 82 LaneBitmask DefinedLanes); 83 84 /// Given a mask \p DefinedLanes of lanes defined at operand \p OpNum 85 /// of COPY-like instruction, determine which lanes are defined at the output 86 /// operand \p Def. 87 LaneBitmask transferDefinedLanes(const MachineOperand &Def, unsigned OpNum, 88 LaneBitmask DefinedLanes) const; 89 90 LaneBitmask determineInitialDefinedLanes(unsigned Reg); 91 LaneBitmask determineInitialUsedLanes(unsigned Reg); 92 93 const MachineRegisterInfo *MRI; 94 const TargetRegisterInfo *TRI; 95 96 void PutInWorklist(unsigned RegIdx) { 97 if (WorklistMembers.test(RegIdx)) 98 return; 99 WorklistMembers.set(RegIdx); 100 Worklist.push_back(RegIdx); 101 } 102 103 VRegInfo *VRegInfos; 104 /// Worklist containing virtreg indexes. 105 std::deque<unsigned> Worklist; 106 BitVector WorklistMembers; 107 /// This bitvector is set for each vreg index where the vreg is defined 108 /// by an instruction where lowersToCopies()==true. 109 BitVector DefinedByCopy; 110 }; 111 112 } // end anonymous namespace 113 114 char DetectDeadLanes::ID = 0; 115 char &llvm::DetectDeadLanesID = DetectDeadLanes::ID; 116 117 INITIALIZE_PASS(DetectDeadLanes, "detect-dead-lanes", "Detect Dead Lanes", 118 false, false) 119 120 /// Returns true if \p MI will get lowered to a series of COPY instructions. 121 /// We call this a COPY-like instruction. 122 static bool lowersToCopies(const MachineInstr &MI) { 123 // Note: We could support instructions with MCInstrDesc::isRegSequenceLike(), 124 // isExtractSubRegLike(), isInsertSubregLike() in the future even though they 125 // are not lowered to a COPY. 126 switch (MI.getOpcode()) { 127 case TargetOpcode::COPY: 128 case TargetOpcode::PHI: 129 case TargetOpcode::INSERT_SUBREG: 130 case TargetOpcode::REG_SEQUENCE: 131 case TargetOpcode::EXTRACT_SUBREG: 132 return true; 133 } 134 return false; 135 } 136 137 static bool isCrossCopy(const MachineRegisterInfo &MRI, 138 const MachineInstr &MI, 139 const TargetRegisterClass *DstRC, 140 const MachineOperand &MO) { 141 assert(lowersToCopies(MI)); 142 unsigned SrcReg = MO.getReg(); 143 const TargetRegisterClass *SrcRC = MRI.getRegClass(SrcReg); 144 if (DstRC == SrcRC) 145 return false; 146 147 unsigned SrcSubIdx = MO.getSubReg(); 148 149 const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo(); 150 unsigned DstSubIdx = 0; 151 switch (MI.getOpcode()) { 152 case TargetOpcode::INSERT_SUBREG: 153 if (MI.getOperandNo(&MO) == 2) 154 DstSubIdx = MI.getOperand(3).getImm(); 155 break; 156 case TargetOpcode::REG_SEQUENCE: { 157 unsigned OpNum = MI.getOperandNo(&MO); 158 DstSubIdx = MI.getOperand(OpNum+1).getImm(); 159 break; 160 } 161 case TargetOpcode::EXTRACT_SUBREG: { 162 unsigned SubReg = MI.getOperand(2).getImm(); 163 SrcSubIdx = TRI.composeSubRegIndices(SubReg, SrcSubIdx); 164 } 165 } 166 167 unsigned PreA, PreB; // Unused. 168 if (SrcSubIdx && DstSubIdx) 169 return !TRI.getCommonSuperRegClass(SrcRC, SrcSubIdx, DstRC, DstSubIdx, PreA, 170 PreB); 171 if (SrcSubIdx) 172 return !TRI.getMatchingSuperRegClass(SrcRC, DstRC, SrcSubIdx); 173 if (DstSubIdx) 174 return !TRI.getMatchingSuperRegClass(DstRC, SrcRC, DstSubIdx); 175 return !TRI.getCommonSubClass(SrcRC, DstRC); 176 } 177 178 void DetectDeadLanes::addUsedLanesOnOperand(const MachineOperand &MO, 179 LaneBitmask UsedLanes) { 180 if (!MO.readsReg()) 181 return; 182 unsigned MOReg = MO.getReg(); 183 if (!TargetRegisterInfo::isVirtualRegister(MOReg)) 184 return; 185 186 unsigned MOSubReg = MO.getSubReg(); 187 if (MOSubReg != 0) 188 UsedLanes = TRI->composeSubRegIndexLaneMask(MOSubReg, UsedLanes); 189 UsedLanes &= MRI->getMaxLaneMaskForVReg(MOReg); 190 191 unsigned MORegIdx = TargetRegisterInfo::virtReg2Index(MOReg); 192 VRegInfo &MORegInfo = VRegInfos[MORegIdx]; 193 LaneBitmask PrevUsedLanes = MORegInfo.UsedLanes; 194 // Any change at all? 195 if ((UsedLanes & ~PrevUsedLanes) == 0) 196 return; 197 198 // Set UsedLanes and remember instruction for further propagation. 199 MORegInfo.UsedLanes = PrevUsedLanes | UsedLanes; 200 if (DefinedByCopy.test(MORegIdx)) 201 PutInWorklist(MORegIdx); 202 } 203 204 void DetectDeadLanes::transferUsedLanesStep(const MachineOperand &Def, 205 LaneBitmask UsedLanes) { 206 const MachineInstr &MI = *Def.getParent(); 207 switch (MI.getOpcode()) { 208 case TargetOpcode::COPY: 209 case TargetOpcode::PHI: 210 for (const MachineOperand &MO : MI.uses()) { 211 if (MO.isReg() && MO.isUse()) 212 addUsedLanesOnOperand(MO, UsedLanes); 213 } 214 break; 215 case TargetOpcode::REG_SEQUENCE: { 216 // Note: This loop makes the conservative assumption that subregister 217 // indices do not overlap or that we do not know how the overlap is 218 // resolved when lowering to copies. 219 for (unsigned I = 1, N = MI.getNumOperands(); I < N; I += 2) { 220 const MachineOperand &MO = MI.getOperand(I); 221 unsigned SubIdx = MI.getOperand(I + 1).getImm(); 222 LaneBitmask MOUsedLanes = 223 TRI->reverseComposeSubRegIndexLaneMask(SubIdx, UsedLanes); 224 225 addUsedLanesOnOperand(MO, MOUsedLanes); 226 } 227 break; 228 } 229 case TargetOpcode::INSERT_SUBREG: { 230 const MachineOperand &MO2 = MI.getOperand(2); 231 unsigned SubIdx = MI.getOperand(3).getImm(); 232 LaneBitmask MO2UsedLanes = 233 TRI->reverseComposeSubRegIndexLaneMask(SubIdx, UsedLanes); 234 addUsedLanesOnOperand(MO2, MO2UsedLanes); 235 236 const MachineOperand &MO1 = MI.getOperand(1); 237 unsigned DefReg = Def.getReg(); 238 const TargetRegisterClass *RC = MRI->getRegClass(DefReg); 239 LaneBitmask MO1UsedLanes; 240 if (RC->CoveredBySubRegs) 241 MO1UsedLanes = UsedLanes & ~TRI->getSubRegIndexLaneMask(SubIdx); 242 else 243 MO1UsedLanes = RC->LaneMask; 244 addUsedLanesOnOperand(MO1, MO1UsedLanes); 245 break; 246 } 247 case TargetOpcode::EXTRACT_SUBREG: { 248 const MachineOperand &MO = MI.getOperand(1); 249 unsigned SubIdx = MI.getOperand(2).getImm(); 250 LaneBitmask MOUsedLanes = 251 TRI->composeSubRegIndexLaneMask(SubIdx, UsedLanes); 252 addUsedLanesOnOperand(MO, MOUsedLanes); 253 break; 254 } 255 default: 256 llvm_unreachable("function must be called with COPY-like instruction"); 257 } 258 } 259 260 void DetectDeadLanes::transferDefinedLanesStep(const MachineOperand &Use, 261 LaneBitmask DefinedLanes) { 262 if (!Use.readsReg()) 263 return; 264 // Check whether the operand writes a vreg and is part of a COPY-like 265 // instruction. 266 const MachineInstr &MI = *Use.getParent(); 267 if (MI.getDesc().getNumDefs() != 1) 268 return; 269 // FIXME: PATCHPOINT instructions announce a Def that does not always exist, 270 // they really need to be modeled differently! 271 if (MI.getOpcode() == TargetOpcode::PATCHPOINT) 272 return; 273 const MachineOperand &Def = *MI.defs().begin(); 274 unsigned DefReg = Def.getReg(); 275 if (!TargetRegisterInfo::isVirtualRegister(DefReg)) 276 return; 277 unsigned DefRegIdx = TargetRegisterInfo::virtReg2Index(DefReg); 278 if (!DefinedByCopy.test(DefRegIdx)) 279 return; 280 281 unsigned OpNum = MI.getOperandNo(&Use); 282 DefinedLanes = 283 TRI->reverseComposeSubRegIndexLaneMask(Use.getSubReg(), DefinedLanes); 284 DefinedLanes = transferDefinedLanes(Def, OpNum, DefinedLanes); 285 286 VRegInfo &RegInfo = VRegInfos[DefRegIdx]; 287 LaneBitmask PrevDefinedLanes = RegInfo.DefinedLanes; 288 // Any change at all? 289 if ((DefinedLanes & ~PrevDefinedLanes) == 0) 290 return; 291 292 RegInfo.DefinedLanes = PrevDefinedLanes | DefinedLanes; 293 PutInWorklist(DefRegIdx); 294 } 295 296 LaneBitmask DetectDeadLanes::transferDefinedLanes(const MachineOperand &Def, 297 unsigned OpNum, LaneBitmask DefinedLanes) const { 298 const MachineInstr &MI = *Def.getParent(); 299 // Translate DefinedLanes if necessary. 300 switch (MI.getOpcode()) { 301 case TargetOpcode::REG_SEQUENCE: { 302 unsigned SubIdx = MI.getOperand(OpNum + 1).getImm(); 303 DefinedLanes = TRI->composeSubRegIndexLaneMask(SubIdx, DefinedLanes); 304 DefinedLanes &= TRI->getSubRegIndexLaneMask(SubIdx); 305 break; 306 } 307 case TargetOpcode::INSERT_SUBREG: { 308 unsigned SubIdx = MI.getOperand(3).getImm(); 309 if (OpNum == 2) { 310 DefinedLanes = TRI->composeSubRegIndexLaneMask(SubIdx, DefinedLanes); 311 DefinedLanes &= TRI->getSubRegIndexLaneMask(SubIdx); 312 } else { 313 assert(OpNum == 1 && "INSERT_SUBREG must have two operands"); 314 // Ignore lanes defined by operand 2. 315 DefinedLanes &= ~TRI->getSubRegIndexLaneMask(SubIdx); 316 } 317 break; 318 } 319 case TargetOpcode::EXTRACT_SUBREG: { 320 unsigned SubIdx = MI.getOperand(2).getImm(); 321 assert(OpNum == 1 && "EXTRACT_SUBREG must have one register operand only"); 322 DefinedLanes = TRI->reverseComposeSubRegIndexLaneMask(SubIdx, DefinedLanes); 323 break; 324 } 325 case TargetOpcode::COPY: 326 case TargetOpcode::PHI: 327 break; 328 default: 329 llvm_unreachable("function must be called with COPY-like instruction"); 330 } 331 332 assert(Def.getSubReg() == 0 && 333 "Should not have subregister defs in machine SSA phase"); 334 DefinedLanes &= MRI->getMaxLaneMaskForVReg(Def.getReg()); 335 return DefinedLanes; 336 } 337 338 LaneBitmask DetectDeadLanes::determineInitialDefinedLanes(unsigned Reg) { 339 // Live-In or unused registers have no definition but are considered fully 340 // defined. 341 if (!MRI->hasOneDef(Reg)) 342 return ~0u; 343 344 const MachineOperand &Def = *MRI->def_begin(Reg); 345 const MachineInstr &DefMI = *Def.getParent(); 346 if (lowersToCopies(DefMI)) { 347 // Start optimisatically with no used or defined lanes for copy 348 // instructions. The following dataflow analysis will add more bits. 349 unsigned RegIdx = TargetRegisterInfo::virtReg2Index(Reg); 350 DefinedByCopy.set(RegIdx); 351 PutInWorklist(RegIdx); 352 353 if (Def.isDead()) 354 return 0; 355 356 // COPY/PHI can copy across unrelated register classes (example: float/int) 357 // with incompatible subregister structure. Do not include these in the 358 // dataflow analysis since we cannot transfer lanemasks in a meaningful way. 359 const TargetRegisterClass *DefRC = MRI->getRegClass(Reg); 360 361 // Determine initially DefinedLanes. 362 LaneBitmask DefinedLanes = 0; 363 for (const MachineOperand &MO : DefMI.uses()) { 364 if (!MO.isReg() || !MO.readsReg()) 365 continue; 366 unsigned MOReg = MO.getReg(); 367 if (!MOReg) 368 continue; 369 370 LaneBitmask MODefinedLanes; 371 if (TargetRegisterInfo::isPhysicalRegister(MOReg)) { 372 MODefinedLanes = ~0u; 373 } else if (isCrossCopy(*MRI, DefMI, DefRC, MO)) { 374 MODefinedLanes = ~0u; 375 } else { 376 assert(TargetRegisterInfo::isVirtualRegister(MOReg)); 377 if (MRI->hasOneDef(MOReg)) { 378 const MachineOperand &MODef = *MRI->def_begin(MOReg); 379 const MachineInstr &MODefMI = *MODef.getParent(); 380 // Bits from copy-like operations will be added later. 381 if (lowersToCopies(MODefMI) || MODefMI.isImplicitDef()) 382 continue; 383 } 384 unsigned MOSubReg = MO.getSubReg(); 385 MODefinedLanes = MRI->getMaxLaneMaskForVReg(MOReg); 386 MODefinedLanes = TRI->reverseComposeSubRegIndexLaneMask( 387 MOSubReg, MODefinedLanes); 388 } 389 390 unsigned OpNum = DefMI.getOperandNo(&MO); 391 DefinedLanes |= transferDefinedLanes(Def, OpNum, MODefinedLanes); 392 } 393 return DefinedLanes; 394 } 395 if (DefMI.isImplicitDef() || Def.isDead()) 396 return 0; 397 398 assert(Def.getSubReg() == 0 && 399 "Should not have subregister defs in machine SSA phase"); 400 return MRI->getMaxLaneMaskForVReg(Reg); 401 } 402 403 LaneBitmask DetectDeadLanes::determineInitialUsedLanes(unsigned Reg) { 404 LaneBitmask UsedLanes = 0; 405 for (const MachineOperand &MO : MRI->use_nodbg_operands(Reg)) { 406 if (!MO.readsReg()) 407 continue; 408 409 const MachineInstr &UseMI = *MO.getParent(); 410 if (UseMI.isKill()) 411 continue; 412 413 unsigned SubReg = MO.getSubReg(); 414 if (lowersToCopies(UseMI)) { 415 assert(UseMI.getDesc().getNumDefs() == 1); 416 const MachineOperand &Def = *UseMI.defs().begin(); 417 unsigned DefReg = Def.getReg(); 418 // The used lanes of COPY-like instruction operands are determined by the 419 // following dataflow analysis. 420 if (TargetRegisterInfo::isVirtualRegister(DefReg)) { 421 // But ignore copies across incompatible register classes. 422 bool CrossCopy = false; 423 if (lowersToCopies(UseMI)) { 424 const TargetRegisterClass *DstRC = MRI->getRegClass(DefReg); 425 CrossCopy = isCrossCopy(*MRI, UseMI, DstRC, MO); 426 } 427 428 if (!CrossCopy) 429 continue; 430 } 431 } 432 433 // Shortcut: All lanes are used. 434 if (SubReg == 0) 435 return MRI->getMaxLaneMaskForVReg(Reg); 436 437 UsedLanes |= TRI->getSubRegIndexLaneMask(SubReg); 438 } 439 return UsedLanes; 440 } 441 442 bool DetectDeadLanes::runOnMachineFunction(MachineFunction &MF) { 443 // Don't bother if we won't track subregister liveness later. This pass is 444 // required for correctness if subregister liveness is enabled because the 445 // register coalescer cannot deal with hidden dead defs. However without 446 // subregister liveness enabled, the expected benefits of this pass are small 447 // so we safe the compile time. 448 if (!MF.getSubtarget().enableSubRegLiveness()) { 449 DEBUG(dbgs() << "Skipping Detect dead lanes pass\n"); 450 return false; 451 } 452 453 MRI = &MF.getRegInfo(); 454 TRI = MRI->getTargetRegisterInfo(); 455 456 unsigned NumVirtRegs = MRI->getNumVirtRegs(); 457 VRegInfos = new VRegInfo[NumVirtRegs]; 458 WorklistMembers.resize(NumVirtRegs); 459 DefinedByCopy.resize(NumVirtRegs); 460 461 // First pass: Populate defs/uses of vregs with initial values 462 for (unsigned RegIdx = 0; RegIdx < NumVirtRegs; ++RegIdx) { 463 unsigned Reg = TargetRegisterInfo::index2VirtReg(RegIdx); 464 465 // Determine used/defined lanes and add copy instructions to worklist. 466 VRegInfo &Info = VRegInfos[RegIdx]; 467 Info.DefinedLanes = determineInitialDefinedLanes(Reg); 468 Info.UsedLanes = determineInitialUsedLanes(Reg); 469 } 470 471 // Iterate as long as defined lanes/used lanes keep changing. 472 while (!Worklist.empty()) { 473 unsigned RegIdx = Worklist.front(); 474 Worklist.pop_front(); 475 WorklistMembers.reset(RegIdx); 476 VRegInfo &Info = VRegInfos[RegIdx]; 477 unsigned Reg = TargetRegisterInfo::index2VirtReg(RegIdx); 478 479 // Transfer UsedLanes to operands of DefMI (backwards dataflow). 480 MachineOperand &Def = *MRI->def_begin(Reg); 481 transferUsedLanesStep(Def, Info.UsedLanes); 482 // Transfer DefinedLanes to users of Reg (forward dataflow). 483 for (const MachineOperand &MO : MRI->use_nodbg_operands(Reg)) 484 transferDefinedLanesStep(MO, Info.DefinedLanes); 485 } 486 487 DEBUG( 488 dbgs() << "Defined/Used lanes:\n"; 489 for (unsigned RegIdx = 0; RegIdx < NumVirtRegs; ++RegIdx) { 490 unsigned Reg = TargetRegisterInfo::index2VirtReg(RegIdx); 491 const VRegInfo &Info = VRegInfos[RegIdx]; 492 dbgs() << PrintReg(Reg, nullptr) 493 << " Used: " << PrintLaneMask(Info.UsedLanes) 494 << " Def: " << PrintLaneMask(Info.DefinedLanes) << '\n'; 495 } 496 dbgs() << "\n"; 497 ); 498 499 // Mark operands as dead/unused. 500 for (MachineBasicBlock &MBB : MF) { 501 for (MachineInstr &MI : MBB) { 502 for (MachineOperand &MO : MI.operands()) { 503 if (!MO.isReg()) 504 continue; 505 unsigned Reg = MO.getReg(); 506 if (!TargetRegisterInfo::isVirtualRegister(Reg)) 507 continue; 508 unsigned SubReg = MO.getSubReg(); 509 LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubReg); 510 unsigned RegIdx = TargetRegisterInfo::virtReg2Index(Reg); 511 const VRegInfo &RegInfo = VRegInfos[RegIdx]; 512 if (RegInfo.UsedLanes == 0 && MO.isDef() && !MO.isDead()) { 513 DEBUG(dbgs() << "Marking operand '" << MO << "' as dead in " << MI); 514 MO.setIsDead(); 515 } 516 if (((RegInfo.UsedLanes & Mask) == 0 || 517 (RegInfo.DefinedLanes & Mask) == 0) && MO.readsReg()) { 518 DEBUG(dbgs() << "Marking operand '" << MO << "' as undef in " << MI); 519 MO.setIsUndef(); 520 } 521 } 522 } 523 } 524 525 DefinedByCopy.clear(); 526 WorklistMembers.clear(); 527 delete[] VRegInfos; 528 return true; 529 } 530