1 //===- ARMInstructionSelector.cpp ----------------------------*- 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 /// \file 10 /// This file implements the targeting of the InstructionSelector class for ARM. 11 /// \todo This should be generated by TableGen. 12 //===----------------------------------------------------------------------===// 13 14 #include "ARMRegisterBankInfo.h" 15 #include "ARMSubtarget.h" 16 #include "ARMTargetMachine.h" 17 #include "llvm/CodeGen/GlobalISel/InstructionSelector.h" 18 #include "llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h" 19 #include "llvm/CodeGen/MachineConstantPool.h" 20 #include "llvm/CodeGen/MachineRegisterInfo.h" 21 #include "llvm/Support/Debug.h" 22 23 #define DEBUG_TYPE "arm-isel" 24 25 using namespace llvm; 26 27 namespace { 28 29 #define GET_GLOBALISEL_PREDICATE_BITSET 30 #include "ARMGenGlobalISel.inc" 31 #undef GET_GLOBALISEL_PREDICATE_BITSET 32 33 class ARMInstructionSelector : public InstructionSelector { 34 public: 35 ARMInstructionSelector(const ARMBaseTargetMachine &TM, const ARMSubtarget &STI, 36 const ARMRegisterBankInfo &RBI); 37 38 bool select(MachineInstr &I, CodeGenCoverage &CoverageInfo) const override; 39 static const char *getName() { return DEBUG_TYPE; } 40 41 private: 42 bool selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const; 43 44 struct CmpConstants; 45 struct InsertInfo; 46 47 bool selectCmp(CmpConstants Helper, MachineInstrBuilder &MIB, 48 MachineRegisterInfo &MRI) const; 49 50 // Helper for inserting a comparison sequence that sets \p ResReg to either 1 51 // if \p LHSReg and \p RHSReg are in the relationship defined by \p Cond, or 52 // \p PrevRes otherwise. In essence, it computes PrevRes OR (LHS Cond RHS). 53 bool insertComparison(CmpConstants Helper, InsertInfo I, unsigned ResReg, 54 ARMCC::CondCodes Cond, unsigned LHSReg, unsigned RHSReg, 55 unsigned PrevRes) const; 56 57 // Set \p DestReg to \p Constant. 58 void putConstant(InsertInfo I, unsigned DestReg, unsigned Constant) const; 59 60 bool selectGlobal(MachineInstrBuilder &MIB, MachineRegisterInfo &MRI) const; 61 bool selectSelect(MachineInstrBuilder &MIB, MachineRegisterInfo &MRI) const; 62 bool selectShift(unsigned ShiftOpc, MachineInstrBuilder &MIB) const; 63 64 // Check if the types match and both operands have the expected size and 65 // register bank. 66 bool validOpRegPair(MachineRegisterInfo &MRI, unsigned LHS, unsigned RHS, 67 unsigned ExpectedSize, unsigned ExpectedRegBankID) const; 68 69 // Check if the register has the expected size and register bank. 70 bool validReg(MachineRegisterInfo &MRI, unsigned Reg, unsigned ExpectedSize, 71 unsigned ExpectedRegBankID) const; 72 73 const ARMBaseInstrInfo &TII; 74 const ARMBaseRegisterInfo &TRI; 75 const ARMBaseTargetMachine &TM; 76 const ARMRegisterBankInfo &RBI; 77 const ARMSubtarget &STI; 78 79 #define GET_GLOBALISEL_PREDICATES_DECL 80 #include "ARMGenGlobalISel.inc" 81 #undef GET_GLOBALISEL_PREDICATES_DECL 82 83 // We declare the temporaries used by selectImpl() in the class to minimize the 84 // cost of constructing placeholder values. 85 #define GET_GLOBALISEL_TEMPORARIES_DECL 86 #include "ARMGenGlobalISel.inc" 87 #undef GET_GLOBALISEL_TEMPORARIES_DECL 88 }; 89 } // end anonymous namespace 90 91 namespace llvm { 92 InstructionSelector * 93 createARMInstructionSelector(const ARMBaseTargetMachine &TM, 94 const ARMSubtarget &STI, 95 const ARMRegisterBankInfo &RBI) { 96 return new ARMInstructionSelector(TM, STI, RBI); 97 } 98 } 99 100 const unsigned zero_reg = 0; 101 102 #define GET_GLOBALISEL_IMPL 103 #include "ARMGenGlobalISel.inc" 104 #undef GET_GLOBALISEL_IMPL 105 106 ARMInstructionSelector::ARMInstructionSelector(const ARMBaseTargetMachine &TM, 107 const ARMSubtarget &STI, 108 const ARMRegisterBankInfo &RBI) 109 : InstructionSelector(), TII(*STI.getInstrInfo()), 110 TRI(*STI.getRegisterInfo()), TM(TM), RBI(RBI), STI(STI), 111 #define GET_GLOBALISEL_PREDICATES_INIT 112 #include "ARMGenGlobalISel.inc" 113 #undef GET_GLOBALISEL_PREDICATES_INIT 114 #define GET_GLOBALISEL_TEMPORARIES_INIT 115 #include "ARMGenGlobalISel.inc" 116 #undef GET_GLOBALISEL_TEMPORARIES_INIT 117 { 118 } 119 120 static const TargetRegisterClass *guessRegClass(unsigned Reg, 121 MachineRegisterInfo &MRI, 122 const TargetRegisterInfo &TRI, 123 const RegisterBankInfo &RBI) { 124 const RegisterBank *RegBank = RBI.getRegBank(Reg, MRI, TRI); 125 assert(RegBank && "Can't get reg bank for virtual register"); 126 127 const unsigned Size = MRI.getType(Reg).getSizeInBits(); 128 assert((RegBank->getID() == ARM::GPRRegBankID || 129 RegBank->getID() == ARM::FPRRegBankID) && 130 "Unsupported reg bank"); 131 132 if (RegBank->getID() == ARM::FPRRegBankID) { 133 if (Size == 32) 134 return &ARM::SPRRegClass; 135 else if (Size == 64) 136 return &ARM::DPRRegClass; 137 else if (Size == 128) 138 return &ARM::QPRRegClass; 139 else 140 llvm_unreachable("Unsupported destination size"); 141 } 142 143 return &ARM::GPRRegClass; 144 } 145 146 static bool selectCopy(MachineInstr &I, const TargetInstrInfo &TII, 147 MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI, 148 const RegisterBankInfo &RBI) { 149 unsigned DstReg = I.getOperand(0).getReg(); 150 if (TargetRegisterInfo::isPhysicalRegister(DstReg)) 151 return true; 152 153 const TargetRegisterClass *RC = guessRegClass(DstReg, MRI, TRI, RBI); 154 155 // No need to constrain SrcReg. It will get constrained when 156 // we hit another of its uses or its defs. 157 // Copies do not have constraints. 158 if (!RBI.constrainGenericRegister(DstReg, *RC, MRI)) { 159 LLVM_DEBUG(dbgs() << "Failed to constrain " << TII.getName(I.getOpcode()) 160 << " operand\n"); 161 return false; 162 } 163 return true; 164 } 165 166 static bool selectMergeValues(MachineInstrBuilder &MIB, 167 const ARMBaseInstrInfo &TII, 168 MachineRegisterInfo &MRI, 169 const TargetRegisterInfo &TRI, 170 const RegisterBankInfo &RBI) { 171 assert(TII.getSubtarget().hasVFP2() && "Can't select merge without VFP"); 172 173 // We only support G_MERGE_VALUES as a way to stick together two scalar GPRs 174 // into one DPR. 175 unsigned VReg0 = MIB->getOperand(0).getReg(); 176 (void)VReg0; 177 assert(MRI.getType(VReg0).getSizeInBits() == 64 && 178 RBI.getRegBank(VReg0, MRI, TRI)->getID() == ARM::FPRRegBankID && 179 "Unsupported operand for G_MERGE_VALUES"); 180 unsigned VReg1 = MIB->getOperand(1).getReg(); 181 (void)VReg1; 182 assert(MRI.getType(VReg1).getSizeInBits() == 32 && 183 RBI.getRegBank(VReg1, MRI, TRI)->getID() == ARM::GPRRegBankID && 184 "Unsupported operand for G_MERGE_VALUES"); 185 unsigned VReg2 = MIB->getOperand(2).getReg(); 186 (void)VReg2; 187 assert(MRI.getType(VReg2).getSizeInBits() == 32 && 188 RBI.getRegBank(VReg2, MRI, TRI)->getID() == ARM::GPRRegBankID && 189 "Unsupported operand for G_MERGE_VALUES"); 190 191 MIB->setDesc(TII.get(ARM::VMOVDRR)); 192 MIB.add(predOps(ARMCC::AL)); 193 194 return true; 195 } 196 197 static bool selectUnmergeValues(MachineInstrBuilder &MIB, 198 const ARMBaseInstrInfo &TII, 199 MachineRegisterInfo &MRI, 200 const TargetRegisterInfo &TRI, 201 const RegisterBankInfo &RBI) { 202 assert(TII.getSubtarget().hasVFP2() && "Can't select unmerge without VFP"); 203 204 // We only support G_UNMERGE_VALUES as a way to break up one DPR into two 205 // GPRs. 206 unsigned VReg0 = MIB->getOperand(0).getReg(); 207 (void)VReg0; 208 assert(MRI.getType(VReg0).getSizeInBits() == 32 && 209 RBI.getRegBank(VReg0, MRI, TRI)->getID() == ARM::GPRRegBankID && 210 "Unsupported operand for G_UNMERGE_VALUES"); 211 unsigned VReg1 = MIB->getOperand(1).getReg(); 212 (void)VReg1; 213 assert(MRI.getType(VReg1).getSizeInBits() == 32 && 214 RBI.getRegBank(VReg1, MRI, TRI)->getID() == ARM::GPRRegBankID && 215 "Unsupported operand for G_UNMERGE_VALUES"); 216 unsigned VReg2 = MIB->getOperand(2).getReg(); 217 (void)VReg2; 218 assert(MRI.getType(VReg2).getSizeInBits() == 64 && 219 RBI.getRegBank(VReg2, MRI, TRI)->getID() == ARM::FPRRegBankID && 220 "Unsupported operand for G_UNMERGE_VALUES"); 221 222 MIB->setDesc(TII.get(ARM::VMOVRRD)); 223 MIB.add(predOps(ARMCC::AL)); 224 225 return true; 226 } 227 228 /// Select the opcode for simple extensions (that translate to a single SXT/UXT 229 /// instruction). Extension operations more complicated than that should not 230 /// invoke this. Returns the original opcode if it doesn't know how to select a 231 /// better one. 232 static unsigned selectSimpleExtOpc(unsigned Opc, unsigned Size) { 233 using namespace TargetOpcode; 234 235 if (Size != 8 && Size != 16) 236 return Opc; 237 238 if (Opc == G_SEXT) 239 return Size == 8 ? ARM::SXTB : ARM::SXTH; 240 241 if (Opc == G_ZEXT) 242 return Size == 8 ? ARM::UXTB : ARM::UXTH; 243 244 return Opc; 245 } 246 247 /// Select the opcode for simple loads and stores. For types smaller than 32 248 /// bits, the value will be zero extended. Returns the original opcode if it 249 /// doesn't know how to select a better one. 250 static unsigned selectLoadStoreOpCode(unsigned Opc, unsigned RegBank, 251 unsigned Size, bool isThumb) { 252 bool isStore = Opc == TargetOpcode::G_STORE; 253 254 if (RegBank == ARM::GPRRegBankID) { 255 if (isThumb) 256 switch (Size) { 257 case 1: 258 case 8: 259 return isStore ? ARM::t2STRBi12 : ARM::t2LDRBi12; 260 case 16: 261 return isStore ? ARM::t2STRHi12 : ARM::t2LDRHi12; 262 case 32: 263 return isStore ? ARM::t2STRi12 : ARM::t2LDRi12; 264 default: 265 return Opc; 266 } 267 268 switch (Size) { 269 case 1: 270 case 8: 271 return isStore ? ARM::STRBi12 : ARM::LDRBi12; 272 case 16: 273 return isStore ? ARM::STRH : ARM::LDRH; 274 case 32: 275 return isStore ? ARM::STRi12 : ARM::LDRi12; 276 default: 277 return Opc; 278 } 279 } 280 281 if (RegBank == ARM::FPRRegBankID) { 282 switch (Size) { 283 case 32: 284 return isStore ? ARM::VSTRS : ARM::VLDRS; 285 case 64: 286 return isStore ? ARM::VSTRD : ARM::VLDRD; 287 default: 288 return Opc; 289 } 290 } 291 292 return Opc; 293 } 294 295 // When lowering comparisons, we sometimes need to perform two compares instead 296 // of just one. Get the condition codes for both comparisons. If only one is 297 // needed, the second member of the pair is ARMCC::AL. 298 static std::pair<ARMCC::CondCodes, ARMCC::CondCodes> 299 getComparePreds(CmpInst::Predicate Pred) { 300 std::pair<ARMCC::CondCodes, ARMCC::CondCodes> Preds = {ARMCC::AL, ARMCC::AL}; 301 switch (Pred) { 302 case CmpInst::FCMP_ONE: 303 Preds = {ARMCC::GT, ARMCC::MI}; 304 break; 305 case CmpInst::FCMP_UEQ: 306 Preds = {ARMCC::EQ, ARMCC::VS}; 307 break; 308 case CmpInst::ICMP_EQ: 309 case CmpInst::FCMP_OEQ: 310 Preds.first = ARMCC::EQ; 311 break; 312 case CmpInst::ICMP_SGT: 313 case CmpInst::FCMP_OGT: 314 Preds.first = ARMCC::GT; 315 break; 316 case CmpInst::ICMP_SGE: 317 case CmpInst::FCMP_OGE: 318 Preds.first = ARMCC::GE; 319 break; 320 case CmpInst::ICMP_UGT: 321 case CmpInst::FCMP_UGT: 322 Preds.first = ARMCC::HI; 323 break; 324 case CmpInst::FCMP_OLT: 325 Preds.first = ARMCC::MI; 326 break; 327 case CmpInst::ICMP_ULE: 328 case CmpInst::FCMP_OLE: 329 Preds.first = ARMCC::LS; 330 break; 331 case CmpInst::FCMP_ORD: 332 Preds.first = ARMCC::VC; 333 break; 334 case CmpInst::FCMP_UNO: 335 Preds.first = ARMCC::VS; 336 break; 337 case CmpInst::FCMP_UGE: 338 Preds.first = ARMCC::PL; 339 break; 340 case CmpInst::ICMP_SLT: 341 case CmpInst::FCMP_ULT: 342 Preds.first = ARMCC::LT; 343 break; 344 case CmpInst::ICMP_SLE: 345 case CmpInst::FCMP_ULE: 346 Preds.first = ARMCC::LE; 347 break; 348 case CmpInst::FCMP_UNE: 349 case CmpInst::ICMP_NE: 350 Preds.first = ARMCC::NE; 351 break; 352 case CmpInst::ICMP_UGE: 353 Preds.first = ARMCC::HS; 354 break; 355 case CmpInst::ICMP_ULT: 356 Preds.first = ARMCC::LO; 357 break; 358 default: 359 break; 360 } 361 assert(Preds.first != ARMCC::AL && "No comparisons needed?"); 362 return Preds; 363 } 364 365 struct ARMInstructionSelector::CmpConstants { 366 CmpConstants(unsigned CmpOpcode, unsigned FlagsOpcode, unsigned OpRegBank, 367 unsigned OpSize) 368 : ComparisonOpcode(CmpOpcode), ReadFlagsOpcode(FlagsOpcode), 369 OperandRegBankID(OpRegBank), OperandSize(OpSize) {} 370 371 // The opcode used for performing the comparison. 372 const unsigned ComparisonOpcode; 373 374 // The opcode used for reading the flags set by the comparison. May be 375 // ARM::INSTRUCTION_LIST_END if we don't need to read the flags. 376 const unsigned ReadFlagsOpcode; 377 378 // The assumed register bank ID for the operands. 379 const unsigned OperandRegBankID; 380 381 // The assumed size in bits for the operands. 382 const unsigned OperandSize; 383 }; 384 385 struct ARMInstructionSelector::InsertInfo { 386 InsertInfo(MachineInstrBuilder &MIB) 387 : MBB(*MIB->getParent()), InsertBefore(std::next(MIB->getIterator())), 388 DbgLoc(MIB->getDebugLoc()) {} 389 390 MachineBasicBlock &MBB; 391 const MachineBasicBlock::instr_iterator InsertBefore; 392 const DebugLoc &DbgLoc; 393 }; 394 395 void ARMInstructionSelector::putConstant(InsertInfo I, unsigned DestReg, 396 unsigned Constant) const { 397 (void)BuildMI(I.MBB, I.InsertBefore, I.DbgLoc, TII.get(ARM::MOVi)) 398 .addDef(DestReg) 399 .addImm(Constant) 400 .add(predOps(ARMCC::AL)) 401 .add(condCodeOp()); 402 } 403 404 bool ARMInstructionSelector::validOpRegPair(MachineRegisterInfo &MRI, 405 unsigned LHSReg, unsigned RHSReg, 406 unsigned ExpectedSize, 407 unsigned ExpectedRegBankID) const { 408 return MRI.getType(LHSReg) == MRI.getType(RHSReg) && 409 validReg(MRI, LHSReg, ExpectedSize, ExpectedRegBankID) && 410 validReg(MRI, RHSReg, ExpectedSize, ExpectedRegBankID); 411 } 412 413 bool ARMInstructionSelector::validReg(MachineRegisterInfo &MRI, unsigned Reg, 414 unsigned ExpectedSize, 415 unsigned ExpectedRegBankID) const { 416 if (MRI.getType(Reg).getSizeInBits() != ExpectedSize) { 417 LLVM_DEBUG(dbgs() << "Unexpected size for register"); 418 return false; 419 } 420 421 if (RBI.getRegBank(Reg, MRI, TRI)->getID() != ExpectedRegBankID) { 422 LLVM_DEBUG(dbgs() << "Unexpected register bank for register"); 423 return false; 424 } 425 426 return true; 427 } 428 429 bool ARMInstructionSelector::selectCmp(CmpConstants Helper, 430 MachineInstrBuilder &MIB, 431 MachineRegisterInfo &MRI) const { 432 const InsertInfo I(MIB); 433 434 auto ResReg = MIB->getOperand(0).getReg(); 435 if (!validReg(MRI, ResReg, 1, ARM::GPRRegBankID)) 436 return false; 437 438 auto Cond = 439 static_cast<CmpInst::Predicate>(MIB->getOperand(1).getPredicate()); 440 if (Cond == CmpInst::FCMP_TRUE || Cond == CmpInst::FCMP_FALSE) { 441 putConstant(I, ResReg, Cond == CmpInst::FCMP_TRUE ? 1 : 0); 442 MIB->eraseFromParent(); 443 return true; 444 } 445 446 auto LHSReg = MIB->getOperand(2).getReg(); 447 auto RHSReg = MIB->getOperand(3).getReg(); 448 if (!validOpRegPair(MRI, LHSReg, RHSReg, Helper.OperandSize, 449 Helper.OperandRegBankID)) 450 return false; 451 452 auto ARMConds = getComparePreds(Cond); 453 auto ZeroReg = MRI.createVirtualRegister(&ARM::GPRRegClass); 454 putConstant(I, ZeroReg, 0); 455 456 if (ARMConds.second == ARMCC::AL) { 457 // Simple case, we only need one comparison and we're done. 458 if (!insertComparison(Helper, I, ResReg, ARMConds.first, LHSReg, RHSReg, 459 ZeroReg)) 460 return false; 461 } else { 462 // Not so simple, we need two successive comparisons. 463 auto IntermediateRes = MRI.createVirtualRegister(&ARM::GPRRegClass); 464 if (!insertComparison(Helper, I, IntermediateRes, ARMConds.first, LHSReg, 465 RHSReg, ZeroReg)) 466 return false; 467 if (!insertComparison(Helper, I, ResReg, ARMConds.second, LHSReg, RHSReg, 468 IntermediateRes)) 469 return false; 470 } 471 472 MIB->eraseFromParent(); 473 return true; 474 } 475 476 bool ARMInstructionSelector::insertComparison(CmpConstants Helper, InsertInfo I, 477 unsigned ResReg, 478 ARMCC::CondCodes Cond, 479 unsigned LHSReg, unsigned RHSReg, 480 unsigned PrevRes) const { 481 // Perform the comparison. 482 auto CmpI = 483 BuildMI(I.MBB, I.InsertBefore, I.DbgLoc, TII.get(Helper.ComparisonOpcode)) 484 .addUse(LHSReg) 485 .addUse(RHSReg) 486 .add(predOps(ARMCC::AL)); 487 if (!constrainSelectedInstRegOperands(*CmpI, TII, TRI, RBI)) 488 return false; 489 490 // Read the comparison flags (if necessary). 491 if (Helper.ReadFlagsOpcode != ARM::INSTRUCTION_LIST_END) { 492 auto ReadI = BuildMI(I.MBB, I.InsertBefore, I.DbgLoc, 493 TII.get(Helper.ReadFlagsOpcode)) 494 .add(predOps(ARMCC::AL)); 495 if (!constrainSelectedInstRegOperands(*ReadI, TII, TRI, RBI)) 496 return false; 497 } 498 499 // Select either 1 or the previous result based on the value of the flags. 500 auto Mov1I = BuildMI(I.MBB, I.InsertBefore, I.DbgLoc, TII.get(ARM::MOVCCi)) 501 .addDef(ResReg) 502 .addUse(PrevRes) 503 .addImm(1) 504 .add(predOps(Cond, ARM::CPSR)); 505 if (!constrainSelectedInstRegOperands(*Mov1I, TII, TRI, RBI)) 506 return false; 507 508 return true; 509 } 510 511 bool ARMInstructionSelector::selectGlobal(MachineInstrBuilder &MIB, 512 MachineRegisterInfo &MRI) const { 513 if ((STI.isROPI() || STI.isRWPI()) && !STI.isTargetELF()) { 514 LLVM_DEBUG(dbgs() << "ROPI and RWPI only supported for ELF\n"); 515 return false; 516 } 517 518 auto GV = MIB->getOperand(1).getGlobal(); 519 if (GV->isThreadLocal()) { 520 LLVM_DEBUG(dbgs() << "TLS variables not supported yet\n"); 521 return false; 522 } 523 524 auto &MBB = *MIB->getParent(); 525 auto &MF = *MBB.getParent(); 526 527 bool UseMovt = STI.useMovt(MF); 528 529 unsigned Size = TM.getPointerSize(0); 530 unsigned Alignment = 4; 531 532 auto addOpsForConstantPoolLoad = [&MF, Alignment, 533 Size](MachineInstrBuilder &MIB, 534 const GlobalValue *GV, bool IsSBREL) { 535 assert(MIB->getOpcode() == ARM::LDRi12 && "Unsupported instruction"); 536 auto ConstPool = MF.getConstantPool(); 537 auto CPIndex = 538 // For SB relative entries we need a target-specific constant pool. 539 // Otherwise, just use a regular constant pool entry. 540 IsSBREL 541 ? ConstPool->getConstantPoolIndex( 542 ARMConstantPoolConstant::Create(GV, ARMCP::SBREL), Alignment) 543 : ConstPool->getConstantPoolIndex(GV, Alignment); 544 MIB.addConstantPoolIndex(CPIndex, /*Offset*/ 0, /*TargetFlags*/ 0) 545 .addMemOperand( 546 MF.getMachineMemOperand(MachinePointerInfo::getConstantPool(MF), 547 MachineMemOperand::MOLoad, Size, Alignment)) 548 .addImm(0) 549 .add(predOps(ARMCC::AL)); 550 }; 551 552 if (TM.isPositionIndependent()) { 553 bool Indirect = STI.isGVIndirectSymbol(GV); 554 // FIXME: Taking advantage of MOVT for ELF is pretty involved, so we don't 555 // support it yet. See PR28229. 556 unsigned Opc = 557 UseMovt && !STI.isTargetELF() 558 ? (Indirect ? ARM::MOV_ga_pcrel_ldr : ARM::MOV_ga_pcrel) 559 : (Indirect ? ARM::LDRLIT_ga_pcrel_ldr : ARM::LDRLIT_ga_pcrel); 560 MIB->setDesc(TII.get(Opc)); 561 562 int TargetFlags = ARMII::MO_NO_FLAG; 563 if (STI.isTargetDarwin()) 564 TargetFlags |= ARMII::MO_NONLAZY; 565 if (STI.isGVInGOT(GV)) 566 TargetFlags |= ARMII::MO_GOT; 567 MIB->getOperand(1).setTargetFlags(TargetFlags); 568 569 if (Indirect) 570 MIB.addMemOperand(MF.getMachineMemOperand( 571 MachinePointerInfo::getGOT(MF), MachineMemOperand::MOLoad, 572 TM.getProgramPointerSize(), Alignment)); 573 574 return constrainSelectedInstRegOperands(*MIB, TII, TRI, RBI); 575 } 576 577 bool isReadOnly = STI.getTargetLowering()->isReadOnly(GV); 578 if (STI.isROPI() && isReadOnly) { 579 unsigned Opc = UseMovt ? ARM::MOV_ga_pcrel : ARM::LDRLIT_ga_pcrel; 580 MIB->setDesc(TII.get(Opc)); 581 return constrainSelectedInstRegOperands(*MIB, TII, TRI, RBI); 582 } 583 if (STI.isRWPI() && !isReadOnly) { 584 auto Offset = MRI.createVirtualRegister(&ARM::GPRRegClass); 585 MachineInstrBuilder OffsetMIB; 586 if (UseMovt) { 587 OffsetMIB = BuildMI(MBB, *MIB, MIB->getDebugLoc(), 588 TII.get(ARM::MOVi32imm), Offset); 589 OffsetMIB.addGlobalAddress(GV, /*Offset*/ 0, ARMII::MO_SBREL); 590 } else { 591 // Load the offset from the constant pool. 592 OffsetMIB = 593 BuildMI(MBB, *MIB, MIB->getDebugLoc(), TII.get(ARM::LDRi12), Offset); 594 addOpsForConstantPoolLoad(OffsetMIB, GV, /*IsSBREL*/ true); 595 } 596 if (!constrainSelectedInstRegOperands(*OffsetMIB, TII, TRI, RBI)) 597 return false; 598 599 // Add the offset to the SB register. 600 MIB->setDesc(TII.get(ARM::ADDrr)); 601 MIB->RemoveOperand(1); 602 MIB.addReg(ARM::R9) // FIXME: don't hardcode R9 603 .addReg(Offset) 604 .add(predOps(ARMCC::AL)) 605 .add(condCodeOp()); 606 607 return constrainSelectedInstRegOperands(*MIB, TII, TRI, RBI); 608 } 609 610 if (STI.isTargetELF()) { 611 if (UseMovt) { 612 MIB->setDesc(TII.get(ARM::MOVi32imm)); 613 } else { 614 // Load the global's address from the constant pool. 615 MIB->setDesc(TII.get(ARM::LDRi12)); 616 MIB->RemoveOperand(1); 617 addOpsForConstantPoolLoad(MIB, GV, /*IsSBREL*/ false); 618 } 619 } else if (STI.isTargetMachO()) { 620 if (UseMovt) 621 MIB->setDesc(TII.get(ARM::MOVi32imm)); 622 else 623 MIB->setDesc(TII.get(ARM::LDRLIT_ga_abs)); 624 } else { 625 LLVM_DEBUG(dbgs() << "Object format not supported yet\n"); 626 return false; 627 } 628 629 return constrainSelectedInstRegOperands(*MIB, TII, TRI, RBI); 630 } 631 632 bool ARMInstructionSelector::selectSelect(MachineInstrBuilder &MIB, 633 MachineRegisterInfo &MRI) const { 634 auto &MBB = *MIB->getParent(); 635 auto InsertBefore = std::next(MIB->getIterator()); 636 auto &DbgLoc = MIB->getDebugLoc(); 637 638 // Compare the condition to 0. 639 auto CondReg = MIB->getOperand(1).getReg(); 640 assert(validReg(MRI, CondReg, 1, ARM::GPRRegBankID) && 641 "Unsupported types for select operation"); 642 auto CmpI = BuildMI(MBB, InsertBefore, DbgLoc, TII.get(ARM::CMPri)) 643 .addUse(CondReg) 644 .addImm(0) 645 .add(predOps(ARMCC::AL)); 646 if (!constrainSelectedInstRegOperands(*CmpI, TII, TRI, RBI)) 647 return false; 648 649 // Move a value into the result register based on the result of the 650 // comparison. 651 auto ResReg = MIB->getOperand(0).getReg(); 652 auto TrueReg = MIB->getOperand(2).getReg(); 653 auto FalseReg = MIB->getOperand(3).getReg(); 654 assert(validOpRegPair(MRI, ResReg, TrueReg, 32, ARM::GPRRegBankID) && 655 validOpRegPair(MRI, TrueReg, FalseReg, 32, ARM::GPRRegBankID) && 656 "Unsupported types for select operation"); 657 auto Mov1I = BuildMI(MBB, InsertBefore, DbgLoc, TII.get(ARM::MOVCCr)) 658 .addDef(ResReg) 659 .addUse(TrueReg) 660 .addUse(FalseReg) 661 .add(predOps(ARMCC::EQ, ARM::CPSR)); 662 if (!constrainSelectedInstRegOperands(*Mov1I, TII, TRI, RBI)) 663 return false; 664 665 MIB->eraseFromParent(); 666 return true; 667 } 668 669 bool ARMInstructionSelector::selectShift(unsigned ShiftOpc, 670 MachineInstrBuilder &MIB) const { 671 MIB->setDesc(TII.get(ARM::MOVsr)); 672 MIB.addImm(ShiftOpc); 673 MIB.add(predOps(ARMCC::AL)).add(condCodeOp()); 674 return constrainSelectedInstRegOperands(*MIB, TII, TRI, RBI); 675 } 676 677 bool ARMInstructionSelector::select(MachineInstr &I, 678 CodeGenCoverage &CoverageInfo) const { 679 assert(I.getParent() && "Instruction should be in a basic block!"); 680 assert(I.getParent()->getParent() && "Instruction should be in a function!"); 681 682 auto &MBB = *I.getParent(); 683 auto &MF = *MBB.getParent(); 684 auto &MRI = MF.getRegInfo(); 685 686 if (!isPreISelGenericOpcode(I.getOpcode())) { 687 if (I.isCopy()) 688 return selectCopy(I, TII, MRI, TRI, RBI); 689 690 return true; 691 } 692 693 using namespace TargetOpcode; 694 695 if (selectImpl(I, CoverageInfo)) 696 return true; 697 698 MachineInstrBuilder MIB{MF, I}; 699 bool isSExt = false; 700 701 switch (I.getOpcode()) { 702 case G_SEXT: 703 isSExt = true; 704 LLVM_FALLTHROUGH; 705 case G_ZEXT: { 706 LLT DstTy = MRI.getType(I.getOperand(0).getReg()); 707 // FIXME: Smaller destination sizes coming soon! 708 if (DstTy.getSizeInBits() != 32) { 709 LLVM_DEBUG(dbgs() << "Unsupported destination size for extension"); 710 return false; 711 } 712 713 LLT SrcTy = MRI.getType(I.getOperand(1).getReg()); 714 unsigned SrcSize = SrcTy.getSizeInBits(); 715 switch (SrcSize) { 716 case 1: { 717 // ZExt boils down to & 0x1; for SExt we also subtract that from 0 718 I.setDesc(TII.get(ARM::ANDri)); 719 MIB.addImm(1).add(predOps(ARMCC::AL)).add(condCodeOp()); 720 721 if (isSExt) { 722 unsigned SExtResult = I.getOperand(0).getReg(); 723 724 // Use a new virtual register for the result of the AND 725 unsigned AndResult = MRI.createVirtualRegister(&ARM::GPRRegClass); 726 I.getOperand(0).setReg(AndResult); 727 728 auto InsertBefore = std::next(I.getIterator()); 729 auto SubI = 730 BuildMI(MBB, InsertBefore, I.getDebugLoc(), TII.get(ARM::RSBri)) 731 .addDef(SExtResult) 732 .addUse(AndResult) 733 .addImm(0) 734 .add(predOps(ARMCC::AL)) 735 .add(condCodeOp()); 736 if (!constrainSelectedInstRegOperands(*SubI, TII, TRI, RBI)) 737 return false; 738 } 739 break; 740 } 741 case 8: 742 case 16: { 743 unsigned NewOpc = selectSimpleExtOpc(I.getOpcode(), SrcSize); 744 if (NewOpc == I.getOpcode()) 745 return false; 746 I.setDesc(TII.get(NewOpc)); 747 MIB.addImm(0).add(predOps(ARMCC::AL)); 748 break; 749 } 750 default: 751 LLVM_DEBUG(dbgs() << "Unsupported source size for extension"); 752 return false; 753 } 754 break; 755 } 756 case G_ANYEXT: 757 case G_TRUNC: { 758 // The high bits are undefined, so there's nothing special to do, just 759 // treat it as a copy. 760 auto SrcReg = I.getOperand(1).getReg(); 761 auto DstReg = I.getOperand(0).getReg(); 762 763 const auto &SrcRegBank = *RBI.getRegBank(SrcReg, MRI, TRI); 764 const auto &DstRegBank = *RBI.getRegBank(DstReg, MRI, TRI); 765 766 if (SrcRegBank.getID() == ARM::FPRRegBankID) { 767 // This should only happen in the obscure case where we have put a 64-bit 768 // integer into a D register. Get it out of there and keep only the 769 // interesting part. 770 assert(I.getOpcode() == G_TRUNC && "Unsupported operand for G_ANYEXT"); 771 assert(DstRegBank.getID() == ARM::GPRRegBankID && 772 "Unsupported combination of register banks"); 773 assert(MRI.getType(SrcReg).getSizeInBits() == 64 && "Unsupported size"); 774 assert(MRI.getType(DstReg).getSizeInBits() <= 32 && "Unsupported size"); 775 776 unsigned IgnoredBits = MRI.createVirtualRegister(&ARM::GPRRegClass); 777 auto InsertBefore = std::next(I.getIterator()); 778 auto MovI = 779 BuildMI(MBB, InsertBefore, I.getDebugLoc(), TII.get(ARM::VMOVRRD)) 780 .addDef(DstReg) 781 .addDef(IgnoredBits) 782 .addUse(SrcReg) 783 .add(predOps(ARMCC::AL)); 784 if (!constrainSelectedInstRegOperands(*MovI, TII, TRI, RBI)) 785 return false; 786 787 MIB->eraseFromParent(); 788 return true; 789 } 790 791 if (SrcRegBank.getID() != DstRegBank.getID()) { 792 LLVM_DEBUG( 793 dbgs() << "G_TRUNC/G_ANYEXT operands on different register banks\n"); 794 return false; 795 } 796 797 if (SrcRegBank.getID() != ARM::GPRRegBankID) { 798 LLVM_DEBUG(dbgs() << "G_TRUNC/G_ANYEXT on non-GPR not supported yet\n"); 799 return false; 800 } 801 802 I.setDesc(TII.get(COPY)); 803 return selectCopy(I, TII, MRI, TRI, RBI); 804 } 805 case G_CONSTANT: { 806 if (!MRI.getType(I.getOperand(0).getReg()).isPointer()) { 807 // Non-pointer constants should be handled by TableGen. 808 LLVM_DEBUG(dbgs() << "Unsupported constant type\n"); 809 return false; 810 } 811 812 auto &Val = I.getOperand(1); 813 if (Val.isCImm()) { 814 if (!Val.getCImm()->isZero()) { 815 LLVM_DEBUG(dbgs() << "Unsupported pointer constant value\n"); 816 return false; 817 } 818 Val.ChangeToImmediate(0); 819 } else { 820 assert(Val.isImm() && "Unexpected operand for G_CONSTANT"); 821 if (Val.getImm() != 0) { 822 LLVM_DEBUG(dbgs() << "Unsupported pointer constant value\n"); 823 return false; 824 } 825 } 826 827 I.setDesc(TII.get(ARM::MOVi)); 828 MIB.add(predOps(ARMCC::AL)).add(condCodeOp()); 829 break; 830 } 831 case G_INTTOPTR: 832 case G_PTRTOINT: { 833 auto SrcReg = I.getOperand(1).getReg(); 834 auto DstReg = I.getOperand(0).getReg(); 835 836 const auto &SrcRegBank = *RBI.getRegBank(SrcReg, MRI, TRI); 837 const auto &DstRegBank = *RBI.getRegBank(DstReg, MRI, TRI); 838 839 if (SrcRegBank.getID() != DstRegBank.getID()) { 840 LLVM_DEBUG( 841 dbgs() 842 << "G_INTTOPTR/G_PTRTOINT operands on different register banks\n"); 843 return false; 844 } 845 846 if (SrcRegBank.getID() != ARM::GPRRegBankID) { 847 LLVM_DEBUG( 848 dbgs() << "G_INTTOPTR/G_PTRTOINT on non-GPR not supported yet\n"); 849 return false; 850 } 851 852 I.setDesc(TII.get(COPY)); 853 return selectCopy(I, TII, MRI, TRI, RBI); 854 } 855 case G_SELECT: 856 return selectSelect(MIB, MRI); 857 case G_ICMP: { 858 CmpConstants Helper(ARM::CMPrr, ARM::INSTRUCTION_LIST_END, 859 ARM::GPRRegBankID, 32); 860 return selectCmp(Helper, MIB, MRI); 861 } 862 case G_FCMP: { 863 assert(STI.hasVFP2() && "Can't select fcmp without VFP"); 864 865 unsigned OpReg = I.getOperand(2).getReg(); 866 unsigned Size = MRI.getType(OpReg).getSizeInBits(); 867 868 if (Size == 64 && STI.isFPOnlySP()) { 869 LLVM_DEBUG(dbgs() << "Subtarget only supports single precision"); 870 return false; 871 } 872 if (Size != 32 && Size != 64) { 873 LLVM_DEBUG(dbgs() << "Unsupported size for G_FCMP operand"); 874 return false; 875 } 876 877 CmpConstants Helper(Size == 32 ? ARM::VCMPS : ARM::VCMPD, ARM::FMSTAT, 878 ARM::FPRRegBankID, Size); 879 return selectCmp(Helper, MIB, MRI); 880 } 881 case G_LSHR: 882 return selectShift(ARM_AM::ShiftOpc::lsr, MIB); 883 case G_ASHR: 884 return selectShift(ARM_AM::ShiftOpc::asr, MIB); 885 case G_SHL: { 886 return selectShift(ARM_AM::ShiftOpc::lsl, MIB); 887 } 888 case G_GEP: 889 I.setDesc(TII.get(ARM::ADDrr)); 890 MIB.add(predOps(ARMCC::AL)).add(condCodeOp()); 891 break; 892 case G_FRAME_INDEX: 893 // Add 0 to the given frame index and hope it will eventually be folded into 894 // the user(s). 895 I.setDesc(TII.get(ARM::ADDri)); 896 MIB.addImm(0).add(predOps(ARMCC::AL)).add(condCodeOp()); 897 break; 898 case G_GLOBAL_VALUE: 899 return selectGlobal(MIB, MRI); 900 case G_STORE: 901 case G_LOAD: { 902 const auto &MemOp = **I.memoperands_begin(); 903 if (MemOp.getOrdering() != AtomicOrdering::NotAtomic) { 904 LLVM_DEBUG(dbgs() << "Atomic load/store not supported yet\n"); 905 return false; 906 } 907 908 unsigned Reg = I.getOperand(0).getReg(); 909 unsigned RegBank = RBI.getRegBank(Reg, MRI, TRI)->getID(); 910 911 LLT ValTy = MRI.getType(Reg); 912 const auto ValSize = ValTy.getSizeInBits(); 913 914 assert((ValSize != 64 || STI.hasVFP2()) && 915 "Don't know how to load/store 64-bit value without VFP"); 916 917 const auto NewOpc = 918 selectLoadStoreOpCode(I.getOpcode(), RegBank, ValSize, STI.isThumb()); 919 if (NewOpc == G_LOAD || NewOpc == G_STORE) 920 return false; 921 922 I.setDesc(TII.get(NewOpc)); 923 924 if (NewOpc == ARM::LDRH || NewOpc == ARM::STRH) 925 // LDRH has a funny addressing mode (there's already a FIXME for it). 926 MIB.addReg(0); 927 MIB.addImm(0).add(predOps(ARMCC::AL)); 928 break; 929 } 930 case G_MERGE_VALUES: { 931 if (!selectMergeValues(MIB, TII, MRI, TRI, RBI)) 932 return false; 933 break; 934 } 935 case G_UNMERGE_VALUES: { 936 if (!selectUnmergeValues(MIB, TII, MRI, TRI, RBI)) 937 return false; 938 break; 939 } 940 case G_BRCOND: { 941 if (!validReg(MRI, I.getOperand(0).getReg(), 1, ARM::GPRRegBankID)) { 942 LLVM_DEBUG(dbgs() << "Unsupported condition register for G_BRCOND"); 943 return false; 944 } 945 946 // Set the flags. 947 auto Test = BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(ARM::TSTri)) 948 .addReg(I.getOperand(0).getReg()) 949 .addImm(1) 950 .add(predOps(ARMCC::AL)); 951 if (!constrainSelectedInstRegOperands(*Test, TII, TRI, RBI)) 952 return false; 953 954 // Branch conditionally. 955 auto Branch = BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(ARM::Bcc)) 956 .add(I.getOperand(1)) 957 .add(predOps(ARMCC::NE, ARM::CPSR)); 958 if (!constrainSelectedInstRegOperands(*Branch, TII, TRI, RBI)) 959 return false; 960 I.eraseFromParent(); 961 return true; 962 } 963 case G_PHI: { 964 I.setDesc(TII.get(PHI)); 965 966 unsigned DstReg = I.getOperand(0).getReg(); 967 const TargetRegisterClass *RC = guessRegClass(DstReg, MRI, TRI, RBI); 968 if (!RBI.constrainGenericRegister(DstReg, *RC, MRI)) { 969 break; 970 } 971 972 return true; 973 } 974 default: 975 return false; 976 } 977 978 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 979 } 980