1 //===----- HexagonPacketizer.cpp - vliw packetizer ---------------------===// 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 // This implements a simple VLIW packetizer using DFA. The packetizer works on 11 // machine basic blocks. For each instruction I in BB, the packetizer consults 12 // the DFA to see if machine resources are available to execute I. If so, the 13 // packetizer checks if I depends on any instruction J in the current packet. 14 // If no dependency is found, I is added to current packet and machine resource 15 // is marked as taken. If any dependency is found, a target API call is made to 16 // prune the dependence. 17 // 18 //===----------------------------------------------------------------------===// 19 #define DEBUG_TYPE "packets" 20 #include "llvm/CodeGen/DFAPacketizer.h" 21 #include "llvm/CodeGen/Passes.h" 22 #include "llvm/CodeGen/MachineDominators.h" 23 #include "llvm/CodeGen/MachineFunctionPass.h" 24 #include "llvm/CodeGen/MachineLoopInfo.h" 25 #include "llvm/CodeGen/ScheduleDAG.h" 26 #include "llvm/CodeGen/ScheduleDAGInstrs.h" 27 #include "llvm/CodeGen/LatencyPriorityQueue.h" 28 #include "llvm/CodeGen/SchedulerRegistry.h" 29 #include "llvm/CodeGen/MachineFrameInfo.h" 30 #include "llvm/CodeGen/MachineInstrBuilder.h" 31 #include "llvm/CodeGen/MachineRegisterInfo.h" 32 #include "llvm/CodeGen/MachineFunctionAnalysis.h" 33 #include "llvm/CodeGen/ScheduleHazardRecognizer.h" 34 #include "llvm/Target/TargetMachine.h" 35 #include "llvm/Target/TargetInstrInfo.h" 36 #include "llvm/Target/TargetRegisterInfo.h" 37 #include "llvm/ADT/DenseMap.h" 38 #include "llvm/ADT/Statistic.h" 39 #include "llvm/Support/MathExtras.h" 40 #include "llvm/MC/MCInstrItineraries.h" 41 #include "llvm/Support/Compiler.h" 42 #include "llvm/Support/CommandLine.h" 43 #include "llvm/Support/Debug.h" 44 #include "Hexagon.h" 45 #include "HexagonTargetMachine.h" 46 #include "HexagonRegisterInfo.h" 47 #include "HexagonSubtarget.h" 48 #include "HexagonMachineFunctionInfo.h" 49 50 #include <map> 51 #include <vector> 52 53 using namespace llvm; 54 55 static cl::opt<bool> PacketizeVolatiles("hexagon-packetize-volatiles", 56 cl::ZeroOrMore, cl::Hidden, cl::init(true), 57 cl::desc("Allow non-solo packetization of volatile memory references")); 58 59 namespace llvm { 60 void initializeHexagonPacketizerPass(PassRegistry&); 61 } 62 63 64 namespace { 65 class HexagonPacketizer : public MachineFunctionPass { 66 67 public: 68 static char ID; 69 HexagonPacketizer() : MachineFunctionPass(ID) { 70 initializeHexagonPacketizerPass(*PassRegistry::getPassRegistry()); 71 } 72 73 void getAnalysisUsage(AnalysisUsage &AU) const { 74 AU.setPreservesCFG(); 75 AU.addRequired<MachineDominatorTree>(); 76 AU.addRequired<MachineBranchProbabilityInfo>(); 77 AU.addPreserved<MachineDominatorTree>(); 78 AU.addRequired<MachineLoopInfo>(); 79 AU.addPreserved<MachineLoopInfo>(); 80 MachineFunctionPass::getAnalysisUsage(AU); 81 } 82 83 const char *getPassName() const { 84 return "Hexagon Packetizer"; 85 } 86 87 bool runOnMachineFunction(MachineFunction &Fn); 88 }; 89 char HexagonPacketizer::ID = 0; 90 91 class HexagonPacketizerList : public VLIWPacketizerList { 92 93 private: 94 95 // Has the instruction been promoted to a dot-new instruction. 96 bool PromotedToDotNew; 97 98 // Has the instruction been glued to allocframe. 99 bool GlueAllocframeStore; 100 101 // Has the feeder instruction been glued to new value jump. 102 bool GlueToNewValueJump; 103 104 // Check if there is a dependence between some instruction already in this 105 // packet and this instruction. 106 bool Dependence; 107 108 // Only check for dependence if there are resources available to 109 // schedule this instruction. 110 bool FoundSequentialDependence; 111 112 /// \brief A handle to the branch probability pass. 113 const MachineBranchProbabilityInfo *MBPI; 114 115 // Track MIs with ignored dependece. 116 std::vector<MachineInstr*> IgnoreDepMIs; 117 118 public: 119 // Ctor. 120 HexagonPacketizerList(MachineFunction &MF, MachineLoopInfo &MLI, 121 MachineDominatorTree &MDT, 122 const MachineBranchProbabilityInfo *MBPI); 123 124 // initPacketizerState - initialize some internal flags. 125 void initPacketizerState(); 126 127 // ignorePseudoInstruction - Ignore bundling of pseudo instructions. 128 bool ignorePseudoInstruction(MachineInstr *MI, MachineBasicBlock *MBB); 129 130 // isSoloInstruction - return true if instruction MI can not be packetized 131 // with any other instruction, which means that MI itself is a packet. 132 bool isSoloInstruction(MachineInstr *MI); 133 134 // isLegalToPacketizeTogether - Is it legal to packetize SUI and SUJ 135 // together. 136 bool isLegalToPacketizeTogether(SUnit *SUI, SUnit *SUJ); 137 138 // isLegalToPruneDependencies - Is it legal to prune dependece between SUI 139 // and SUJ. 140 bool isLegalToPruneDependencies(SUnit *SUI, SUnit *SUJ); 141 142 MachineBasicBlock::iterator addToPacket(MachineInstr *MI); 143 private: 144 bool IsCallDependent(MachineInstr* MI, SDep::Kind DepType, unsigned DepReg); 145 bool PromoteToDotNew(MachineInstr* MI, SDep::Kind DepType, 146 MachineBasicBlock::iterator &MII, 147 const TargetRegisterClass* RC); 148 bool CanPromoteToDotNew(MachineInstr* MI, SUnit* PacketSU, 149 unsigned DepReg, 150 std::map <MachineInstr*, SUnit*> MIToSUnit, 151 MachineBasicBlock::iterator &MII, 152 const TargetRegisterClass* RC); 153 bool CanPromoteToNewValue(MachineInstr* MI, SUnit* PacketSU, 154 unsigned DepReg, 155 std::map <MachineInstr*, SUnit*> MIToSUnit, 156 MachineBasicBlock::iterator &MII); 157 bool CanPromoteToNewValueStore(MachineInstr* MI, MachineInstr* PacketMI, 158 unsigned DepReg, 159 std::map <MachineInstr*, SUnit*> MIToSUnit); 160 bool DemoteToDotOld(MachineInstr* MI); 161 bool ArePredicatesComplements(MachineInstr* MI1, MachineInstr* MI2, 162 std::map <MachineInstr*, SUnit*> MIToSUnit); 163 bool RestrictingDepExistInPacket(MachineInstr*, 164 unsigned, std::map <MachineInstr*, SUnit*>); 165 bool isNewifiable(MachineInstr* MI); 166 bool isCondInst(MachineInstr* MI); 167 bool tryAllocateResourcesForConstExt(MachineInstr* MI); 168 bool canReserveResourcesForConstExt(MachineInstr *MI); 169 void reserveResourcesForConstExt(MachineInstr* MI); 170 bool isNewValueInst(MachineInstr* MI); 171 }; 172 } 173 174 INITIALIZE_PASS_BEGIN(HexagonPacketizer, "packets", "Hexagon Packetizer", 175 false, false) 176 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree) 177 INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo) 178 INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo) 179 INITIALIZE_AG_DEPENDENCY(AliasAnalysis) 180 INITIALIZE_PASS_END(HexagonPacketizer, "packets", "Hexagon Packetizer", 181 false, false) 182 183 184 // HexagonPacketizerList Ctor. 185 HexagonPacketizerList::HexagonPacketizerList( 186 MachineFunction &MF, MachineLoopInfo &MLI,MachineDominatorTree &MDT, 187 const MachineBranchProbabilityInfo *MBPI) 188 : VLIWPacketizerList(MF, MLI, MDT, true){ 189 this->MBPI = MBPI; 190 } 191 192 bool HexagonPacketizer::runOnMachineFunction(MachineFunction &Fn) { 193 const TargetInstrInfo *TII = Fn.getTarget().getInstrInfo(); 194 MachineLoopInfo &MLI = getAnalysis<MachineLoopInfo>(); 195 MachineDominatorTree &MDT = getAnalysis<MachineDominatorTree>(); 196 const MachineBranchProbabilityInfo *MBPI = 197 &getAnalysis<MachineBranchProbabilityInfo>(); 198 // Instantiate the packetizer. 199 HexagonPacketizerList Packetizer(Fn, MLI, MDT, MBPI); 200 201 // DFA state table should not be empty. 202 assert(Packetizer.getResourceTracker() && "Empty DFA table!"); 203 204 // 205 // Loop over all basic blocks and remove KILL pseudo-instructions 206 // These instructions confuse the dependence analysis. Consider: 207 // D0 = ... (Insn 0) 208 // R0 = KILL R0, D0 (Insn 1) 209 // R0 = ... (Insn 2) 210 // Here, Insn 1 will result in the dependence graph not emitting an output 211 // dependence between Insn 0 and Insn 2. This can lead to incorrect 212 // packetization 213 // 214 for (MachineFunction::iterator MBB = Fn.begin(), MBBe = Fn.end(); 215 MBB != MBBe; ++MBB) { 216 MachineBasicBlock::iterator End = MBB->end(); 217 MachineBasicBlock::iterator MI = MBB->begin(); 218 while (MI != End) { 219 if (MI->isKill()) { 220 MachineBasicBlock::iterator DeleteMI = MI; 221 ++MI; 222 MBB->erase(DeleteMI); 223 End = MBB->end(); 224 continue; 225 } 226 ++MI; 227 } 228 } 229 230 // Loop over all of the basic blocks. 231 for (MachineFunction::iterator MBB = Fn.begin(), MBBe = Fn.end(); 232 MBB != MBBe; ++MBB) { 233 // Find scheduling regions and schedule / packetize each region. 234 unsigned RemainingCount = MBB->size(); 235 for(MachineBasicBlock::iterator RegionEnd = MBB->end(); 236 RegionEnd != MBB->begin();) { 237 // The next region starts above the previous region. Look backward in the 238 // instruction stream until we find the nearest boundary. 239 MachineBasicBlock::iterator I = RegionEnd; 240 for(;I != MBB->begin(); --I, --RemainingCount) { 241 if (TII->isSchedulingBoundary(llvm::prior(I), MBB, Fn)) 242 break; 243 } 244 I = MBB->begin(); 245 246 // Skip empty scheduling regions. 247 if (I == RegionEnd) { 248 RegionEnd = llvm::prior(RegionEnd); 249 --RemainingCount; 250 continue; 251 } 252 // Skip regions with one instruction. 253 if (I == llvm::prior(RegionEnd)) { 254 RegionEnd = llvm::prior(RegionEnd); 255 continue; 256 } 257 258 Packetizer.PacketizeMIs(MBB, I, RegionEnd); 259 RegionEnd = I; 260 } 261 } 262 263 return true; 264 } 265 266 267 static bool IsIndirectCall(MachineInstr* MI) { 268 return ((MI->getOpcode() == Hexagon::CALLR) || 269 (MI->getOpcode() == Hexagon::CALLRv3)); 270 } 271 272 // Reserve resources for constant extender. Trigure an assertion if 273 // reservation fail. 274 void HexagonPacketizerList::reserveResourcesForConstExt(MachineInstr* MI) { 275 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 276 MachineFunction *MF = MI->getParent()->getParent(); 277 MachineInstr *PseudoMI = MF->CreateMachineInstr(QII->get(Hexagon::IMMEXT_i), 278 MI->getDebugLoc()); 279 280 if (ResourceTracker->canReserveResources(PseudoMI)) { 281 ResourceTracker->reserveResources(PseudoMI); 282 MI->getParent()->getParent()->DeleteMachineInstr(PseudoMI); 283 } else { 284 MI->getParent()->getParent()->DeleteMachineInstr(PseudoMI); 285 llvm_unreachable("can not reserve resources for constant extender."); 286 } 287 return; 288 } 289 290 bool HexagonPacketizerList::canReserveResourcesForConstExt(MachineInstr *MI) { 291 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 292 assert((QII->isExtended(MI) || QII->isConstExtended(MI)) && 293 "Should only be called for constant extended instructions"); 294 MachineFunction *MF = MI->getParent()->getParent(); 295 MachineInstr *PseudoMI = MF->CreateMachineInstr(QII->get(Hexagon::IMMEXT_i), 296 MI->getDebugLoc()); 297 bool CanReserve = ResourceTracker->canReserveResources(PseudoMI); 298 MF->DeleteMachineInstr(PseudoMI); 299 return CanReserve; 300 } 301 302 // Allocate resources (i.e. 4 bytes) for constant extender. If succeed, return 303 // true, otherwise, return false. 304 bool HexagonPacketizerList::tryAllocateResourcesForConstExt(MachineInstr* MI) { 305 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 306 MachineFunction *MF = MI->getParent()->getParent(); 307 MachineInstr *PseudoMI = MF->CreateMachineInstr(QII->get(Hexagon::IMMEXT_i), 308 MI->getDebugLoc()); 309 310 if (ResourceTracker->canReserveResources(PseudoMI)) { 311 ResourceTracker->reserveResources(PseudoMI); 312 MI->getParent()->getParent()->DeleteMachineInstr(PseudoMI); 313 return true; 314 } else { 315 MI->getParent()->getParent()->DeleteMachineInstr(PseudoMI); 316 return false; 317 } 318 } 319 320 321 bool HexagonPacketizerList::IsCallDependent(MachineInstr* MI, 322 SDep::Kind DepType, 323 unsigned DepReg) { 324 325 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 326 const HexagonRegisterInfo* QRI = 327 (const HexagonRegisterInfo *) TM.getRegisterInfo(); 328 329 // Check for lr dependence 330 if (DepReg == QRI->getRARegister()) { 331 return true; 332 } 333 334 if (QII->isDeallocRet(MI)) { 335 if (DepReg == QRI->getFrameRegister() || 336 DepReg == QRI->getStackRegister()) 337 return true; 338 } 339 340 // Check if this is a predicate dependence 341 const TargetRegisterClass* RC = QRI->getMinimalPhysRegClass(DepReg); 342 if (RC == &Hexagon::PredRegsRegClass) { 343 return true; 344 } 345 346 // 347 // Lastly check for an operand used in an indirect call 348 // If we had an attribute for checking if an instruction is an indirect call, 349 // then we could have avoided this relatively brittle implementation of 350 // IsIndirectCall() 351 // 352 // Assumes that the first operand of the CALLr is the function address 353 // 354 if (IsIndirectCall(MI) && (DepType == SDep::Data)) { 355 MachineOperand MO = MI->getOperand(0); 356 if (MO.isReg() && MO.isUse() && (MO.getReg() == DepReg)) { 357 return true; 358 } 359 } 360 361 return false; 362 } 363 364 static bool IsRegDependence(const SDep::Kind DepType) { 365 return (DepType == SDep::Data || DepType == SDep::Anti || 366 DepType == SDep::Output); 367 } 368 369 static bool IsDirectJump(MachineInstr* MI) { 370 return (MI->getOpcode() == Hexagon::JMP); 371 } 372 373 static bool IsSchedBarrier(MachineInstr* MI) { 374 switch (MI->getOpcode()) { 375 case Hexagon::BARRIER: 376 return true; 377 } 378 return false; 379 } 380 381 static bool IsControlFlow(MachineInstr* MI) { 382 return (MI->getDesc().isTerminator() || MI->getDesc().isCall()); 383 } 384 385 static bool IsLoopN(MachineInstr *MI) { 386 return (MI->getOpcode() == Hexagon::LOOP0_i || 387 MI->getOpcode() == Hexagon::LOOP0_r); 388 } 389 390 /// DoesModifyCalleeSavedReg - Returns true if the instruction modifies a 391 /// callee-saved register. 392 static bool DoesModifyCalleeSavedReg(MachineInstr *MI, 393 const TargetRegisterInfo *TRI) { 394 for (const uint16_t *CSR = TRI->getCalleeSavedRegs(); *CSR; ++CSR) { 395 unsigned CalleeSavedReg = *CSR; 396 if (MI->modifiesRegister(CalleeSavedReg, TRI)) 397 return true; 398 } 399 return false; 400 } 401 402 // Returns true if an instruction can be promoted to .new predicate 403 // or new-value store. 404 bool HexagonPacketizerList::isNewifiable(MachineInstr* MI) { 405 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 406 if ( isCondInst(MI) || QII->mayBeNewStore(MI)) 407 return true; 408 else 409 return false; 410 } 411 412 bool HexagonPacketizerList::isCondInst (MachineInstr* MI) { 413 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 414 const MCInstrDesc& TID = MI->getDesc(); 415 // bug 5670: until that is fixed, 416 // this portion is disabled. 417 if ( TID.isConditionalBranch() // && !IsRegisterJump(MI)) || 418 || QII->isConditionalTransfer(MI) 419 || QII->isConditionalALU32(MI) 420 || QII->isConditionalLoad(MI) 421 || QII->isConditionalStore(MI)) { 422 return true; 423 } 424 return false; 425 } 426 427 428 // Promote an instructiont to its .new form. 429 // At this time, we have already made a call to CanPromoteToDotNew 430 // and made sure that it can *indeed* be promoted. 431 bool HexagonPacketizerList::PromoteToDotNew(MachineInstr* MI, 432 SDep::Kind DepType, MachineBasicBlock::iterator &MII, 433 const TargetRegisterClass* RC) { 434 435 assert (DepType == SDep::Data); 436 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 437 438 int NewOpcode; 439 if (RC == &Hexagon::PredRegsRegClass) 440 NewOpcode = QII->GetDotNewPredOp(MI, MBPI); 441 else 442 NewOpcode = QII->GetDotNewOp(MI); 443 MI->setDesc(QII->get(NewOpcode)); 444 445 return true; 446 } 447 448 bool HexagonPacketizerList::DemoteToDotOld(MachineInstr* MI) { 449 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 450 int NewOpcode = QII->GetDotOldOp(MI->getOpcode()); 451 MI->setDesc(QII->get(NewOpcode)); 452 return true; 453 } 454 455 enum PredicateKind { 456 PK_False, 457 PK_True, 458 PK_Unknown 459 }; 460 461 /// Returns true if an instruction is predicated on p0 and false if it's 462 /// predicated on !p0. 463 static PredicateKind getPredicateSense(MachineInstr* MI, 464 const HexagonInstrInfo *QII) { 465 if (!QII->isPredicated(MI)) 466 return PK_Unknown; 467 468 if (QII->isPredicatedTrue(MI)) 469 return PK_True; 470 471 return PK_False; 472 } 473 474 static MachineOperand& GetPostIncrementOperand(MachineInstr *MI, 475 const HexagonInstrInfo *QII) { 476 assert(QII->isPostIncrement(MI) && "Not a post increment operation."); 477 #ifndef NDEBUG 478 // Post Increment means duplicates. Use dense map to find duplicates in the 479 // list. Caution: Densemap initializes with the minimum of 64 buckets, 480 // whereas there are at most 5 operands in the post increment. 481 DenseMap<unsigned, unsigned> DefRegsSet; 482 for(unsigned opNum = 0; opNum < MI->getNumOperands(); opNum++) 483 if (MI->getOperand(opNum).isReg() && 484 MI->getOperand(opNum).isDef()) { 485 DefRegsSet[MI->getOperand(opNum).getReg()] = 1; 486 } 487 488 for(unsigned opNum = 0; opNum < MI->getNumOperands(); opNum++) 489 if (MI->getOperand(opNum).isReg() && 490 MI->getOperand(opNum).isUse()) { 491 if (DefRegsSet[MI->getOperand(opNum).getReg()]) { 492 return MI->getOperand(opNum); 493 } 494 } 495 #else 496 if (MI->getDesc().mayLoad()) { 497 // The 2nd operand is always the post increment operand in load. 498 assert(MI->getOperand(1).isReg() && 499 "Post increment operand has be to a register."); 500 return (MI->getOperand(1)); 501 } 502 if (MI->getDesc().mayStore()) { 503 // The 1st operand is always the post increment operand in store. 504 assert(MI->getOperand(0).isReg() && 505 "Post increment operand has be to a register."); 506 return (MI->getOperand(0)); 507 } 508 #endif 509 // we should never come here. 510 llvm_unreachable("mayLoad or mayStore not set for Post Increment operation"); 511 } 512 513 // get the value being stored 514 static MachineOperand& GetStoreValueOperand(MachineInstr *MI) { 515 // value being stored is always the last operand. 516 return (MI->getOperand(MI->getNumOperands()-1)); 517 } 518 519 // can be new value store? 520 // Following restrictions are to be respected in convert a store into 521 // a new value store. 522 // 1. If an instruction uses auto-increment, its address register cannot 523 // be a new-value register. Arch Spec 5.4.2.1 524 // 2. If an instruction uses absolute-set addressing mode, 525 // its address register cannot be a new-value register. 526 // Arch Spec 5.4.2.1.TODO: This is not enabled as 527 // as absolute-set address mode patters are not implemented. 528 // 3. If an instruction produces a 64-bit result, its registers cannot be used 529 // as new-value registers. Arch Spec 5.4.2.2. 530 // 4. If the instruction that sets a new-value register is conditional, then 531 // the instruction that uses the new-value register must also be conditional, 532 // and both must always have their predicates evaluate identically. 533 // Arch Spec 5.4.2.3. 534 // 5. There is an implied restriction of a packet can not have another store, 535 // if there is a new value store in the packet. Corollary, if there is 536 // already a store in a packet, there can not be a new value store. 537 // Arch Spec: 3.4.4.2 538 bool HexagonPacketizerList::CanPromoteToNewValueStore( MachineInstr *MI, 539 MachineInstr *PacketMI, unsigned DepReg, 540 std::map <MachineInstr*, SUnit*> MIToSUnit) { 541 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 542 // Make sure we are looking at the store, that can be promoted. 543 if (!QII->mayBeNewStore(MI)) 544 return false; 545 546 // Make sure there is dependency and can be new value'ed 547 if (GetStoreValueOperand(MI).isReg() && 548 GetStoreValueOperand(MI).getReg() != DepReg) 549 return false; 550 551 const HexagonRegisterInfo* QRI = 552 (const HexagonRegisterInfo *) TM.getRegisterInfo(); 553 const MCInstrDesc& MCID = PacketMI->getDesc(); 554 // first operand is always the result 555 556 const TargetRegisterClass* PacketRC = QII->getRegClass(MCID, 0, QRI, MF); 557 558 // if there is already an store in the packet, no can do new value store 559 // Arch Spec 3.4.4.2. 560 for (std::vector<MachineInstr*>::iterator VI = CurrentPacketMIs.begin(), 561 VE = CurrentPacketMIs.end(); 562 (VI != VE); ++VI) { 563 SUnit* PacketSU = MIToSUnit[*VI]; 564 if (PacketSU->getInstr()->getDesc().mayStore() || 565 // if we have mayStore = 1 set on ALLOCFRAME and DEALLOCFRAME, 566 // then we don't need this 567 PacketSU->getInstr()->getOpcode() == Hexagon::ALLOCFRAME || 568 PacketSU->getInstr()->getOpcode() == Hexagon::DEALLOCFRAME) 569 return false; 570 } 571 572 if (PacketRC == &Hexagon::DoubleRegsRegClass) { 573 // new value store constraint: double regs can not feed into new value store 574 // arch spec section: 5.4.2.2 575 return false; 576 } 577 578 // Make sure it's NOT the post increment register that we are going to 579 // new value. 580 if (QII->isPostIncrement(MI) && 581 MI->getDesc().mayStore() && 582 GetPostIncrementOperand(MI, QII).getReg() == DepReg) { 583 return false; 584 } 585 586 if (QII->isPostIncrement(PacketMI) && 587 PacketMI->getDesc().mayLoad() && 588 GetPostIncrementOperand(PacketMI, QII).getReg() == DepReg) { 589 // if source is post_inc, or absolute-set addressing, 590 // it can not feed into new value store 591 // r3 = memw(r2++#4) 592 // memw(r30 + #-1404) = r2.new -> can not be new value store 593 // arch spec section: 5.4.2.1 594 return false; 595 } 596 597 // If the source that feeds the store is predicated, new value store must 598 // also be predicated. 599 if (QII->isPredicated(PacketMI)) { 600 if (!QII->isPredicated(MI)) 601 return false; 602 603 // Check to make sure that they both will have their predicates 604 // evaluate identically 605 unsigned predRegNumSrc = 0; 606 unsigned predRegNumDst = 0; 607 const TargetRegisterClass* predRegClass = NULL; 608 609 // Get predicate register used in the source instruction 610 for(unsigned opNum = 0; opNum < PacketMI->getNumOperands(); opNum++) { 611 if ( PacketMI->getOperand(opNum).isReg()) 612 predRegNumSrc = PacketMI->getOperand(opNum).getReg(); 613 predRegClass = QRI->getMinimalPhysRegClass(predRegNumSrc); 614 if (predRegClass == &Hexagon::PredRegsRegClass) { 615 break; 616 } 617 } 618 assert ((predRegClass == &Hexagon::PredRegsRegClass ) && 619 ("predicate register not found in a predicated PacketMI instruction")); 620 621 // Get predicate register used in new-value store instruction 622 for(unsigned opNum = 0; opNum < MI->getNumOperands(); opNum++) { 623 if ( MI->getOperand(opNum).isReg()) 624 predRegNumDst = MI->getOperand(opNum).getReg(); 625 predRegClass = QRI->getMinimalPhysRegClass(predRegNumDst); 626 if (predRegClass == &Hexagon::PredRegsRegClass) { 627 break; 628 } 629 } 630 assert ((predRegClass == &Hexagon::PredRegsRegClass ) && 631 ("predicate register not found in a predicated MI instruction")); 632 633 // New-value register producer and user (store) need to satisfy these 634 // constraints: 635 // 1) Both instructions should be predicated on the same register. 636 // 2) If producer of the new-value register is .new predicated then store 637 // should also be .new predicated and if producer is not .new predicated 638 // then store should not be .new predicated. 639 // 3) Both new-value register producer and user should have same predicate 640 // sense, i.e, either both should be negated or both should be none negated. 641 642 if (( predRegNumDst != predRegNumSrc) || 643 QII->isDotNewInst(PacketMI) != QII->isDotNewInst(MI) || 644 getPredicateSense(MI, QII) != getPredicateSense(PacketMI, QII)) { 645 return false; 646 } 647 } 648 649 // Make sure that other than the new-value register no other store instruction 650 // register has been modified in the same packet. Predicate registers can be 651 // modified by they should not be modified between the producer and the store 652 // instruction as it will make them both conditional on different values. 653 // We already know this to be true for all the instructions before and 654 // including PacketMI. Howerver, we need to perform the check for the 655 // remaining instructions in the packet. 656 657 std::vector<MachineInstr*>::iterator VI; 658 std::vector<MachineInstr*>::iterator VE; 659 unsigned StartCheck = 0; 660 661 for (VI=CurrentPacketMIs.begin(), VE = CurrentPacketMIs.end(); 662 (VI != VE); ++VI) { 663 SUnit* TempSU = MIToSUnit[*VI]; 664 MachineInstr* TempMI = TempSU->getInstr(); 665 666 // Following condition is true for all the instructions until PacketMI is 667 // reached (StartCheck is set to 0 before the for loop). 668 // StartCheck flag is 1 for all the instructions after PacketMI. 669 if (TempMI != PacketMI && !StartCheck) // start processing only after 670 continue; // encountering PacketMI 671 672 StartCheck = 1; 673 if (TempMI == PacketMI) // We don't want to check PacketMI for dependence 674 continue; 675 676 for(unsigned opNum = 0; opNum < MI->getNumOperands(); opNum++) { 677 if (MI->getOperand(opNum).isReg() && 678 TempSU->getInstr()->modifiesRegister(MI->getOperand(opNum).getReg(), 679 QRI)) 680 return false; 681 } 682 } 683 684 // Make sure that for non POST_INC stores: 685 // 1. The only use of reg is DepReg and no other registers. 686 // This handles V4 base+index registers. 687 // The following store can not be dot new. 688 // Eg. r0 = add(r0, #3)a 689 // memw(r1+r0<<#2) = r0 690 if (!QII->isPostIncrement(MI) && 691 GetStoreValueOperand(MI).isReg() && 692 GetStoreValueOperand(MI).getReg() == DepReg) { 693 for(unsigned opNum = 0; opNum < MI->getNumOperands()-1; opNum++) { 694 if (MI->getOperand(opNum).isReg() && 695 MI->getOperand(opNum).getReg() == DepReg) { 696 return false; 697 } 698 } 699 // 2. If data definition is because of implicit definition of the register, 700 // do not newify the store. Eg. 701 // %R9<def> = ZXTH %R12, %D6<imp-use>, %R12<imp-def> 702 // STrih_indexed %R8, 2, %R12<kill>; mem:ST2[%scevgep343] 703 for(unsigned opNum = 0; opNum < PacketMI->getNumOperands(); opNum++) { 704 if (PacketMI->getOperand(opNum).isReg() && 705 PacketMI->getOperand(opNum).getReg() == DepReg && 706 PacketMI->getOperand(opNum).isDef() && 707 PacketMI->getOperand(opNum).isImplicit()) { 708 return false; 709 } 710 } 711 } 712 713 // Can be dot new store. 714 return true; 715 } 716 717 // can this MI to promoted to either 718 // new value store or new value jump 719 bool HexagonPacketizerList::CanPromoteToNewValue( MachineInstr *MI, 720 SUnit *PacketSU, unsigned DepReg, 721 std::map <MachineInstr*, SUnit*> MIToSUnit, 722 MachineBasicBlock::iterator &MII) 723 { 724 725 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 726 const HexagonRegisterInfo* QRI = 727 (const HexagonRegisterInfo *) TM.getRegisterInfo(); 728 if (!QRI->Subtarget.hasV4TOps() || 729 !QII->mayBeNewStore(MI)) 730 return false; 731 732 MachineInstr *PacketMI = PacketSU->getInstr(); 733 734 // Check to see the store can be new value'ed. 735 if (CanPromoteToNewValueStore(MI, PacketMI, DepReg, MIToSUnit)) 736 return true; 737 738 // Check to see the compare/jump can be new value'ed. 739 // This is done as a pass on its own. Don't need to check it here. 740 return false; 741 } 742 743 // Check to see if an instruction can be dot new 744 // There are three kinds. 745 // 1. dot new on predicate - V2/V3/V4 746 // 2. dot new on stores NV/ST - V4 747 // 3. dot new on jump NV/J - V4 -- This is generated in a pass. 748 bool HexagonPacketizerList::CanPromoteToDotNew( MachineInstr *MI, 749 SUnit *PacketSU, unsigned DepReg, 750 std::map <MachineInstr*, SUnit*> MIToSUnit, 751 MachineBasicBlock::iterator &MII, 752 const TargetRegisterClass* RC ) 753 { 754 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 755 // Already a dot new instruction. 756 if (QII->isDotNewInst(MI) && !QII->mayBeNewStore(MI)) 757 return false; 758 759 if (!isNewifiable(MI)) 760 return false; 761 762 // predicate .new 763 if (RC == &Hexagon::PredRegsRegClass && isCondInst(MI)) 764 return true; 765 else if (RC != &Hexagon::PredRegsRegClass && 766 !QII->mayBeNewStore(MI)) // MI is not a new-value store 767 return false; 768 else { 769 // Create a dot new machine instruction to see if resources can be 770 // allocated. If not, bail out now. 771 int NewOpcode = QII->GetDotNewOp(MI); 772 const MCInstrDesc &desc = QII->get(NewOpcode); 773 DebugLoc dl; 774 MachineInstr *NewMI = 775 MI->getParent()->getParent()->CreateMachineInstr(desc, dl); 776 bool ResourcesAvailable = ResourceTracker->canReserveResources(NewMI); 777 MI->getParent()->getParent()->DeleteMachineInstr(NewMI); 778 779 if (!ResourcesAvailable) 780 return false; 781 782 // new value store only 783 // new new value jump generated as a passes 784 if (!CanPromoteToNewValue(MI, PacketSU, DepReg, MIToSUnit, MII)) { 785 return false; 786 } 787 } 788 return true; 789 } 790 791 // Go through the packet instructions and search for anti dependency 792 // between them and DepReg from MI 793 // Consider this case: 794 // Trying to add 795 // a) %R1<def> = TFRI_cdNotPt %P3, 2 796 // to this packet: 797 // { 798 // b) %P0<def> = OR_pp %P3<kill>, %P0<kill> 799 // c) %P3<def> = TFR_PdRs %R23 800 // d) %R1<def> = TFRI_cdnPt %P3, 4 801 // } 802 // The P3 from a) and d) will be complements after 803 // a)'s P3 is converted to .new form 804 // Anti Dep between c) and b) is irrelevant for this case 805 bool HexagonPacketizerList::RestrictingDepExistInPacket (MachineInstr* MI, 806 unsigned DepReg, 807 std::map <MachineInstr*, SUnit*> MIToSUnit) { 808 809 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 810 SUnit* PacketSUDep = MIToSUnit[MI]; 811 812 for (std::vector<MachineInstr*>::iterator VIN = CurrentPacketMIs.begin(), 813 VEN = CurrentPacketMIs.end(); (VIN != VEN); ++VIN) { 814 815 // We only care for dependencies to predicated instructions 816 if(!QII->isPredicated(*VIN)) continue; 817 818 // Scheduling Unit for current insn in the packet 819 SUnit* PacketSU = MIToSUnit[*VIN]; 820 821 // Look at dependencies between current members of the packet 822 // and predicate defining instruction MI. 823 // Make sure that dependency is on the exact register 824 // we care about. 825 if (PacketSU->isSucc(PacketSUDep)) { 826 for (unsigned i = 0; i < PacketSU->Succs.size(); ++i) { 827 if ((PacketSU->Succs[i].getSUnit() == PacketSUDep) && 828 (PacketSU->Succs[i].getKind() == SDep::Anti) && 829 (PacketSU->Succs[i].getReg() == DepReg)) { 830 return true; 831 } 832 } 833 } 834 } 835 836 return false; 837 } 838 839 840 /// Gets the predicate register of a predicated instruction. 841 static unsigned getPredicatedRegister(MachineInstr *MI, 842 const HexagonInstrInfo *QII) { 843 /// We use the following rule: The first predicate register that is a use is 844 /// the predicate register of a predicated instruction. 845 846 assert(QII->isPredicated(MI) && "Must be predicated instruction"); 847 848 for (MachineInstr::mop_iterator OI = MI->operands_begin(), 849 OE = MI->operands_end(); OI != OE; ++OI) { 850 MachineOperand &Op = *OI; 851 if (Op.isReg() && Op.getReg() && Op.isUse() && 852 Hexagon::PredRegsRegClass.contains(Op.getReg())) 853 return Op.getReg(); 854 } 855 856 llvm_unreachable("Unknown instruction operand layout"); 857 858 return 0; 859 } 860 861 // Given two predicated instructions, this function detects whether 862 // the predicates are complements 863 bool HexagonPacketizerList::ArePredicatesComplements (MachineInstr* MI1, 864 MachineInstr* MI2, std::map <MachineInstr*, SUnit*> MIToSUnit) { 865 866 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 867 868 // If we don't know the predicate sense of the instructions bail out early, we 869 // need it later. 870 if (getPredicateSense(MI1, QII) == PK_Unknown || 871 getPredicateSense(MI2, QII) == PK_Unknown) 872 return false; 873 874 // Scheduling unit for candidate 875 SUnit* SU = MIToSUnit[MI1]; 876 877 // One corner case deals with the following scenario: 878 // Trying to add 879 // a) %R24<def> = TFR_cPt %P0, %R25 880 // to this packet: 881 // 882 // { 883 // b) %R25<def> = TFR_cNotPt %P0, %R24 884 // c) %P0<def> = CMPEQri %R26, 1 885 // } 886 // 887 // On general check a) and b) are complements, but 888 // presence of c) will convert a) to .new form, and 889 // then it is not a complement 890 // We attempt to detect it by analyzing existing 891 // dependencies in the packet 892 893 // Analyze relationships between all existing members of the packet. 894 // Look for Anti dependecy on the same predicate reg 895 // as used in the candidate 896 for (std::vector<MachineInstr*>::iterator VIN = CurrentPacketMIs.begin(), 897 VEN = CurrentPacketMIs.end(); (VIN != VEN); ++VIN) { 898 899 // Scheduling Unit for current insn in the packet 900 SUnit* PacketSU = MIToSUnit[*VIN]; 901 902 // If this instruction in the packet is succeeded by the candidate... 903 if (PacketSU->isSucc(SU)) { 904 for (unsigned i = 0; i < PacketSU->Succs.size(); ++i) { 905 // The corner case exist when there is true data 906 // dependency between candidate and one of current 907 // packet members, this dep is on predicate reg, and 908 // there already exist anti dep on the same pred in 909 // the packet. 910 if (PacketSU->Succs[i].getSUnit() == SU && 911 PacketSU->Succs[i].getKind() == SDep::Data && 912 Hexagon::PredRegsRegClass.contains( 913 PacketSU->Succs[i].getReg()) && 914 // Here I know that *VIN is predicate setting instruction 915 // with true data dep to candidate on the register 916 // we care about - c) in the above example. 917 // Now I need to see if there is an anti dependency 918 // from c) to any other instruction in the 919 // same packet on the pred reg of interest 920 RestrictingDepExistInPacket(*VIN,PacketSU->Succs[i].getReg(), 921 MIToSUnit)) { 922 return false; 923 } 924 } 925 } 926 } 927 928 // If the above case does not apply, check regular 929 // complement condition. 930 // Check that the predicate register is the same and 931 // that the predicate sense is different 932 // We also need to differentiate .old vs. .new: 933 // !p0 is not complimentary to p0.new 934 unsigned PReg1 = getPredicatedRegister(MI1, QII); 935 unsigned PReg2 = getPredicatedRegister(MI2, QII); 936 return ((PReg1 == PReg2) && 937 Hexagon::PredRegsRegClass.contains(PReg1) && 938 Hexagon::PredRegsRegClass.contains(PReg2) && 939 (getPredicateSense(MI1, QII) != getPredicateSense(MI2, QII)) && 940 (QII->isDotNewInst(MI1) == QII->isDotNewInst(MI2))); 941 } 942 943 // initPacketizerState - Initialize packetizer flags 944 void HexagonPacketizerList::initPacketizerState() { 945 946 Dependence = false; 947 PromotedToDotNew = false; 948 GlueToNewValueJump = false; 949 GlueAllocframeStore = false; 950 FoundSequentialDependence = false; 951 952 return; 953 } 954 955 // ignorePseudoInstruction - Ignore bundling of pseudo instructions. 956 bool HexagonPacketizerList::ignorePseudoInstruction(MachineInstr *MI, 957 MachineBasicBlock *MBB) { 958 if (MI->isDebugValue()) 959 return true; 960 961 // We must print out inline assembly 962 if (MI->isInlineAsm()) 963 return false; 964 965 // We check if MI has any functional units mapped to it. 966 // If it doesn't, we ignore the instruction. 967 const MCInstrDesc& TID = MI->getDesc(); 968 unsigned SchedClass = TID.getSchedClass(); 969 const InstrStage* IS = 970 ResourceTracker->getInstrItins()->beginStage(SchedClass); 971 unsigned FuncUnits = IS->getUnits(); 972 return !FuncUnits; 973 } 974 975 // isSoloInstruction: - Returns true for instructions that must be 976 // scheduled in their own packet. 977 bool HexagonPacketizerList::isSoloInstruction(MachineInstr *MI) { 978 979 if (MI->isInlineAsm()) 980 return true; 981 982 if (MI->isEHLabel()) 983 return true; 984 985 // From Hexagon V4 Programmer's Reference Manual 3.4.4 Grouping constraints: 986 // trap, pause, barrier, icinva, isync, and syncht are solo instructions. 987 // They must not be grouped with other instructions in a packet. 988 if (IsSchedBarrier(MI)) 989 return true; 990 991 return false; 992 } 993 994 // isLegalToPacketizeTogether: 995 // SUI is the current instruction that is out side of the current packet. 996 // SUJ is the current instruction inside the current packet against which that 997 // SUI will be packetized. 998 bool HexagonPacketizerList::isLegalToPacketizeTogether(SUnit *SUI, SUnit *SUJ) { 999 MachineInstr *I = SUI->getInstr(); 1000 MachineInstr *J = SUJ->getInstr(); 1001 assert(I && J && "Unable to packetize null instruction!"); 1002 1003 const MCInstrDesc &MCIDI = I->getDesc(); 1004 const MCInstrDesc &MCIDJ = J->getDesc(); 1005 1006 MachineBasicBlock::iterator II = I; 1007 1008 const unsigned FrameSize = MF.getFrameInfo()->getStackSize(); 1009 const HexagonRegisterInfo* QRI = 1010 (const HexagonRegisterInfo *) TM.getRegisterInfo(); 1011 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 1012 1013 // Inline asm cannot go in the packet. 1014 if (I->getOpcode() == Hexagon::INLINEASM) 1015 llvm_unreachable("Should not meet inline asm here!"); 1016 1017 if (isSoloInstruction(I)) 1018 llvm_unreachable("Should not meet solo instr here!"); 1019 1020 // A save callee-save register function call can only be in a packet 1021 // with instructions that don't write to the callee-save registers. 1022 if ((QII->isSaveCalleeSavedRegsCall(I) && 1023 DoesModifyCalleeSavedReg(J, QRI)) || 1024 (QII->isSaveCalleeSavedRegsCall(J) && 1025 DoesModifyCalleeSavedReg(I, QRI))) { 1026 Dependence = true; 1027 return false; 1028 } 1029 1030 // Two control flow instructions cannot go in the same packet. 1031 if (IsControlFlow(I) && IsControlFlow(J)) { 1032 Dependence = true; 1033 return false; 1034 } 1035 1036 // A LoopN instruction cannot appear in the same packet as a jump or call. 1037 if (IsLoopN(I) && 1038 (IsDirectJump(J) || MCIDJ.isCall() || QII->isDeallocRet(J))) { 1039 Dependence = true; 1040 return false; 1041 } 1042 if (IsLoopN(J) && 1043 (IsDirectJump(I) || MCIDI.isCall() || QII->isDeallocRet(I))) { 1044 Dependence = true; 1045 return false; 1046 } 1047 1048 // dealloc_return cannot appear in the same packet as a conditional or 1049 // unconditional jump. 1050 if (QII->isDeallocRet(I) && 1051 (MCIDJ.isBranch() || MCIDJ.isCall() || MCIDJ.isBarrier())) { 1052 Dependence = true; 1053 return false; 1054 } 1055 1056 1057 // V4 allows dual store. But does not allow second store, if the 1058 // first store is not in SLOT0. New value store, new value jump, 1059 // dealloc_return and memop always take SLOT0. 1060 // Arch spec 3.4.4.2 1061 if (QRI->Subtarget.hasV4TOps()) { 1062 if (MCIDI.mayStore() && MCIDJ.mayStore() && 1063 (QII->isNewValueInst(J) || QII->isMemOp(J) || QII->isMemOp(I))) { 1064 Dependence = true; 1065 return false; 1066 } 1067 1068 if ((QII->isMemOp(J) && MCIDI.mayStore()) 1069 || (MCIDJ.mayStore() && QII->isMemOp(I)) 1070 || (QII->isMemOp(J) && QII->isMemOp(I))) { 1071 Dependence = true; 1072 return false; 1073 } 1074 1075 //if dealloc_return 1076 if (MCIDJ.mayStore() && QII->isDeallocRet(I)) { 1077 Dependence = true; 1078 return false; 1079 } 1080 1081 // If an instruction feeds new value jump, glue it. 1082 MachineBasicBlock::iterator NextMII = I; 1083 ++NextMII; 1084 if (NextMII != I->getParent()->end() && QII->isNewValueJump(NextMII)) { 1085 MachineInstr *NextMI = NextMII; 1086 1087 bool secondRegMatch = false; 1088 bool maintainNewValueJump = false; 1089 1090 if (NextMI->getOperand(1).isReg() && 1091 I->getOperand(0).getReg() == NextMI->getOperand(1).getReg()) { 1092 secondRegMatch = true; 1093 maintainNewValueJump = true; 1094 } 1095 1096 if (!secondRegMatch && 1097 I->getOperand(0).getReg() == NextMI->getOperand(0).getReg()) { 1098 maintainNewValueJump = true; 1099 } 1100 1101 for (std::vector<MachineInstr*>::iterator 1102 VI = CurrentPacketMIs.begin(), 1103 VE = CurrentPacketMIs.end(); 1104 (VI != VE && maintainNewValueJump); ++VI) { 1105 SUnit* PacketSU = MIToSUnit[*VI]; 1106 1107 // NVJ can not be part of the dual jump - Arch Spec: section 7.8 1108 if (PacketSU->getInstr()->getDesc().isCall()) { 1109 Dependence = true; 1110 break; 1111 } 1112 // Validate 1113 // 1. Packet does not have a store in it. 1114 // 2. If the first operand of the nvj is newified, and the second 1115 // operand is also a reg, it (second reg) is not defined in 1116 // the same packet. 1117 // 3. If the second operand of the nvj is newified, (which means 1118 // first operand is also a reg), first reg is not defined in 1119 // the same packet. 1120 if (PacketSU->getInstr()->getDesc().mayStore() || 1121 PacketSU->getInstr()->getOpcode() == Hexagon::ALLOCFRAME || 1122 // Check #2. 1123 (!secondRegMatch && NextMI->getOperand(1).isReg() && 1124 PacketSU->getInstr()->modifiesRegister( 1125 NextMI->getOperand(1).getReg(), QRI)) || 1126 // Check #3. 1127 (secondRegMatch && 1128 PacketSU->getInstr()->modifiesRegister( 1129 NextMI->getOperand(0).getReg(), QRI))) { 1130 Dependence = true; 1131 break; 1132 } 1133 } 1134 if (!Dependence) 1135 GlueToNewValueJump = true; 1136 else 1137 return false; 1138 } 1139 } 1140 1141 if (SUJ->isSucc(SUI)) { 1142 for (unsigned i = 0; 1143 (i < SUJ->Succs.size()) && !FoundSequentialDependence; 1144 ++i) { 1145 1146 if (SUJ->Succs[i].getSUnit() != SUI) { 1147 continue; 1148 } 1149 1150 SDep::Kind DepType = SUJ->Succs[i].getKind(); 1151 1152 // For direct calls: 1153 // Ignore register dependences for call instructions for 1154 // packetization purposes except for those due to r31 and 1155 // predicate registers. 1156 // 1157 // For indirect calls: 1158 // Same as direct calls + check for true dependences to the register 1159 // used in the indirect call. 1160 // 1161 // We completely ignore Order dependences for call instructions 1162 // 1163 // For returns: 1164 // Ignore register dependences for return instructions like jumpr, 1165 // dealloc return unless we have dependencies on the explicit uses 1166 // of the registers used by jumpr (like r31) or dealloc return 1167 // (like r29 or r30). 1168 // 1169 // TODO: Currently, jumpr is handling only return of r31. So, the 1170 // following logic (specificaly IsCallDependent) is working fine. 1171 // We need to enable jumpr for register other than r31 and then, 1172 // we need to rework the last part, where it handles indirect call 1173 // of that (IsCallDependent) function. Bug 6216 is opened for this. 1174 // 1175 unsigned DepReg = 0; 1176 const TargetRegisterClass* RC = NULL; 1177 if (DepType == SDep::Data) { 1178 DepReg = SUJ->Succs[i].getReg(); 1179 RC = QRI->getMinimalPhysRegClass(DepReg); 1180 } 1181 if ((MCIDI.isCall() || MCIDI.isReturn()) && 1182 (!IsRegDependence(DepType) || 1183 !IsCallDependent(I, DepType, SUJ->Succs[i].getReg()))) { 1184 /* do nothing */ 1185 } 1186 1187 // For instructions that can be promoted to dot-new, try to promote. 1188 else if ((DepType == SDep::Data) && 1189 CanPromoteToDotNew(I, SUJ, DepReg, MIToSUnit, II, RC) && 1190 PromoteToDotNew(I, DepType, II, RC)) { 1191 PromotedToDotNew = true; 1192 /* do nothing */ 1193 } 1194 1195 else if ((DepType == SDep::Data) && 1196 (QII->isNewValueJump(I))) { 1197 /* do nothing */ 1198 } 1199 1200 // For predicated instructions, if the predicates are complements 1201 // then there can be no dependence. 1202 else if (QII->isPredicated(I) && 1203 QII->isPredicated(J) && 1204 ArePredicatesComplements(I, J, MIToSUnit)) { 1205 /* do nothing */ 1206 1207 } 1208 else if (IsDirectJump(I) && 1209 !MCIDJ.isBranch() && 1210 !MCIDJ.isCall() && 1211 (DepType == SDep::Order)) { 1212 // Ignore Order dependences between unconditional direct branches 1213 // and non-control-flow instructions 1214 /* do nothing */ 1215 } 1216 else if (MCIDI.isConditionalBranch() && (DepType != SDep::Data) && 1217 (DepType != SDep::Output)) { 1218 // Ignore all dependences for jumps except for true and output 1219 // dependences 1220 /* do nothing */ 1221 } 1222 1223 // Ignore output dependences due to superregs. We can 1224 // write to two different subregisters of R1:0 for instance 1225 // in the same cycle 1226 // 1227 1228 // 1229 // Let the 1230 // If neither I nor J defines DepReg, then this is a 1231 // superfluous output dependence. The dependence must be of the 1232 // form: 1233 // R0 = ... 1234 // R1 = ... 1235 // and there is an output dependence between the two instructions 1236 // with 1237 // DepReg = D0 1238 // We want to ignore these dependences. 1239 // Ideally, the dependence constructor should annotate such 1240 // dependences. We can then avoid this relatively expensive check. 1241 // 1242 else if (DepType == SDep::Output) { 1243 // DepReg is the register that's responsible for the dependence. 1244 unsigned DepReg = SUJ->Succs[i].getReg(); 1245 1246 // Check if I and J really defines DepReg. 1247 if (I->definesRegister(DepReg) || 1248 J->definesRegister(DepReg)) { 1249 FoundSequentialDependence = true; 1250 break; 1251 } 1252 } 1253 1254 // We ignore Order dependences for 1255 // 1. Two loads unless they are volatile. 1256 // 2. Two stores in V4 unless they are volatile. 1257 else if ((DepType == SDep::Order) && 1258 !I->hasOrderedMemoryRef() && 1259 !J->hasOrderedMemoryRef()) { 1260 if (QRI->Subtarget.hasV4TOps() && 1261 // hexagonv4 allows dual store. 1262 MCIDI.mayStore() && MCIDJ.mayStore()) { 1263 /* do nothing */ 1264 } 1265 // store followed by store-- not OK on V2 1266 // store followed by load -- not OK on all (OK if addresses 1267 // are not aliased) 1268 // load followed by store -- OK on all 1269 // load followed by load -- OK on all 1270 else if ( !MCIDJ.mayStore()) { 1271 /* do nothing */ 1272 } 1273 else { 1274 FoundSequentialDependence = true; 1275 break; 1276 } 1277 } 1278 1279 // For V4, special case ALLOCFRAME. Even though there is dependency 1280 // between ALLOCAFRAME and subsequent store, allow it to be 1281 // packetized in a same packet. This implies that the store is using 1282 // caller's SP. Hense, offset needs to be updated accordingly. 1283 else if (DepType == SDep::Data 1284 && QRI->Subtarget.hasV4TOps() 1285 && J->getOpcode() == Hexagon::ALLOCFRAME 1286 && (I->getOpcode() == Hexagon::STrid 1287 || I->getOpcode() == Hexagon::STriw 1288 || I->getOpcode() == Hexagon::STrib) 1289 && I->getOperand(0).getReg() == QRI->getStackRegister() 1290 && QII->isValidOffset(I->getOpcode(), 1291 I->getOperand(1).getImm() - 1292 (FrameSize + HEXAGON_LRFP_SIZE))) 1293 { 1294 GlueAllocframeStore = true; 1295 // Since this store is to be glued with allocframe in the same 1296 // packet, it will use SP of the previous stack frame, i.e 1297 // caller's SP. Therefore, we need to recalculate offset according 1298 // to this change. 1299 I->getOperand(1).setImm(I->getOperand(1).getImm() - 1300 (FrameSize + HEXAGON_LRFP_SIZE)); 1301 } 1302 1303 // 1304 // Skip over anti-dependences. Two instructions that are 1305 // anti-dependent can share a packet 1306 // 1307 else if (DepType != SDep::Anti) { 1308 FoundSequentialDependence = true; 1309 break; 1310 } 1311 } 1312 1313 if (FoundSequentialDependence) { 1314 Dependence = true; 1315 return false; 1316 } 1317 } 1318 1319 return true; 1320 } 1321 1322 // isLegalToPruneDependencies 1323 bool HexagonPacketizerList::isLegalToPruneDependencies(SUnit *SUI, SUnit *SUJ) { 1324 MachineInstr *I = SUI->getInstr(); 1325 assert(I && SUJ->getInstr() && "Unable to packetize null instruction!"); 1326 1327 const unsigned FrameSize = MF.getFrameInfo()->getStackSize(); 1328 1329 if (Dependence) { 1330 1331 // Check if the instruction was promoted to a dot-new. If so, demote it 1332 // back into a dot-old. 1333 if (PromotedToDotNew) { 1334 DemoteToDotOld(I); 1335 } 1336 1337 // Check if the instruction (must be a store) was glued with an Allocframe 1338 // instruction. If so, restore its offset to its original value, i.e. use 1339 // curent SP instead of caller's SP. 1340 if (GlueAllocframeStore) { 1341 I->getOperand(1).setImm(I->getOperand(1).getImm() + 1342 FrameSize + HEXAGON_LRFP_SIZE); 1343 } 1344 1345 return false; 1346 } 1347 return true; 1348 } 1349 1350 MachineBasicBlock::iterator 1351 HexagonPacketizerList::addToPacket(MachineInstr *MI) { 1352 1353 MachineBasicBlock::iterator MII = MI; 1354 MachineBasicBlock *MBB = MI->getParent(); 1355 1356 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 1357 1358 if (GlueToNewValueJump) { 1359 1360 ++MII; 1361 MachineInstr *nvjMI = MII; 1362 assert(ResourceTracker->canReserveResources(MI)); 1363 ResourceTracker->reserveResources(MI); 1364 if ((QII->isExtended(MI) || QII->isConstExtended(MI)) && 1365 !tryAllocateResourcesForConstExt(MI)) { 1366 endPacket(MBB, MI); 1367 ResourceTracker->reserveResources(MI); 1368 assert(canReserveResourcesForConstExt(MI) && 1369 "Ensure that there is a slot"); 1370 reserveResourcesForConstExt(MI); 1371 // Reserve resources for new value jump constant extender. 1372 assert(canReserveResourcesForConstExt(MI) && 1373 "Ensure that there is a slot"); 1374 reserveResourcesForConstExt(nvjMI); 1375 assert(ResourceTracker->canReserveResources(nvjMI) && 1376 "Ensure that there is a slot"); 1377 1378 } else if ( // Extended instruction takes two slots in the packet. 1379 // Try reserve and allocate 4-byte in the current packet first. 1380 (QII->isExtended(nvjMI) 1381 && (!tryAllocateResourcesForConstExt(nvjMI) 1382 || !ResourceTracker->canReserveResources(nvjMI))) 1383 || // For non-extended instruction, no need to allocate extra 4 bytes. 1384 (!QII->isExtended(nvjMI) && 1385 !ResourceTracker->canReserveResources(nvjMI))) 1386 { 1387 endPacket(MBB, MI); 1388 // A new and empty packet starts. 1389 // We are sure that the resources requirements can be satisfied. 1390 // Therefore, do not need to call "canReserveResources" anymore. 1391 ResourceTracker->reserveResources(MI); 1392 if (QII->isExtended(nvjMI)) 1393 reserveResourcesForConstExt(nvjMI); 1394 } 1395 // Here, we are sure that "reserveResources" would succeed. 1396 ResourceTracker->reserveResources(nvjMI); 1397 CurrentPacketMIs.push_back(MI); 1398 CurrentPacketMIs.push_back(nvjMI); 1399 } else { 1400 if ( (QII->isExtended(MI) || QII->isConstExtended(MI)) 1401 && ( !tryAllocateResourcesForConstExt(MI) 1402 || !ResourceTracker->canReserveResources(MI))) 1403 { 1404 endPacket(MBB, MI); 1405 // Check if the instruction was promoted to a dot-new. If so, demote it 1406 // back into a dot-old 1407 if (PromotedToDotNew) { 1408 DemoteToDotOld(MI); 1409 } 1410 reserveResourcesForConstExt(MI); 1411 } 1412 // In case that "MI" is not an extended insn, 1413 // the resource availability has already been checked. 1414 ResourceTracker->reserveResources(MI); 1415 CurrentPacketMIs.push_back(MI); 1416 } 1417 return MII; 1418 } 1419 1420 //===----------------------------------------------------------------------===// 1421 // Public Constructor Functions 1422 //===----------------------------------------------------------------------===// 1423 1424 FunctionPass *llvm::createHexagonPacketizer() { 1425 return new HexagonPacketizer(); 1426 } 1427 1428