1 //===------- HexagonCopyToCombine.cpp - Hexagon Copy-To-Combine Pass ------===// 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 // This pass replaces transfer instructions by combine instructions. 10 // We walk along a basic block and look for two combinable instructions and try 11 // to move them together. If we can move them next to each other we do so and 12 // replace them with a combine instruction. 13 //===----------------------------------------------------------------------===// 14 #define DEBUG_TYPE "hexagon-copy-combine" 15 16 #include "llvm/PassSupport.h" 17 #include "llvm/ADT/DenseSet.h" 18 #include "llvm/ADT/DenseMap.h" 19 #include "llvm/CodeGen/Passes.h" 20 #include "llvm/CodeGen/MachineBasicBlock.h" 21 #include "llvm/CodeGen/MachineFunction.h" 22 #include "llvm/CodeGen/MachineFunctionPass.h" 23 #include "llvm/CodeGen/MachineInstr.h" 24 #include "llvm/CodeGen/MachineInstrBuilder.h" 25 #include "llvm/Target/TargetRegisterInfo.h" 26 #include "llvm/Support/CodeGen.h" 27 #include "llvm/Support/CommandLine.h" 28 #include "llvm/Support/Debug.h" 29 #include "llvm/Support/raw_ostream.h" 30 31 #include "Hexagon.h" 32 #include "HexagonInstrInfo.h" 33 #include "HexagonRegisterInfo.h" 34 #include "HexagonSubtarget.h" 35 #include "HexagonTargetMachine.h" 36 #include "HexagonMachineFunctionInfo.h" 37 38 using namespace llvm; 39 40 static 41 cl::opt<bool> IsCombinesDisabled("disable-merge-into-combines", 42 cl::Hidden, cl::ZeroOrMore, 43 cl::init(false), 44 cl::desc("Disable merging into combines")); 45 static 46 cl::opt<unsigned> 47 MaxNumOfInstsBetweenNewValueStoreAndTFR("max-num-inst-between-tfr-and-nv-store", 48 cl::Hidden, cl::init(4), 49 cl::desc("Maximum distance between a tfr feeding a store we " 50 "consider the store still to be newifiable")); 51 52 namespace llvm { 53 void initializeHexagonCopyToCombinePass(PassRegistry&); 54 } 55 56 57 namespace { 58 59 class HexagonCopyToCombine : public MachineFunctionPass { 60 const HexagonInstrInfo *TII; 61 const TargetRegisterInfo *TRI; 62 bool ShouldCombineAggressively; 63 64 DenseSet<MachineInstr *> PotentiallyNewifiableTFR; 65 public: 66 static char ID; 67 68 HexagonCopyToCombine() : MachineFunctionPass(ID) { 69 initializeHexagonCopyToCombinePass(*PassRegistry::getPassRegistry()); 70 } 71 72 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 73 MachineFunctionPass::getAnalysisUsage(AU); 74 } 75 76 const char *getPassName() const { 77 return "Hexagon Copy-To-Combine Pass"; 78 } 79 80 virtual bool runOnMachineFunction(MachineFunction &Fn); 81 82 private: 83 MachineInstr *findPairable(MachineInstr *I1, bool &DoInsertAtI1); 84 85 void findPotentialNewifiableTFRs(MachineBasicBlock &); 86 87 void combine(MachineInstr *I1, MachineInstr *I2, 88 MachineBasicBlock::iterator &MI, bool DoInsertAtI1); 89 90 bool isSafeToMoveTogether(MachineInstr *I1, MachineInstr *I2, 91 unsigned I1DestReg, unsigned I2DestReg, 92 bool &DoInsertAtI1); 93 94 void emitCombineRR(MachineBasicBlock::iterator &Before, unsigned DestReg, 95 MachineOperand &HiOperand, MachineOperand &LoOperand); 96 97 void emitCombineRI(MachineBasicBlock::iterator &Before, unsigned DestReg, 98 MachineOperand &HiOperand, MachineOperand &LoOperand); 99 100 void emitCombineIR(MachineBasicBlock::iterator &Before, unsigned DestReg, 101 MachineOperand &HiOperand, MachineOperand &LoOperand); 102 103 void emitCombineII(MachineBasicBlock::iterator &Before, unsigned DestReg, 104 MachineOperand &HiOperand, MachineOperand &LoOperand); 105 }; 106 107 } // End anonymous namespace. 108 109 char HexagonCopyToCombine::ID = 0; 110 111 INITIALIZE_PASS(HexagonCopyToCombine, "hexagon-copy-combine", 112 "Hexagon Copy-To-Combine Pass", false, false) 113 114 static bool isCombinableInstType(MachineInstr *MI, 115 const HexagonInstrInfo *TII, 116 bool ShouldCombineAggressively) { 117 switch(MI->getOpcode()) { 118 case Hexagon::TFR: { 119 // A COPY instruction can be combined if its arguments are IntRegs (32bit). 120 assert(MI->getOperand(0).isReg() && MI->getOperand(1).isReg()); 121 122 unsigned DestReg = MI->getOperand(0).getReg(); 123 unsigned SrcReg = MI->getOperand(1).getReg(); 124 return Hexagon::IntRegsRegClass.contains(DestReg) && 125 Hexagon::IntRegsRegClass.contains(SrcReg); 126 } 127 128 case Hexagon::TFRI: { 129 // A transfer-immediate can be combined if its argument is a signed 8bit 130 // value. 131 assert(MI->getOperand(0).isReg() && MI->getOperand(1).isImm()); 132 unsigned DestReg = MI->getOperand(0).getReg(); 133 134 // Only combine constant extended TFRI if we are in aggressive mode. 135 return Hexagon::IntRegsRegClass.contains(DestReg) && 136 (ShouldCombineAggressively || isInt<8>(MI->getOperand(1).getImm())); 137 } 138 139 case Hexagon::TFRI_V4: { 140 if (!ShouldCombineAggressively) 141 return false; 142 assert(MI->getOperand(0).isReg() && MI->getOperand(1).isGlobal()); 143 144 // Ensure that TargetFlags are MO_NO_FLAG for a global. This is a 145 // workaround for an ABI bug that prevents GOT relocations on combine 146 // instructions 147 if (MI->getOperand(1).getTargetFlags() != HexagonII::MO_NO_FLAG) 148 return false; 149 150 unsigned DestReg = MI->getOperand(0).getReg(); 151 return Hexagon::IntRegsRegClass.contains(DestReg); 152 } 153 154 default: 155 break; 156 } 157 158 return false; 159 } 160 161 static bool isGreaterThan8BitTFRI(MachineInstr *I) { 162 return I->getOpcode() == Hexagon::TFRI && 163 !isInt<8>(I->getOperand(1).getImm()); 164 } 165 static bool isGreaterThan6BitTFRI(MachineInstr *I) { 166 return I->getOpcode() == Hexagon::TFRI && 167 !isUInt<6>(I->getOperand(1).getImm()); 168 } 169 170 /// areCombinableOperations - Returns true if the two instruction can be merge 171 /// into a combine (ignoring register constraints). 172 static bool areCombinableOperations(const TargetRegisterInfo *TRI, 173 MachineInstr *HighRegInst, 174 MachineInstr *LowRegInst) { 175 assert((HighRegInst->getOpcode() == Hexagon::TFR || 176 HighRegInst->getOpcode() == Hexagon::TFRI || 177 HighRegInst->getOpcode() == Hexagon::TFRI_V4) && 178 (LowRegInst->getOpcode() == Hexagon::TFR || 179 LowRegInst->getOpcode() == Hexagon::TFRI || 180 LowRegInst->getOpcode() == Hexagon::TFRI_V4) && 181 "Assume individual instructions are of a combinable type"); 182 183 const HexagonRegisterInfo *QRI = 184 static_cast<const HexagonRegisterInfo *>(TRI); 185 186 // V4 added some combine variations (mixed immediate and register source 187 // operands), if we are on < V4 we can only combine 2 register-to-register 188 // moves and 2 immediate-to-register moves. We also don't have 189 // constant-extenders. 190 if (!QRI->Subtarget.hasV4TOps()) 191 return HighRegInst->getOpcode() == LowRegInst->getOpcode() && 192 !isGreaterThan8BitTFRI(HighRegInst) && 193 !isGreaterThan6BitTFRI(LowRegInst); 194 195 // There is no combine of two constant extended values. 196 if ((HighRegInst->getOpcode() == Hexagon::TFRI_V4 || 197 isGreaterThan8BitTFRI(HighRegInst)) && 198 (LowRegInst->getOpcode() == Hexagon::TFRI_V4 || 199 isGreaterThan6BitTFRI(LowRegInst))) 200 return false; 201 202 return true; 203 } 204 205 static bool isEvenReg(unsigned Reg) { 206 assert(TargetRegisterInfo::isPhysicalRegister(Reg) && 207 Hexagon::IntRegsRegClass.contains(Reg)); 208 return (Reg - Hexagon::R0) % 2 == 0; 209 } 210 211 static void removeKillInfo(MachineInstr *MI, unsigned RegNotKilled) { 212 for (unsigned I = 0, E = MI->getNumOperands(); I != E; ++I) { 213 MachineOperand &Op = MI->getOperand(I); 214 if (!Op.isReg() || Op.getReg() != RegNotKilled || !Op.isKill()) 215 continue; 216 Op.setIsKill(false); 217 } 218 } 219 220 /// isUnsafeToMoveAcross - Returns true if it is unsafe to move a copy 221 /// instruction from \p UseReg to \p DestReg over the instruction \p I. 222 static bool isUnsafeToMoveAcross(MachineInstr *I, unsigned UseReg, 223 unsigned DestReg, 224 const TargetRegisterInfo *TRI) { 225 return (UseReg && (I->modifiesRegister(UseReg, TRI))) || 226 I->modifiesRegister(DestReg, TRI) || 227 I->readsRegister(DestReg, TRI) || 228 I->hasUnmodeledSideEffects() || 229 I->isInlineAsm() || I->isDebugValue(); 230 } 231 232 /// isSafeToMoveTogether - Returns true if it is safe to move I1 next to I2 such 233 /// that the two instructions can be paired in a combine. 234 bool HexagonCopyToCombine::isSafeToMoveTogether(MachineInstr *I1, 235 MachineInstr *I2, 236 unsigned I1DestReg, 237 unsigned I2DestReg, 238 bool &DoInsertAtI1) { 239 240 bool IsImmUseReg = I2->getOperand(1).isImm() || I2->getOperand(1).isGlobal(); 241 unsigned I2UseReg = IsImmUseReg ? 0 : I2->getOperand(1).getReg(); 242 243 // It is not safe to move I1 and I2 into one combine if I2 has a true 244 // dependence on I1. 245 if (I2UseReg && I1->modifiesRegister(I2UseReg, TRI)) 246 return false; 247 248 bool isSafe = true; 249 250 // First try to move I2 towards I1. 251 { 252 // A reverse_iterator instantiated like below starts before I2, and I1 253 // respectively. 254 // Look at instructions I in between I2 and (excluding) I1. 255 MachineBasicBlock::reverse_iterator I(I2), 256 End = --(MachineBasicBlock::reverse_iterator(I1)); 257 // At 03 we got better results (dhrystone!) by being more conservative. 258 if (!ShouldCombineAggressively) 259 End = MachineBasicBlock::reverse_iterator(I1); 260 // If I2 kills its operand and we move I2 over an instruction that also 261 // uses I2's use reg we need to modify that (first) instruction to now kill 262 // this reg. 263 unsigned KilledOperand = 0; 264 if (I2->killsRegister(I2UseReg)) 265 KilledOperand = I2UseReg; 266 MachineInstr *KillingInstr = 0; 267 268 for (; I != End; ++I) { 269 // If the intervening instruction I: 270 // * modifies I2's use reg 271 // * modifies I2's def reg 272 // * reads I2's def reg 273 // * or has unmodelled side effects 274 // we can't move I2 across it. 275 if (isUnsafeToMoveAcross(&*I, I2UseReg, I2DestReg, TRI)) { 276 isSafe = false; 277 break; 278 } 279 280 // Update first use of the killed operand. 281 if (!KillingInstr && KilledOperand && 282 I->readsRegister(KilledOperand, TRI)) 283 KillingInstr = &*I; 284 } 285 if (isSafe) { 286 // Update the intermediate instruction to with the kill flag. 287 if (KillingInstr) { 288 bool Added = KillingInstr->addRegisterKilled(KilledOperand, TRI, true); 289 (void)Added; // supress compiler warning 290 assert(Added && "Must successfully update kill flag"); 291 removeKillInfo(I2, KilledOperand); 292 } 293 DoInsertAtI1 = true; 294 return true; 295 } 296 } 297 298 // Try to move I1 towards I2. 299 { 300 // Look at instructions I in between I1 and (excluding) I2. 301 MachineBasicBlock::iterator I(I1), End(I2); 302 // At O3 we got better results (dhrystone) by being more conservative here. 303 if (!ShouldCombineAggressively) 304 End = llvm::next(MachineBasicBlock::iterator(I2)); 305 IsImmUseReg = I1->getOperand(1).isImm() || I1->getOperand(1).isGlobal(); 306 unsigned I1UseReg = IsImmUseReg ? 0 : I1->getOperand(1).getReg(); 307 // Track killed operands. If we move across an instruction that kills our 308 // operand, we need to update the kill information on the moved I1. It kills 309 // the operand now. 310 MachineInstr *KillingInstr = 0; 311 unsigned KilledOperand = 0; 312 313 while(++I != End) { 314 // If the intervening instruction I: 315 // * modifies I1's use reg 316 // * modifies I1's def reg 317 // * reads I1's def reg 318 // * or has unmodelled side effects 319 // We introduce this special case because llvm has no api to remove a 320 // kill flag for a register (a removeRegisterKilled() analogous to 321 // addRegisterKilled) that handles aliased register correctly. 322 // * or has a killed aliased register use of I1's use reg 323 // %D4<def> = TFRI64 16 324 // %R6<def> = TFR %R9 325 // %R8<def> = KILL %R8, %D4<imp-use,kill> 326 // If we want to move R6 = across the KILL instruction we would have 327 // to remove the %D4<imp-use,kill> operand. For now, we are 328 // conservative and disallow the move. 329 // we can't move I1 across it. 330 if (isUnsafeToMoveAcross(I, I1UseReg, I1DestReg, TRI) || 331 // Check for an aliased register kill. Bail out if we see one. 332 (!I->killsRegister(I1UseReg) && I->killsRegister(I1UseReg, TRI))) 333 return false; 334 335 // Check for an exact kill (registers match). 336 if (I1UseReg && I->killsRegister(I1UseReg)) { 337 assert(KillingInstr == 0 && "Should only see one killing instruction"); 338 KilledOperand = I1UseReg; 339 KillingInstr = &*I; 340 } 341 } 342 if (KillingInstr) { 343 removeKillInfo(KillingInstr, KilledOperand); 344 // Update I1 to set the kill flag. This flag will later be picked up by 345 // the new COMBINE instruction. 346 bool Added = I1->addRegisterKilled(KilledOperand, TRI); 347 (void)Added; // supress compiler warning 348 assert(Added && "Must successfully update kill flag"); 349 } 350 DoInsertAtI1 = false; 351 } 352 353 return true; 354 } 355 356 /// findPotentialNewifiableTFRs - Finds tranfers that feed stores that could be 357 /// newified. (A use of a 64 bit register define can not be newified) 358 void 359 HexagonCopyToCombine::findPotentialNewifiableTFRs(MachineBasicBlock &BB) { 360 DenseMap<unsigned, MachineInstr *> LastDef; 361 for (MachineBasicBlock::iterator I = BB.begin(), E = BB.end(); I != E; ++I) { 362 MachineInstr *MI = I; 363 // Mark TFRs that feed a potential new value store as such. 364 if(TII->mayBeNewStore(MI)) { 365 // Look for uses of TFR instructions. 366 for (unsigned OpdIdx = 0, OpdE = MI->getNumOperands(); OpdIdx != OpdE; 367 ++OpdIdx) { 368 MachineOperand &Op = MI->getOperand(OpdIdx); 369 370 // Skip over anything except register uses. 371 if (!Op.isReg() || !Op.isUse() || !Op.getReg()) 372 continue; 373 374 // Look for the defining instruction. 375 unsigned Reg = Op.getReg(); 376 MachineInstr *DefInst = LastDef[Reg]; 377 if (!DefInst) 378 continue; 379 if (!isCombinableInstType(DefInst, TII, ShouldCombineAggressively)) 380 continue; 381 382 // Only close newifiable stores should influence the decision. 383 MachineBasicBlock::iterator It(DefInst); 384 unsigned NumInstsToDef = 0; 385 while (&*It++ != MI) 386 ++NumInstsToDef; 387 388 if (NumInstsToDef > MaxNumOfInstsBetweenNewValueStoreAndTFR) 389 continue; 390 391 PotentiallyNewifiableTFR.insert(DefInst); 392 } 393 // Skip to next instruction. 394 continue; 395 } 396 397 // Put instructions that last defined integer or double registers into the 398 // map. 399 for (unsigned I = 0, E = MI->getNumOperands(); I != E; ++I) { 400 MachineOperand &Op = MI->getOperand(I); 401 if (!Op.isReg() || !Op.isDef() || !Op.getReg()) 402 continue; 403 unsigned Reg = Op.getReg(); 404 if (Hexagon::DoubleRegsRegClass.contains(Reg)) { 405 for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) { 406 LastDef[*SubRegs] = MI; 407 } 408 } else if (Hexagon::IntRegsRegClass.contains(Reg)) 409 LastDef[Reg] = MI; 410 } 411 } 412 } 413 414 bool HexagonCopyToCombine::runOnMachineFunction(MachineFunction &MF) { 415 416 if (IsCombinesDisabled) return false; 417 418 bool HasChanged = false; 419 420 // Get target info. 421 TRI = MF.getTarget().getRegisterInfo(); 422 TII = static_cast<const HexagonInstrInfo *>(MF.getTarget().getInstrInfo()); 423 424 // Combine aggressively (for code size) 425 ShouldCombineAggressively = 426 MF.getTarget().getOptLevel() <= CodeGenOpt::Default; 427 428 // Traverse basic blocks. 429 for (MachineFunction::iterator BI = MF.begin(), BE = MF.end(); BI != BE; 430 ++BI) { 431 PotentiallyNewifiableTFR.clear(); 432 findPotentialNewifiableTFRs(*BI); 433 434 // Traverse instructions in basic block. 435 for(MachineBasicBlock::iterator MI = BI->begin(), End = BI->end(); 436 MI != End;) { 437 MachineInstr *I1 = MI++; 438 // Don't combine a TFR whose user could be newified (instructions that 439 // define double registers can not be newified - Programmer's Ref Manual 440 // 5.4.2 New-value stores). 441 if (ShouldCombineAggressively && PotentiallyNewifiableTFR.count(I1)) 442 continue; 443 444 // Ignore instructions that are not combinable. 445 if (!isCombinableInstType(I1, TII, ShouldCombineAggressively)) 446 continue; 447 448 // Find a second instruction that can be merged into a combine 449 // instruction. 450 bool DoInsertAtI1 = false; 451 MachineInstr *I2 = findPairable(I1, DoInsertAtI1); 452 if (I2) { 453 HasChanged = true; 454 combine(I1, I2, MI, DoInsertAtI1); 455 } 456 } 457 } 458 459 return HasChanged; 460 } 461 462 /// findPairable - Returns an instruction that can be merged with \p I1 into a 463 /// COMBINE instruction or 0 if no such instruction can be found. Returns true 464 /// in \p DoInsertAtI1 if the combine must be inserted at instruction \p I1 465 /// false if the combine must be inserted at the returned instruction. 466 MachineInstr *HexagonCopyToCombine::findPairable(MachineInstr *I1, 467 bool &DoInsertAtI1) { 468 MachineBasicBlock::iterator I2 = llvm::next(MachineBasicBlock::iterator(I1)); 469 unsigned I1DestReg = I1->getOperand(0).getReg(); 470 471 for (MachineBasicBlock::iterator End = I1->getParent()->end(); I2 != End; 472 ++I2) { 473 // Bail out early if we see a second definition of I1DestReg. 474 if (I2->modifiesRegister(I1DestReg, TRI)) 475 break; 476 477 // Ignore non-combinable instructions. 478 if (!isCombinableInstType(I2, TII, ShouldCombineAggressively)) 479 continue; 480 481 // Don't combine a TFR whose user could be newified. 482 if (ShouldCombineAggressively && PotentiallyNewifiableTFR.count(I2)) 483 continue; 484 485 unsigned I2DestReg = I2->getOperand(0).getReg(); 486 487 // Check that registers are adjacent and that the first destination register 488 // is even. 489 bool IsI1LowReg = (I2DestReg - I1DestReg) == 1; 490 bool IsI2LowReg = (I1DestReg - I2DestReg) == 1; 491 unsigned FirstRegIndex = IsI1LowReg ? I1DestReg : I2DestReg; 492 if ((!IsI1LowReg && !IsI2LowReg) || !isEvenReg(FirstRegIndex)) 493 continue; 494 495 // Check that the two instructions are combinable. V4 allows more 496 // instructions to be merged into a combine. 497 // The order matters because in a TFRI we might can encode a int8 as the 498 // hi reg operand but only a uint6 as the low reg operand. 499 if ((IsI2LowReg && !areCombinableOperations(TRI, I1, I2)) || 500 (IsI1LowReg && !areCombinableOperations(TRI, I2, I1))) 501 break; 502 503 if (isSafeToMoveTogether(I1, I2, I1DestReg, I2DestReg, 504 DoInsertAtI1)) 505 return I2; 506 507 // Not safe. Stop searching. 508 break; 509 } 510 return 0; 511 } 512 513 void HexagonCopyToCombine::combine(MachineInstr *I1, MachineInstr *I2, 514 MachineBasicBlock::iterator &MI, 515 bool DoInsertAtI1) { 516 // We are going to delete I2. If MI points to I2 advance it to the next 517 // instruction. 518 if ((MachineInstr *)MI == I2) ++MI; 519 520 // Figure out whether I1 or I2 goes into the lowreg part. 521 unsigned I1DestReg = I1->getOperand(0).getReg(); 522 unsigned I2DestReg = I2->getOperand(0).getReg(); 523 bool IsI1Loreg = (I2DestReg - I1DestReg) == 1; 524 unsigned LoRegDef = IsI1Loreg ? I1DestReg : I2DestReg; 525 526 // Get the double word register. 527 unsigned DoubleRegDest = 528 TRI->getMatchingSuperReg(LoRegDef, Hexagon::subreg_loreg, 529 &Hexagon::DoubleRegsRegClass); 530 assert(DoubleRegDest != 0 && "Expect a valid register"); 531 532 533 // Setup source operands. 534 MachineOperand &LoOperand = IsI1Loreg ? I1->getOperand(1) : 535 I2->getOperand(1); 536 MachineOperand &HiOperand = IsI1Loreg ? I2->getOperand(1) : 537 I1->getOperand(1); 538 539 // Figure out which source is a register and which a constant. 540 bool IsHiReg = HiOperand.isReg(); 541 bool IsLoReg = LoOperand.isReg(); 542 543 MachineBasicBlock::iterator InsertPt(DoInsertAtI1 ? I1 : I2); 544 // Emit combine. 545 if (IsHiReg && IsLoReg) 546 emitCombineRR(InsertPt, DoubleRegDest, HiOperand, LoOperand); 547 else if (IsHiReg) 548 emitCombineRI(InsertPt, DoubleRegDest, HiOperand, LoOperand); 549 else if (IsLoReg) 550 emitCombineIR(InsertPt, DoubleRegDest, HiOperand, LoOperand); 551 else 552 emitCombineII(InsertPt, DoubleRegDest, HiOperand, LoOperand); 553 554 I1->eraseFromParent(); 555 I2->eraseFromParent(); 556 } 557 558 void HexagonCopyToCombine::emitCombineII(MachineBasicBlock::iterator &InsertPt, 559 unsigned DoubleDestReg, 560 MachineOperand &HiOperand, 561 MachineOperand &LoOperand) { 562 DebugLoc DL = InsertPt->getDebugLoc(); 563 MachineBasicBlock *BB = InsertPt->getParent(); 564 565 // Handle globals. 566 if (HiOperand.isGlobal()) { 567 BuildMI(*BB, InsertPt, DL, TII->get(Hexagon::COMBINE_Ii), DoubleDestReg) 568 .addGlobalAddress(HiOperand.getGlobal(), HiOperand.getOffset(), 569 HiOperand.getTargetFlags()) 570 .addImm(LoOperand.getImm()); 571 return; 572 } 573 if (LoOperand.isGlobal()) { 574 BuildMI(*BB, InsertPt, DL, TII->get(Hexagon::COMBINE_iI_V4), DoubleDestReg) 575 .addImm(HiOperand.getImm()) 576 .addGlobalAddress(LoOperand.getGlobal(), LoOperand.getOffset(), 577 LoOperand.getTargetFlags()); 578 return; 579 } 580 581 // Handle constant extended immediates. 582 if (!isInt<8>(HiOperand.getImm())) { 583 assert(isInt<8>(LoOperand.getImm())); 584 BuildMI(*BB, InsertPt, DL, TII->get(Hexagon::COMBINE_Ii), DoubleDestReg) 585 .addImm(HiOperand.getImm()) 586 .addImm(LoOperand.getImm()); 587 return; 588 } 589 590 if (!isUInt<6>(LoOperand.getImm())) { 591 assert(isInt<8>(HiOperand.getImm())); 592 BuildMI(*BB, InsertPt, DL, TII->get(Hexagon::COMBINE_iI_V4), DoubleDestReg) 593 .addImm(HiOperand.getImm()) 594 .addImm(LoOperand.getImm()); 595 return; 596 } 597 598 // Insert new combine instruction. 599 // DoubleRegDest = combine #HiImm, #LoImm 600 BuildMI(*BB, InsertPt, DL, TII->get(Hexagon::COMBINE_Ii), DoubleDestReg) 601 .addImm(HiOperand.getImm()) 602 .addImm(LoOperand.getImm()); 603 } 604 605 void HexagonCopyToCombine::emitCombineIR(MachineBasicBlock::iterator &InsertPt, 606 unsigned DoubleDestReg, 607 MachineOperand &HiOperand, 608 MachineOperand &LoOperand) { 609 unsigned LoReg = LoOperand.getReg(); 610 unsigned LoRegKillFlag = getKillRegState(LoOperand.isKill()); 611 612 DebugLoc DL = InsertPt->getDebugLoc(); 613 MachineBasicBlock *BB = InsertPt->getParent(); 614 615 // Handle global. 616 if (HiOperand.isGlobal()) { 617 BuildMI(*BB, InsertPt, DL, TII->get(Hexagon::COMBINE_Ir_V4), DoubleDestReg) 618 .addGlobalAddress(HiOperand.getGlobal(), HiOperand.getOffset(), 619 HiOperand.getTargetFlags()) 620 .addReg(LoReg, LoRegKillFlag); 621 return; 622 } 623 // Insert new combine instruction. 624 // DoubleRegDest = combine #HiImm, LoReg 625 BuildMI(*BB, InsertPt, DL, TII->get(Hexagon::COMBINE_Ir_V4), DoubleDestReg) 626 .addImm(HiOperand.getImm()) 627 .addReg(LoReg, LoRegKillFlag); 628 } 629 630 void HexagonCopyToCombine::emitCombineRI(MachineBasicBlock::iterator &InsertPt, 631 unsigned DoubleDestReg, 632 MachineOperand &HiOperand, 633 MachineOperand &LoOperand) { 634 unsigned HiRegKillFlag = getKillRegState(HiOperand.isKill()); 635 unsigned HiReg = HiOperand.getReg(); 636 637 DebugLoc DL = InsertPt->getDebugLoc(); 638 MachineBasicBlock *BB = InsertPt->getParent(); 639 640 // Handle global. 641 if (LoOperand.isGlobal()) { 642 BuildMI(*BB, InsertPt, DL, TII->get(Hexagon::COMBINE_rI_V4), DoubleDestReg) 643 .addReg(HiReg, HiRegKillFlag) 644 .addGlobalAddress(LoOperand.getGlobal(), LoOperand.getOffset(), 645 LoOperand.getTargetFlags()); 646 return; 647 } 648 649 // Insert new combine instruction. 650 // DoubleRegDest = combine HiReg, #LoImm 651 BuildMI(*BB, InsertPt, DL, TII->get(Hexagon::COMBINE_rI_V4), DoubleDestReg) 652 .addReg(HiReg, HiRegKillFlag) 653 .addImm(LoOperand.getImm()); 654 } 655 656 void HexagonCopyToCombine::emitCombineRR(MachineBasicBlock::iterator &InsertPt, 657 unsigned DoubleDestReg, 658 MachineOperand &HiOperand, 659 MachineOperand &LoOperand) { 660 unsigned LoRegKillFlag = getKillRegState(LoOperand.isKill()); 661 unsigned HiRegKillFlag = getKillRegState(HiOperand.isKill()); 662 unsigned LoReg = LoOperand.getReg(); 663 unsigned HiReg = HiOperand.getReg(); 664 665 DebugLoc DL = InsertPt->getDebugLoc(); 666 MachineBasicBlock *BB = InsertPt->getParent(); 667 668 // Insert new combine instruction. 669 // DoubleRegDest = combine HiReg, LoReg 670 BuildMI(*BB, InsertPt, DL, TII->get(Hexagon::COMBINE_rr), DoubleDestReg) 671 .addReg(HiReg, HiRegKillFlag) 672 .addReg(LoReg, LoRegKillFlag); 673 } 674 675 FunctionPass *llvm::createHexagonCopyToCombine() { 676 return new HexagonCopyToCombine(); 677 } 678