1 //===- AArch64InstructionSelector.cpp ----------------------------*- C++ -*-==// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// \file 9 /// This file implements the targeting of the InstructionSelector class for 10 /// AArch64. 11 /// \todo This should be generated by TableGen. 12 //===----------------------------------------------------------------------===// 13 14 #include "AArch64GlobalISelUtils.h" 15 #include "AArch64InstrInfo.h" 16 #include "AArch64MachineFunctionInfo.h" 17 #include "AArch64RegisterBankInfo.h" 18 #include "AArch64RegisterInfo.h" 19 #include "AArch64Subtarget.h" 20 #include "AArch64TargetMachine.h" 21 #include "MCTargetDesc/AArch64AddressingModes.h" 22 #include "MCTargetDesc/AArch64MCTargetDesc.h" 23 #include "llvm/ADT/Optional.h" 24 #include "llvm/BinaryFormat/Dwarf.h" 25 #include "llvm/CodeGen/GlobalISel/GenericMachineInstrs.h" 26 #include "llvm/CodeGen/GlobalISel/InstructionSelector.h" 27 #include "llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h" 28 #include "llvm/CodeGen/GlobalISel/MIPatternMatch.h" 29 #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" 30 #include "llvm/CodeGen/GlobalISel/Utils.h" 31 #include "llvm/CodeGen/MachineBasicBlock.h" 32 #include "llvm/CodeGen/MachineConstantPool.h" 33 #include "llvm/CodeGen/MachineFrameInfo.h" 34 #include "llvm/CodeGen/MachineFunction.h" 35 #include "llvm/CodeGen/MachineInstr.h" 36 #include "llvm/CodeGen/MachineInstrBuilder.h" 37 #include "llvm/CodeGen/MachineMemOperand.h" 38 #include "llvm/CodeGen/MachineOperand.h" 39 #include "llvm/CodeGen/MachineRegisterInfo.h" 40 #include "llvm/CodeGen/TargetOpcodes.h" 41 #include "llvm/IR/Constants.h" 42 #include "llvm/IR/DerivedTypes.h" 43 #include "llvm/IR/Instructions.h" 44 #include "llvm/IR/IntrinsicsAArch64.h" 45 #include "llvm/IR/PatternMatch.h" 46 #include "llvm/IR/Type.h" 47 #include "llvm/Pass.h" 48 #include "llvm/Support/Debug.h" 49 #include "llvm/Support/raw_ostream.h" 50 51 #define DEBUG_TYPE "aarch64-isel" 52 53 using namespace llvm; 54 using namespace MIPatternMatch; 55 using namespace AArch64GISelUtils; 56 57 namespace llvm { 58 class BlockFrequencyInfo; 59 class ProfileSummaryInfo; 60 } 61 62 namespace { 63 64 #define GET_GLOBALISEL_PREDICATE_BITSET 65 #include "AArch64GenGlobalISel.inc" 66 #undef GET_GLOBALISEL_PREDICATE_BITSET 67 68 69 class AArch64InstructionSelector : public InstructionSelector { 70 public: 71 AArch64InstructionSelector(const AArch64TargetMachine &TM, 72 const AArch64Subtarget &STI, 73 const AArch64RegisterBankInfo &RBI); 74 75 bool select(MachineInstr &I) override; 76 static const char *getName() { return DEBUG_TYPE; } 77 78 void setupMF(MachineFunction &MF, GISelKnownBits *KB, 79 CodeGenCoverage &CoverageInfo, ProfileSummaryInfo *PSI, 80 BlockFrequencyInfo *BFI) override { 81 InstructionSelector::setupMF(MF, KB, CoverageInfo, PSI, BFI); 82 MIB.setMF(MF); 83 84 // hasFnAttribute() is expensive to call on every BRCOND selection, so 85 // cache it here for each run of the selector. 86 ProduceNonFlagSettingCondBr = 87 !MF.getFunction().hasFnAttribute(Attribute::SpeculativeLoadHardening); 88 MFReturnAddr = Register(); 89 90 processPHIs(MF); 91 } 92 93 private: 94 /// tblgen-erated 'select' implementation, used as the initial selector for 95 /// the patterns that don't require complex C++. 96 bool selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const; 97 98 // A lowering phase that runs before any selection attempts. 99 // Returns true if the instruction was modified. 100 bool preISelLower(MachineInstr &I); 101 102 // An early selection function that runs before the selectImpl() call. 103 bool earlySelect(MachineInstr &I); 104 105 // Do some preprocessing of G_PHIs before we begin selection. 106 void processPHIs(MachineFunction &MF); 107 108 bool earlySelectSHL(MachineInstr &I, MachineRegisterInfo &MRI); 109 110 /// Eliminate same-sized cross-bank copies into stores before selectImpl(). 111 bool contractCrossBankCopyIntoStore(MachineInstr &I, 112 MachineRegisterInfo &MRI); 113 114 bool convertPtrAddToAdd(MachineInstr &I, MachineRegisterInfo &MRI); 115 116 bool selectVaStartAAPCS(MachineInstr &I, MachineFunction &MF, 117 MachineRegisterInfo &MRI) const; 118 bool selectVaStartDarwin(MachineInstr &I, MachineFunction &MF, 119 MachineRegisterInfo &MRI) const; 120 121 ///@{ 122 /// Helper functions for selectCompareBranch. 123 bool selectCompareBranchFedByFCmp(MachineInstr &I, MachineInstr &FCmp, 124 MachineIRBuilder &MIB) const; 125 bool selectCompareBranchFedByICmp(MachineInstr &I, MachineInstr &ICmp, 126 MachineIRBuilder &MIB) const; 127 bool tryOptCompareBranchFedByICmp(MachineInstr &I, MachineInstr &ICmp, 128 MachineIRBuilder &MIB) const; 129 bool tryOptAndIntoCompareBranch(MachineInstr &AndInst, bool Invert, 130 MachineBasicBlock *DstMBB, 131 MachineIRBuilder &MIB) const; 132 ///@} 133 134 bool selectCompareBranch(MachineInstr &I, MachineFunction &MF, 135 MachineRegisterInfo &MRI); 136 137 bool selectVectorAshrLshr(MachineInstr &I, MachineRegisterInfo &MRI); 138 bool selectVectorSHL(MachineInstr &I, MachineRegisterInfo &MRI); 139 140 // Helper to generate an equivalent of scalar_to_vector into a new register, 141 // returned via 'Dst'. 142 MachineInstr *emitScalarToVector(unsigned EltSize, 143 const TargetRegisterClass *DstRC, 144 Register Scalar, 145 MachineIRBuilder &MIRBuilder) const; 146 147 /// Emit a lane insert into \p DstReg, or a new vector register if None is 148 /// provided. 149 /// 150 /// The lane inserted into is defined by \p LaneIdx. The vector source 151 /// register is given by \p SrcReg. The register containing the element is 152 /// given by \p EltReg. 153 MachineInstr *emitLaneInsert(Optional<Register> DstReg, Register SrcReg, 154 Register EltReg, unsigned LaneIdx, 155 const RegisterBank &RB, 156 MachineIRBuilder &MIRBuilder) const; 157 158 /// Emit a sequence of instructions representing a constant \p CV for a 159 /// vector register \p Dst. (E.g. a MOV, or a load from a constant pool.) 160 /// 161 /// \returns the last instruction in the sequence on success, and nullptr 162 /// otherwise. 163 MachineInstr *emitConstantVector(Register Dst, Constant *CV, 164 MachineIRBuilder &MIRBuilder, 165 MachineRegisterInfo &MRI); 166 167 bool selectInsertElt(MachineInstr &I, MachineRegisterInfo &MRI); 168 bool tryOptConstantBuildVec(MachineInstr &MI, LLT DstTy, 169 MachineRegisterInfo &MRI); 170 /// \returns true if a G_BUILD_VECTOR instruction \p MI can be selected as a 171 /// SUBREG_TO_REG. 172 bool tryOptBuildVecToSubregToReg(MachineInstr &MI, MachineRegisterInfo &MRI); 173 bool selectBuildVector(MachineInstr &I, MachineRegisterInfo &MRI); 174 bool selectMergeValues(MachineInstr &I, MachineRegisterInfo &MRI); 175 bool selectUnmergeValues(MachineInstr &I, MachineRegisterInfo &MRI); 176 177 bool selectShuffleVector(MachineInstr &I, MachineRegisterInfo &MRI); 178 bool selectExtractElt(MachineInstr &I, MachineRegisterInfo &MRI); 179 bool selectConcatVectors(MachineInstr &I, MachineRegisterInfo &MRI); 180 bool selectSplitVectorUnmerge(MachineInstr &I, MachineRegisterInfo &MRI); 181 182 /// Helper function to select vector load intrinsics like 183 /// @llvm.aarch64.neon.ld2.*, @llvm.aarch64.neon.ld4.*, etc. 184 /// \p Opc is the opcode that the selected instruction should use. 185 /// \p NumVecs is the number of vector destinations for the instruction. 186 /// \p I is the original G_INTRINSIC_W_SIDE_EFFECTS instruction. 187 bool selectVectorLoadIntrinsic(unsigned Opc, unsigned NumVecs, 188 MachineInstr &I); 189 bool selectIntrinsicWithSideEffects(MachineInstr &I, 190 MachineRegisterInfo &MRI); 191 bool selectIntrinsic(MachineInstr &I, MachineRegisterInfo &MRI); 192 bool selectVectorICmp(MachineInstr &I, MachineRegisterInfo &MRI); 193 bool selectIntrinsicTrunc(MachineInstr &I, MachineRegisterInfo &MRI) const; 194 bool selectIntrinsicRound(MachineInstr &I, MachineRegisterInfo &MRI) const; 195 bool selectJumpTable(MachineInstr &I, MachineRegisterInfo &MRI); 196 bool selectBrJT(MachineInstr &I, MachineRegisterInfo &MRI); 197 bool selectTLSGlobalValue(MachineInstr &I, MachineRegisterInfo &MRI); 198 bool selectReduction(MachineInstr &I, MachineRegisterInfo &MRI); 199 bool selectMOPS(MachineInstr &I, MachineRegisterInfo &MRI); 200 bool selectUSMovFromExtend(MachineInstr &I, MachineRegisterInfo &MRI); 201 202 unsigned emitConstantPoolEntry(const Constant *CPVal, 203 MachineFunction &MF) const; 204 MachineInstr *emitLoadFromConstantPool(const Constant *CPVal, 205 MachineIRBuilder &MIRBuilder) const; 206 207 // Emit a vector concat operation. 208 MachineInstr *emitVectorConcat(Optional<Register> Dst, Register Op1, 209 Register Op2, 210 MachineIRBuilder &MIRBuilder) const; 211 212 // Emit an integer compare between LHS and RHS, which checks for Predicate. 213 MachineInstr *emitIntegerCompare(MachineOperand &LHS, MachineOperand &RHS, 214 MachineOperand &Predicate, 215 MachineIRBuilder &MIRBuilder) const; 216 217 /// Emit a floating point comparison between \p LHS and \p RHS. 218 /// \p Pred if given is the intended predicate to use. 219 MachineInstr *emitFPCompare(Register LHS, Register RHS, 220 MachineIRBuilder &MIRBuilder, 221 Optional<CmpInst::Predicate> = None) const; 222 223 MachineInstr *emitInstr(unsigned Opcode, 224 std::initializer_list<llvm::DstOp> DstOps, 225 std::initializer_list<llvm::SrcOp> SrcOps, 226 MachineIRBuilder &MIRBuilder, 227 const ComplexRendererFns &RenderFns = None) const; 228 /// Helper function to emit an add or sub instruction. 229 /// 230 /// \p AddrModeAndSizeToOpcode must contain each of the opcode variants above 231 /// in a specific order. 232 /// 233 /// Below is an example of the expected input to \p AddrModeAndSizeToOpcode. 234 /// 235 /// \code 236 /// const std::array<std::array<unsigned, 2>, 4> Table { 237 /// {{AArch64::ADDXri, AArch64::ADDWri}, 238 /// {AArch64::ADDXrs, AArch64::ADDWrs}, 239 /// {AArch64::ADDXrr, AArch64::ADDWrr}, 240 /// {AArch64::SUBXri, AArch64::SUBWri}, 241 /// {AArch64::ADDXrx, AArch64::ADDWrx}}}; 242 /// \endcode 243 /// 244 /// Each row in the table corresponds to a different addressing mode. Each 245 /// column corresponds to a different register size. 246 /// 247 /// \attention Rows must be structured as follows: 248 /// - Row 0: The ri opcode variants 249 /// - Row 1: The rs opcode variants 250 /// - Row 2: The rr opcode variants 251 /// - Row 3: The ri opcode variants for negative immediates 252 /// - Row 4: The rx opcode variants 253 /// 254 /// \attention Columns must be structured as follows: 255 /// - Column 0: The 64-bit opcode variants 256 /// - Column 1: The 32-bit opcode variants 257 /// 258 /// \p Dst is the destination register of the binop to emit. 259 /// \p LHS is the left-hand operand of the binop to emit. 260 /// \p RHS is the right-hand operand of the binop to emit. 261 MachineInstr *emitAddSub( 262 const std::array<std::array<unsigned, 2>, 5> &AddrModeAndSizeToOpcode, 263 Register Dst, MachineOperand &LHS, MachineOperand &RHS, 264 MachineIRBuilder &MIRBuilder) const; 265 MachineInstr *emitADD(Register DefReg, MachineOperand &LHS, 266 MachineOperand &RHS, 267 MachineIRBuilder &MIRBuilder) const; 268 MachineInstr *emitADDS(Register Dst, MachineOperand &LHS, MachineOperand &RHS, 269 MachineIRBuilder &MIRBuilder) const; 270 MachineInstr *emitSUBS(Register Dst, MachineOperand &LHS, MachineOperand &RHS, 271 MachineIRBuilder &MIRBuilder) const; 272 MachineInstr *emitCMN(MachineOperand &LHS, MachineOperand &RHS, 273 MachineIRBuilder &MIRBuilder) const; 274 MachineInstr *emitTST(MachineOperand &LHS, MachineOperand &RHS, 275 MachineIRBuilder &MIRBuilder) const; 276 MachineInstr *emitSelect(Register Dst, Register LHS, Register RHS, 277 AArch64CC::CondCode CC, 278 MachineIRBuilder &MIRBuilder) const; 279 MachineInstr *emitExtractVectorElt(Optional<Register> DstReg, 280 const RegisterBank &DstRB, LLT ScalarTy, 281 Register VecReg, unsigned LaneIdx, 282 MachineIRBuilder &MIRBuilder) const; 283 MachineInstr *emitCSINC(Register Dst, Register Src1, Register Src2, 284 AArch64CC::CondCode Pred, 285 MachineIRBuilder &MIRBuilder) const; 286 /// Emit a CSet for a FP compare. 287 /// 288 /// \p Dst is expected to be a 32-bit scalar register. 289 MachineInstr *emitCSetForFCmp(Register Dst, CmpInst::Predicate Pred, 290 MachineIRBuilder &MIRBuilder) const; 291 292 /// Emit the overflow op for \p Opcode. 293 /// 294 /// \p Opcode is expected to be an overflow op's opcode, e.g. G_UADDO, 295 /// G_USUBO, etc. 296 std::pair<MachineInstr *, AArch64CC::CondCode> 297 emitOverflowOp(unsigned Opcode, Register Dst, MachineOperand &LHS, 298 MachineOperand &RHS, MachineIRBuilder &MIRBuilder) const; 299 300 /// Emit expression as a conjunction (a series of CCMP/CFCMP ops). 301 /// In some cases this is even possible with OR operations in the expression. 302 MachineInstr *emitConjunction(Register Val, AArch64CC::CondCode &OutCC, 303 MachineIRBuilder &MIB) const; 304 MachineInstr *emitConditionalComparison(Register LHS, Register RHS, 305 CmpInst::Predicate CC, 306 AArch64CC::CondCode Predicate, 307 AArch64CC::CondCode OutCC, 308 MachineIRBuilder &MIB) const; 309 MachineInstr *emitConjunctionRec(Register Val, AArch64CC::CondCode &OutCC, 310 bool Negate, Register CCOp, 311 AArch64CC::CondCode Predicate, 312 MachineIRBuilder &MIB) const; 313 314 /// Emit a TB(N)Z instruction which tests \p Bit in \p TestReg. 315 /// \p IsNegative is true if the test should be "not zero". 316 /// This will also optimize the test bit instruction when possible. 317 MachineInstr *emitTestBit(Register TestReg, uint64_t Bit, bool IsNegative, 318 MachineBasicBlock *DstMBB, 319 MachineIRBuilder &MIB) const; 320 321 /// Emit a CB(N)Z instruction which branches to \p DestMBB. 322 MachineInstr *emitCBZ(Register CompareReg, bool IsNegative, 323 MachineBasicBlock *DestMBB, 324 MachineIRBuilder &MIB) const; 325 326 // Equivalent to the i32shift_a and friends from AArch64InstrInfo.td. 327 // We use these manually instead of using the importer since it doesn't 328 // support SDNodeXForm. 329 ComplexRendererFns selectShiftA_32(const MachineOperand &Root) const; 330 ComplexRendererFns selectShiftB_32(const MachineOperand &Root) const; 331 ComplexRendererFns selectShiftA_64(const MachineOperand &Root) const; 332 ComplexRendererFns selectShiftB_64(const MachineOperand &Root) const; 333 334 ComplexRendererFns select12BitValueWithLeftShift(uint64_t Immed) const; 335 ComplexRendererFns selectArithImmed(MachineOperand &Root) const; 336 ComplexRendererFns selectNegArithImmed(MachineOperand &Root) const; 337 338 ComplexRendererFns selectAddrModeUnscaled(MachineOperand &Root, 339 unsigned Size) const; 340 341 ComplexRendererFns selectAddrModeUnscaled8(MachineOperand &Root) const { 342 return selectAddrModeUnscaled(Root, 1); 343 } 344 ComplexRendererFns selectAddrModeUnscaled16(MachineOperand &Root) const { 345 return selectAddrModeUnscaled(Root, 2); 346 } 347 ComplexRendererFns selectAddrModeUnscaled32(MachineOperand &Root) const { 348 return selectAddrModeUnscaled(Root, 4); 349 } 350 ComplexRendererFns selectAddrModeUnscaled64(MachineOperand &Root) const { 351 return selectAddrModeUnscaled(Root, 8); 352 } 353 ComplexRendererFns selectAddrModeUnscaled128(MachineOperand &Root) const { 354 return selectAddrModeUnscaled(Root, 16); 355 } 356 357 /// Helper to try to fold in a GISEL_ADD_LOW into an immediate, to be used 358 /// from complex pattern matchers like selectAddrModeIndexed(). 359 ComplexRendererFns tryFoldAddLowIntoImm(MachineInstr &RootDef, unsigned Size, 360 MachineRegisterInfo &MRI) const; 361 362 ComplexRendererFns selectAddrModeIndexed(MachineOperand &Root, 363 unsigned Size) const; 364 template <int Width> 365 ComplexRendererFns selectAddrModeIndexed(MachineOperand &Root) const { 366 return selectAddrModeIndexed(Root, Width / 8); 367 } 368 369 bool isWorthFoldingIntoExtendedReg(MachineInstr &MI, 370 const MachineRegisterInfo &MRI) const; 371 ComplexRendererFns 372 selectAddrModeShiftedExtendXReg(MachineOperand &Root, 373 unsigned SizeInBytes) const; 374 375 /// Returns a \p ComplexRendererFns which contains a base, offset, and whether 376 /// or not a shift + extend should be folded into an addressing mode. Returns 377 /// None when this is not profitable or possible. 378 ComplexRendererFns 379 selectExtendedSHL(MachineOperand &Root, MachineOperand &Base, 380 MachineOperand &Offset, unsigned SizeInBytes, 381 bool WantsExt) const; 382 ComplexRendererFns selectAddrModeRegisterOffset(MachineOperand &Root) const; 383 ComplexRendererFns selectAddrModeXRO(MachineOperand &Root, 384 unsigned SizeInBytes) const; 385 template <int Width> 386 ComplexRendererFns selectAddrModeXRO(MachineOperand &Root) const { 387 return selectAddrModeXRO(Root, Width / 8); 388 } 389 390 ComplexRendererFns selectAddrModeWRO(MachineOperand &Root, 391 unsigned SizeInBytes) const; 392 template <int Width> 393 ComplexRendererFns selectAddrModeWRO(MachineOperand &Root) const { 394 return selectAddrModeWRO(Root, Width / 8); 395 } 396 397 ComplexRendererFns selectShiftedRegister(MachineOperand &Root, 398 bool AllowROR = false) const; 399 400 ComplexRendererFns selectArithShiftedRegister(MachineOperand &Root) const { 401 return selectShiftedRegister(Root); 402 } 403 404 ComplexRendererFns selectLogicalShiftedRegister(MachineOperand &Root) const { 405 return selectShiftedRegister(Root, true); 406 } 407 408 /// Given an extend instruction, determine the correct shift-extend type for 409 /// that instruction. 410 /// 411 /// If the instruction is going to be used in a load or store, pass 412 /// \p IsLoadStore = true. 413 AArch64_AM::ShiftExtendType 414 getExtendTypeForInst(MachineInstr &MI, MachineRegisterInfo &MRI, 415 bool IsLoadStore = false) const; 416 417 /// Move \p Reg to \p RC if \p Reg is not already on \p RC. 418 /// 419 /// \returns Either \p Reg if no change was necessary, or the new register 420 /// created by moving \p Reg. 421 /// 422 /// Note: This uses emitCopy right now. 423 Register moveScalarRegClass(Register Reg, const TargetRegisterClass &RC, 424 MachineIRBuilder &MIB) const; 425 426 ComplexRendererFns selectArithExtendedRegister(MachineOperand &Root) const; 427 428 void renderTruncImm(MachineInstrBuilder &MIB, const MachineInstr &MI, 429 int OpIdx = -1) const; 430 void renderLogicalImm32(MachineInstrBuilder &MIB, const MachineInstr &I, 431 int OpIdx = -1) const; 432 void renderLogicalImm64(MachineInstrBuilder &MIB, const MachineInstr &I, 433 int OpIdx = -1) const; 434 void renderFPImm16(MachineInstrBuilder &MIB, const MachineInstr &MI, 435 int OpIdx = -1) const; 436 void renderFPImm32(MachineInstrBuilder &MIB, const MachineInstr &MI, 437 int OpIdx = -1) const; 438 void renderFPImm64(MachineInstrBuilder &MIB, const MachineInstr &MI, 439 int OpIdx = -1) const; 440 void renderFPImm32SIMDModImmType4(MachineInstrBuilder &MIB, 441 const MachineInstr &MI, 442 int OpIdx = -1) const; 443 444 // Materialize a GlobalValue or BlockAddress using a movz+movk sequence. 445 void materializeLargeCMVal(MachineInstr &I, const Value *V, unsigned OpFlags); 446 447 // Optimization methods. 448 bool tryOptSelect(GSelect &Sel); 449 bool tryOptSelectConjunction(GSelect &Sel, MachineInstr &CondMI); 450 MachineInstr *tryFoldIntegerCompare(MachineOperand &LHS, MachineOperand &RHS, 451 MachineOperand &Predicate, 452 MachineIRBuilder &MIRBuilder) const; 453 454 /// Return true if \p MI is a load or store of \p NumBytes bytes. 455 bool isLoadStoreOfNumBytes(const MachineInstr &MI, unsigned NumBytes) const; 456 457 /// Returns true if \p MI is guaranteed to have the high-half of a 64-bit 458 /// register zeroed out. In other words, the result of MI has been explicitly 459 /// zero extended. 460 bool isDef32(const MachineInstr &MI) const; 461 462 const AArch64TargetMachine &TM; 463 const AArch64Subtarget &STI; 464 const AArch64InstrInfo &TII; 465 const AArch64RegisterInfo &TRI; 466 const AArch64RegisterBankInfo &RBI; 467 468 bool ProduceNonFlagSettingCondBr = false; 469 470 // Some cached values used during selection. 471 // We use LR as a live-in register, and we keep track of it here as it can be 472 // clobbered by calls. 473 Register MFReturnAddr; 474 475 MachineIRBuilder MIB; 476 477 #define GET_GLOBALISEL_PREDICATES_DECL 478 #include "AArch64GenGlobalISel.inc" 479 #undef GET_GLOBALISEL_PREDICATES_DECL 480 481 // We declare the temporaries used by selectImpl() in the class to minimize the 482 // cost of constructing placeholder values. 483 #define GET_GLOBALISEL_TEMPORARIES_DECL 484 #include "AArch64GenGlobalISel.inc" 485 #undef GET_GLOBALISEL_TEMPORARIES_DECL 486 }; 487 488 } // end anonymous namespace 489 490 #define GET_GLOBALISEL_IMPL 491 #include "AArch64GenGlobalISel.inc" 492 #undef GET_GLOBALISEL_IMPL 493 494 AArch64InstructionSelector::AArch64InstructionSelector( 495 const AArch64TargetMachine &TM, const AArch64Subtarget &STI, 496 const AArch64RegisterBankInfo &RBI) 497 : TM(TM), STI(STI), TII(*STI.getInstrInfo()), TRI(*STI.getRegisterInfo()), 498 RBI(RBI), 499 #define GET_GLOBALISEL_PREDICATES_INIT 500 #include "AArch64GenGlobalISel.inc" 501 #undef GET_GLOBALISEL_PREDICATES_INIT 502 #define GET_GLOBALISEL_TEMPORARIES_INIT 503 #include "AArch64GenGlobalISel.inc" 504 #undef GET_GLOBALISEL_TEMPORARIES_INIT 505 { 506 } 507 508 // FIXME: This should be target-independent, inferred from the types declared 509 // for each class in the bank. 510 // 511 /// Given a register bank, and a type, return the smallest register class that 512 /// can represent that combination. 513 static const TargetRegisterClass * 514 getRegClassForTypeOnBank(LLT Ty, const RegisterBank &RB, 515 bool GetAllRegSet = false) { 516 if (RB.getID() == AArch64::GPRRegBankID) { 517 if (Ty.getSizeInBits() <= 32) 518 return GetAllRegSet ? &AArch64::GPR32allRegClass 519 : &AArch64::GPR32RegClass; 520 if (Ty.getSizeInBits() == 64) 521 return GetAllRegSet ? &AArch64::GPR64allRegClass 522 : &AArch64::GPR64RegClass; 523 if (Ty.getSizeInBits() == 128) 524 return &AArch64::XSeqPairsClassRegClass; 525 return nullptr; 526 } 527 528 if (RB.getID() == AArch64::FPRRegBankID) { 529 switch (Ty.getSizeInBits()) { 530 case 8: 531 return &AArch64::FPR8RegClass; 532 case 16: 533 return &AArch64::FPR16RegClass; 534 case 32: 535 return &AArch64::FPR32RegClass; 536 case 64: 537 return &AArch64::FPR64RegClass; 538 case 128: 539 return &AArch64::FPR128RegClass; 540 } 541 return nullptr; 542 } 543 544 return nullptr; 545 } 546 547 /// Given a register bank, and size in bits, return the smallest register class 548 /// that can represent that combination. 549 static const TargetRegisterClass * 550 getMinClassForRegBank(const RegisterBank &RB, unsigned SizeInBits, 551 bool GetAllRegSet = false) { 552 unsigned RegBankID = RB.getID(); 553 554 if (RegBankID == AArch64::GPRRegBankID) { 555 if (SizeInBits <= 32) 556 return GetAllRegSet ? &AArch64::GPR32allRegClass 557 : &AArch64::GPR32RegClass; 558 if (SizeInBits == 64) 559 return GetAllRegSet ? &AArch64::GPR64allRegClass 560 : &AArch64::GPR64RegClass; 561 if (SizeInBits == 128) 562 return &AArch64::XSeqPairsClassRegClass; 563 } 564 565 if (RegBankID == AArch64::FPRRegBankID) { 566 switch (SizeInBits) { 567 default: 568 return nullptr; 569 case 8: 570 return &AArch64::FPR8RegClass; 571 case 16: 572 return &AArch64::FPR16RegClass; 573 case 32: 574 return &AArch64::FPR32RegClass; 575 case 64: 576 return &AArch64::FPR64RegClass; 577 case 128: 578 return &AArch64::FPR128RegClass; 579 } 580 } 581 582 return nullptr; 583 } 584 585 /// Returns the correct subregister to use for a given register class. 586 static bool getSubRegForClass(const TargetRegisterClass *RC, 587 const TargetRegisterInfo &TRI, unsigned &SubReg) { 588 switch (TRI.getRegSizeInBits(*RC)) { 589 case 8: 590 SubReg = AArch64::bsub; 591 break; 592 case 16: 593 SubReg = AArch64::hsub; 594 break; 595 case 32: 596 if (RC != &AArch64::FPR32RegClass) 597 SubReg = AArch64::sub_32; 598 else 599 SubReg = AArch64::ssub; 600 break; 601 case 64: 602 SubReg = AArch64::dsub; 603 break; 604 default: 605 LLVM_DEBUG( 606 dbgs() << "Couldn't find appropriate subregister for register class."); 607 return false; 608 } 609 610 return true; 611 } 612 613 /// Returns the minimum size the given register bank can hold. 614 static unsigned getMinSizeForRegBank(const RegisterBank &RB) { 615 switch (RB.getID()) { 616 case AArch64::GPRRegBankID: 617 return 32; 618 case AArch64::FPRRegBankID: 619 return 8; 620 default: 621 llvm_unreachable("Tried to get minimum size for unknown register bank."); 622 } 623 } 624 625 /// Create a REG_SEQUENCE instruction using the registers in \p Regs. 626 /// Helper function for functions like createDTuple and createQTuple. 627 /// 628 /// \p RegClassIDs - The list of register class IDs available for some tuple of 629 /// a scalar class. E.g. QQRegClassID, QQQRegClassID, QQQQRegClassID. This is 630 /// expected to contain between 2 and 4 tuple classes. 631 /// 632 /// \p SubRegs - The list of subregister classes associated with each register 633 /// class ID in \p RegClassIDs. E.g., QQRegClassID should use the qsub0 634 /// subregister class. The index of each subregister class is expected to 635 /// correspond with the index of each register class. 636 /// 637 /// \returns Either the destination register of REG_SEQUENCE instruction that 638 /// was created, or the 0th element of \p Regs if \p Regs contains a single 639 /// element. 640 static Register createTuple(ArrayRef<Register> Regs, 641 const unsigned RegClassIDs[], 642 const unsigned SubRegs[], MachineIRBuilder &MIB) { 643 unsigned NumRegs = Regs.size(); 644 if (NumRegs == 1) 645 return Regs[0]; 646 assert(NumRegs >= 2 && NumRegs <= 4 && 647 "Only support between two and 4 registers in a tuple!"); 648 const TargetRegisterInfo *TRI = MIB.getMF().getSubtarget().getRegisterInfo(); 649 auto *DesiredClass = TRI->getRegClass(RegClassIDs[NumRegs - 2]); 650 auto RegSequence = 651 MIB.buildInstr(TargetOpcode::REG_SEQUENCE, {DesiredClass}, {}); 652 for (unsigned I = 0, E = Regs.size(); I < E; ++I) { 653 RegSequence.addUse(Regs[I]); 654 RegSequence.addImm(SubRegs[I]); 655 } 656 return RegSequence.getReg(0); 657 } 658 659 /// Create a tuple of D-registers using the registers in \p Regs. 660 static Register createDTuple(ArrayRef<Register> Regs, MachineIRBuilder &MIB) { 661 static const unsigned RegClassIDs[] = { 662 AArch64::DDRegClassID, AArch64::DDDRegClassID, AArch64::DDDDRegClassID}; 663 static const unsigned SubRegs[] = {AArch64::dsub0, AArch64::dsub1, 664 AArch64::dsub2, AArch64::dsub3}; 665 return createTuple(Regs, RegClassIDs, SubRegs, MIB); 666 } 667 668 /// Create a tuple of Q-registers using the registers in \p Regs. 669 static Register createQTuple(ArrayRef<Register> Regs, MachineIRBuilder &MIB) { 670 static const unsigned RegClassIDs[] = { 671 AArch64::QQRegClassID, AArch64::QQQRegClassID, AArch64::QQQQRegClassID}; 672 static const unsigned SubRegs[] = {AArch64::qsub0, AArch64::qsub1, 673 AArch64::qsub2, AArch64::qsub3}; 674 return createTuple(Regs, RegClassIDs, SubRegs, MIB); 675 } 676 677 static Optional<uint64_t> getImmedFromMO(const MachineOperand &Root) { 678 auto &MI = *Root.getParent(); 679 auto &MBB = *MI.getParent(); 680 auto &MF = *MBB.getParent(); 681 auto &MRI = MF.getRegInfo(); 682 uint64_t Immed; 683 if (Root.isImm()) 684 Immed = Root.getImm(); 685 else if (Root.isCImm()) 686 Immed = Root.getCImm()->getZExtValue(); 687 else if (Root.isReg()) { 688 auto ValAndVReg = 689 getIConstantVRegValWithLookThrough(Root.getReg(), MRI, true); 690 if (!ValAndVReg) 691 return None; 692 Immed = ValAndVReg->Value.getSExtValue(); 693 } else 694 return None; 695 return Immed; 696 } 697 698 /// Check whether \p I is a currently unsupported binary operation: 699 /// - it has an unsized type 700 /// - an operand is not a vreg 701 /// - all operands are not in the same bank 702 /// These are checks that should someday live in the verifier, but right now, 703 /// these are mostly limitations of the aarch64 selector. 704 static bool unsupportedBinOp(const MachineInstr &I, 705 const AArch64RegisterBankInfo &RBI, 706 const MachineRegisterInfo &MRI, 707 const AArch64RegisterInfo &TRI) { 708 LLT Ty = MRI.getType(I.getOperand(0).getReg()); 709 if (!Ty.isValid()) { 710 LLVM_DEBUG(dbgs() << "Generic binop register should be typed\n"); 711 return true; 712 } 713 714 const RegisterBank *PrevOpBank = nullptr; 715 for (auto &MO : I.operands()) { 716 // FIXME: Support non-register operands. 717 if (!MO.isReg()) { 718 LLVM_DEBUG(dbgs() << "Generic inst non-reg operands are unsupported\n"); 719 return true; 720 } 721 722 // FIXME: Can generic operations have physical registers operands? If 723 // so, this will need to be taught about that, and we'll need to get the 724 // bank out of the minimal class for the register. 725 // Either way, this needs to be documented (and possibly verified). 726 if (!Register::isVirtualRegister(MO.getReg())) { 727 LLVM_DEBUG(dbgs() << "Generic inst has physical register operand\n"); 728 return true; 729 } 730 731 const RegisterBank *OpBank = RBI.getRegBank(MO.getReg(), MRI, TRI); 732 if (!OpBank) { 733 LLVM_DEBUG(dbgs() << "Generic register has no bank or class\n"); 734 return true; 735 } 736 737 if (PrevOpBank && OpBank != PrevOpBank) { 738 LLVM_DEBUG(dbgs() << "Generic inst operands have different banks\n"); 739 return true; 740 } 741 PrevOpBank = OpBank; 742 } 743 return false; 744 } 745 746 /// Select the AArch64 opcode for the basic binary operation \p GenericOpc 747 /// (such as G_OR or G_SDIV), appropriate for the register bank \p RegBankID 748 /// and of size \p OpSize. 749 /// \returns \p GenericOpc if the combination is unsupported. 750 static unsigned selectBinaryOp(unsigned GenericOpc, unsigned RegBankID, 751 unsigned OpSize) { 752 switch (RegBankID) { 753 case AArch64::GPRRegBankID: 754 if (OpSize == 32) { 755 switch (GenericOpc) { 756 case TargetOpcode::G_SHL: 757 return AArch64::LSLVWr; 758 case TargetOpcode::G_LSHR: 759 return AArch64::LSRVWr; 760 case TargetOpcode::G_ASHR: 761 return AArch64::ASRVWr; 762 default: 763 return GenericOpc; 764 } 765 } else if (OpSize == 64) { 766 switch (GenericOpc) { 767 case TargetOpcode::G_PTR_ADD: 768 return AArch64::ADDXrr; 769 case TargetOpcode::G_SHL: 770 return AArch64::LSLVXr; 771 case TargetOpcode::G_LSHR: 772 return AArch64::LSRVXr; 773 case TargetOpcode::G_ASHR: 774 return AArch64::ASRVXr; 775 default: 776 return GenericOpc; 777 } 778 } 779 break; 780 case AArch64::FPRRegBankID: 781 switch (OpSize) { 782 case 32: 783 switch (GenericOpc) { 784 case TargetOpcode::G_FADD: 785 return AArch64::FADDSrr; 786 case TargetOpcode::G_FSUB: 787 return AArch64::FSUBSrr; 788 case TargetOpcode::G_FMUL: 789 return AArch64::FMULSrr; 790 case TargetOpcode::G_FDIV: 791 return AArch64::FDIVSrr; 792 default: 793 return GenericOpc; 794 } 795 case 64: 796 switch (GenericOpc) { 797 case TargetOpcode::G_FADD: 798 return AArch64::FADDDrr; 799 case TargetOpcode::G_FSUB: 800 return AArch64::FSUBDrr; 801 case TargetOpcode::G_FMUL: 802 return AArch64::FMULDrr; 803 case TargetOpcode::G_FDIV: 804 return AArch64::FDIVDrr; 805 case TargetOpcode::G_OR: 806 return AArch64::ORRv8i8; 807 default: 808 return GenericOpc; 809 } 810 } 811 break; 812 } 813 return GenericOpc; 814 } 815 816 /// Select the AArch64 opcode for the G_LOAD or G_STORE operation \p GenericOpc, 817 /// appropriate for the (value) register bank \p RegBankID and of memory access 818 /// size \p OpSize. This returns the variant with the base+unsigned-immediate 819 /// addressing mode (e.g., LDRXui). 820 /// \returns \p GenericOpc if the combination is unsupported. 821 static unsigned selectLoadStoreUIOp(unsigned GenericOpc, unsigned RegBankID, 822 unsigned OpSize) { 823 const bool isStore = GenericOpc == TargetOpcode::G_STORE; 824 switch (RegBankID) { 825 case AArch64::GPRRegBankID: 826 switch (OpSize) { 827 case 8: 828 return isStore ? AArch64::STRBBui : AArch64::LDRBBui; 829 case 16: 830 return isStore ? AArch64::STRHHui : AArch64::LDRHHui; 831 case 32: 832 return isStore ? AArch64::STRWui : AArch64::LDRWui; 833 case 64: 834 return isStore ? AArch64::STRXui : AArch64::LDRXui; 835 } 836 break; 837 case AArch64::FPRRegBankID: 838 switch (OpSize) { 839 case 8: 840 return isStore ? AArch64::STRBui : AArch64::LDRBui; 841 case 16: 842 return isStore ? AArch64::STRHui : AArch64::LDRHui; 843 case 32: 844 return isStore ? AArch64::STRSui : AArch64::LDRSui; 845 case 64: 846 return isStore ? AArch64::STRDui : AArch64::LDRDui; 847 case 128: 848 return isStore ? AArch64::STRQui : AArch64::LDRQui; 849 } 850 break; 851 } 852 return GenericOpc; 853 } 854 855 /// Helper function for selectCopy. Inserts a subregister copy from \p SrcReg 856 /// to \p *To. 857 /// 858 /// E.g "To = COPY SrcReg:SubReg" 859 static bool copySubReg(MachineInstr &I, MachineRegisterInfo &MRI, 860 const RegisterBankInfo &RBI, Register SrcReg, 861 const TargetRegisterClass *To, unsigned SubReg) { 862 assert(SrcReg.isValid() && "Expected a valid source register?"); 863 assert(To && "Destination register class cannot be null"); 864 assert(SubReg && "Expected a valid subregister"); 865 866 MachineIRBuilder MIB(I); 867 auto SubRegCopy = 868 MIB.buildInstr(TargetOpcode::COPY, {To}, {}).addReg(SrcReg, 0, SubReg); 869 MachineOperand &RegOp = I.getOperand(1); 870 RegOp.setReg(SubRegCopy.getReg(0)); 871 872 // It's possible that the destination register won't be constrained. Make 873 // sure that happens. 874 if (!Register::isPhysicalRegister(I.getOperand(0).getReg())) 875 RBI.constrainGenericRegister(I.getOperand(0).getReg(), *To, MRI); 876 877 return true; 878 } 879 880 /// Helper function to get the source and destination register classes for a 881 /// copy. Returns a std::pair containing the source register class for the 882 /// copy, and the destination register class for the copy. If a register class 883 /// cannot be determined, then it will be nullptr. 884 static std::pair<const TargetRegisterClass *, const TargetRegisterClass *> 885 getRegClassesForCopy(MachineInstr &I, const TargetInstrInfo &TII, 886 MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI, 887 const RegisterBankInfo &RBI) { 888 Register DstReg = I.getOperand(0).getReg(); 889 Register SrcReg = I.getOperand(1).getReg(); 890 const RegisterBank &DstRegBank = *RBI.getRegBank(DstReg, MRI, TRI); 891 const RegisterBank &SrcRegBank = *RBI.getRegBank(SrcReg, MRI, TRI); 892 unsigned DstSize = RBI.getSizeInBits(DstReg, MRI, TRI); 893 unsigned SrcSize = RBI.getSizeInBits(SrcReg, MRI, TRI); 894 895 // Special casing for cross-bank copies of s1s. We can technically represent 896 // a 1-bit value with any size of register. The minimum size for a GPR is 32 897 // bits. So, we need to put the FPR on 32 bits as well. 898 // 899 // FIXME: I'm not sure if this case holds true outside of copies. If it does, 900 // then we can pull it into the helpers that get the appropriate class for a 901 // register bank. Or make a new helper that carries along some constraint 902 // information. 903 if (SrcRegBank != DstRegBank && (DstSize == 1 && SrcSize == 1)) 904 SrcSize = DstSize = 32; 905 906 return {getMinClassForRegBank(SrcRegBank, SrcSize, true), 907 getMinClassForRegBank(DstRegBank, DstSize, true)}; 908 } 909 910 static bool selectCopy(MachineInstr &I, const TargetInstrInfo &TII, 911 MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI, 912 const RegisterBankInfo &RBI) { 913 Register DstReg = I.getOperand(0).getReg(); 914 Register SrcReg = I.getOperand(1).getReg(); 915 const RegisterBank &DstRegBank = *RBI.getRegBank(DstReg, MRI, TRI); 916 const RegisterBank &SrcRegBank = *RBI.getRegBank(SrcReg, MRI, TRI); 917 918 // Find the correct register classes for the source and destination registers. 919 const TargetRegisterClass *SrcRC; 920 const TargetRegisterClass *DstRC; 921 std::tie(SrcRC, DstRC) = getRegClassesForCopy(I, TII, MRI, TRI, RBI); 922 923 if (!DstRC) { 924 LLVM_DEBUG(dbgs() << "Unexpected dest size " 925 << RBI.getSizeInBits(DstReg, MRI, TRI) << '\n'); 926 return false; 927 } 928 929 // Is this a copy? If so, then we may need to insert a subregister copy. 930 if (I.isCopy()) { 931 // Yes. Check if there's anything to fix up. 932 if (!SrcRC) { 933 LLVM_DEBUG(dbgs() << "Couldn't determine source register class\n"); 934 return false; 935 } 936 937 unsigned SrcSize = TRI.getRegSizeInBits(*SrcRC); 938 unsigned DstSize = TRI.getRegSizeInBits(*DstRC); 939 unsigned SubReg; 940 941 // If the source bank doesn't support a subregister copy small enough, 942 // then we first need to copy to the destination bank. 943 if (getMinSizeForRegBank(SrcRegBank) > DstSize) { 944 const TargetRegisterClass *DstTempRC = 945 getMinClassForRegBank(DstRegBank, SrcSize, /* GetAllRegSet */ true); 946 getSubRegForClass(DstRC, TRI, SubReg); 947 948 MachineIRBuilder MIB(I); 949 auto Copy = MIB.buildCopy({DstTempRC}, {SrcReg}); 950 copySubReg(I, MRI, RBI, Copy.getReg(0), DstRC, SubReg); 951 } else if (SrcSize > DstSize) { 952 // If the source register is bigger than the destination we need to 953 // perform a subregister copy. 954 const TargetRegisterClass *SubRegRC = 955 getMinClassForRegBank(SrcRegBank, DstSize, /* GetAllRegSet */ true); 956 getSubRegForClass(SubRegRC, TRI, SubReg); 957 copySubReg(I, MRI, RBI, SrcReg, DstRC, SubReg); 958 } else if (DstSize > SrcSize) { 959 // If the destination register is bigger than the source we need to do 960 // a promotion using SUBREG_TO_REG. 961 const TargetRegisterClass *PromotionRC = 962 getMinClassForRegBank(SrcRegBank, DstSize, /* GetAllRegSet */ true); 963 getSubRegForClass(SrcRC, TRI, SubReg); 964 965 Register PromoteReg = MRI.createVirtualRegister(PromotionRC); 966 BuildMI(*I.getParent(), I, I.getDebugLoc(), 967 TII.get(AArch64::SUBREG_TO_REG), PromoteReg) 968 .addImm(0) 969 .addUse(SrcReg) 970 .addImm(SubReg); 971 MachineOperand &RegOp = I.getOperand(1); 972 RegOp.setReg(PromoteReg); 973 } 974 975 // If the destination is a physical register, then there's nothing to 976 // change, so we're done. 977 if (Register::isPhysicalRegister(DstReg)) 978 return true; 979 } 980 981 // No need to constrain SrcReg. It will get constrained when we hit another 982 // of its use or its defs. Copies do not have constraints. 983 if (!RBI.constrainGenericRegister(DstReg, *DstRC, MRI)) { 984 LLVM_DEBUG(dbgs() << "Failed to constrain " << TII.getName(I.getOpcode()) 985 << " operand\n"); 986 return false; 987 } 988 989 // If this a GPR ZEXT that we want to just reduce down into a copy. 990 // The sizes will be mismatched with the source < 32b but that's ok. 991 if (I.getOpcode() == TargetOpcode::G_ZEXT) { 992 I.setDesc(TII.get(AArch64::COPY)); 993 assert(SrcRegBank.getID() == AArch64::GPRRegBankID); 994 return selectCopy(I, TII, MRI, TRI, RBI); 995 } 996 997 I.setDesc(TII.get(AArch64::COPY)); 998 return true; 999 } 1000 1001 static unsigned selectFPConvOpc(unsigned GenericOpc, LLT DstTy, LLT SrcTy) { 1002 if (!DstTy.isScalar() || !SrcTy.isScalar()) 1003 return GenericOpc; 1004 1005 const unsigned DstSize = DstTy.getSizeInBits(); 1006 const unsigned SrcSize = SrcTy.getSizeInBits(); 1007 1008 switch (DstSize) { 1009 case 32: 1010 switch (SrcSize) { 1011 case 32: 1012 switch (GenericOpc) { 1013 case TargetOpcode::G_SITOFP: 1014 return AArch64::SCVTFUWSri; 1015 case TargetOpcode::G_UITOFP: 1016 return AArch64::UCVTFUWSri; 1017 case TargetOpcode::G_FPTOSI: 1018 return AArch64::FCVTZSUWSr; 1019 case TargetOpcode::G_FPTOUI: 1020 return AArch64::FCVTZUUWSr; 1021 default: 1022 return GenericOpc; 1023 } 1024 case 64: 1025 switch (GenericOpc) { 1026 case TargetOpcode::G_SITOFP: 1027 return AArch64::SCVTFUXSri; 1028 case TargetOpcode::G_UITOFP: 1029 return AArch64::UCVTFUXSri; 1030 case TargetOpcode::G_FPTOSI: 1031 return AArch64::FCVTZSUWDr; 1032 case TargetOpcode::G_FPTOUI: 1033 return AArch64::FCVTZUUWDr; 1034 default: 1035 return GenericOpc; 1036 } 1037 default: 1038 return GenericOpc; 1039 } 1040 case 64: 1041 switch (SrcSize) { 1042 case 32: 1043 switch (GenericOpc) { 1044 case TargetOpcode::G_SITOFP: 1045 return AArch64::SCVTFUWDri; 1046 case TargetOpcode::G_UITOFP: 1047 return AArch64::UCVTFUWDri; 1048 case TargetOpcode::G_FPTOSI: 1049 return AArch64::FCVTZSUXSr; 1050 case TargetOpcode::G_FPTOUI: 1051 return AArch64::FCVTZUUXSr; 1052 default: 1053 return GenericOpc; 1054 } 1055 case 64: 1056 switch (GenericOpc) { 1057 case TargetOpcode::G_SITOFP: 1058 return AArch64::SCVTFUXDri; 1059 case TargetOpcode::G_UITOFP: 1060 return AArch64::UCVTFUXDri; 1061 case TargetOpcode::G_FPTOSI: 1062 return AArch64::FCVTZSUXDr; 1063 case TargetOpcode::G_FPTOUI: 1064 return AArch64::FCVTZUUXDr; 1065 default: 1066 return GenericOpc; 1067 } 1068 default: 1069 return GenericOpc; 1070 } 1071 default: 1072 return GenericOpc; 1073 }; 1074 return GenericOpc; 1075 } 1076 1077 MachineInstr * 1078 AArch64InstructionSelector::emitSelect(Register Dst, Register True, 1079 Register False, AArch64CC::CondCode CC, 1080 MachineIRBuilder &MIB) const { 1081 MachineRegisterInfo &MRI = *MIB.getMRI(); 1082 assert(RBI.getRegBank(False, MRI, TRI)->getID() == 1083 RBI.getRegBank(True, MRI, TRI)->getID() && 1084 "Expected both select operands to have the same regbank?"); 1085 LLT Ty = MRI.getType(True); 1086 if (Ty.isVector()) 1087 return nullptr; 1088 const unsigned Size = Ty.getSizeInBits(); 1089 assert((Size == 32 || Size == 64) && 1090 "Expected 32 bit or 64 bit select only?"); 1091 const bool Is32Bit = Size == 32; 1092 if (RBI.getRegBank(True, MRI, TRI)->getID() != AArch64::GPRRegBankID) { 1093 unsigned Opc = Is32Bit ? AArch64::FCSELSrrr : AArch64::FCSELDrrr; 1094 auto FCSel = MIB.buildInstr(Opc, {Dst}, {True, False}).addImm(CC); 1095 constrainSelectedInstRegOperands(*FCSel, TII, TRI, RBI); 1096 return &*FCSel; 1097 } 1098 1099 // By default, we'll try and emit a CSEL. 1100 unsigned Opc = Is32Bit ? AArch64::CSELWr : AArch64::CSELXr; 1101 bool Optimized = false; 1102 auto TryFoldBinOpIntoSelect = [&Opc, Is32Bit, &CC, &MRI, 1103 &Optimized](Register &Reg, Register &OtherReg, 1104 bool Invert) { 1105 if (Optimized) 1106 return false; 1107 1108 // Attempt to fold: 1109 // 1110 // %sub = G_SUB 0, %x 1111 // %select = G_SELECT cc, %reg, %sub 1112 // 1113 // Into: 1114 // %select = CSNEG %reg, %x, cc 1115 Register MatchReg; 1116 if (mi_match(Reg, MRI, m_Neg(m_Reg(MatchReg)))) { 1117 Opc = Is32Bit ? AArch64::CSNEGWr : AArch64::CSNEGXr; 1118 Reg = MatchReg; 1119 if (Invert) { 1120 CC = AArch64CC::getInvertedCondCode(CC); 1121 std::swap(Reg, OtherReg); 1122 } 1123 return true; 1124 } 1125 1126 // Attempt to fold: 1127 // 1128 // %xor = G_XOR %x, -1 1129 // %select = G_SELECT cc, %reg, %xor 1130 // 1131 // Into: 1132 // %select = CSINV %reg, %x, cc 1133 if (mi_match(Reg, MRI, m_Not(m_Reg(MatchReg)))) { 1134 Opc = Is32Bit ? AArch64::CSINVWr : AArch64::CSINVXr; 1135 Reg = MatchReg; 1136 if (Invert) { 1137 CC = AArch64CC::getInvertedCondCode(CC); 1138 std::swap(Reg, OtherReg); 1139 } 1140 return true; 1141 } 1142 1143 // Attempt to fold: 1144 // 1145 // %add = G_ADD %x, 1 1146 // %select = G_SELECT cc, %reg, %add 1147 // 1148 // Into: 1149 // %select = CSINC %reg, %x, cc 1150 if (mi_match(Reg, MRI, 1151 m_any_of(m_GAdd(m_Reg(MatchReg), m_SpecificICst(1)), 1152 m_GPtrAdd(m_Reg(MatchReg), m_SpecificICst(1))))) { 1153 Opc = Is32Bit ? AArch64::CSINCWr : AArch64::CSINCXr; 1154 Reg = MatchReg; 1155 if (Invert) { 1156 CC = AArch64CC::getInvertedCondCode(CC); 1157 std::swap(Reg, OtherReg); 1158 } 1159 return true; 1160 } 1161 1162 return false; 1163 }; 1164 1165 // Helper lambda which tries to use CSINC/CSINV for the instruction when its 1166 // true/false values are constants. 1167 // FIXME: All of these patterns already exist in tablegen. We should be 1168 // able to import these. 1169 auto TryOptSelectCst = [&Opc, &True, &False, &CC, Is32Bit, &MRI, 1170 &Optimized]() { 1171 if (Optimized) 1172 return false; 1173 auto TrueCst = getIConstantVRegValWithLookThrough(True, MRI); 1174 auto FalseCst = getIConstantVRegValWithLookThrough(False, MRI); 1175 if (!TrueCst && !FalseCst) 1176 return false; 1177 1178 Register ZReg = Is32Bit ? AArch64::WZR : AArch64::XZR; 1179 if (TrueCst && FalseCst) { 1180 int64_t T = TrueCst->Value.getSExtValue(); 1181 int64_t F = FalseCst->Value.getSExtValue(); 1182 1183 if (T == 0 && F == 1) { 1184 // G_SELECT cc, 0, 1 -> CSINC zreg, zreg, cc 1185 Opc = Is32Bit ? AArch64::CSINCWr : AArch64::CSINCXr; 1186 True = ZReg; 1187 False = ZReg; 1188 return true; 1189 } 1190 1191 if (T == 0 && F == -1) { 1192 // G_SELECT cc 0, -1 -> CSINV zreg, zreg cc 1193 Opc = Is32Bit ? AArch64::CSINVWr : AArch64::CSINVXr; 1194 True = ZReg; 1195 False = ZReg; 1196 return true; 1197 } 1198 } 1199 1200 if (TrueCst) { 1201 int64_t T = TrueCst->Value.getSExtValue(); 1202 if (T == 1) { 1203 // G_SELECT cc, 1, f -> CSINC f, zreg, inv_cc 1204 Opc = Is32Bit ? AArch64::CSINCWr : AArch64::CSINCXr; 1205 True = False; 1206 False = ZReg; 1207 CC = AArch64CC::getInvertedCondCode(CC); 1208 return true; 1209 } 1210 1211 if (T == -1) { 1212 // G_SELECT cc, -1, f -> CSINV f, zreg, inv_cc 1213 Opc = Is32Bit ? AArch64::CSINVWr : AArch64::CSINVXr; 1214 True = False; 1215 False = ZReg; 1216 CC = AArch64CC::getInvertedCondCode(CC); 1217 return true; 1218 } 1219 } 1220 1221 if (FalseCst) { 1222 int64_t F = FalseCst->Value.getSExtValue(); 1223 if (F == 1) { 1224 // G_SELECT cc, t, 1 -> CSINC t, zreg, cc 1225 Opc = Is32Bit ? AArch64::CSINCWr : AArch64::CSINCXr; 1226 False = ZReg; 1227 return true; 1228 } 1229 1230 if (F == -1) { 1231 // G_SELECT cc, t, -1 -> CSINC t, zreg, cc 1232 Opc = Is32Bit ? AArch64::CSINVWr : AArch64::CSINVXr; 1233 False = ZReg; 1234 return true; 1235 } 1236 } 1237 return false; 1238 }; 1239 1240 Optimized |= TryFoldBinOpIntoSelect(False, True, /*Invert = */ false); 1241 Optimized |= TryFoldBinOpIntoSelect(True, False, /*Invert = */ true); 1242 Optimized |= TryOptSelectCst(); 1243 auto SelectInst = MIB.buildInstr(Opc, {Dst}, {True, False}).addImm(CC); 1244 constrainSelectedInstRegOperands(*SelectInst, TII, TRI, RBI); 1245 return &*SelectInst; 1246 } 1247 1248 static AArch64CC::CondCode changeICMPPredToAArch64CC(CmpInst::Predicate P) { 1249 switch (P) { 1250 default: 1251 llvm_unreachable("Unknown condition code!"); 1252 case CmpInst::ICMP_NE: 1253 return AArch64CC::NE; 1254 case CmpInst::ICMP_EQ: 1255 return AArch64CC::EQ; 1256 case CmpInst::ICMP_SGT: 1257 return AArch64CC::GT; 1258 case CmpInst::ICMP_SGE: 1259 return AArch64CC::GE; 1260 case CmpInst::ICMP_SLT: 1261 return AArch64CC::LT; 1262 case CmpInst::ICMP_SLE: 1263 return AArch64CC::LE; 1264 case CmpInst::ICMP_UGT: 1265 return AArch64CC::HI; 1266 case CmpInst::ICMP_UGE: 1267 return AArch64CC::HS; 1268 case CmpInst::ICMP_ULT: 1269 return AArch64CC::LO; 1270 case CmpInst::ICMP_ULE: 1271 return AArch64CC::LS; 1272 } 1273 } 1274 1275 /// changeFPCCToORAArch64CC - Convert an IR fp condition code to an AArch64 CC. 1276 static void changeFPCCToORAArch64CC(CmpInst::Predicate CC, 1277 AArch64CC::CondCode &CondCode, 1278 AArch64CC::CondCode &CondCode2) { 1279 CondCode2 = AArch64CC::AL; 1280 switch (CC) { 1281 default: 1282 llvm_unreachable("Unknown FP condition!"); 1283 case CmpInst::FCMP_OEQ: 1284 CondCode = AArch64CC::EQ; 1285 break; 1286 case CmpInst::FCMP_OGT: 1287 CondCode = AArch64CC::GT; 1288 break; 1289 case CmpInst::FCMP_OGE: 1290 CondCode = AArch64CC::GE; 1291 break; 1292 case CmpInst::FCMP_OLT: 1293 CondCode = AArch64CC::MI; 1294 break; 1295 case CmpInst::FCMP_OLE: 1296 CondCode = AArch64CC::LS; 1297 break; 1298 case CmpInst::FCMP_ONE: 1299 CondCode = AArch64CC::MI; 1300 CondCode2 = AArch64CC::GT; 1301 break; 1302 case CmpInst::FCMP_ORD: 1303 CondCode = AArch64CC::VC; 1304 break; 1305 case CmpInst::FCMP_UNO: 1306 CondCode = AArch64CC::VS; 1307 break; 1308 case CmpInst::FCMP_UEQ: 1309 CondCode = AArch64CC::EQ; 1310 CondCode2 = AArch64CC::VS; 1311 break; 1312 case CmpInst::FCMP_UGT: 1313 CondCode = AArch64CC::HI; 1314 break; 1315 case CmpInst::FCMP_UGE: 1316 CondCode = AArch64CC::PL; 1317 break; 1318 case CmpInst::FCMP_ULT: 1319 CondCode = AArch64CC::LT; 1320 break; 1321 case CmpInst::FCMP_ULE: 1322 CondCode = AArch64CC::LE; 1323 break; 1324 case CmpInst::FCMP_UNE: 1325 CondCode = AArch64CC::NE; 1326 break; 1327 } 1328 } 1329 1330 /// Convert an IR fp condition code to an AArch64 CC. 1331 /// This differs from changeFPCCToAArch64CC in that it returns cond codes that 1332 /// should be AND'ed instead of OR'ed. 1333 static void changeFPCCToANDAArch64CC(CmpInst::Predicate CC, 1334 AArch64CC::CondCode &CondCode, 1335 AArch64CC::CondCode &CondCode2) { 1336 CondCode2 = AArch64CC::AL; 1337 switch (CC) { 1338 default: 1339 changeFPCCToORAArch64CC(CC, CondCode, CondCode2); 1340 assert(CondCode2 == AArch64CC::AL); 1341 break; 1342 case CmpInst::FCMP_ONE: 1343 // (a one b) 1344 // == ((a olt b) || (a ogt b)) 1345 // == ((a ord b) && (a une b)) 1346 CondCode = AArch64CC::VC; 1347 CondCode2 = AArch64CC::NE; 1348 break; 1349 case CmpInst::FCMP_UEQ: 1350 // (a ueq b) 1351 // == ((a uno b) || (a oeq b)) 1352 // == ((a ule b) && (a uge b)) 1353 CondCode = AArch64CC::PL; 1354 CondCode2 = AArch64CC::LE; 1355 break; 1356 } 1357 } 1358 1359 /// Return a register which can be used as a bit to test in a TB(N)Z. 1360 static Register getTestBitReg(Register Reg, uint64_t &Bit, bool &Invert, 1361 MachineRegisterInfo &MRI) { 1362 assert(Reg.isValid() && "Expected valid register!"); 1363 bool HasZext = false; 1364 while (MachineInstr *MI = getDefIgnoringCopies(Reg, MRI)) { 1365 unsigned Opc = MI->getOpcode(); 1366 1367 if (!MI->getOperand(0).isReg() || 1368 !MRI.hasOneNonDBGUse(MI->getOperand(0).getReg())) 1369 break; 1370 1371 // (tbz (any_ext x), b) -> (tbz x, b) if we don't use the extended bits. 1372 // 1373 // (tbz (trunc x), b) -> (tbz x, b) is always safe, because the bit number 1374 // on the truncated x is the same as the bit number on x. 1375 if (Opc == TargetOpcode::G_ANYEXT || Opc == TargetOpcode::G_ZEXT || 1376 Opc == TargetOpcode::G_TRUNC) { 1377 if (Opc == TargetOpcode::G_ZEXT) 1378 HasZext = true; 1379 1380 Register NextReg = MI->getOperand(1).getReg(); 1381 // Did we find something worth folding? 1382 if (!NextReg.isValid() || !MRI.hasOneNonDBGUse(NextReg)) 1383 break; 1384 1385 // NextReg is worth folding. Keep looking. 1386 Reg = NextReg; 1387 continue; 1388 } 1389 1390 // Attempt to find a suitable operation with a constant on one side. 1391 Optional<uint64_t> C; 1392 Register TestReg; 1393 switch (Opc) { 1394 default: 1395 break; 1396 case TargetOpcode::G_AND: 1397 case TargetOpcode::G_XOR: { 1398 TestReg = MI->getOperand(1).getReg(); 1399 Register ConstantReg = MI->getOperand(2).getReg(); 1400 auto VRegAndVal = getIConstantVRegValWithLookThrough(ConstantReg, MRI); 1401 if (!VRegAndVal) { 1402 // AND commutes, check the other side for a constant. 1403 // FIXME: Can we canonicalize the constant so that it's always on the 1404 // same side at some point earlier? 1405 std::swap(ConstantReg, TestReg); 1406 VRegAndVal = getIConstantVRegValWithLookThrough(ConstantReg, MRI); 1407 } 1408 if (VRegAndVal) { 1409 if (HasZext) 1410 C = VRegAndVal->Value.getZExtValue(); 1411 else 1412 C = VRegAndVal->Value.getSExtValue(); 1413 } 1414 break; 1415 } 1416 case TargetOpcode::G_ASHR: 1417 case TargetOpcode::G_LSHR: 1418 case TargetOpcode::G_SHL: { 1419 TestReg = MI->getOperand(1).getReg(); 1420 auto VRegAndVal = 1421 getIConstantVRegValWithLookThrough(MI->getOperand(2).getReg(), MRI); 1422 if (VRegAndVal) 1423 C = VRegAndVal->Value.getSExtValue(); 1424 break; 1425 } 1426 } 1427 1428 // Didn't find a constant or viable register. Bail out of the loop. 1429 if (!C || !TestReg.isValid()) 1430 break; 1431 1432 // We found a suitable instruction with a constant. Check to see if we can 1433 // walk through the instruction. 1434 Register NextReg; 1435 unsigned TestRegSize = MRI.getType(TestReg).getSizeInBits(); 1436 switch (Opc) { 1437 default: 1438 break; 1439 case TargetOpcode::G_AND: 1440 // (tbz (and x, m), b) -> (tbz x, b) when the b-th bit of m is set. 1441 if ((*C >> Bit) & 1) 1442 NextReg = TestReg; 1443 break; 1444 case TargetOpcode::G_SHL: 1445 // (tbz (shl x, c), b) -> (tbz x, b-c) when b-c is positive and fits in 1446 // the type of the register. 1447 if (*C <= Bit && (Bit - *C) < TestRegSize) { 1448 NextReg = TestReg; 1449 Bit = Bit - *C; 1450 } 1451 break; 1452 case TargetOpcode::G_ASHR: 1453 // (tbz (ashr x, c), b) -> (tbz x, b+c) or (tbz x, msb) if b+c is > # bits 1454 // in x 1455 NextReg = TestReg; 1456 Bit = Bit + *C; 1457 if (Bit >= TestRegSize) 1458 Bit = TestRegSize - 1; 1459 break; 1460 case TargetOpcode::G_LSHR: 1461 // (tbz (lshr x, c), b) -> (tbz x, b+c) when b + c is < # bits in x 1462 if ((Bit + *C) < TestRegSize) { 1463 NextReg = TestReg; 1464 Bit = Bit + *C; 1465 } 1466 break; 1467 case TargetOpcode::G_XOR: 1468 // We can walk through a G_XOR by inverting whether we use tbz/tbnz when 1469 // appropriate. 1470 // 1471 // e.g. If x' = xor x, c, and the b-th bit is set in c then 1472 // 1473 // tbz x', b -> tbnz x, b 1474 // 1475 // Because x' only has the b-th bit set if x does not. 1476 if ((*C >> Bit) & 1) 1477 Invert = !Invert; 1478 NextReg = TestReg; 1479 break; 1480 } 1481 1482 // Check if we found anything worth folding. 1483 if (!NextReg.isValid()) 1484 return Reg; 1485 Reg = NextReg; 1486 } 1487 1488 return Reg; 1489 } 1490 1491 MachineInstr *AArch64InstructionSelector::emitTestBit( 1492 Register TestReg, uint64_t Bit, bool IsNegative, MachineBasicBlock *DstMBB, 1493 MachineIRBuilder &MIB) const { 1494 assert(TestReg.isValid()); 1495 assert(ProduceNonFlagSettingCondBr && 1496 "Cannot emit TB(N)Z with speculation tracking!"); 1497 MachineRegisterInfo &MRI = *MIB.getMRI(); 1498 1499 // Attempt to optimize the test bit by walking over instructions. 1500 TestReg = getTestBitReg(TestReg, Bit, IsNegative, MRI); 1501 LLT Ty = MRI.getType(TestReg); 1502 unsigned Size = Ty.getSizeInBits(); 1503 assert(!Ty.isVector() && "Expected a scalar!"); 1504 assert(Bit < 64 && "Bit is too large!"); 1505 1506 // When the test register is a 64-bit register, we have to narrow to make 1507 // TBNZW work. 1508 bool UseWReg = Bit < 32; 1509 unsigned NecessarySize = UseWReg ? 32 : 64; 1510 if (Size != NecessarySize) 1511 TestReg = moveScalarRegClass( 1512 TestReg, UseWReg ? AArch64::GPR32RegClass : AArch64::GPR64RegClass, 1513 MIB); 1514 1515 static const unsigned OpcTable[2][2] = {{AArch64::TBZX, AArch64::TBNZX}, 1516 {AArch64::TBZW, AArch64::TBNZW}}; 1517 unsigned Opc = OpcTable[UseWReg][IsNegative]; 1518 auto TestBitMI = 1519 MIB.buildInstr(Opc).addReg(TestReg).addImm(Bit).addMBB(DstMBB); 1520 constrainSelectedInstRegOperands(*TestBitMI, TII, TRI, RBI); 1521 return &*TestBitMI; 1522 } 1523 1524 bool AArch64InstructionSelector::tryOptAndIntoCompareBranch( 1525 MachineInstr &AndInst, bool Invert, MachineBasicBlock *DstMBB, 1526 MachineIRBuilder &MIB) const { 1527 assert(AndInst.getOpcode() == TargetOpcode::G_AND && "Expected G_AND only?"); 1528 // Given something like this: 1529 // 1530 // %x = ...Something... 1531 // %one = G_CONSTANT i64 1 1532 // %zero = G_CONSTANT i64 0 1533 // %and = G_AND %x, %one 1534 // %cmp = G_ICMP intpred(ne), %and, %zero 1535 // %cmp_trunc = G_TRUNC %cmp 1536 // G_BRCOND %cmp_trunc, %bb.3 1537 // 1538 // We want to try and fold the AND into the G_BRCOND and produce either a 1539 // TBNZ (when we have intpred(ne)) or a TBZ (when we have intpred(eq)). 1540 // 1541 // In this case, we'd get 1542 // 1543 // TBNZ %x %bb.3 1544 // 1545 1546 // Check if the AND has a constant on its RHS which we can use as a mask. 1547 // If it's a power of 2, then it's the same as checking a specific bit. 1548 // (e.g, ANDing with 8 == ANDing with 000...100 == testing if bit 3 is set) 1549 auto MaybeBit = getIConstantVRegValWithLookThrough( 1550 AndInst.getOperand(2).getReg(), *MIB.getMRI()); 1551 if (!MaybeBit) 1552 return false; 1553 1554 int32_t Bit = MaybeBit->Value.exactLogBase2(); 1555 if (Bit < 0) 1556 return false; 1557 1558 Register TestReg = AndInst.getOperand(1).getReg(); 1559 1560 // Emit a TB(N)Z. 1561 emitTestBit(TestReg, Bit, Invert, DstMBB, MIB); 1562 return true; 1563 } 1564 1565 MachineInstr *AArch64InstructionSelector::emitCBZ(Register CompareReg, 1566 bool IsNegative, 1567 MachineBasicBlock *DestMBB, 1568 MachineIRBuilder &MIB) const { 1569 assert(ProduceNonFlagSettingCondBr && "CBZ does not set flags!"); 1570 MachineRegisterInfo &MRI = *MIB.getMRI(); 1571 assert(RBI.getRegBank(CompareReg, MRI, TRI)->getID() == 1572 AArch64::GPRRegBankID && 1573 "Expected GPRs only?"); 1574 auto Ty = MRI.getType(CompareReg); 1575 unsigned Width = Ty.getSizeInBits(); 1576 assert(!Ty.isVector() && "Expected scalar only?"); 1577 assert(Width <= 64 && "Expected width to be at most 64?"); 1578 static const unsigned OpcTable[2][2] = {{AArch64::CBZW, AArch64::CBZX}, 1579 {AArch64::CBNZW, AArch64::CBNZX}}; 1580 unsigned Opc = OpcTable[IsNegative][Width == 64]; 1581 auto BranchMI = MIB.buildInstr(Opc, {}, {CompareReg}).addMBB(DestMBB); 1582 constrainSelectedInstRegOperands(*BranchMI, TII, TRI, RBI); 1583 return &*BranchMI; 1584 } 1585 1586 bool AArch64InstructionSelector::selectCompareBranchFedByFCmp( 1587 MachineInstr &I, MachineInstr &FCmp, MachineIRBuilder &MIB) const { 1588 assert(FCmp.getOpcode() == TargetOpcode::G_FCMP); 1589 assert(I.getOpcode() == TargetOpcode::G_BRCOND); 1590 // Unfortunately, the mapping of LLVM FP CC's onto AArch64 CC's isn't 1591 // totally clean. Some of them require two branches to implement. 1592 auto Pred = (CmpInst::Predicate)FCmp.getOperand(1).getPredicate(); 1593 emitFPCompare(FCmp.getOperand(2).getReg(), FCmp.getOperand(3).getReg(), MIB, 1594 Pred); 1595 AArch64CC::CondCode CC1, CC2; 1596 changeFCMPPredToAArch64CC(static_cast<CmpInst::Predicate>(Pred), CC1, CC2); 1597 MachineBasicBlock *DestMBB = I.getOperand(1).getMBB(); 1598 MIB.buildInstr(AArch64::Bcc, {}, {}).addImm(CC1).addMBB(DestMBB); 1599 if (CC2 != AArch64CC::AL) 1600 MIB.buildInstr(AArch64::Bcc, {}, {}).addImm(CC2).addMBB(DestMBB); 1601 I.eraseFromParent(); 1602 return true; 1603 } 1604 1605 bool AArch64InstructionSelector::tryOptCompareBranchFedByICmp( 1606 MachineInstr &I, MachineInstr &ICmp, MachineIRBuilder &MIB) const { 1607 assert(ICmp.getOpcode() == TargetOpcode::G_ICMP); 1608 assert(I.getOpcode() == TargetOpcode::G_BRCOND); 1609 // Attempt to optimize the G_BRCOND + G_ICMP into a TB(N)Z/CB(N)Z. 1610 // 1611 // Speculation tracking/SLH assumes that optimized TB(N)Z/CB(N)Z 1612 // instructions will not be produced, as they are conditional branch 1613 // instructions that do not set flags. 1614 if (!ProduceNonFlagSettingCondBr) 1615 return false; 1616 1617 MachineRegisterInfo &MRI = *MIB.getMRI(); 1618 MachineBasicBlock *DestMBB = I.getOperand(1).getMBB(); 1619 auto Pred = 1620 static_cast<CmpInst::Predicate>(ICmp.getOperand(1).getPredicate()); 1621 Register LHS = ICmp.getOperand(2).getReg(); 1622 Register RHS = ICmp.getOperand(3).getReg(); 1623 1624 // We're allowed to emit a TB(N)Z/CB(N)Z. Try to do that. 1625 auto VRegAndVal = getIConstantVRegValWithLookThrough(RHS, MRI); 1626 MachineInstr *AndInst = getOpcodeDef(TargetOpcode::G_AND, LHS, MRI); 1627 1628 // When we can emit a TB(N)Z, prefer that. 1629 // 1630 // Handle non-commutative condition codes first. 1631 // Note that we don't want to do this when we have a G_AND because it can 1632 // become a tst. The tst will make the test bit in the TB(N)Z redundant. 1633 if (VRegAndVal && !AndInst) { 1634 int64_t C = VRegAndVal->Value.getSExtValue(); 1635 1636 // When we have a greater-than comparison, we can just test if the msb is 1637 // zero. 1638 if (C == -1 && Pred == CmpInst::ICMP_SGT) { 1639 uint64_t Bit = MRI.getType(LHS).getSizeInBits() - 1; 1640 emitTestBit(LHS, Bit, /*IsNegative = */ false, DestMBB, MIB); 1641 I.eraseFromParent(); 1642 return true; 1643 } 1644 1645 // When we have a less than comparison, we can just test if the msb is not 1646 // zero. 1647 if (C == 0 && Pred == CmpInst::ICMP_SLT) { 1648 uint64_t Bit = MRI.getType(LHS).getSizeInBits() - 1; 1649 emitTestBit(LHS, Bit, /*IsNegative = */ true, DestMBB, MIB); 1650 I.eraseFromParent(); 1651 return true; 1652 } 1653 } 1654 1655 // Attempt to handle commutative condition codes. Right now, that's only 1656 // eq/ne. 1657 if (ICmpInst::isEquality(Pred)) { 1658 if (!VRegAndVal) { 1659 std::swap(RHS, LHS); 1660 VRegAndVal = getIConstantVRegValWithLookThrough(RHS, MRI); 1661 AndInst = getOpcodeDef(TargetOpcode::G_AND, LHS, MRI); 1662 } 1663 1664 if (VRegAndVal && VRegAndVal->Value == 0) { 1665 // If there's a G_AND feeding into this branch, try to fold it away by 1666 // emitting a TB(N)Z instead. 1667 // 1668 // Note: If we have LT, then it *is* possible to fold, but it wouldn't be 1669 // beneficial. When we have an AND and LT, we need a TST/ANDS, so folding 1670 // would be redundant. 1671 if (AndInst && 1672 tryOptAndIntoCompareBranch( 1673 *AndInst, /*Invert = */ Pred == CmpInst::ICMP_NE, DestMBB, MIB)) { 1674 I.eraseFromParent(); 1675 return true; 1676 } 1677 1678 // Otherwise, try to emit a CB(N)Z instead. 1679 auto LHSTy = MRI.getType(LHS); 1680 if (!LHSTy.isVector() && LHSTy.getSizeInBits() <= 64) { 1681 emitCBZ(LHS, /*IsNegative = */ Pred == CmpInst::ICMP_NE, DestMBB, MIB); 1682 I.eraseFromParent(); 1683 return true; 1684 } 1685 } 1686 } 1687 1688 return false; 1689 } 1690 1691 bool AArch64InstructionSelector::selectCompareBranchFedByICmp( 1692 MachineInstr &I, MachineInstr &ICmp, MachineIRBuilder &MIB) const { 1693 assert(ICmp.getOpcode() == TargetOpcode::G_ICMP); 1694 assert(I.getOpcode() == TargetOpcode::G_BRCOND); 1695 if (tryOptCompareBranchFedByICmp(I, ICmp, MIB)) 1696 return true; 1697 1698 // Couldn't optimize. Emit a compare + a Bcc. 1699 MachineBasicBlock *DestMBB = I.getOperand(1).getMBB(); 1700 auto PredOp = ICmp.getOperand(1); 1701 emitIntegerCompare(ICmp.getOperand(2), ICmp.getOperand(3), PredOp, MIB); 1702 const AArch64CC::CondCode CC = changeICMPPredToAArch64CC( 1703 static_cast<CmpInst::Predicate>(PredOp.getPredicate())); 1704 MIB.buildInstr(AArch64::Bcc, {}, {}).addImm(CC).addMBB(DestMBB); 1705 I.eraseFromParent(); 1706 return true; 1707 } 1708 1709 bool AArch64InstructionSelector::selectCompareBranch( 1710 MachineInstr &I, MachineFunction &MF, MachineRegisterInfo &MRI) { 1711 Register CondReg = I.getOperand(0).getReg(); 1712 MachineInstr *CCMI = MRI.getVRegDef(CondReg); 1713 if (CCMI->getOpcode() == TargetOpcode::G_TRUNC) { 1714 CondReg = CCMI->getOperand(1).getReg(); 1715 CCMI = MRI.getVRegDef(CondReg); 1716 } 1717 1718 // Try to select the G_BRCOND using whatever is feeding the condition if 1719 // possible. 1720 unsigned CCMIOpc = CCMI->getOpcode(); 1721 if (CCMIOpc == TargetOpcode::G_FCMP) 1722 return selectCompareBranchFedByFCmp(I, *CCMI, MIB); 1723 if (CCMIOpc == TargetOpcode::G_ICMP) 1724 return selectCompareBranchFedByICmp(I, *CCMI, MIB); 1725 1726 // Speculation tracking/SLH assumes that optimized TB(N)Z/CB(N)Z 1727 // instructions will not be produced, as they are conditional branch 1728 // instructions that do not set flags. 1729 if (ProduceNonFlagSettingCondBr) { 1730 emitTestBit(CondReg, /*Bit = */ 0, /*IsNegative = */ true, 1731 I.getOperand(1).getMBB(), MIB); 1732 I.eraseFromParent(); 1733 return true; 1734 } 1735 1736 // Can't emit TB(N)Z/CB(N)Z. Emit a tst + bcc instead. 1737 auto TstMI = 1738 MIB.buildInstr(AArch64::ANDSWri, {LLT::scalar(32)}, {CondReg}).addImm(1); 1739 constrainSelectedInstRegOperands(*TstMI, TII, TRI, RBI); 1740 auto Bcc = MIB.buildInstr(AArch64::Bcc) 1741 .addImm(AArch64CC::EQ) 1742 .addMBB(I.getOperand(1).getMBB()); 1743 I.eraseFromParent(); 1744 return constrainSelectedInstRegOperands(*Bcc, TII, TRI, RBI); 1745 } 1746 1747 /// Returns the element immediate value of a vector shift operand if found. 1748 /// This needs to detect a splat-like operation, e.g. a G_BUILD_VECTOR. 1749 static Optional<int64_t> getVectorShiftImm(Register Reg, 1750 MachineRegisterInfo &MRI) { 1751 assert(MRI.getType(Reg).isVector() && "Expected a *vector* shift operand"); 1752 MachineInstr *OpMI = MRI.getVRegDef(Reg); 1753 return getAArch64VectorSplatScalar(*OpMI, MRI); 1754 } 1755 1756 /// Matches and returns the shift immediate value for a SHL instruction given 1757 /// a shift operand. 1758 static Optional<int64_t> getVectorSHLImm(LLT SrcTy, Register Reg, MachineRegisterInfo &MRI) { 1759 Optional<int64_t> ShiftImm = getVectorShiftImm(Reg, MRI); 1760 if (!ShiftImm) 1761 return None; 1762 // Check the immediate is in range for a SHL. 1763 int64_t Imm = *ShiftImm; 1764 if (Imm < 0) 1765 return None; 1766 switch (SrcTy.getElementType().getSizeInBits()) { 1767 default: 1768 LLVM_DEBUG(dbgs() << "Unhandled element type for vector shift"); 1769 return None; 1770 case 8: 1771 if (Imm > 7) 1772 return None; 1773 break; 1774 case 16: 1775 if (Imm > 15) 1776 return None; 1777 break; 1778 case 32: 1779 if (Imm > 31) 1780 return None; 1781 break; 1782 case 64: 1783 if (Imm > 63) 1784 return None; 1785 break; 1786 } 1787 return Imm; 1788 } 1789 1790 bool AArch64InstructionSelector::selectVectorSHL(MachineInstr &I, 1791 MachineRegisterInfo &MRI) { 1792 assert(I.getOpcode() == TargetOpcode::G_SHL); 1793 Register DstReg = I.getOperand(0).getReg(); 1794 const LLT Ty = MRI.getType(DstReg); 1795 Register Src1Reg = I.getOperand(1).getReg(); 1796 Register Src2Reg = I.getOperand(2).getReg(); 1797 1798 if (!Ty.isVector()) 1799 return false; 1800 1801 // Check if we have a vector of constants on RHS that we can select as the 1802 // immediate form. 1803 Optional<int64_t> ImmVal = getVectorSHLImm(Ty, Src2Reg, MRI); 1804 1805 unsigned Opc = 0; 1806 if (Ty == LLT::fixed_vector(2, 64)) { 1807 Opc = ImmVal ? AArch64::SHLv2i64_shift : AArch64::USHLv2i64; 1808 } else if (Ty == LLT::fixed_vector(4, 32)) { 1809 Opc = ImmVal ? AArch64::SHLv4i32_shift : AArch64::USHLv4i32; 1810 } else if (Ty == LLT::fixed_vector(2, 32)) { 1811 Opc = ImmVal ? AArch64::SHLv2i32_shift : AArch64::USHLv2i32; 1812 } else if (Ty == LLT::fixed_vector(4, 16)) { 1813 Opc = ImmVal ? AArch64::SHLv4i16_shift : AArch64::USHLv4i16; 1814 } else if (Ty == LLT::fixed_vector(8, 16)) { 1815 Opc = ImmVal ? AArch64::SHLv8i16_shift : AArch64::USHLv8i16; 1816 } else if (Ty == LLT::fixed_vector(16, 8)) { 1817 Opc = ImmVal ? AArch64::SHLv16i8_shift : AArch64::USHLv16i8; 1818 } else if (Ty == LLT::fixed_vector(8, 8)) { 1819 Opc = ImmVal ? AArch64::SHLv8i8_shift : AArch64::USHLv8i8; 1820 } else { 1821 LLVM_DEBUG(dbgs() << "Unhandled G_SHL type"); 1822 return false; 1823 } 1824 1825 auto Shl = MIB.buildInstr(Opc, {DstReg}, {Src1Reg}); 1826 if (ImmVal) 1827 Shl.addImm(*ImmVal); 1828 else 1829 Shl.addUse(Src2Reg); 1830 constrainSelectedInstRegOperands(*Shl, TII, TRI, RBI); 1831 I.eraseFromParent(); 1832 return true; 1833 } 1834 1835 bool AArch64InstructionSelector::selectVectorAshrLshr( 1836 MachineInstr &I, MachineRegisterInfo &MRI) { 1837 assert(I.getOpcode() == TargetOpcode::G_ASHR || 1838 I.getOpcode() == TargetOpcode::G_LSHR); 1839 Register DstReg = I.getOperand(0).getReg(); 1840 const LLT Ty = MRI.getType(DstReg); 1841 Register Src1Reg = I.getOperand(1).getReg(); 1842 Register Src2Reg = I.getOperand(2).getReg(); 1843 1844 if (!Ty.isVector()) 1845 return false; 1846 1847 bool IsASHR = I.getOpcode() == TargetOpcode::G_ASHR; 1848 1849 // We expect the immediate case to be lowered in the PostLegalCombiner to 1850 // AArch64ISD::VASHR or AArch64ISD::VLSHR equivalents. 1851 1852 // There is not a shift right register instruction, but the shift left 1853 // register instruction takes a signed value, where negative numbers specify a 1854 // right shift. 1855 1856 unsigned Opc = 0; 1857 unsigned NegOpc = 0; 1858 const TargetRegisterClass *RC = 1859 getRegClassForTypeOnBank(Ty, RBI.getRegBank(AArch64::FPRRegBankID)); 1860 if (Ty == LLT::fixed_vector(2, 64)) { 1861 Opc = IsASHR ? AArch64::SSHLv2i64 : AArch64::USHLv2i64; 1862 NegOpc = AArch64::NEGv2i64; 1863 } else if (Ty == LLT::fixed_vector(4, 32)) { 1864 Opc = IsASHR ? AArch64::SSHLv4i32 : AArch64::USHLv4i32; 1865 NegOpc = AArch64::NEGv4i32; 1866 } else if (Ty == LLT::fixed_vector(2, 32)) { 1867 Opc = IsASHR ? AArch64::SSHLv2i32 : AArch64::USHLv2i32; 1868 NegOpc = AArch64::NEGv2i32; 1869 } else if (Ty == LLT::fixed_vector(4, 16)) { 1870 Opc = IsASHR ? AArch64::SSHLv4i16 : AArch64::USHLv4i16; 1871 NegOpc = AArch64::NEGv4i16; 1872 } else if (Ty == LLT::fixed_vector(8, 16)) { 1873 Opc = IsASHR ? AArch64::SSHLv8i16 : AArch64::USHLv8i16; 1874 NegOpc = AArch64::NEGv8i16; 1875 } else if (Ty == LLT::fixed_vector(16, 8)) { 1876 Opc = IsASHR ? AArch64::SSHLv16i8 : AArch64::USHLv16i8; 1877 NegOpc = AArch64::NEGv16i8; 1878 } else if (Ty == LLT::fixed_vector(8, 8)) { 1879 Opc = IsASHR ? AArch64::SSHLv8i8 : AArch64::USHLv8i8; 1880 NegOpc = AArch64::NEGv8i8; 1881 } else { 1882 LLVM_DEBUG(dbgs() << "Unhandled G_ASHR type"); 1883 return false; 1884 } 1885 1886 auto Neg = MIB.buildInstr(NegOpc, {RC}, {Src2Reg}); 1887 constrainSelectedInstRegOperands(*Neg, TII, TRI, RBI); 1888 auto SShl = MIB.buildInstr(Opc, {DstReg}, {Src1Reg, Neg}); 1889 constrainSelectedInstRegOperands(*SShl, TII, TRI, RBI); 1890 I.eraseFromParent(); 1891 return true; 1892 } 1893 1894 bool AArch64InstructionSelector::selectVaStartAAPCS( 1895 MachineInstr &I, MachineFunction &MF, MachineRegisterInfo &MRI) const { 1896 return false; 1897 } 1898 1899 bool AArch64InstructionSelector::selectVaStartDarwin( 1900 MachineInstr &I, MachineFunction &MF, MachineRegisterInfo &MRI) const { 1901 AArch64FunctionInfo *FuncInfo = MF.getInfo<AArch64FunctionInfo>(); 1902 Register ListReg = I.getOperand(0).getReg(); 1903 1904 Register ArgsAddrReg = MRI.createVirtualRegister(&AArch64::GPR64RegClass); 1905 1906 auto MIB = 1907 BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(AArch64::ADDXri)) 1908 .addDef(ArgsAddrReg) 1909 .addFrameIndex(FuncInfo->getVarArgsStackIndex()) 1910 .addImm(0) 1911 .addImm(0); 1912 1913 constrainSelectedInstRegOperands(*MIB, TII, TRI, RBI); 1914 1915 MIB = BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(AArch64::STRXui)) 1916 .addUse(ArgsAddrReg) 1917 .addUse(ListReg) 1918 .addImm(0) 1919 .addMemOperand(*I.memoperands_begin()); 1920 1921 constrainSelectedInstRegOperands(*MIB, TII, TRI, RBI); 1922 I.eraseFromParent(); 1923 return true; 1924 } 1925 1926 void AArch64InstructionSelector::materializeLargeCMVal( 1927 MachineInstr &I, const Value *V, unsigned OpFlags) { 1928 MachineBasicBlock &MBB = *I.getParent(); 1929 MachineFunction &MF = *MBB.getParent(); 1930 MachineRegisterInfo &MRI = MF.getRegInfo(); 1931 1932 auto MovZ = MIB.buildInstr(AArch64::MOVZXi, {&AArch64::GPR64RegClass}, {}); 1933 MovZ->addOperand(MF, I.getOperand(1)); 1934 MovZ->getOperand(1).setTargetFlags(OpFlags | AArch64II::MO_G0 | 1935 AArch64II::MO_NC); 1936 MovZ->addOperand(MF, MachineOperand::CreateImm(0)); 1937 constrainSelectedInstRegOperands(*MovZ, TII, TRI, RBI); 1938 1939 auto BuildMovK = [&](Register SrcReg, unsigned char Flags, unsigned Offset, 1940 Register ForceDstReg) { 1941 Register DstReg = ForceDstReg 1942 ? ForceDstReg 1943 : MRI.createVirtualRegister(&AArch64::GPR64RegClass); 1944 auto MovI = MIB.buildInstr(AArch64::MOVKXi).addDef(DstReg).addUse(SrcReg); 1945 if (auto *GV = dyn_cast<GlobalValue>(V)) { 1946 MovI->addOperand(MF, MachineOperand::CreateGA( 1947 GV, MovZ->getOperand(1).getOffset(), Flags)); 1948 } else { 1949 MovI->addOperand( 1950 MF, MachineOperand::CreateBA(cast<BlockAddress>(V), 1951 MovZ->getOperand(1).getOffset(), Flags)); 1952 } 1953 MovI->addOperand(MF, MachineOperand::CreateImm(Offset)); 1954 constrainSelectedInstRegOperands(*MovI, TII, TRI, RBI); 1955 return DstReg; 1956 }; 1957 Register DstReg = BuildMovK(MovZ.getReg(0), 1958 AArch64II::MO_G1 | AArch64II::MO_NC, 16, 0); 1959 DstReg = BuildMovK(DstReg, AArch64II::MO_G2 | AArch64II::MO_NC, 32, 0); 1960 BuildMovK(DstReg, AArch64II::MO_G3, 48, I.getOperand(0).getReg()); 1961 } 1962 1963 bool AArch64InstructionSelector::preISelLower(MachineInstr &I) { 1964 MachineBasicBlock &MBB = *I.getParent(); 1965 MachineFunction &MF = *MBB.getParent(); 1966 MachineRegisterInfo &MRI = MF.getRegInfo(); 1967 1968 switch (I.getOpcode()) { 1969 case TargetOpcode::G_STORE: { 1970 bool Changed = contractCrossBankCopyIntoStore(I, MRI); 1971 MachineOperand &SrcOp = I.getOperand(0); 1972 if (MRI.getType(SrcOp.getReg()).isPointer()) { 1973 // Allow matching with imported patterns for stores of pointers. Unlike 1974 // G_LOAD/G_PTR_ADD, we may not have selected all users. So, emit a copy 1975 // and constrain. 1976 auto Copy = MIB.buildCopy(LLT::scalar(64), SrcOp); 1977 Register NewSrc = Copy.getReg(0); 1978 SrcOp.setReg(NewSrc); 1979 RBI.constrainGenericRegister(NewSrc, AArch64::GPR64RegClass, MRI); 1980 Changed = true; 1981 } 1982 return Changed; 1983 } 1984 case TargetOpcode::G_PTR_ADD: 1985 return convertPtrAddToAdd(I, MRI); 1986 case TargetOpcode::G_LOAD: { 1987 // For scalar loads of pointers, we try to convert the dest type from p0 1988 // to s64 so that our imported patterns can match. Like with the G_PTR_ADD 1989 // conversion, this should be ok because all users should have been 1990 // selected already, so the type doesn't matter for them. 1991 Register DstReg = I.getOperand(0).getReg(); 1992 const LLT DstTy = MRI.getType(DstReg); 1993 if (!DstTy.isPointer()) 1994 return false; 1995 MRI.setType(DstReg, LLT::scalar(64)); 1996 return true; 1997 } 1998 case AArch64::G_DUP: { 1999 // Convert the type from p0 to s64 to help selection. 2000 LLT DstTy = MRI.getType(I.getOperand(0).getReg()); 2001 if (!DstTy.getElementType().isPointer()) 2002 return false; 2003 auto NewSrc = MIB.buildCopy(LLT::scalar(64), I.getOperand(1).getReg()); 2004 MRI.setType(I.getOperand(0).getReg(), 2005 DstTy.changeElementType(LLT::scalar(64))); 2006 MRI.setRegClass(NewSrc.getReg(0), &AArch64::GPR64RegClass); 2007 I.getOperand(1).setReg(NewSrc.getReg(0)); 2008 return true; 2009 } 2010 case TargetOpcode::G_UITOFP: 2011 case TargetOpcode::G_SITOFP: { 2012 // If both source and destination regbanks are FPR, then convert the opcode 2013 // to G_SITOF so that the importer can select it to an fpr variant. 2014 // Otherwise, it ends up matching an fpr/gpr variant and adding a cross-bank 2015 // copy. 2016 Register SrcReg = I.getOperand(1).getReg(); 2017 LLT SrcTy = MRI.getType(SrcReg); 2018 LLT DstTy = MRI.getType(I.getOperand(0).getReg()); 2019 if (SrcTy.isVector() || SrcTy.getSizeInBits() != DstTy.getSizeInBits()) 2020 return false; 2021 2022 if (RBI.getRegBank(SrcReg, MRI, TRI)->getID() == AArch64::FPRRegBankID) { 2023 if (I.getOpcode() == TargetOpcode::G_SITOFP) 2024 I.setDesc(TII.get(AArch64::G_SITOF)); 2025 else 2026 I.setDesc(TII.get(AArch64::G_UITOF)); 2027 return true; 2028 } 2029 return false; 2030 } 2031 default: 2032 return false; 2033 } 2034 } 2035 2036 /// This lowering tries to look for G_PTR_ADD instructions and then converts 2037 /// them to a standard G_ADD with a COPY on the source. 2038 /// 2039 /// The motivation behind this is to expose the add semantics to the imported 2040 /// tablegen patterns. We shouldn't need to check for uses being loads/stores, 2041 /// because the selector works bottom up, uses before defs. By the time we 2042 /// end up trying to select a G_PTR_ADD, we should have already attempted to 2043 /// fold this into addressing modes and were therefore unsuccessful. 2044 bool AArch64InstructionSelector::convertPtrAddToAdd( 2045 MachineInstr &I, MachineRegisterInfo &MRI) { 2046 assert(I.getOpcode() == TargetOpcode::G_PTR_ADD && "Expected G_PTR_ADD"); 2047 Register DstReg = I.getOperand(0).getReg(); 2048 Register AddOp1Reg = I.getOperand(1).getReg(); 2049 const LLT PtrTy = MRI.getType(DstReg); 2050 if (PtrTy.getAddressSpace() != 0) 2051 return false; 2052 2053 const LLT CastPtrTy = 2054 PtrTy.isVector() ? LLT::fixed_vector(2, 64) : LLT::scalar(64); 2055 auto PtrToInt = MIB.buildPtrToInt(CastPtrTy, AddOp1Reg); 2056 // Set regbanks on the registers. 2057 if (PtrTy.isVector()) 2058 MRI.setRegBank(PtrToInt.getReg(0), RBI.getRegBank(AArch64::FPRRegBankID)); 2059 else 2060 MRI.setRegBank(PtrToInt.getReg(0), RBI.getRegBank(AArch64::GPRRegBankID)); 2061 2062 // Now turn the %dst(p0) = G_PTR_ADD %base, off into: 2063 // %dst(intty) = G_ADD %intbase, off 2064 I.setDesc(TII.get(TargetOpcode::G_ADD)); 2065 MRI.setType(DstReg, CastPtrTy); 2066 I.getOperand(1).setReg(PtrToInt.getReg(0)); 2067 if (!select(*PtrToInt)) { 2068 LLVM_DEBUG(dbgs() << "Failed to select G_PTRTOINT in convertPtrAddToAdd"); 2069 return false; 2070 } 2071 2072 // Also take the opportunity here to try to do some optimization. 2073 // Try to convert this into a G_SUB if the offset is a 0-x negate idiom. 2074 Register NegatedReg; 2075 if (!mi_match(I.getOperand(2).getReg(), MRI, m_Neg(m_Reg(NegatedReg)))) 2076 return true; 2077 I.getOperand(2).setReg(NegatedReg); 2078 I.setDesc(TII.get(TargetOpcode::G_SUB)); 2079 return true; 2080 } 2081 2082 bool AArch64InstructionSelector::earlySelectSHL(MachineInstr &I, 2083 MachineRegisterInfo &MRI) { 2084 // We try to match the immediate variant of LSL, which is actually an alias 2085 // for a special case of UBFM. Otherwise, we fall back to the imported 2086 // selector which will match the register variant. 2087 assert(I.getOpcode() == TargetOpcode::G_SHL && "unexpected op"); 2088 const auto &MO = I.getOperand(2); 2089 auto VRegAndVal = getIConstantVRegVal(MO.getReg(), MRI); 2090 if (!VRegAndVal) 2091 return false; 2092 2093 const LLT DstTy = MRI.getType(I.getOperand(0).getReg()); 2094 if (DstTy.isVector()) 2095 return false; 2096 bool Is64Bit = DstTy.getSizeInBits() == 64; 2097 auto Imm1Fn = Is64Bit ? selectShiftA_64(MO) : selectShiftA_32(MO); 2098 auto Imm2Fn = Is64Bit ? selectShiftB_64(MO) : selectShiftB_32(MO); 2099 2100 if (!Imm1Fn || !Imm2Fn) 2101 return false; 2102 2103 auto NewI = 2104 MIB.buildInstr(Is64Bit ? AArch64::UBFMXri : AArch64::UBFMWri, 2105 {I.getOperand(0).getReg()}, {I.getOperand(1).getReg()}); 2106 2107 for (auto &RenderFn : *Imm1Fn) 2108 RenderFn(NewI); 2109 for (auto &RenderFn : *Imm2Fn) 2110 RenderFn(NewI); 2111 2112 I.eraseFromParent(); 2113 return constrainSelectedInstRegOperands(*NewI, TII, TRI, RBI); 2114 } 2115 2116 bool AArch64InstructionSelector::contractCrossBankCopyIntoStore( 2117 MachineInstr &I, MachineRegisterInfo &MRI) { 2118 assert(I.getOpcode() == TargetOpcode::G_STORE && "Expected G_STORE"); 2119 // If we're storing a scalar, it doesn't matter what register bank that 2120 // scalar is on. All that matters is the size. 2121 // 2122 // So, if we see something like this (with a 32-bit scalar as an example): 2123 // 2124 // %x:gpr(s32) = ... something ... 2125 // %y:fpr(s32) = COPY %x:gpr(s32) 2126 // G_STORE %y:fpr(s32) 2127 // 2128 // We can fix this up into something like this: 2129 // 2130 // G_STORE %x:gpr(s32) 2131 // 2132 // And then continue the selection process normally. 2133 Register DefDstReg = getSrcRegIgnoringCopies(I.getOperand(0).getReg(), MRI); 2134 if (!DefDstReg.isValid()) 2135 return false; 2136 LLT DefDstTy = MRI.getType(DefDstReg); 2137 Register StoreSrcReg = I.getOperand(0).getReg(); 2138 LLT StoreSrcTy = MRI.getType(StoreSrcReg); 2139 2140 // If we get something strange like a physical register, then we shouldn't 2141 // go any further. 2142 if (!DefDstTy.isValid()) 2143 return false; 2144 2145 // Are the source and dst types the same size? 2146 if (DefDstTy.getSizeInBits() != StoreSrcTy.getSizeInBits()) 2147 return false; 2148 2149 if (RBI.getRegBank(StoreSrcReg, MRI, TRI) == 2150 RBI.getRegBank(DefDstReg, MRI, TRI)) 2151 return false; 2152 2153 // We have a cross-bank copy, which is entering a store. Let's fold it. 2154 I.getOperand(0).setReg(DefDstReg); 2155 return true; 2156 } 2157 2158 bool AArch64InstructionSelector::earlySelect(MachineInstr &I) { 2159 assert(I.getParent() && "Instruction should be in a basic block!"); 2160 assert(I.getParent()->getParent() && "Instruction should be in a function!"); 2161 2162 MachineBasicBlock &MBB = *I.getParent(); 2163 MachineFunction &MF = *MBB.getParent(); 2164 MachineRegisterInfo &MRI = MF.getRegInfo(); 2165 2166 switch (I.getOpcode()) { 2167 case AArch64::G_DUP: { 2168 // Before selecting a DUP instruction, check if it is better selected as a 2169 // MOV or load from a constant pool. 2170 Register Src = I.getOperand(1).getReg(); 2171 auto ValAndVReg = getIConstantVRegValWithLookThrough(Src, MRI); 2172 if (!ValAndVReg) 2173 return false; 2174 LLVMContext &Ctx = MF.getFunction().getContext(); 2175 Register Dst = I.getOperand(0).getReg(); 2176 auto *CV = ConstantDataVector::getSplat( 2177 MRI.getType(Dst).getNumElements(), 2178 ConstantInt::get(Type::getIntNTy(Ctx, MRI.getType(Src).getSizeInBits()), 2179 ValAndVReg->Value)); 2180 if (!emitConstantVector(Dst, CV, MIB, MRI)) 2181 return false; 2182 I.eraseFromParent(); 2183 return true; 2184 } 2185 case TargetOpcode::G_SEXT: 2186 // Check for i64 sext(i32 vector_extract) prior to tablegen to select SMOV 2187 // over a normal extend. 2188 if (selectUSMovFromExtend(I, MRI)) 2189 return true; 2190 return false; 2191 case TargetOpcode::G_BR: 2192 return false; 2193 case TargetOpcode::G_SHL: 2194 return earlySelectSHL(I, MRI); 2195 case TargetOpcode::G_CONSTANT: { 2196 bool IsZero = false; 2197 if (I.getOperand(1).isCImm()) 2198 IsZero = I.getOperand(1).getCImm()->getZExtValue() == 0; 2199 else if (I.getOperand(1).isImm()) 2200 IsZero = I.getOperand(1).getImm() == 0; 2201 2202 if (!IsZero) 2203 return false; 2204 2205 Register DefReg = I.getOperand(0).getReg(); 2206 LLT Ty = MRI.getType(DefReg); 2207 if (Ty.getSizeInBits() == 64) { 2208 I.getOperand(1).ChangeToRegister(AArch64::XZR, false); 2209 RBI.constrainGenericRegister(DefReg, AArch64::GPR64RegClass, MRI); 2210 } else if (Ty.getSizeInBits() == 32) { 2211 I.getOperand(1).ChangeToRegister(AArch64::WZR, false); 2212 RBI.constrainGenericRegister(DefReg, AArch64::GPR32RegClass, MRI); 2213 } else 2214 return false; 2215 2216 I.setDesc(TII.get(TargetOpcode::COPY)); 2217 return true; 2218 } 2219 2220 case TargetOpcode::G_ADD: { 2221 // Check if this is being fed by a G_ICMP on either side. 2222 // 2223 // (cmp pred, x, y) + z 2224 // 2225 // In the above case, when the cmp is true, we increment z by 1. So, we can 2226 // fold the add into the cset for the cmp by using cinc. 2227 // 2228 // FIXME: This would probably be a lot nicer in PostLegalizerLowering. 2229 Register AddDst = I.getOperand(0).getReg(); 2230 Register AddLHS = I.getOperand(1).getReg(); 2231 Register AddRHS = I.getOperand(2).getReg(); 2232 // Only handle scalars. 2233 LLT Ty = MRI.getType(AddLHS); 2234 if (Ty.isVector()) 2235 return false; 2236 // Since G_ICMP is modeled as ADDS/SUBS/ANDS, we can handle 32 bits or 64 2237 // bits. 2238 unsigned Size = Ty.getSizeInBits(); 2239 if (Size != 32 && Size != 64) 2240 return false; 2241 auto MatchCmp = [&](Register Reg) -> MachineInstr * { 2242 if (!MRI.hasOneNonDBGUse(Reg)) 2243 return nullptr; 2244 // If the LHS of the add is 32 bits, then we want to fold a 32-bit 2245 // compare. 2246 if (Size == 32) 2247 return getOpcodeDef(TargetOpcode::G_ICMP, Reg, MRI); 2248 // We model scalar compares using 32-bit destinations right now. 2249 // If it's a 64-bit compare, it'll have 64-bit sources. 2250 Register ZExt; 2251 if (!mi_match(Reg, MRI, 2252 m_OneNonDBGUse(m_GZExt(m_OneNonDBGUse(m_Reg(ZExt)))))) 2253 return nullptr; 2254 auto *Cmp = getOpcodeDef(TargetOpcode::G_ICMP, ZExt, MRI); 2255 if (!Cmp || 2256 MRI.getType(Cmp->getOperand(2).getReg()).getSizeInBits() != 64) 2257 return nullptr; 2258 return Cmp; 2259 }; 2260 // Try to match 2261 // z + (cmp pred, x, y) 2262 MachineInstr *Cmp = MatchCmp(AddRHS); 2263 if (!Cmp) { 2264 // (cmp pred, x, y) + z 2265 std::swap(AddLHS, AddRHS); 2266 Cmp = MatchCmp(AddRHS); 2267 if (!Cmp) 2268 return false; 2269 } 2270 auto &PredOp = Cmp->getOperand(1); 2271 auto Pred = static_cast<CmpInst::Predicate>(PredOp.getPredicate()); 2272 const AArch64CC::CondCode InvCC = 2273 changeICMPPredToAArch64CC(CmpInst::getInversePredicate(Pred)); 2274 MIB.setInstrAndDebugLoc(I); 2275 emitIntegerCompare(/*LHS=*/Cmp->getOperand(2), 2276 /*RHS=*/Cmp->getOperand(3), PredOp, MIB); 2277 emitCSINC(/*Dst=*/AddDst, /*Src =*/AddLHS, /*Src2=*/AddLHS, InvCC, MIB); 2278 I.eraseFromParent(); 2279 return true; 2280 } 2281 case TargetOpcode::G_OR: { 2282 // Look for operations that take the lower `Width=Size-ShiftImm` bits of 2283 // `ShiftSrc` and insert them into the upper `Width` bits of `MaskSrc` via 2284 // shifting and masking that we can replace with a BFI (encoded as a BFM). 2285 Register Dst = I.getOperand(0).getReg(); 2286 LLT Ty = MRI.getType(Dst); 2287 2288 if (!Ty.isScalar()) 2289 return false; 2290 2291 unsigned Size = Ty.getSizeInBits(); 2292 if (Size != 32 && Size != 64) 2293 return false; 2294 2295 Register ShiftSrc; 2296 int64_t ShiftImm; 2297 Register MaskSrc; 2298 int64_t MaskImm; 2299 if (!mi_match( 2300 Dst, MRI, 2301 m_GOr(m_OneNonDBGUse(m_GShl(m_Reg(ShiftSrc), m_ICst(ShiftImm))), 2302 m_OneNonDBGUse(m_GAnd(m_Reg(MaskSrc), m_ICst(MaskImm)))))) 2303 return false; 2304 2305 if (ShiftImm > Size || ((1ULL << ShiftImm) - 1ULL) != uint64_t(MaskImm)) 2306 return false; 2307 2308 int64_t Immr = Size - ShiftImm; 2309 int64_t Imms = Size - ShiftImm - 1; 2310 unsigned Opc = Size == 32 ? AArch64::BFMWri : AArch64::BFMXri; 2311 emitInstr(Opc, {Dst}, {MaskSrc, ShiftSrc, Immr, Imms}, MIB); 2312 I.eraseFromParent(); 2313 return true; 2314 } 2315 case TargetOpcode::G_FENCE: { 2316 if (I.getOperand(1).getImm() == 0) 2317 BuildMI(MBB, I, I.getDebugLoc(), TII.get(AArch64::CompilerBarrier)) 2318 .addImm(I.getOperand(0).getImm()); 2319 else 2320 BuildMI(MBB, I, I.getDebugLoc(), TII.get(AArch64::DMB)) 2321 .addImm(I.getOperand(0).getImm() == 4 ? 0x9 : 0xb); 2322 I.eraseFromParent(); 2323 return true; 2324 } 2325 default: 2326 return false; 2327 } 2328 } 2329 2330 bool AArch64InstructionSelector::select(MachineInstr &I) { 2331 assert(I.getParent() && "Instruction should be in a basic block!"); 2332 assert(I.getParent()->getParent() && "Instruction should be in a function!"); 2333 2334 MachineBasicBlock &MBB = *I.getParent(); 2335 MachineFunction &MF = *MBB.getParent(); 2336 MachineRegisterInfo &MRI = MF.getRegInfo(); 2337 2338 const AArch64Subtarget *Subtarget = &MF.getSubtarget<AArch64Subtarget>(); 2339 if (Subtarget->requiresStrictAlign()) { 2340 // We don't support this feature yet. 2341 LLVM_DEBUG(dbgs() << "AArch64 GISel does not support strict-align yet\n"); 2342 return false; 2343 } 2344 2345 MIB.setInstrAndDebugLoc(I); 2346 2347 unsigned Opcode = I.getOpcode(); 2348 // G_PHI requires same handling as PHI 2349 if (!I.isPreISelOpcode() || Opcode == TargetOpcode::G_PHI) { 2350 // Certain non-generic instructions also need some special handling. 2351 2352 if (Opcode == TargetOpcode::LOAD_STACK_GUARD) 2353 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 2354 2355 if (Opcode == TargetOpcode::PHI || Opcode == TargetOpcode::G_PHI) { 2356 const Register DefReg = I.getOperand(0).getReg(); 2357 const LLT DefTy = MRI.getType(DefReg); 2358 2359 const RegClassOrRegBank &RegClassOrBank = 2360 MRI.getRegClassOrRegBank(DefReg); 2361 2362 const TargetRegisterClass *DefRC 2363 = RegClassOrBank.dyn_cast<const TargetRegisterClass *>(); 2364 if (!DefRC) { 2365 if (!DefTy.isValid()) { 2366 LLVM_DEBUG(dbgs() << "PHI operand has no type, not a gvreg?\n"); 2367 return false; 2368 } 2369 const RegisterBank &RB = *RegClassOrBank.get<const RegisterBank *>(); 2370 DefRC = getRegClassForTypeOnBank(DefTy, RB); 2371 if (!DefRC) { 2372 LLVM_DEBUG(dbgs() << "PHI operand has unexpected size/bank\n"); 2373 return false; 2374 } 2375 } 2376 2377 I.setDesc(TII.get(TargetOpcode::PHI)); 2378 2379 return RBI.constrainGenericRegister(DefReg, *DefRC, MRI); 2380 } 2381 2382 if (I.isCopy()) 2383 return selectCopy(I, TII, MRI, TRI, RBI); 2384 2385 return true; 2386 } 2387 2388 2389 if (I.getNumOperands() != I.getNumExplicitOperands()) { 2390 LLVM_DEBUG( 2391 dbgs() << "Generic instruction has unexpected implicit operands\n"); 2392 return false; 2393 } 2394 2395 // Try to do some lowering before we start instruction selecting. These 2396 // lowerings are purely transformations on the input G_MIR and so selection 2397 // must continue after any modification of the instruction. 2398 if (preISelLower(I)) { 2399 Opcode = I.getOpcode(); // The opcode may have been modified, refresh it. 2400 } 2401 2402 // There may be patterns where the importer can't deal with them optimally, 2403 // but does select it to a suboptimal sequence so our custom C++ selection 2404 // code later never has a chance to work on it. Therefore, we have an early 2405 // selection attempt here to give priority to certain selection routines 2406 // over the imported ones. 2407 if (earlySelect(I)) 2408 return true; 2409 2410 if (selectImpl(I, *CoverageInfo)) 2411 return true; 2412 2413 LLT Ty = 2414 I.getOperand(0).isReg() ? MRI.getType(I.getOperand(0).getReg()) : LLT{}; 2415 2416 switch (Opcode) { 2417 case TargetOpcode::G_SBFX: 2418 case TargetOpcode::G_UBFX: { 2419 static const unsigned OpcTable[2][2] = { 2420 {AArch64::UBFMWri, AArch64::UBFMXri}, 2421 {AArch64::SBFMWri, AArch64::SBFMXri}}; 2422 bool IsSigned = Opcode == TargetOpcode::G_SBFX; 2423 unsigned Size = Ty.getSizeInBits(); 2424 unsigned Opc = OpcTable[IsSigned][Size == 64]; 2425 auto Cst1 = 2426 getIConstantVRegValWithLookThrough(I.getOperand(2).getReg(), MRI); 2427 assert(Cst1 && "Should have gotten a constant for src 1?"); 2428 auto Cst2 = 2429 getIConstantVRegValWithLookThrough(I.getOperand(3).getReg(), MRI); 2430 assert(Cst2 && "Should have gotten a constant for src 2?"); 2431 auto LSB = Cst1->Value.getZExtValue(); 2432 auto Width = Cst2->Value.getZExtValue(); 2433 auto BitfieldInst = 2434 MIB.buildInstr(Opc, {I.getOperand(0)}, {I.getOperand(1)}) 2435 .addImm(LSB) 2436 .addImm(LSB + Width - 1); 2437 I.eraseFromParent(); 2438 return constrainSelectedInstRegOperands(*BitfieldInst, TII, TRI, RBI); 2439 } 2440 case TargetOpcode::G_BRCOND: 2441 return selectCompareBranch(I, MF, MRI); 2442 2443 case TargetOpcode::G_BRINDIRECT: { 2444 I.setDesc(TII.get(AArch64::BR)); 2445 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 2446 } 2447 2448 case TargetOpcode::G_BRJT: 2449 return selectBrJT(I, MRI); 2450 2451 case AArch64::G_ADD_LOW: { 2452 // This op may have been separated from it's ADRP companion by the localizer 2453 // or some other code motion pass. Given that many CPUs will try to 2454 // macro fuse these operations anyway, select this into a MOVaddr pseudo 2455 // which will later be expanded into an ADRP+ADD pair after scheduling. 2456 MachineInstr *BaseMI = MRI.getVRegDef(I.getOperand(1).getReg()); 2457 if (BaseMI->getOpcode() != AArch64::ADRP) { 2458 I.setDesc(TII.get(AArch64::ADDXri)); 2459 I.addOperand(MachineOperand::CreateImm(0)); 2460 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 2461 } 2462 assert(TM.getCodeModel() == CodeModel::Small && 2463 "Expected small code model"); 2464 auto Op1 = BaseMI->getOperand(1); 2465 auto Op2 = I.getOperand(2); 2466 auto MovAddr = MIB.buildInstr(AArch64::MOVaddr, {I.getOperand(0)}, {}) 2467 .addGlobalAddress(Op1.getGlobal(), Op1.getOffset(), 2468 Op1.getTargetFlags()) 2469 .addGlobalAddress(Op2.getGlobal(), Op2.getOffset(), 2470 Op2.getTargetFlags()); 2471 I.eraseFromParent(); 2472 return constrainSelectedInstRegOperands(*MovAddr, TII, TRI, RBI); 2473 } 2474 2475 case TargetOpcode::G_BSWAP: { 2476 // Handle vector types for G_BSWAP directly. 2477 Register DstReg = I.getOperand(0).getReg(); 2478 LLT DstTy = MRI.getType(DstReg); 2479 2480 // We should only get vector types here; everything else is handled by the 2481 // importer right now. 2482 if (!DstTy.isVector() || DstTy.getSizeInBits() > 128) { 2483 LLVM_DEBUG(dbgs() << "Dst type for G_BSWAP currently unsupported.\n"); 2484 return false; 2485 } 2486 2487 // Only handle 4 and 2 element vectors for now. 2488 // TODO: 16-bit elements. 2489 unsigned NumElts = DstTy.getNumElements(); 2490 if (NumElts != 4 && NumElts != 2) { 2491 LLVM_DEBUG(dbgs() << "Unsupported number of elements for G_BSWAP.\n"); 2492 return false; 2493 } 2494 2495 // Choose the correct opcode for the supported types. Right now, that's 2496 // v2s32, v4s32, and v2s64. 2497 unsigned Opc = 0; 2498 unsigned EltSize = DstTy.getElementType().getSizeInBits(); 2499 if (EltSize == 32) 2500 Opc = (DstTy.getNumElements() == 2) ? AArch64::REV32v8i8 2501 : AArch64::REV32v16i8; 2502 else if (EltSize == 64) 2503 Opc = AArch64::REV64v16i8; 2504 2505 // We should always get something by the time we get here... 2506 assert(Opc != 0 && "Didn't get an opcode for G_BSWAP?"); 2507 2508 I.setDesc(TII.get(Opc)); 2509 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 2510 } 2511 2512 case TargetOpcode::G_FCONSTANT: 2513 case TargetOpcode::G_CONSTANT: { 2514 const bool isFP = Opcode == TargetOpcode::G_FCONSTANT; 2515 2516 const LLT s8 = LLT::scalar(8); 2517 const LLT s16 = LLT::scalar(16); 2518 const LLT s32 = LLT::scalar(32); 2519 const LLT s64 = LLT::scalar(64); 2520 const LLT s128 = LLT::scalar(128); 2521 const LLT p0 = LLT::pointer(0, 64); 2522 2523 const Register DefReg = I.getOperand(0).getReg(); 2524 const LLT DefTy = MRI.getType(DefReg); 2525 const unsigned DefSize = DefTy.getSizeInBits(); 2526 const RegisterBank &RB = *RBI.getRegBank(DefReg, MRI, TRI); 2527 2528 // FIXME: Redundant check, but even less readable when factored out. 2529 if (isFP) { 2530 if (Ty != s16 && Ty != s32 && Ty != s64 && Ty != s128) { 2531 LLVM_DEBUG(dbgs() << "Unable to materialize FP " << Ty 2532 << " constant, expected: " << s16 << " or " << s32 2533 << " or " << s64 << " or " << s128 << '\n'); 2534 return false; 2535 } 2536 2537 if (RB.getID() != AArch64::FPRRegBankID) { 2538 LLVM_DEBUG(dbgs() << "Unable to materialize FP " << Ty 2539 << " constant on bank: " << RB 2540 << ", expected: FPR\n"); 2541 return false; 2542 } 2543 2544 // The case when we have 0.0 is covered by tablegen. Reject it here so we 2545 // can be sure tablegen works correctly and isn't rescued by this code. 2546 // 0.0 is not covered by tablegen for FP128. So we will handle this 2547 // scenario in the code here. 2548 if (DefSize != 128 && I.getOperand(1).getFPImm()->isExactlyValue(0.0)) 2549 return false; 2550 } else { 2551 // s32 and s64 are covered by tablegen. 2552 if (Ty != p0 && Ty != s8 && Ty != s16) { 2553 LLVM_DEBUG(dbgs() << "Unable to materialize integer " << Ty 2554 << " constant, expected: " << s32 << ", " << s64 2555 << ", or " << p0 << '\n'); 2556 return false; 2557 } 2558 2559 if (RB.getID() != AArch64::GPRRegBankID) { 2560 LLVM_DEBUG(dbgs() << "Unable to materialize integer " << Ty 2561 << " constant on bank: " << RB 2562 << ", expected: GPR\n"); 2563 return false; 2564 } 2565 } 2566 2567 if (isFP) { 2568 const TargetRegisterClass &FPRRC = *getRegClassForTypeOnBank(DefTy, RB); 2569 // For 16, 64, and 128b values, emit a constant pool load. 2570 switch (DefSize) { 2571 default: 2572 llvm_unreachable("Unexpected destination size for G_FCONSTANT?"); 2573 case 32: 2574 // For s32, use a cp load if we have optsize/minsize. 2575 if (!shouldOptForSize(&MF)) 2576 break; 2577 LLVM_FALLTHROUGH; 2578 case 16: 2579 case 64: 2580 case 128: { 2581 auto *FPImm = I.getOperand(1).getFPImm(); 2582 auto *LoadMI = emitLoadFromConstantPool(FPImm, MIB); 2583 if (!LoadMI) { 2584 LLVM_DEBUG(dbgs() << "Failed to load double constant pool entry\n"); 2585 return false; 2586 } 2587 MIB.buildCopy({DefReg}, {LoadMI->getOperand(0).getReg()}); 2588 I.eraseFromParent(); 2589 return RBI.constrainGenericRegister(DefReg, FPRRC, MRI); 2590 } 2591 } 2592 2593 // Either emit a FMOV, or emit a copy to emit a normal mov. 2594 assert(DefSize == 32 && 2595 "Expected constant pool loads for all sizes other than 32!"); 2596 const Register DefGPRReg = 2597 MRI.createVirtualRegister(&AArch64::GPR32RegClass); 2598 MachineOperand &RegOp = I.getOperand(0); 2599 RegOp.setReg(DefGPRReg); 2600 MIB.setInsertPt(MIB.getMBB(), std::next(I.getIterator())); 2601 MIB.buildCopy({DefReg}, {DefGPRReg}); 2602 2603 if (!RBI.constrainGenericRegister(DefReg, FPRRC, MRI)) { 2604 LLVM_DEBUG(dbgs() << "Failed to constrain G_FCONSTANT def operand\n"); 2605 return false; 2606 } 2607 2608 MachineOperand &ImmOp = I.getOperand(1); 2609 // FIXME: Is going through int64_t always correct? 2610 ImmOp.ChangeToImmediate( 2611 ImmOp.getFPImm()->getValueAPF().bitcastToAPInt().getZExtValue()); 2612 } else if (I.getOperand(1).isCImm()) { 2613 uint64_t Val = I.getOperand(1).getCImm()->getZExtValue(); 2614 I.getOperand(1).ChangeToImmediate(Val); 2615 } else if (I.getOperand(1).isImm()) { 2616 uint64_t Val = I.getOperand(1).getImm(); 2617 I.getOperand(1).ChangeToImmediate(Val); 2618 } 2619 2620 const unsigned MovOpc = 2621 DefSize == 64 ? AArch64::MOVi64imm : AArch64::MOVi32imm; 2622 I.setDesc(TII.get(MovOpc)); 2623 constrainSelectedInstRegOperands(I, TII, TRI, RBI); 2624 return true; 2625 } 2626 case TargetOpcode::G_EXTRACT: { 2627 Register DstReg = I.getOperand(0).getReg(); 2628 Register SrcReg = I.getOperand(1).getReg(); 2629 LLT SrcTy = MRI.getType(SrcReg); 2630 LLT DstTy = MRI.getType(DstReg); 2631 (void)DstTy; 2632 unsigned SrcSize = SrcTy.getSizeInBits(); 2633 2634 if (SrcTy.getSizeInBits() > 64) { 2635 // This should be an extract of an s128, which is like a vector extract. 2636 if (SrcTy.getSizeInBits() != 128) 2637 return false; 2638 // Only support extracting 64 bits from an s128 at the moment. 2639 if (DstTy.getSizeInBits() != 64) 2640 return false; 2641 2642 unsigned Offset = I.getOperand(2).getImm(); 2643 if (Offset % 64 != 0) 2644 return false; 2645 2646 // Check we have the right regbank always. 2647 const RegisterBank &SrcRB = *RBI.getRegBank(SrcReg, MRI, TRI); 2648 const RegisterBank &DstRB = *RBI.getRegBank(DstReg, MRI, TRI); 2649 assert(SrcRB.getID() == DstRB.getID() && "Wrong extract regbank!"); 2650 2651 if (SrcRB.getID() == AArch64::GPRRegBankID) { 2652 MIB.buildInstr(TargetOpcode::COPY, {DstReg}, {}) 2653 .addUse(SrcReg, 0, Offset == 0 ? AArch64::sube64 : AArch64::subo64); 2654 I.eraseFromParent(); 2655 return true; 2656 } 2657 2658 // Emit the same code as a vector extract. 2659 // Offset must be a multiple of 64. 2660 unsigned LaneIdx = Offset / 64; 2661 MachineInstr *Extract = emitExtractVectorElt( 2662 DstReg, DstRB, LLT::scalar(64), SrcReg, LaneIdx, MIB); 2663 if (!Extract) 2664 return false; 2665 I.eraseFromParent(); 2666 return true; 2667 } 2668 2669 I.setDesc(TII.get(SrcSize == 64 ? AArch64::UBFMXri : AArch64::UBFMWri)); 2670 MachineInstrBuilder(MF, I).addImm(I.getOperand(2).getImm() + 2671 Ty.getSizeInBits() - 1); 2672 2673 if (SrcSize < 64) { 2674 assert(SrcSize == 32 && DstTy.getSizeInBits() == 16 && 2675 "unexpected G_EXTRACT types"); 2676 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 2677 } 2678 2679 DstReg = MRI.createGenericVirtualRegister(LLT::scalar(64)); 2680 MIB.setInsertPt(MIB.getMBB(), std::next(I.getIterator())); 2681 MIB.buildInstr(TargetOpcode::COPY, {I.getOperand(0).getReg()}, {}) 2682 .addReg(DstReg, 0, AArch64::sub_32); 2683 RBI.constrainGenericRegister(I.getOperand(0).getReg(), 2684 AArch64::GPR32RegClass, MRI); 2685 I.getOperand(0).setReg(DstReg); 2686 2687 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 2688 } 2689 2690 case TargetOpcode::G_INSERT: { 2691 LLT SrcTy = MRI.getType(I.getOperand(2).getReg()); 2692 LLT DstTy = MRI.getType(I.getOperand(0).getReg()); 2693 unsigned DstSize = DstTy.getSizeInBits(); 2694 // Larger inserts are vectors, same-size ones should be something else by 2695 // now (split up or turned into COPYs). 2696 if (Ty.getSizeInBits() > 64 || SrcTy.getSizeInBits() > 32) 2697 return false; 2698 2699 I.setDesc(TII.get(DstSize == 64 ? AArch64::BFMXri : AArch64::BFMWri)); 2700 unsigned LSB = I.getOperand(3).getImm(); 2701 unsigned Width = MRI.getType(I.getOperand(2).getReg()).getSizeInBits(); 2702 I.getOperand(3).setImm((DstSize - LSB) % DstSize); 2703 MachineInstrBuilder(MF, I).addImm(Width - 1); 2704 2705 if (DstSize < 64) { 2706 assert(DstSize == 32 && SrcTy.getSizeInBits() == 16 && 2707 "unexpected G_INSERT types"); 2708 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 2709 } 2710 2711 Register SrcReg = MRI.createGenericVirtualRegister(LLT::scalar(64)); 2712 BuildMI(MBB, I.getIterator(), I.getDebugLoc(), 2713 TII.get(AArch64::SUBREG_TO_REG)) 2714 .addDef(SrcReg) 2715 .addImm(0) 2716 .addUse(I.getOperand(2).getReg()) 2717 .addImm(AArch64::sub_32); 2718 RBI.constrainGenericRegister(I.getOperand(2).getReg(), 2719 AArch64::GPR32RegClass, MRI); 2720 I.getOperand(2).setReg(SrcReg); 2721 2722 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 2723 } 2724 case TargetOpcode::G_FRAME_INDEX: { 2725 // allocas and G_FRAME_INDEX are only supported in addrspace(0). 2726 if (Ty != LLT::pointer(0, 64)) { 2727 LLVM_DEBUG(dbgs() << "G_FRAME_INDEX pointer has type: " << Ty 2728 << ", expected: " << LLT::pointer(0, 64) << '\n'); 2729 return false; 2730 } 2731 I.setDesc(TII.get(AArch64::ADDXri)); 2732 2733 // MOs for a #0 shifted immediate. 2734 I.addOperand(MachineOperand::CreateImm(0)); 2735 I.addOperand(MachineOperand::CreateImm(0)); 2736 2737 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 2738 } 2739 2740 case TargetOpcode::G_GLOBAL_VALUE: { 2741 auto GV = I.getOperand(1).getGlobal(); 2742 if (GV->isThreadLocal()) 2743 return selectTLSGlobalValue(I, MRI); 2744 2745 unsigned OpFlags = STI.ClassifyGlobalReference(GV, TM); 2746 if (OpFlags & AArch64II::MO_GOT) { 2747 I.setDesc(TII.get(AArch64::LOADgot)); 2748 I.getOperand(1).setTargetFlags(OpFlags); 2749 } else if (TM.getCodeModel() == CodeModel::Large) { 2750 // Materialize the global using movz/movk instructions. 2751 materializeLargeCMVal(I, GV, OpFlags); 2752 I.eraseFromParent(); 2753 return true; 2754 } else if (TM.getCodeModel() == CodeModel::Tiny) { 2755 I.setDesc(TII.get(AArch64::ADR)); 2756 I.getOperand(1).setTargetFlags(OpFlags); 2757 } else { 2758 I.setDesc(TII.get(AArch64::MOVaddr)); 2759 I.getOperand(1).setTargetFlags(OpFlags | AArch64II::MO_PAGE); 2760 MachineInstrBuilder MIB(MF, I); 2761 MIB.addGlobalAddress(GV, I.getOperand(1).getOffset(), 2762 OpFlags | AArch64II::MO_PAGEOFF | AArch64II::MO_NC); 2763 } 2764 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 2765 } 2766 2767 case TargetOpcode::G_ZEXTLOAD: 2768 case TargetOpcode::G_LOAD: 2769 case TargetOpcode::G_STORE: { 2770 GLoadStore &LdSt = cast<GLoadStore>(I); 2771 bool IsZExtLoad = I.getOpcode() == TargetOpcode::G_ZEXTLOAD; 2772 LLT PtrTy = MRI.getType(LdSt.getPointerReg()); 2773 2774 if (PtrTy != LLT::pointer(0, 64)) { 2775 LLVM_DEBUG(dbgs() << "Load/Store pointer has type: " << PtrTy 2776 << ", expected: " << LLT::pointer(0, 64) << '\n'); 2777 return false; 2778 } 2779 2780 uint64_t MemSizeInBytes = LdSt.getMemSize(); 2781 unsigned MemSizeInBits = LdSt.getMemSizeInBits(); 2782 AtomicOrdering Order = LdSt.getMMO().getSuccessOrdering(); 2783 2784 // Need special instructions for atomics that affect ordering. 2785 if (Order != AtomicOrdering::NotAtomic && 2786 Order != AtomicOrdering::Unordered && 2787 Order != AtomicOrdering::Monotonic) { 2788 assert(!isa<GZExtLoad>(LdSt)); 2789 if (MemSizeInBytes > 64) 2790 return false; 2791 2792 if (isa<GLoad>(LdSt)) { 2793 static constexpr unsigned LDAPROpcodes[] = { 2794 AArch64::LDAPRB, AArch64::LDAPRH, AArch64::LDAPRW, AArch64::LDAPRX}; 2795 static constexpr unsigned LDAROpcodes[] = { 2796 AArch64::LDARB, AArch64::LDARH, AArch64::LDARW, AArch64::LDARX}; 2797 ArrayRef<unsigned> Opcodes = 2798 STI.hasLDAPR() && Order != AtomicOrdering::SequentiallyConsistent 2799 ? LDAPROpcodes 2800 : LDAROpcodes; 2801 I.setDesc(TII.get(Opcodes[Log2_32(MemSizeInBytes)])); 2802 } else { 2803 static constexpr unsigned Opcodes[] = {AArch64::STLRB, AArch64::STLRH, 2804 AArch64::STLRW, AArch64::STLRX}; 2805 Register ValReg = LdSt.getReg(0); 2806 if (MRI.getType(ValReg).getSizeInBits() == 64 && MemSizeInBits != 64) { 2807 // Emit a subreg copy of 32 bits. 2808 Register NewVal = MRI.createVirtualRegister(&AArch64::GPR32RegClass); 2809 MIB.buildInstr(TargetOpcode::COPY, {NewVal}, {}) 2810 .addReg(I.getOperand(0).getReg(), 0, AArch64::sub_32); 2811 I.getOperand(0).setReg(NewVal); 2812 } 2813 I.setDesc(TII.get(Opcodes[Log2_32(MemSizeInBytes)])); 2814 } 2815 constrainSelectedInstRegOperands(I, TII, TRI, RBI); 2816 return true; 2817 } 2818 2819 #ifndef NDEBUG 2820 const Register PtrReg = LdSt.getPointerReg(); 2821 const RegisterBank &PtrRB = *RBI.getRegBank(PtrReg, MRI, TRI); 2822 // Check that the pointer register is valid. 2823 assert(PtrRB.getID() == AArch64::GPRRegBankID && 2824 "Load/Store pointer operand isn't a GPR"); 2825 assert(MRI.getType(PtrReg).isPointer() && 2826 "Load/Store pointer operand isn't a pointer"); 2827 #endif 2828 2829 const Register ValReg = LdSt.getReg(0); 2830 const LLT ValTy = MRI.getType(ValReg); 2831 const RegisterBank &RB = *RBI.getRegBank(ValReg, MRI, TRI); 2832 2833 // The code below doesn't support truncating stores, so we need to split it 2834 // again. 2835 if (isa<GStore>(LdSt) && ValTy.getSizeInBits() > MemSizeInBits) { 2836 unsigned SubReg; 2837 LLT MemTy = LdSt.getMMO().getMemoryType(); 2838 auto *RC = getRegClassForTypeOnBank(MemTy, RB); 2839 if (!getSubRegForClass(RC, TRI, SubReg)) 2840 return false; 2841 2842 // Generate a subreg copy. 2843 auto Copy = MIB.buildInstr(TargetOpcode::COPY, {MemTy}, {}) 2844 .addReg(ValReg, 0, SubReg) 2845 .getReg(0); 2846 RBI.constrainGenericRegister(Copy, *RC, MRI); 2847 LdSt.getOperand(0).setReg(Copy); 2848 } else if (isa<GLoad>(LdSt) && ValTy.getSizeInBits() > MemSizeInBits) { 2849 // If this is an any-extending load from the FPR bank, split it into a regular 2850 // load + extend. 2851 if (RB.getID() == AArch64::FPRRegBankID) { 2852 unsigned SubReg; 2853 LLT MemTy = LdSt.getMMO().getMemoryType(); 2854 auto *RC = getRegClassForTypeOnBank(MemTy, RB); 2855 if (!getSubRegForClass(RC, TRI, SubReg)) 2856 return false; 2857 Register OldDst = LdSt.getReg(0); 2858 Register NewDst = 2859 MRI.createGenericVirtualRegister(LdSt.getMMO().getMemoryType()); 2860 LdSt.getOperand(0).setReg(NewDst); 2861 MRI.setRegBank(NewDst, RB); 2862 // Generate a SUBREG_TO_REG to extend it. 2863 MIB.setInsertPt(MIB.getMBB(), std::next(LdSt.getIterator())); 2864 MIB.buildInstr(AArch64::SUBREG_TO_REG, {OldDst}, {}) 2865 .addImm(0) 2866 .addUse(NewDst) 2867 .addImm(SubReg); 2868 auto SubRegRC = getRegClassForTypeOnBank(MRI.getType(OldDst), RB); 2869 RBI.constrainGenericRegister(OldDst, *SubRegRC, MRI); 2870 MIB.setInstr(LdSt); 2871 } 2872 } 2873 2874 // Helper lambda for partially selecting I. Either returns the original 2875 // instruction with an updated opcode, or a new instruction. 2876 auto SelectLoadStoreAddressingMode = [&]() -> MachineInstr * { 2877 bool IsStore = isa<GStore>(I); 2878 const unsigned NewOpc = 2879 selectLoadStoreUIOp(I.getOpcode(), RB.getID(), MemSizeInBits); 2880 if (NewOpc == I.getOpcode()) 2881 return nullptr; 2882 // Check if we can fold anything into the addressing mode. 2883 auto AddrModeFns = 2884 selectAddrModeIndexed(I.getOperand(1), MemSizeInBytes); 2885 if (!AddrModeFns) { 2886 // Can't fold anything. Use the original instruction. 2887 I.setDesc(TII.get(NewOpc)); 2888 I.addOperand(MachineOperand::CreateImm(0)); 2889 return &I; 2890 } 2891 2892 // Folded something. Create a new instruction and return it. 2893 auto NewInst = MIB.buildInstr(NewOpc, {}, {}, I.getFlags()); 2894 Register CurValReg = I.getOperand(0).getReg(); 2895 IsStore ? NewInst.addUse(CurValReg) : NewInst.addDef(CurValReg); 2896 NewInst.cloneMemRefs(I); 2897 for (auto &Fn : *AddrModeFns) 2898 Fn(NewInst); 2899 I.eraseFromParent(); 2900 return &*NewInst; 2901 }; 2902 2903 MachineInstr *LoadStore = SelectLoadStoreAddressingMode(); 2904 if (!LoadStore) 2905 return false; 2906 2907 // If we're storing a 0, use WZR/XZR. 2908 if (Opcode == TargetOpcode::G_STORE) { 2909 auto CVal = getIConstantVRegValWithLookThrough( 2910 LoadStore->getOperand(0).getReg(), MRI); 2911 if (CVal && CVal->Value == 0) { 2912 switch (LoadStore->getOpcode()) { 2913 case AArch64::STRWui: 2914 case AArch64::STRHHui: 2915 case AArch64::STRBBui: 2916 LoadStore->getOperand(0).setReg(AArch64::WZR); 2917 break; 2918 case AArch64::STRXui: 2919 LoadStore->getOperand(0).setReg(AArch64::XZR); 2920 break; 2921 } 2922 } 2923 } 2924 2925 if (IsZExtLoad) { 2926 // The zextload from a smaller type to i32 should be handled by the 2927 // importer. 2928 if (MRI.getType(LoadStore->getOperand(0).getReg()).getSizeInBits() != 64) 2929 return false; 2930 // If we have a ZEXTLOAD then change the load's type to be a narrower reg 2931 // and zero_extend with SUBREG_TO_REG. 2932 Register LdReg = MRI.createVirtualRegister(&AArch64::GPR32RegClass); 2933 Register DstReg = LoadStore->getOperand(0).getReg(); 2934 LoadStore->getOperand(0).setReg(LdReg); 2935 2936 MIB.setInsertPt(MIB.getMBB(), std::next(LoadStore->getIterator())); 2937 MIB.buildInstr(AArch64::SUBREG_TO_REG, {DstReg}, {}) 2938 .addImm(0) 2939 .addUse(LdReg) 2940 .addImm(AArch64::sub_32); 2941 constrainSelectedInstRegOperands(*LoadStore, TII, TRI, RBI); 2942 return RBI.constrainGenericRegister(DstReg, AArch64::GPR64allRegClass, 2943 MRI); 2944 } 2945 return constrainSelectedInstRegOperands(*LoadStore, TII, TRI, RBI); 2946 } 2947 2948 case TargetOpcode::G_SMULH: 2949 case TargetOpcode::G_UMULH: { 2950 // Reject the various things we don't support yet. 2951 if (unsupportedBinOp(I, RBI, MRI, TRI)) 2952 return false; 2953 2954 const Register DefReg = I.getOperand(0).getReg(); 2955 const RegisterBank &RB = *RBI.getRegBank(DefReg, MRI, TRI); 2956 2957 if (RB.getID() != AArch64::GPRRegBankID) { 2958 LLVM_DEBUG(dbgs() << "G_[SU]MULH on bank: " << RB << ", expected: GPR\n"); 2959 return false; 2960 } 2961 2962 if (Ty != LLT::scalar(64)) { 2963 LLVM_DEBUG(dbgs() << "G_[SU]MULH has type: " << Ty 2964 << ", expected: " << LLT::scalar(64) << '\n'); 2965 return false; 2966 } 2967 2968 unsigned NewOpc = I.getOpcode() == TargetOpcode::G_SMULH ? AArch64::SMULHrr 2969 : AArch64::UMULHrr; 2970 I.setDesc(TII.get(NewOpc)); 2971 2972 // Now that we selected an opcode, we need to constrain the register 2973 // operands to use appropriate classes. 2974 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 2975 } 2976 case TargetOpcode::G_LSHR: 2977 case TargetOpcode::G_ASHR: 2978 if (MRI.getType(I.getOperand(0).getReg()).isVector()) 2979 return selectVectorAshrLshr(I, MRI); 2980 LLVM_FALLTHROUGH; 2981 case TargetOpcode::G_SHL: 2982 if (Opcode == TargetOpcode::G_SHL && 2983 MRI.getType(I.getOperand(0).getReg()).isVector()) 2984 return selectVectorSHL(I, MRI); 2985 2986 // These shifts were legalized to have 64 bit shift amounts because we 2987 // want to take advantage of the selection patterns that assume the 2988 // immediates are s64s, however, selectBinaryOp will assume both operands 2989 // will have the same bit size. 2990 { 2991 Register SrcReg = I.getOperand(1).getReg(); 2992 Register ShiftReg = I.getOperand(2).getReg(); 2993 const LLT ShiftTy = MRI.getType(ShiftReg); 2994 const LLT SrcTy = MRI.getType(SrcReg); 2995 if (!SrcTy.isVector() && SrcTy.getSizeInBits() == 32 && 2996 ShiftTy.getSizeInBits() == 64) { 2997 assert(!ShiftTy.isVector() && "unexpected vector shift ty"); 2998 // Insert a subregister copy to implement a 64->32 trunc 2999 auto Trunc = MIB.buildInstr(TargetOpcode::COPY, {SrcTy}, {}) 3000 .addReg(ShiftReg, 0, AArch64::sub_32); 3001 MRI.setRegBank(Trunc.getReg(0), RBI.getRegBank(AArch64::GPRRegBankID)); 3002 I.getOperand(2).setReg(Trunc.getReg(0)); 3003 } 3004 } 3005 LLVM_FALLTHROUGH; 3006 case TargetOpcode::G_OR: { 3007 // Reject the various things we don't support yet. 3008 if (unsupportedBinOp(I, RBI, MRI, TRI)) 3009 return false; 3010 3011 const unsigned OpSize = Ty.getSizeInBits(); 3012 3013 const Register DefReg = I.getOperand(0).getReg(); 3014 const RegisterBank &RB = *RBI.getRegBank(DefReg, MRI, TRI); 3015 3016 const unsigned NewOpc = selectBinaryOp(I.getOpcode(), RB.getID(), OpSize); 3017 if (NewOpc == I.getOpcode()) 3018 return false; 3019 3020 I.setDesc(TII.get(NewOpc)); 3021 // FIXME: Should the type be always reset in setDesc? 3022 3023 // Now that we selected an opcode, we need to constrain the register 3024 // operands to use appropriate classes. 3025 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 3026 } 3027 3028 case TargetOpcode::G_PTR_ADD: { 3029 emitADD(I.getOperand(0).getReg(), I.getOperand(1), I.getOperand(2), MIB); 3030 I.eraseFromParent(); 3031 return true; 3032 } 3033 case TargetOpcode::G_SADDO: 3034 case TargetOpcode::G_UADDO: 3035 case TargetOpcode::G_SSUBO: 3036 case TargetOpcode::G_USUBO: { 3037 // Emit the operation and get the correct condition code. 3038 auto OpAndCC = emitOverflowOp(Opcode, I.getOperand(0).getReg(), 3039 I.getOperand(2), I.getOperand(3), MIB); 3040 3041 // Now, put the overflow result in the register given by the first operand 3042 // to the overflow op. CSINC increments the result when the predicate is 3043 // false, so to get the increment when it's true, we need to use the 3044 // inverse. In this case, we want to increment when carry is set. 3045 Register ZReg = AArch64::WZR; 3046 emitCSINC(/*Dst=*/I.getOperand(1).getReg(), /*Src1=*/ZReg, /*Src2=*/ZReg, 3047 getInvertedCondCode(OpAndCC.second), MIB); 3048 I.eraseFromParent(); 3049 return true; 3050 } 3051 3052 case TargetOpcode::G_PTRMASK: { 3053 Register MaskReg = I.getOperand(2).getReg(); 3054 Optional<int64_t> MaskVal = getIConstantVRegSExtVal(MaskReg, MRI); 3055 // TODO: Implement arbitrary cases 3056 if (!MaskVal || !isShiftedMask_64(*MaskVal)) 3057 return false; 3058 3059 uint64_t Mask = *MaskVal; 3060 I.setDesc(TII.get(AArch64::ANDXri)); 3061 I.getOperand(2).ChangeToImmediate( 3062 AArch64_AM::encodeLogicalImmediate(Mask, 64)); 3063 3064 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 3065 } 3066 case TargetOpcode::G_PTRTOINT: 3067 case TargetOpcode::G_TRUNC: { 3068 const LLT DstTy = MRI.getType(I.getOperand(0).getReg()); 3069 const LLT SrcTy = MRI.getType(I.getOperand(1).getReg()); 3070 3071 const Register DstReg = I.getOperand(0).getReg(); 3072 const Register SrcReg = I.getOperand(1).getReg(); 3073 3074 const RegisterBank &DstRB = *RBI.getRegBank(DstReg, MRI, TRI); 3075 const RegisterBank &SrcRB = *RBI.getRegBank(SrcReg, MRI, TRI); 3076 3077 if (DstRB.getID() != SrcRB.getID()) { 3078 LLVM_DEBUG( 3079 dbgs() << "G_TRUNC/G_PTRTOINT input/output on different banks\n"); 3080 return false; 3081 } 3082 3083 if (DstRB.getID() == AArch64::GPRRegBankID) { 3084 const TargetRegisterClass *DstRC = getRegClassForTypeOnBank(DstTy, DstRB); 3085 if (!DstRC) 3086 return false; 3087 3088 const TargetRegisterClass *SrcRC = getRegClassForTypeOnBank(SrcTy, SrcRB); 3089 if (!SrcRC) 3090 return false; 3091 3092 if (!RBI.constrainGenericRegister(SrcReg, *SrcRC, MRI) || 3093 !RBI.constrainGenericRegister(DstReg, *DstRC, MRI)) { 3094 LLVM_DEBUG(dbgs() << "Failed to constrain G_TRUNC/G_PTRTOINT\n"); 3095 return false; 3096 } 3097 3098 if (DstRC == SrcRC) { 3099 // Nothing to be done 3100 } else if (Opcode == TargetOpcode::G_TRUNC && DstTy == LLT::scalar(32) && 3101 SrcTy == LLT::scalar(64)) { 3102 llvm_unreachable("TableGen can import this case"); 3103 return false; 3104 } else if (DstRC == &AArch64::GPR32RegClass && 3105 SrcRC == &AArch64::GPR64RegClass) { 3106 I.getOperand(1).setSubReg(AArch64::sub_32); 3107 } else { 3108 LLVM_DEBUG( 3109 dbgs() << "Unhandled mismatched classes in G_TRUNC/G_PTRTOINT\n"); 3110 return false; 3111 } 3112 3113 I.setDesc(TII.get(TargetOpcode::COPY)); 3114 return true; 3115 } else if (DstRB.getID() == AArch64::FPRRegBankID) { 3116 if (DstTy == LLT::fixed_vector(4, 16) && 3117 SrcTy == LLT::fixed_vector(4, 32)) { 3118 I.setDesc(TII.get(AArch64::XTNv4i16)); 3119 constrainSelectedInstRegOperands(I, TII, TRI, RBI); 3120 return true; 3121 } 3122 3123 if (!SrcTy.isVector() && SrcTy.getSizeInBits() == 128) { 3124 MachineInstr *Extract = emitExtractVectorElt( 3125 DstReg, DstRB, LLT::scalar(DstTy.getSizeInBits()), SrcReg, 0, MIB); 3126 if (!Extract) 3127 return false; 3128 I.eraseFromParent(); 3129 return true; 3130 } 3131 3132 // We might have a vector G_PTRTOINT, in which case just emit a COPY. 3133 if (Opcode == TargetOpcode::G_PTRTOINT) { 3134 assert(DstTy.isVector() && "Expected an FPR ptrtoint to be a vector"); 3135 I.setDesc(TII.get(TargetOpcode::COPY)); 3136 return selectCopy(I, TII, MRI, TRI, RBI); 3137 } 3138 } 3139 3140 return false; 3141 } 3142 3143 case TargetOpcode::G_ANYEXT: { 3144 if (selectUSMovFromExtend(I, MRI)) 3145 return true; 3146 3147 const Register DstReg = I.getOperand(0).getReg(); 3148 const Register SrcReg = I.getOperand(1).getReg(); 3149 3150 const RegisterBank &RBDst = *RBI.getRegBank(DstReg, MRI, TRI); 3151 if (RBDst.getID() != AArch64::GPRRegBankID) { 3152 LLVM_DEBUG(dbgs() << "G_ANYEXT on bank: " << RBDst 3153 << ", expected: GPR\n"); 3154 return false; 3155 } 3156 3157 const RegisterBank &RBSrc = *RBI.getRegBank(SrcReg, MRI, TRI); 3158 if (RBSrc.getID() != AArch64::GPRRegBankID) { 3159 LLVM_DEBUG(dbgs() << "G_ANYEXT on bank: " << RBSrc 3160 << ", expected: GPR\n"); 3161 return false; 3162 } 3163 3164 const unsigned DstSize = MRI.getType(DstReg).getSizeInBits(); 3165 3166 if (DstSize == 0) { 3167 LLVM_DEBUG(dbgs() << "G_ANYEXT operand has no size, not a gvreg?\n"); 3168 return false; 3169 } 3170 3171 if (DstSize != 64 && DstSize > 32) { 3172 LLVM_DEBUG(dbgs() << "G_ANYEXT to size: " << DstSize 3173 << ", expected: 32 or 64\n"); 3174 return false; 3175 } 3176 // At this point G_ANYEXT is just like a plain COPY, but we need 3177 // to explicitly form the 64-bit value if any. 3178 if (DstSize > 32) { 3179 Register ExtSrc = MRI.createVirtualRegister(&AArch64::GPR64allRegClass); 3180 BuildMI(MBB, I, I.getDebugLoc(), TII.get(AArch64::SUBREG_TO_REG)) 3181 .addDef(ExtSrc) 3182 .addImm(0) 3183 .addUse(SrcReg) 3184 .addImm(AArch64::sub_32); 3185 I.getOperand(1).setReg(ExtSrc); 3186 } 3187 return selectCopy(I, TII, MRI, TRI, RBI); 3188 } 3189 3190 case TargetOpcode::G_ZEXT: 3191 case TargetOpcode::G_SEXT_INREG: 3192 case TargetOpcode::G_SEXT: { 3193 if (selectUSMovFromExtend(I, MRI)) 3194 return true; 3195 3196 unsigned Opcode = I.getOpcode(); 3197 const bool IsSigned = Opcode != TargetOpcode::G_ZEXT; 3198 const Register DefReg = I.getOperand(0).getReg(); 3199 Register SrcReg = I.getOperand(1).getReg(); 3200 const LLT DstTy = MRI.getType(DefReg); 3201 const LLT SrcTy = MRI.getType(SrcReg); 3202 unsigned DstSize = DstTy.getSizeInBits(); 3203 unsigned SrcSize = SrcTy.getSizeInBits(); 3204 3205 // SEXT_INREG has the same src reg size as dst, the size of the value to be 3206 // extended is encoded in the imm. 3207 if (Opcode == TargetOpcode::G_SEXT_INREG) 3208 SrcSize = I.getOperand(2).getImm(); 3209 3210 if (DstTy.isVector()) 3211 return false; // Should be handled by imported patterns. 3212 3213 assert((*RBI.getRegBank(DefReg, MRI, TRI)).getID() == 3214 AArch64::GPRRegBankID && 3215 "Unexpected ext regbank"); 3216 3217 MachineInstr *ExtI; 3218 3219 // First check if we're extending the result of a load which has a dest type 3220 // smaller than 32 bits, then this zext is redundant. GPR32 is the smallest 3221 // GPR register on AArch64 and all loads which are smaller automatically 3222 // zero-extend the upper bits. E.g. 3223 // %v(s8) = G_LOAD %p, :: (load 1) 3224 // %v2(s32) = G_ZEXT %v(s8) 3225 if (!IsSigned) { 3226 auto *LoadMI = getOpcodeDef(TargetOpcode::G_LOAD, SrcReg, MRI); 3227 bool IsGPR = 3228 RBI.getRegBank(SrcReg, MRI, TRI)->getID() == AArch64::GPRRegBankID; 3229 if (LoadMI && IsGPR) { 3230 const MachineMemOperand *MemOp = *LoadMI->memoperands_begin(); 3231 unsigned BytesLoaded = MemOp->getSize(); 3232 if (BytesLoaded < 4 && SrcTy.getSizeInBytes() == BytesLoaded) 3233 return selectCopy(I, TII, MRI, TRI, RBI); 3234 } 3235 3236 // For the 32-bit -> 64-bit case, we can emit a mov (ORRWrs) 3237 // + SUBREG_TO_REG. 3238 // 3239 // If we are zero extending from 32 bits to 64 bits, it's possible that 3240 // the instruction implicitly does the zero extend for us. In that case, 3241 // we only need the SUBREG_TO_REG. 3242 if (IsGPR && SrcSize == 32 && DstSize == 64) { 3243 // Unlike with the G_LOAD case, we don't want to look through copies 3244 // here. (See isDef32.) 3245 MachineInstr *Def = MRI.getVRegDef(SrcReg); 3246 Register SubregToRegSrc = SrcReg; 3247 3248 // Does the instruction implicitly zero extend? 3249 if (!Def || !isDef32(*Def)) { 3250 // No. Zero out using an OR. 3251 Register OrDst = MRI.createVirtualRegister(&AArch64::GPR32RegClass); 3252 const Register ZReg = AArch64::WZR; 3253 MIB.buildInstr(AArch64::ORRWrs, {OrDst}, {ZReg, SrcReg}).addImm(0); 3254 SubregToRegSrc = OrDst; 3255 } 3256 3257 MIB.buildInstr(AArch64::SUBREG_TO_REG, {DefReg}, {}) 3258 .addImm(0) 3259 .addUse(SubregToRegSrc) 3260 .addImm(AArch64::sub_32); 3261 3262 if (!RBI.constrainGenericRegister(DefReg, AArch64::GPR64RegClass, 3263 MRI)) { 3264 LLVM_DEBUG(dbgs() << "Failed to constrain G_ZEXT destination\n"); 3265 return false; 3266 } 3267 3268 if (!RBI.constrainGenericRegister(SrcReg, AArch64::GPR32RegClass, 3269 MRI)) { 3270 LLVM_DEBUG(dbgs() << "Failed to constrain G_ZEXT source\n"); 3271 return false; 3272 } 3273 3274 I.eraseFromParent(); 3275 return true; 3276 } 3277 } 3278 3279 if (DstSize == 64) { 3280 if (Opcode != TargetOpcode::G_SEXT_INREG) { 3281 // FIXME: Can we avoid manually doing this? 3282 if (!RBI.constrainGenericRegister(SrcReg, AArch64::GPR32RegClass, 3283 MRI)) { 3284 LLVM_DEBUG(dbgs() << "Failed to constrain " << TII.getName(Opcode) 3285 << " operand\n"); 3286 return false; 3287 } 3288 SrcReg = MIB.buildInstr(AArch64::SUBREG_TO_REG, 3289 {&AArch64::GPR64RegClass}, {}) 3290 .addImm(0) 3291 .addUse(SrcReg) 3292 .addImm(AArch64::sub_32) 3293 .getReg(0); 3294 } 3295 3296 ExtI = MIB.buildInstr(IsSigned ? AArch64::SBFMXri : AArch64::UBFMXri, 3297 {DefReg}, {SrcReg}) 3298 .addImm(0) 3299 .addImm(SrcSize - 1); 3300 } else if (DstSize <= 32) { 3301 ExtI = MIB.buildInstr(IsSigned ? AArch64::SBFMWri : AArch64::UBFMWri, 3302 {DefReg}, {SrcReg}) 3303 .addImm(0) 3304 .addImm(SrcSize - 1); 3305 } else { 3306 return false; 3307 } 3308 3309 constrainSelectedInstRegOperands(*ExtI, TII, TRI, RBI); 3310 I.eraseFromParent(); 3311 return true; 3312 } 3313 3314 case TargetOpcode::G_SITOFP: 3315 case TargetOpcode::G_UITOFP: 3316 case TargetOpcode::G_FPTOSI: 3317 case TargetOpcode::G_FPTOUI: { 3318 const LLT DstTy = MRI.getType(I.getOperand(0).getReg()), 3319 SrcTy = MRI.getType(I.getOperand(1).getReg()); 3320 const unsigned NewOpc = selectFPConvOpc(Opcode, DstTy, SrcTy); 3321 if (NewOpc == Opcode) 3322 return false; 3323 3324 I.setDesc(TII.get(NewOpc)); 3325 constrainSelectedInstRegOperands(I, TII, TRI, RBI); 3326 I.setFlags(MachineInstr::NoFPExcept); 3327 3328 return true; 3329 } 3330 3331 case TargetOpcode::G_FREEZE: 3332 return selectCopy(I, TII, MRI, TRI, RBI); 3333 3334 case TargetOpcode::G_INTTOPTR: 3335 // The importer is currently unable to import pointer types since they 3336 // didn't exist in SelectionDAG. 3337 return selectCopy(I, TII, MRI, TRI, RBI); 3338 3339 case TargetOpcode::G_BITCAST: 3340 // Imported SelectionDAG rules can handle every bitcast except those that 3341 // bitcast from a type to the same type. Ideally, these shouldn't occur 3342 // but we might not run an optimizer that deletes them. The other exception 3343 // is bitcasts involving pointer types, as SelectionDAG has no knowledge 3344 // of them. 3345 return selectCopy(I, TII, MRI, TRI, RBI); 3346 3347 case TargetOpcode::G_SELECT: { 3348 auto &Sel = cast<GSelect>(I); 3349 if (MRI.getType(Sel.getCondReg()) != LLT::scalar(1)) { 3350 LLVM_DEBUG(dbgs() << "G_SELECT cond has type: " << Ty 3351 << ", expected: " << LLT::scalar(1) << '\n'); 3352 return false; 3353 } 3354 3355 const Register CondReg = Sel.getCondReg(); 3356 const Register TReg = Sel.getTrueReg(); 3357 const Register FReg = Sel.getFalseReg(); 3358 3359 if (tryOptSelect(Sel)) 3360 return true; 3361 3362 // Make sure to use an unused vreg instead of wzr, so that the peephole 3363 // optimizations will be able to optimize these. 3364 Register DeadVReg = MRI.createVirtualRegister(&AArch64::GPR32RegClass); 3365 auto TstMI = MIB.buildInstr(AArch64::ANDSWri, {DeadVReg}, {CondReg}) 3366 .addImm(AArch64_AM::encodeLogicalImmediate(1, 32)); 3367 constrainSelectedInstRegOperands(*TstMI, TII, TRI, RBI); 3368 if (!emitSelect(Sel.getReg(0), TReg, FReg, AArch64CC::NE, MIB)) 3369 return false; 3370 Sel.eraseFromParent(); 3371 return true; 3372 } 3373 case TargetOpcode::G_ICMP: { 3374 if (Ty.isVector()) 3375 return selectVectorICmp(I, MRI); 3376 3377 if (Ty != LLT::scalar(32)) { 3378 LLVM_DEBUG(dbgs() << "G_ICMP result has type: " << Ty 3379 << ", expected: " << LLT::scalar(32) << '\n'); 3380 return false; 3381 } 3382 3383 auto Pred = static_cast<CmpInst::Predicate>(I.getOperand(1).getPredicate()); 3384 const AArch64CC::CondCode InvCC = 3385 changeICMPPredToAArch64CC(CmpInst::getInversePredicate(Pred)); 3386 emitIntegerCompare(I.getOperand(2), I.getOperand(3), I.getOperand(1), MIB); 3387 emitCSINC(/*Dst=*/I.getOperand(0).getReg(), /*Src1=*/AArch64::WZR, 3388 /*Src2=*/AArch64::WZR, InvCC, MIB); 3389 I.eraseFromParent(); 3390 return true; 3391 } 3392 3393 case TargetOpcode::G_FCMP: { 3394 CmpInst::Predicate Pred = 3395 static_cast<CmpInst::Predicate>(I.getOperand(1).getPredicate()); 3396 if (!emitFPCompare(I.getOperand(2).getReg(), I.getOperand(3).getReg(), MIB, 3397 Pred) || 3398 !emitCSetForFCmp(I.getOperand(0).getReg(), Pred, MIB)) 3399 return false; 3400 I.eraseFromParent(); 3401 return true; 3402 } 3403 case TargetOpcode::G_VASTART: 3404 return STI.isTargetDarwin() ? selectVaStartDarwin(I, MF, MRI) 3405 : selectVaStartAAPCS(I, MF, MRI); 3406 case TargetOpcode::G_INTRINSIC: 3407 return selectIntrinsic(I, MRI); 3408 case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS: 3409 return selectIntrinsicWithSideEffects(I, MRI); 3410 case TargetOpcode::G_IMPLICIT_DEF: { 3411 I.setDesc(TII.get(TargetOpcode::IMPLICIT_DEF)); 3412 const LLT DstTy = MRI.getType(I.getOperand(0).getReg()); 3413 const Register DstReg = I.getOperand(0).getReg(); 3414 const RegisterBank &DstRB = *RBI.getRegBank(DstReg, MRI, TRI); 3415 const TargetRegisterClass *DstRC = getRegClassForTypeOnBank(DstTy, DstRB); 3416 RBI.constrainGenericRegister(DstReg, *DstRC, MRI); 3417 return true; 3418 } 3419 case TargetOpcode::G_BLOCK_ADDR: { 3420 if (TM.getCodeModel() == CodeModel::Large) { 3421 materializeLargeCMVal(I, I.getOperand(1).getBlockAddress(), 0); 3422 I.eraseFromParent(); 3423 return true; 3424 } else { 3425 I.setDesc(TII.get(AArch64::MOVaddrBA)); 3426 auto MovMI = BuildMI(MBB, I, I.getDebugLoc(), TII.get(AArch64::MOVaddrBA), 3427 I.getOperand(0).getReg()) 3428 .addBlockAddress(I.getOperand(1).getBlockAddress(), 3429 /* Offset */ 0, AArch64II::MO_PAGE) 3430 .addBlockAddress( 3431 I.getOperand(1).getBlockAddress(), /* Offset */ 0, 3432 AArch64II::MO_NC | AArch64II::MO_PAGEOFF); 3433 I.eraseFromParent(); 3434 return constrainSelectedInstRegOperands(*MovMI, TII, TRI, RBI); 3435 } 3436 } 3437 case AArch64::G_DUP: { 3438 // When the scalar of G_DUP is an s8/s16 gpr, they can't be selected by 3439 // imported patterns. Do it manually here. Avoiding generating s16 gpr is 3440 // difficult because at RBS we may end up pessimizing the fpr case if we 3441 // decided to add an anyextend to fix this. Manual selection is the most 3442 // robust solution for now. 3443 if (RBI.getRegBank(I.getOperand(1).getReg(), MRI, TRI)->getID() != 3444 AArch64::GPRRegBankID) 3445 return false; // We expect the fpr regbank case to be imported. 3446 LLT VecTy = MRI.getType(I.getOperand(0).getReg()); 3447 if (VecTy == LLT::fixed_vector(8, 8)) 3448 I.setDesc(TII.get(AArch64::DUPv8i8gpr)); 3449 else if (VecTy == LLT::fixed_vector(16, 8)) 3450 I.setDesc(TII.get(AArch64::DUPv16i8gpr)); 3451 else if (VecTy == LLT::fixed_vector(4, 16)) 3452 I.setDesc(TII.get(AArch64::DUPv4i16gpr)); 3453 else if (VecTy == LLT::fixed_vector(8, 16)) 3454 I.setDesc(TII.get(AArch64::DUPv8i16gpr)); 3455 else 3456 return false; 3457 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 3458 } 3459 case TargetOpcode::G_INTRINSIC_TRUNC: 3460 return selectIntrinsicTrunc(I, MRI); 3461 case TargetOpcode::G_INTRINSIC_ROUND: 3462 return selectIntrinsicRound(I, MRI); 3463 case TargetOpcode::G_BUILD_VECTOR: 3464 return selectBuildVector(I, MRI); 3465 case TargetOpcode::G_MERGE_VALUES: 3466 return selectMergeValues(I, MRI); 3467 case TargetOpcode::G_UNMERGE_VALUES: 3468 return selectUnmergeValues(I, MRI); 3469 case TargetOpcode::G_SHUFFLE_VECTOR: 3470 return selectShuffleVector(I, MRI); 3471 case TargetOpcode::G_EXTRACT_VECTOR_ELT: 3472 return selectExtractElt(I, MRI); 3473 case TargetOpcode::G_INSERT_VECTOR_ELT: 3474 return selectInsertElt(I, MRI); 3475 case TargetOpcode::G_CONCAT_VECTORS: 3476 return selectConcatVectors(I, MRI); 3477 case TargetOpcode::G_JUMP_TABLE: 3478 return selectJumpTable(I, MRI); 3479 case TargetOpcode::G_VECREDUCE_FADD: 3480 case TargetOpcode::G_VECREDUCE_ADD: 3481 return selectReduction(I, MRI); 3482 case TargetOpcode::G_MEMCPY: 3483 case TargetOpcode::G_MEMCPY_INLINE: 3484 case TargetOpcode::G_MEMMOVE: 3485 case TargetOpcode::G_MEMSET: 3486 assert(STI.hasMOPS() && "Shouldn't get here without +mops feature"); 3487 return selectMOPS(I, MRI); 3488 } 3489 3490 return false; 3491 } 3492 3493 bool AArch64InstructionSelector::selectReduction(MachineInstr &I, 3494 MachineRegisterInfo &MRI) { 3495 Register VecReg = I.getOperand(1).getReg(); 3496 LLT VecTy = MRI.getType(VecReg); 3497 if (I.getOpcode() == TargetOpcode::G_VECREDUCE_ADD) { 3498 // For <2 x i32> ADDPv2i32 generates an FPR64 value, so we need to emit 3499 // a subregister copy afterwards. 3500 if (VecTy == LLT::fixed_vector(2, 32)) { 3501 Register DstReg = I.getOperand(0).getReg(); 3502 auto AddP = MIB.buildInstr(AArch64::ADDPv2i32, {&AArch64::FPR64RegClass}, 3503 {VecReg, VecReg}); 3504 auto Copy = MIB.buildInstr(TargetOpcode::COPY, {DstReg}, {}) 3505 .addReg(AddP.getReg(0), 0, AArch64::ssub) 3506 .getReg(0); 3507 RBI.constrainGenericRegister(Copy, AArch64::FPR32RegClass, MRI); 3508 I.eraseFromParent(); 3509 return constrainSelectedInstRegOperands(*AddP, TII, TRI, RBI); 3510 } 3511 3512 unsigned Opc = 0; 3513 if (VecTy == LLT::fixed_vector(16, 8)) 3514 Opc = AArch64::ADDVv16i8v; 3515 else if (VecTy == LLT::fixed_vector(8, 16)) 3516 Opc = AArch64::ADDVv8i16v; 3517 else if (VecTy == LLT::fixed_vector(4, 32)) 3518 Opc = AArch64::ADDVv4i32v; 3519 else if (VecTy == LLT::fixed_vector(2, 64)) 3520 Opc = AArch64::ADDPv2i64p; 3521 else { 3522 LLVM_DEBUG(dbgs() << "Unhandled type for add reduction"); 3523 return false; 3524 } 3525 I.setDesc(TII.get(Opc)); 3526 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 3527 } 3528 3529 if (I.getOpcode() == TargetOpcode::G_VECREDUCE_FADD) { 3530 unsigned Opc = 0; 3531 if (VecTy == LLT::fixed_vector(2, 32)) 3532 Opc = AArch64::FADDPv2i32p; 3533 else if (VecTy == LLT::fixed_vector(2, 64)) 3534 Opc = AArch64::FADDPv2i64p; 3535 else { 3536 LLVM_DEBUG(dbgs() << "Unhandled type for fadd reduction"); 3537 return false; 3538 } 3539 I.setDesc(TII.get(Opc)); 3540 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 3541 } 3542 return false; 3543 } 3544 3545 bool AArch64InstructionSelector::selectMOPS(MachineInstr &GI, 3546 MachineRegisterInfo &MRI) { 3547 unsigned Mopcode; 3548 switch (GI.getOpcode()) { 3549 case TargetOpcode::G_MEMCPY: 3550 case TargetOpcode::G_MEMCPY_INLINE: 3551 Mopcode = AArch64::MOPSMemoryCopyPseudo; 3552 break; 3553 case TargetOpcode::G_MEMMOVE: 3554 Mopcode = AArch64::MOPSMemoryMovePseudo; 3555 break; 3556 case TargetOpcode::G_MEMSET: 3557 // For tagged memset see llvm.aarch64.mops.memset.tag 3558 Mopcode = AArch64::MOPSMemorySetPseudo; 3559 break; 3560 } 3561 3562 auto &DstPtr = GI.getOperand(0); 3563 auto &SrcOrVal = GI.getOperand(1); 3564 auto &Size = GI.getOperand(2); 3565 3566 // Create copies of the registers that can be clobbered. 3567 const Register DstPtrCopy = MRI.cloneVirtualRegister(DstPtr.getReg()); 3568 const Register SrcValCopy = MRI.cloneVirtualRegister(SrcOrVal.getReg()); 3569 const Register SizeCopy = MRI.cloneVirtualRegister(Size.getReg()); 3570 3571 const bool IsSet = Mopcode == AArch64::MOPSMemorySetPseudo; 3572 const auto &SrcValRegClass = 3573 IsSet ? AArch64::GPR64RegClass : AArch64::GPR64commonRegClass; 3574 3575 // Constrain to specific registers 3576 RBI.constrainGenericRegister(DstPtrCopy, AArch64::GPR64commonRegClass, MRI); 3577 RBI.constrainGenericRegister(SrcValCopy, SrcValRegClass, MRI); 3578 RBI.constrainGenericRegister(SizeCopy, AArch64::GPR64RegClass, MRI); 3579 3580 MIB.buildCopy(DstPtrCopy, DstPtr); 3581 MIB.buildCopy(SrcValCopy, SrcOrVal); 3582 MIB.buildCopy(SizeCopy, Size); 3583 3584 // New instruction uses the copied registers because it must update them. 3585 // The defs are not used since they don't exist in G_MEM*. They are still 3586 // tied. 3587 // Note: order of operands is different from G_MEMSET, G_MEMCPY, G_MEMMOVE 3588 Register DefDstPtr = MRI.createVirtualRegister(&AArch64::GPR64commonRegClass); 3589 Register DefSize = MRI.createVirtualRegister(&AArch64::GPR64RegClass); 3590 if (IsSet) { 3591 MIB.buildInstr(Mopcode, {DefDstPtr, DefSize}, 3592 {DstPtrCopy, SizeCopy, SrcValCopy}); 3593 } else { 3594 Register DefSrcPtr = MRI.createVirtualRegister(&SrcValRegClass); 3595 MIB.buildInstr(Mopcode, {DefDstPtr, DefSrcPtr, DefSize}, 3596 {DstPtrCopy, SrcValCopy, SizeCopy}); 3597 } 3598 3599 GI.eraseFromParent(); 3600 return true; 3601 } 3602 3603 bool AArch64InstructionSelector::selectBrJT(MachineInstr &I, 3604 MachineRegisterInfo &MRI) { 3605 assert(I.getOpcode() == TargetOpcode::G_BRJT && "Expected G_BRJT"); 3606 Register JTAddr = I.getOperand(0).getReg(); 3607 unsigned JTI = I.getOperand(1).getIndex(); 3608 Register Index = I.getOperand(2).getReg(); 3609 3610 Register TargetReg = MRI.createVirtualRegister(&AArch64::GPR64RegClass); 3611 Register ScratchReg = MRI.createVirtualRegister(&AArch64::GPR64spRegClass); 3612 3613 MF->getInfo<AArch64FunctionInfo>()->setJumpTableEntryInfo(JTI, 4, nullptr); 3614 auto JumpTableInst = MIB.buildInstr(AArch64::JumpTableDest32, 3615 {TargetReg, ScratchReg}, {JTAddr, Index}) 3616 .addJumpTableIndex(JTI); 3617 // Build the indirect branch. 3618 MIB.buildInstr(AArch64::BR, {}, {TargetReg}); 3619 I.eraseFromParent(); 3620 return constrainSelectedInstRegOperands(*JumpTableInst, TII, TRI, RBI); 3621 } 3622 3623 bool AArch64InstructionSelector::selectJumpTable(MachineInstr &I, 3624 MachineRegisterInfo &MRI) { 3625 assert(I.getOpcode() == TargetOpcode::G_JUMP_TABLE && "Expected jump table"); 3626 assert(I.getOperand(1).isJTI() && "Jump table op should have a JTI!"); 3627 3628 Register DstReg = I.getOperand(0).getReg(); 3629 unsigned JTI = I.getOperand(1).getIndex(); 3630 // We generate a MOVaddrJT which will get expanded to an ADRP + ADD later. 3631 auto MovMI = 3632 MIB.buildInstr(AArch64::MOVaddrJT, {DstReg}, {}) 3633 .addJumpTableIndex(JTI, AArch64II::MO_PAGE) 3634 .addJumpTableIndex(JTI, AArch64II::MO_NC | AArch64II::MO_PAGEOFF); 3635 I.eraseFromParent(); 3636 return constrainSelectedInstRegOperands(*MovMI, TII, TRI, RBI); 3637 } 3638 3639 bool AArch64InstructionSelector::selectTLSGlobalValue( 3640 MachineInstr &I, MachineRegisterInfo &MRI) { 3641 if (!STI.isTargetMachO()) 3642 return false; 3643 MachineFunction &MF = *I.getParent()->getParent(); 3644 MF.getFrameInfo().setAdjustsStack(true); 3645 3646 const auto &GlobalOp = I.getOperand(1); 3647 assert(GlobalOp.getOffset() == 0 && 3648 "Shouldn't have an offset on TLS globals!"); 3649 const GlobalValue &GV = *GlobalOp.getGlobal(); 3650 3651 auto LoadGOT = 3652 MIB.buildInstr(AArch64::LOADgot, {&AArch64::GPR64commonRegClass}, {}) 3653 .addGlobalAddress(&GV, 0, AArch64II::MO_TLS); 3654 3655 auto Load = MIB.buildInstr(AArch64::LDRXui, {&AArch64::GPR64commonRegClass}, 3656 {LoadGOT.getReg(0)}) 3657 .addImm(0); 3658 3659 MIB.buildCopy(Register(AArch64::X0), LoadGOT.getReg(0)); 3660 // TLS calls preserve all registers except those that absolutely must be 3661 // trashed: X0 (it takes an argument), LR (it's a call) and NZCV (let's not be 3662 // silly). 3663 MIB.buildInstr(getBLRCallOpcode(MF), {}, {Load}) 3664 .addUse(AArch64::X0, RegState::Implicit) 3665 .addDef(AArch64::X0, RegState::Implicit) 3666 .addRegMask(TRI.getTLSCallPreservedMask()); 3667 3668 MIB.buildCopy(I.getOperand(0).getReg(), Register(AArch64::X0)); 3669 RBI.constrainGenericRegister(I.getOperand(0).getReg(), AArch64::GPR64RegClass, 3670 MRI); 3671 I.eraseFromParent(); 3672 return true; 3673 } 3674 3675 bool AArch64InstructionSelector::selectIntrinsicTrunc( 3676 MachineInstr &I, MachineRegisterInfo &MRI) const { 3677 const LLT SrcTy = MRI.getType(I.getOperand(0).getReg()); 3678 3679 // Select the correct opcode. 3680 unsigned Opc = 0; 3681 if (!SrcTy.isVector()) { 3682 switch (SrcTy.getSizeInBits()) { 3683 default: 3684 case 16: 3685 Opc = AArch64::FRINTZHr; 3686 break; 3687 case 32: 3688 Opc = AArch64::FRINTZSr; 3689 break; 3690 case 64: 3691 Opc = AArch64::FRINTZDr; 3692 break; 3693 } 3694 } else { 3695 unsigned NumElts = SrcTy.getNumElements(); 3696 switch (SrcTy.getElementType().getSizeInBits()) { 3697 default: 3698 break; 3699 case 16: 3700 if (NumElts == 4) 3701 Opc = AArch64::FRINTZv4f16; 3702 else if (NumElts == 8) 3703 Opc = AArch64::FRINTZv8f16; 3704 break; 3705 case 32: 3706 if (NumElts == 2) 3707 Opc = AArch64::FRINTZv2f32; 3708 else if (NumElts == 4) 3709 Opc = AArch64::FRINTZv4f32; 3710 break; 3711 case 64: 3712 if (NumElts == 2) 3713 Opc = AArch64::FRINTZv2f64; 3714 break; 3715 } 3716 } 3717 3718 if (!Opc) { 3719 // Didn't get an opcode above, bail. 3720 LLVM_DEBUG(dbgs() << "Unsupported type for G_INTRINSIC_TRUNC!\n"); 3721 return false; 3722 } 3723 3724 // Legalization would have set us up perfectly for this; we just need to 3725 // set the opcode and move on. 3726 I.setDesc(TII.get(Opc)); 3727 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 3728 } 3729 3730 bool AArch64InstructionSelector::selectIntrinsicRound( 3731 MachineInstr &I, MachineRegisterInfo &MRI) const { 3732 const LLT SrcTy = MRI.getType(I.getOperand(0).getReg()); 3733 3734 // Select the correct opcode. 3735 unsigned Opc = 0; 3736 if (!SrcTy.isVector()) { 3737 switch (SrcTy.getSizeInBits()) { 3738 default: 3739 case 16: 3740 Opc = AArch64::FRINTAHr; 3741 break; 3742 case 32: 3743 Opc = AArch64::FRINTASr; 3744 break; 3745 case 64: 3746 Opc = AArch64::FRINTADr; 3747 break; 3748 } 3749 } else { 3750 unsigned NumElts = SrcTy.getNumElements(); 3751 switch (SrcTy.getElementType().getSizeInBits()) { 3752 default: 3753 break; 3754 case 16: 3755 if (NumElts == 4) 3756 Opc = AArch64::FRINTAv4f16; 3757 else if (NumElts == 8) 3758 Opc = AArch64::FRINTAv8f16; 3759 break; 3760 case 32: 3761 if (NumElts == 2) 3762 Opc = AArch64::FRINTAv2f32; 3763 else if (NumElts == 4) 3764 Opc = AArch64::FRINTAv4f32; 3765 break; 3766 case 64: 3767 if (NumElts == 2) 3768 Opc = AArch64::FRINTAv2f64; 3769 break; 3770 } 3771 } 3772 3773 if (!Opc) { 3774 // Didn't get an opcode above, bail. 3775 LLVM_DEBUG(dbgs() << "Unsupported type for G_INTRINSIC_ROUND!\n"); 3776 return false; 3777 } 3778 3779 // Legalization would have set us up perfectly for this; we just need to 3780 // set the opcode and move on. 3781 I.setDesc(TII.get(Opc)); 3782 return constrainSelectedInstRegOperands(I, TII, TRI, RBI); 3783 } 3784 3785 bool AArch64InstructionSelector::selectVectorICmp( 3786 MachineInstr &I, MachineRegisterInfo &MRI) { 3787 Register DstReg = I.getOperand(0).getReg(); 3788 LLT DstTy = MRI.getType(DstReg); 3789 Register SrcReg = I.getOperand(2).getReg(); 3790 Register Src2Reg = I.getOperand(3).getReg(); 3791 LLT SrcTy = MRI.getType(SrcReg); 3792 3793 unsigned SrcEltSize = SrcTy.getElementType().getSizeInBits(); 3794 unsigned NumElts = DstTy.getNumElements(); 3795 3796 // First index is element size, 0 == 8b, 1 == 16b, 2 == 32b, 3 == 64b 3797 // Second index is num elts, 0 == v2, 1 == v4, 2 == v8, 3 == v16 3798 // Third index is cc opcode: 3799 // 0 == eq 3800 // 1 == ugt 3801 // 2 == uge 3802 // 3 == ult 3803 // 4 == ule 3804 // 5 == sgt 3805 // 6 == sge 3806 // 7 == slt 3807 // 8 == sle 3808 // ne is done by negating 'eq' result. 3809 3810 // This table below assumes that for some comparisons the operands will be 3811 // commuted. 3812 // ult op == commute + ugt op 3813 // ule op == commute + uge op 3814 // slt op == commute + sgt op 3815 // sle op == commute + sge op 3816 unsigned PredIdx = 0; 3817 bool SwapOperands = false; 3818 CmpInst::Predicate Pred = (CmpInst::Predicate)I.getOperand(1).getPredicate(); 3819 switch (Pred) { 3820 case CmpInst::ICMP_NE: 3821 case CmpInst::ICMP_EQ: 3822 PredIdx = 0; 3823 break; 3824 case CmpInst::ICMP_UGT: 3825 PredIdx = 1; 3826 break; 3827 case CmpInst::ICMP_UGE: 3828 PredIdx = 2; 3829 break; 3830 case CmpInst::ICMP_ULT: 3831 PredIdx = 3; 3832 SwapOperands = true; 3833 break; 3834 case CmpInst::ICMP_ULE: 3835 PredIdx = 4; 3836 SwapOperands = true; 3837 break; 3838 case CmpInst::ICMP_SGT: 3839 PredIdx = 5; 3840 break; 3841 case CmpInst::ICMP_SGE: 3842 PredIdx = 6; 3843 break; 3844 case CmpInst::ICMP_SLT: 3845 PredIdx = 7; 3846 SwapOperands = true; 3847 break; 3848 case CmpInst::ICMP_SLE: 3849 PredIdx = 8; 3850 SwapOperands = true; 3851 break; 3852 default: 3853 llvm_unreachable("Unhandled icmp predicate"); 3854 return false; 3855 } 3856 3857 // This table obviously should be tablegen'd when we have our GISel native 3858 // tablegen selector. 3859 3860 static const unsigned OpcTable[4][4][9] = { 3861 { 3862 {0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3863 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3864 0 /* invalid */}, 3865 {0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3866 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3867 0 /* invalid */}, 3868 {AArch64::CMEQv8i8, AArch64::CMHIv8i8, AArch64::CMHSv8i8, 3869 AArch64::CMHIv8i8, AArch64::CMHSv8i8, AArch64::CMGTv8i8, 3870 AArch64::CMGEv8i8, AArch64::CMGTv8i8, AArch64::CMGEv8i8}, 3871 {AArch64::CMEQv16i8, AArch64::CMHIv16i8, AArch64::CMHSv16i8, 3872 AArch64::CMHIv16i8, AArch64::CMHSv16i8, AArch64::CMGTv16i8, 3873 AArch64::CMGEv16i8, AArch64::CMGTv16i8, AArch64::CMGEv16i8} 3874 }, 3875 { 3876 {0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3877 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3878 0 /* invalid */}, 3879 {AArch64::CMEQv4i16, AArch64::CMHIv4i16, AArch64::CMHSv4i16, 3880 AArch64::CMHIv4i16, AArch64::CMHSv4i16, AArch64::CMGTv4i16, 3881 AArch64::CMGEv4i16, AArch64::CMGTv4i16, AArch64::CMGEv4i16}, 3882 {AArch64::CMEQv8i16, AArch64::CMHIv8i16, AArch64::CMHSv8i16, 3883 AArch64::CMHIv8i16, AArch64::CMHSv8i16, AArch64::CMGTv8i16, 3884 AArch64::CMGEv8i16, AArch64::CMGTv8i16, AArch64::CMGEv8i16}, 3885 {0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3886 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3887 0 /* invalid */} 3888 }, 3889 { 3890 {AArch64::CMEQv2i32, AArch64::CMHIv2i32, AArch64::CMHSv2i32, 3891 AArch64::CMHIv2i32, AArch64::CMHSv2i32, AArch64::CMGTv2i32, 3892 AArch64::CMGEv2i32, AArch64::CMGTv2i32, AArch64::CMGEv2i32}, 3893 {AArch64::CMEQv4i32, AArch64::CMHIv4i32, AArch64::CMHSv4i32, 3894 AArch64::CMHIv4i32, AArch64::CMHSv4i32, AArch64::CMGTv4i32, 3895 AArch64::CMGEv4i32, AArch64::CMGTv4i32, AArch64::CMGEv4i32}, 3896 {0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3897 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3898 0 /* invalid */}, 3899 {0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3900 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3901 0 /* invalid */} 3902 }, 3903 { 3904 {AArch64::CMEQv2i64, AArch64::CMHIv2i64, AArch64::CMHSv2i64, 3905 AArch64::CMHIv2i64, AArch64::CMHSv2i64, AArch64::CMGTv2i64, 3906 AArch64::CMGEv2i64, AArch64::CMGTv2i64, AArch64::CMGEv2i64}, 3907 {0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3908 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3909 0 /* invalid */}, 3910 {0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3911 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3912 0 /* invalid */}, 3913 {0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3914 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 0 /* invalid */, 3915 0 /* invalid */} 3916 }, 3917 }; 3918 unsigned EltIdx = Log2_32(SrcEltSize / 8); 3919 unsigned NumEltsIdx = Log2_32(NumElts / 2); 3920 unsigned Opc = OpcTable[EltIdx][NumEltsIdx][PredIdx]; 3921 if (!Opc) { 3922 LLVM_DEBUG(dbgs() << "Could not map G_ICMP to cmp opcode"); 3923 return false; 3924 } 3925 3926 const RegisterBank &VecRB = *RBI.getRegBank(SrcReg, MRI, TRI); 3927 const TargetRegisterClass *SrcRC = 3928 getRegClassForTypeOnBank(SrcTy, VecRB, true); 3929 if (!SrcRC) { 3930 LLVM_DEBUG(dbgs() << "Could not determine source register class.\n"); 3931 return false; 3932 } 3933 3934 unsigned NotOpc = Pred == ICmpInst::ICMP_NE ? AArch64::NOTv8i8 : 0; 3935 if (SrcTy.getSizeInBits() == 128) 3936 NotOpc = NotOpc ? AArch64::NOTv16i8 : 0; 3937 3938 if (SwapOperands) 3939 std::swap(SrcReg, Src2Reg); 3940 3941 auto Cmp = MIB.buildInstr(Opc, {SrcRC}, {SrcReg, Src2Reg}); 3942 constrainSelectedInstRegOperands(*Cmp, TII, TRI, RBI); 3943 3944 // Invert if we had a 'ne' cc. 3945 if (NotOpc) { 3946 Cmp = MIB.buildInstr(NotOpc, {DstReg}, {Cmp}); 3947 constrainSelectedInstRegOperands(*Cmp, TII, TRI, RBI); 3948 } else { 3949 MIB.buildCopy(DstReg, Cmp.getReg(0)); 3950 } 3951 RBI.constrainGenericRegister(DstReg, *SrcRC, MRI); 3952 I.eraseFromParent(); 3953 return true; 3954 } 3955 3956 MachineInstr *AArch64InstructionSelector::emitScalarToVector( 3957 unsigned EltSize, const TargetRegisterClass *DstRC, Register Scalar, 3958 MachineIRBuilder &MIRBuilder) const { 3959 auto Undef = MIRBuilder.buildInstr(TargetOpcode::IMPLICIT_DEF, {DstRC}, {}); 3960 3961 auto BuildFn = [&](unsigned SubregIndex) { 3962 auto Ins = 3963 MIRBuilder 3964 .buildInstr(TargetOpcode::INSERT_SUBREG, {DstRC}, {Undef, Scalar}) 3965 .addImm(SubregIndex); 3966 constrainSelectedInstRegOperands(*Undef, TII, TRI, RBI); 3967 constrainSelectedInstRegOperands(*Ins, TII, TRI, RBI); 3968 return &*Ins; 3969 }; 3970 3971 switch (EltSize) { 3972 case 16: 3973 return BuildFn(AArch64::hsub); 3974 case 32: 3975 return BuildFn(AArch64::ssub); 3976 case 64: 3977 return BuildFn(AArch64::dsub); 3978 default: 3979 return nullptr; 3980 } 3981 } 3982 3983 bool AArch64InstructionSelector::selectMergeValues( 3984 MachineInstr &I, MachineRegisterInfo &MRI) { 3985 assert(I.getOpcode() == TargetOpcode::G_MERGE_VALUES && "unexpected opcode"); 3986 const LLT DstTy = MRI.getType(I.getOperand(0).getReg()); 3987 const LLT SrcTy = MRI.getType(I.getOperand(1).getReg()); 3988 assert(!DstTy.isVector() && !SrcTy.isVector() && "invalid merge operation"); 3989 const RegisterBank &RB = *RBI.getRegBank(I.getOperand(1).getReg(), MRI, TRI); 3990 3991 if (I.getNumOperands() != 3) 3992 return false; 3993 3994 // Merging 2 s64s into an s128. 3995 if (DstTy == LLT::scalar(128)) { 3996 if (SrcTy.getSizeInBits() != 64) 3997 return false; 3998 Register DstReg = I.getOperand(0).getReg(); 3999 Register Src1Reg = I.getOperand(1).getReg(); 4000 Register Src2Reg = I.getOperand(2).getReg(); 4001 auto Tmp = MIB.buildInstr(TargetOpcode::IMPLICIT_DEF, {DstTy}, {}); 4002 MachineInstr *InsMI = 4003 emitLaneInsert(None, Tmp.getReg(0), Src1Reg, /* LaneIdx */ 0, RB, MIB); 4004 if (!InsMI) 4005 return false; 4006 MachineInstr *Ins2MI = emitLaneInsert(DstReg, InsMI->getOperand(0).getReg(), 4007 Src2Reg, /* LaneIdx */ 1, RB, MIB); 4008 if (!Ins2MI) 4009 return false; 4010 constrainSelectedInstRegOperands(*InsMI, TII, TRI, RBI); 4011 constrainSelectedInstRegOperands(*Ins2MI, TII, TRI, RBI); 4012 I.eraseFromParent(); 4013 return true; 4014 } 4015 4016 if (RB.getID() != AArch64::GPRRegBankID) 4017 return false; 4018 4019 if (DstTy.getSizeInBits() != 64 || SrcTy.getSizeInBits() != 32) 4020 return false; 4021 4022 auto *DstRC = &AArch64::GPR64RegClass; 4023 Register SubToRegDef = MRI.createVirtualRegister(DstRC); 4024 MachineInstr &SubRegMI = *BuildMI(*I.getParent(), I, I.getDebugLoc(), 4025 TII.get(TargetOpcode::SUBREG_TO_REG)) 4026 .addDef(SubToRegDef) 4027 .addImm(0) 4028 .addUse(I.getOperand(1).getReg()) 4029 .addImm(AArch64::sub_32); 4030 Register SubToRegDef2 = MRI.createVirtualRegister(DstRC); 4031 // Need to anyext the second scalar before we can use bfm 4032 MachineInstr &SubRegMI2 = *BuildMI(*I.getParent(), I, I.getDebugLoc(), 4033 TII.get(TargetOpcode::SUBREG_TO_REG)) 4034 .addDef(SubToRegDef2) 4035 .addImm(0) 4036 .addUse(I.getOperand(2).getReg()) 4037 .addImm(AArch64::sub_32); 4038 MachineInstr &BFM = 4039 *BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(AArch64::BFMXri)) 4040 .addDef(I.getOperand(0).getReg()) 4041 .addUse(SubToRegDef) 4042 .addUse(SubToRegDef2) 4043 .addImm(32) 4044 .addImm(31); 4045 constrainSelectedInstRegOperands(SubRegMI, TII, TRI, RBI); 4046 constrainSelectedInstRegOperands(SubRegMI2, TII, TRI, RBI); 4047 constrainSelectedInstRegOperands(BFM, TII, TRI, RBI); 4048 I.eraseFromParent(); 4049 return true; 4050 } 4051 4052 static bool getLaneCopyOpcode(unsigned &CopyOpc, unsigned &ExtractSubReg, 4053 const unsigned EltSize) { 4054 // Choose a lane copy opcode and subregister based off of the size of the 4055 // vector's elements. 4056 switch (EltSize) { 4057 case 8: 4058 CopyOpc = AArch64::DUPi8; 4059 ExtractSubReg = AArch64::bsub; 4060 break; 4061 case 16: 4062 CopyOpc = AArch64::DUPi16; 4063 ExtractSubReg = AArch64::hsub; 4064 break; 4065 case 32: 4066 CopyOpc = AArch64::DUPi32; 4067 ExtractSubReg = AArch64::ssub; 4068 break; 4069 case 64: 4070 CopyOpc = AArch64::DUPi64; 4071 ExtractSubReg = AArch64::dsub; 4072 break; 4073 default: 4074 // Unknown size, bail out. 4075 LLVM_DEBUG(dbgs() << "Elt size '" << EltSize << "' unsupported.\n"); 4076 return false; 4077 } 4078 return true; 4079 } 4080 4081 MachineInstr *AArch64InstructionSelector::emitExtractVectorElt( 4082 Optional<Register> DstReg, const RegisterBank &DstRB, LLT ScalarTy, 4083 Register VecReg, unsigned LaneIdx, MachineIRBuilder &MIRBuilder) const { 4084 MachineRegisterInfo &MRI = *MIRBuilder.getMRI(); 4085 unsigned CopyOpc = 0; 4086 unsigned ExtractSubReg = 0; 4087 if (!getLaneCopyOpcode(CopyOpc, ExtractSubReg, ScalarTy.getSizeInBits())) { 4088 LLVM_DEBUG( 4089 dbgs() << "Couldn't determine lane copy opcode for instruction.\n"); 4090 return nullptr; 4091 } 4092 4093 const TargetRegisterClass *DstRC = 4094 getRegClassForTypeOnBank(ScalarTy, DstRB, true); 4095 if (!DstRC) { 4096 LLVM_DEBUG(dbgs() << "Could not determine destination register class.\n"); 4097 return nullptr; 4098 } 4099 4100 const RegisterBank &VecRB = *RBI.getRegBank(VecReg, MRI, TRI); 4101 const LLT &VecTy = MRI.getType(VecReg); 4102 const TargetRegisterClass *VecRC = 4103 getRegClassForTypeOnBank(VecTy, VecRB, true); 4104 if (!VecRC) { 4105 LLVM_DEBUG(dbgs() << "Could not determine source register class.\n"); 4106 return nullptr; 4107 } 4108 4109 // The register that we're going to copy into. 4110 Register InsertReg = VecReg; 4111 if (!DstReg) 4112 DstReg = MRI.createVirtualRegister(DstRC); 4113 // If the lane index is 0, we just use a subregister COPY. 4114 if (LaneIdx == 0) { 4115 auto Copy = MIRBuilder.buildInstr(TargetOpcode::COPY, {*DstReg}, {}) 4116 .addReg(VecReg, 0, ExtractSubReg); 4117 RBI.constrainGenericRegister(*DstReg, *DstRC, MRI); 4118 return &*Copy; 4119 } 4120 4121 // Lane copies require 128-bit wide registers. If we're dealing with an 4122 // unpacked vector, then we need to move up to that width. Insert an implicit 4123 // def and a subregister insert to get us there. 4124 if (VecTy.getSizeInBits() != 128) { 4125 MachineInstr *ScalarToVector = emitScalarToVector( 4126 VecTy.getSizeInBits(), &AArch64::FPR128RegClass, VecReg, MIRBuilder); 4127 if (!ScalarToVector) 4128 return nullptr; 4129 InsertReg = ScalarToVector->getOperand(0).getReg(); 4130 } 4131 4132 MachineInstr *LaneCopyMI = 4133 MIRBuilder.buildInstr(CopyOpc, {*DstReg}, {InsertReg}).addImm(LaneIdx); 4134 constrainSelectedInstRegOperands(*LaneCopyMI, TII, TRI, RBI); 4135 4136 // Make sure that we actually constrain the initial copy. 4137 RBI.constrainGenericRegister(*DstReg, *DstRC, MRI); 4138 return LaneCopyMI; 4139 } 4140 4141 bool AArch64InstructionSelector::selectExtractElt( 4142 MachineInstr &I, MachineRegisterInfo &MRI) { 4143 assert(I.getOpcode() == TargetOpcode::G_EXTRACT_VECTOR_ELT && 4144 "unexpected opcode!"); 4145 Register DstReg = I.getOperand(0).getReg(); 4146 const LLT NarrowTy = MRI.getType(DstReg); 4147 const Register SrcReg = I.getOperand(1).getReg(); 4148 const LLT WideTy = MRI.getType(SrcReg); 4149 (void)WideTy; 4150 assert(WideTy.getSizeInBits() >= NarrowTy.getSizeInBits() && 4151 "source register size too small!"); 4152 assert(!NarrowTy.isVector() && "cannot extract vector into vector!"); 4153 4154 // Need the lane index to determine the correct copy opcode. 4155 MachineOperand &LaneIdxOp = I.getOperand(2); 4156 assert(LaneIdxOp.isReg() && "Lane index operand was not a register?"); 4157 4158 if (RBI.getRegBank(DstReg, MRI, TRI)->getID() != AArch64::FPRRegBankID) { 4159 LLVM_DEBUG(dbgs() << "Cannot extract into GPR.\n"); 4160 return false; 4161 } 4162 4163 // Find the index to extract from. 4164 auto VRegAndVal = getIConstantVRegValWithLookThrough(LaneIdxOp.getReg(), MRI); 4165 if (!VRegAndVal) 4166 return false; 4167 unsigned LaneIdx = VRegAndVal->Value.getSExtValue(); 4168 4169 4170 const RegisterBank &DstRB = *RBI.getRegBank(DstReg, MRI, TRI); 4171 MachineInstr *Extract = emitExtractVectorElt(DstReg, DstRB, NarrowTy, SrcReg, 4172 LaneIdx, MIB); 4173 if (!Extract) 4174 return false; 4175 4176 I.eraseFromParent(); 4177 return true; 4178 } 4179 4180 bool AArch64InstructionSelector::selectSplitVectorUnmerge( 4181 MachineInstr &I, MachineRegisterInfo &MRI) { 4182 unsigned NumElts = I.getNumOperands() - 1; 4183 Register SrcReg = I.getOperand(NumElts).getReg(); 4184 const LLT NarrowTy = MRI.getType(I.getOperand(0).getReg()); 4185 const LLT SrcTy = MRI.getType(SrcReg); 4186 4187 assert(NarrowTy.isVector() && "Expected an unmerge into vectors"); 4188 if (SrcTy.getSizeInBits() > 128) { 4189 LLVM_DEBUG(dbgs() << "Unexpected vector type for vec split unmerge"); 4190 return false; 4191 } 4192 4193 // We implement a split vector operation by treating the sub-vectors as 4194 // scalars and extracting them. 4195 const RegisterBank &DstRB = 4196 *RBI.getRegBank(I.getOperand(0).getReg(), MRI, TRI); 4197 for (unsigned OpIdx = 0; OpIdx < NumElts; ++OpIdx) { 4198 Register Dst = I.getOperand(OpIdx).getReg(); 4199 MachineInstr *Extract = 4200 emitExtractVectorElt(Dst, DstRB, NarrowTy, SrcReg, OpIdx, MIB); 4201 if (!Extract) 4202 return false; 4203 } 4204 I.eraseFromParent(); 4205 return true; 4206 } 4207 4208 bool AArch64InstructionSelector::selectUnmergeValues(MachineInstr &I, 4209 MachineRegisterInfo &MRI) { 4210 assert(I.getOpcode() == TargetOpcode::G_UNMERGE_VALUES && 4211 "unexpected opcode"); 4212 4213 // TODO: Handle unmerging into GPRs and from scalars to scalars. 4214 if (RBI.getRegBank(I.getOperand(0).getReg(), MRI, TRI)->getID() != 4215 AArch64::FPRRegBankID || 4216 RBI.getRegBank(I.getOperand(1).getReg(), MRI, TRI)->getID() != 4217 AArch64::FPRRegBankID) { 4218 LLVM_DEBUG(dbgs() << "Unmerging vector-to-gpr and scalar-to-scalar " 4219 "currently unsupported.\n"); 4220 return false; 4221 } 4222 4223 // The last operand is the vector source register, and every other operand is 4224 // a register to unpack into. 4225 unsigned NumElts = I.getNumOperands() - 1; 4226 Register SrcReg = I.getOperand(NumElts).getReg(); 4227 const LLT NarrowTy = MRI.getType(I.getOperand(0).getReg()); 4228 const LLT WideTy = MRI.getType(SrcReg); 4229 (void)WideTy; 4230 assert((WideTy.isVector() || WideTy.getSizeInBits() == 128) && 4231 "can only unmerge from vector or s128 types!"); 4232 assert(WideTy.getSizeInBits() > NarrowTy.getSizeInBits() && 4233 "source register size too small!"); 4234 4235 if (!NarrowTy.isScalar()) 4236 return selectSplitVectorUnmerge(I, MRI); 4237 4238 // Choose a lane copy opcode and subregister based off of the size of the 4239 // vector's elements. 4240 unsigned CopyOpc = 0; 4241 unsigned ExtractSubReg = 0; 4242 if (!getLaneCopyOpcode(CopyOpc, ExtractSubReg, NarrowTy.getSizeInBits())) 4243 return false; 4244 4245 // Set up for the lane copies. 4246 MachineBasicBlock &MBB = *I.getParent(); 4247 4248 // Stores the registers we'll be copying from. 4249 SmallVector<Register, 4> InsertRegs; 4250 4251 // We'll use the first register twice, so we only need NumElts-1 registers. 4252 unsigned NumInsertRegs = NumElts - 1; 4253 4254 // If our elements fit into exactly 128 bits, then we can copy from the source 4255 // directly. Otherwise, we need to do a bit of setup with some subregister 4256 // inserts. 4257 if (NarrowTy.getSizeInBits() * NumElts == 128) { 4258 InsertRegs = SmallVector<Register, 4>(NumInsertRegs, SrcReg); 4259 } else { 4260 // No. We have to perform subregister inserts. For each insert, create an 4261 // implicit def and a subregister insert, and save the register we create. 4262 const TargetRegisterClass *RC = getRegClassForTypeOnBank( 4263 LLT::fixed_vector(NumElts, WideTy.getScalarSizeInBits()), 4264 *RBI.getRegBank(SrcReg, MRI, TRI)); 4265 unsigned SubReg = 0; 4266 bool Found = getSubRegForClass(RC, TRI, SubReg); 4267 (void)Found; 4268 assert(Found && "expected to find last operand's subeg idx"); 4269 for (unsigned Idx = 0; Idx < NumInsertRegs; ++Idx) { 4270 Register ImpDefReg = MRI.createVirtualRegister(&AArch64::FPR128RegClass); 4271 MachineInstr &ImpDefMI = 4272 *BuildMI(MBB, I, I.getDebugLoc(), TII.get(TargetOpcode::IMPLICIT_DEF), 4273 ImpDefReg); 4274 4275 // Now, create the subregister insert from SrcReg. 4276 Register InsertReg = MRI.createVirtualRegister(&AArch64::FPR128RegClass); 4277 MachineInstr &InsMI = 4278 *BuildMI(MBB, I, I.getDebugLoc(), 4279 TII.get(TargetOpcode::INSERT_SUBREG), InsertReg) 4280 .addUse(ImpDefReg) 4281 .addUse(SrcReg) 4282 .addImm(SubReg); 4283 4284 constrainSelectedInstRegOperands(ImpDefMI, TII, TRI, RBI); 4285 constrainSelectedInstRegOperands(InsMI, TII, TRI, RBI); 4286 4287 // Save the register so that we can copy from it after. 4288 InsertRegs.push_back(InsertReg); 4289 } 4290 } 4291 4292 // Now that we've created any necessary subregister inserts, we can 4293 // create the copies. 4294 // 4295 // Perform the first copy separately as a subregister copy. 4296 Register CopyTo = I.getOperand(0).getReg(); 4297 auto FirstCopy = MIB.buildInstr(TargetOpcode::COPY, {CopyTo}, {}) 4298 .addReg(InsertRegs[0], 0, ExtractSubReg); 4299 constrainSelectedInstRegOperands(*FirstCopy, TII, TRI, RBI); 4300 4301 // Now, perform the remaining copies as vector lane copies. 4302 unsigned LaneIdx = 1; 4303 for (Register InsReg : InsertRegs) { 4304 Register CopyTo = I.getOperand(LaneIdx).getReg(); 4305 MachineInstr &CopyInst = 4306 *BuildMI(MBB, I, I.getDebugLoc(), TII.get(CopyOpc), CopyTo) 4307 .addUse(InsReg) 4308 .addImm(LaneIdx); 4309 constrainSelectedInstRegOperands(CopyInst, TII, TRI, RBI); 4310 ++LaneIdx; 4311 } 4312 4313 // Separately constrain the first copy's destination. Because of the 4314 // limitation in constrainOperandRegClass, we can't guarantee that this will 4315 // actually be constrained. So, do it ourselves using the second operand. 4316 const TargetRegisterClass *RC = 4317 MRI.getRegClassOrNull(I.getOperand(1).getReg()); 4318 if (!RC) { 4319 LLVM_DEBUG(dbgs() << "Couldn't constrain copy destination.\n"); 4320 return false; 4321 } 4322 4323 RBI.constrainGenericRegister(CopyTo, *RC, MRI); 4324 I.eraseFromParent(); 4325 return true; 4326 } 4327 4328 bool AArch64InstructionSelector::selectConcatVectors( 4329 MachineInstr &I, MachineRegisterInfo &MRI) { 4330 assert(I.getOpcode() == TargetOpcode::G_CONCAT_VECTORS && 4331 "Unexpected opcode"); 4332 Register Dst = I.getOperand(0).getReg(); 4333 Register Op1 = I.getOperand(1).getReg(); 4334 Register Op2 = I.getOperand(2).getReg(); 4335 MachineInstr *ConcatMI = emitVectorConcat(Dst, Op1, Op2, MIB); 4336 if (!ConcatMI) 4337 return false; 4338 I.eraseFromParent(); 4339 return true; 4340 } 4341 4342 unsigned 4343 AArch64InstructionSelector::emitConstantPoolEntry(const Constant *CPVal, 4344 MachineFunction &MF) const { 4345 Type *CPTy = CPVal->getType(); 4346 Align Alignment = MF.getDataLayout().getPrefTypeAlign(CPTy); 4347 4348 MachineConstantPool *MCP = MF.getConstantPool(); 4349 return MCP->getConstantPoolIndex(CPVal, Alignment); 4350 } 4351 4352 MachineInstr *AArch64InstructionSelector::emitLoadFromConstantPool( 4353 const Constant *CPVal, MachineIRBuilder &MIRBuilder) const { 4354 auto &MF = MIRBuilder.getMF(); 4355 unsigned CPIdx = emitConstantPoolEntry(CPVal, MF); 4356 4357 auto Adrp = 4358 MIRBuilder.buildInstr(AArch64::ADRP, {&AArch64::GPR64RegClass}, {}) 4359 .addConstantPoolIndex(CPIdx, 0, AArch64II::MO_PAGE); 4360 4361 MachineInstr *LoadMI = nullptr; 4362 MachinePointerInfo PtrInfo = MachinePointerInfo::getConstantPool(MF); 4363 unsigned Size = MIRBuilder.getDataLayout().getTypeStoreSize(CPVal->getType()); 4364 switch (Size) { 4365 case 16: 4366 LoadMI = 4367 &*MIRBuilder 4368 .buildInstr(AArch64::LDRQui, {&AArch64::FPR128RegClass}, {Adrp}) 4369 .addConstantPoolIndex(CPIdx, 0, 4370 AArch64II::MO_PAGEOFF | AArch64II::MO_NC); 4371 break; 4372 case 8: 4373 LoadMI = 4374 &*MIRBuilder 4375 .buildInstr(AArch64::LDRDui, {&AArch64::FPR64RegClass}, {Adrp}) 4376 .addConstantPoolIndex(CPIdx, 0, 4377 AArch64II::MO_PAGEOFF | AArch64II::MO_NC); 4378 break; 4379 case 4: 4380 LoadMI = 4381 &*MIRBuilder 4382 .buildInstr(AArch64::LDRSui, {&AArch64::FPR32RegClass}, {Adrp}) 4383 .addConstantPoolIndex(CPIdx, 0, 4384 AArch64II::MO_PAGEOFF | AArch64II::MO_NC); 4385 break; 4386 case 2: 4387 LoadMI = 4388 &*MIRBuilder 4389 .buildInstr(AArch64::LDRHui, {&AArch64::FPR16RegClass}, {Adrp}) 4390 .addConstantPoolIndex(CPIdx, 0, 4391 AArch64II::MO_PAGEOFF | AArch64II::MO_NC); 4392 break; 4393 default: 4394 LLVM_DEBUG(dbgs() << "Could not load from constant pool of type " 4395 << *CPVal->getType()); 4396 return nullptr; 4397 } 4398 LoadMI->addMemOperand(MF, MF.getMachineMemOperand(PtrInfo, 4399 MachineMemOperand::MOLoad, 4400 Size, Align(Size))); 4401 constrainSelectedInstRegOperands(*Adrp, TII, TRI, RBI); 4402 constrainSelectedInstRegOperands(*LoadMI, TII, TRI, RBI); 4403 return LoadMI; 4404 } 4405 4406 /// Return an <Opcode, SubregIndex> pair to do an vector elt insert of a given 4407 /// size and RB. 4408 static std::pair<unsigned, unsigned> 4409 getInsertVecEltOpInfo(const RegisterBank &RB, unsigned EltSize) { 4410 unsigned Opc, SubregIdx; 4411 if (RB.getID() == AArch64::GPRRegBankID) { 4412 if (EltSize == 16) { 4413 Opc = AArch64::INSvi16gpr; 4414 SubregIdx = AArch64::ssub; 4415 } else if (EltSize == 32) { 4416 Opc = AArch64::INSvi32gpr; 4417 SubregIdx = AArch64::ssub; 4418 } else if (EltSize == 64) { 4419 Opc = AArch64::INSvi64gpr; 4420 SubregIdx = AArch64::dsub; 4421 } else { 4422 llvm_unreachable("invalid elt size!"); 4423 } 4424 } else { 4425 if (EltSize == 8) { 4426 Opc = AArch64::INSvi8lane; 4427 SubregIdx = AArch64::bsub; 4428 } else if (EltSize == 16) { 4429 Opc = AArch64::INSvi16lane; 4430 SubregIdx = AArch64::hsub; 4431 } else if (EltSize == 32) { 4432 Opc = AArch64::INSvi32lane; 4433 SubregIdx = AArch64::ssub; 4434 } else if (EltSize == 64) { 4435 Opc = AArch64::INSvi64lane; 4436 SubregIdx = AArch64::dsub; 4437 } else { 4438 llvm_unreachable("invalid elt size!"); 4439 } 4440 } 4441 return std::make_pair(Opc, SubregIdx); 4442 } 4443 4444 MachineInstr *AArch64InstructionSelector::emitInstr( 4445 unsigned Opcode, std::initializer_list<llvm::DstOp> DstOps, 4446 std::initializer_list<llvm::SrcOp> SrcOps, MachineIRBuilder &MIRBuilder, 4447 const ComplexRendererFns &RenderFns) const { 4448 assert(Opcode && "Expected an opcode?"); 4449 assert(!isPreISelGenericOpcode(Opcode) && 4450 "Function should only be used to produce selected instructions!"); 4451 auto MI = MIRBuilder.buildInstr(Opcode, DstOps, SrcOps); 4452 if (RenderFns) 4453 for (auto &Fn : *RenderFns) 4454 Fn(MI); 4455 constrainSelectedInstRegOperands(*MI, TII, TRI, RBI); 4456 return &*MI; 4457 } 4458 4459 MachineInstr *AArch64InstructionSelector::emitAddSub( 4460 const std::array<std::array<unsigned, 2>, 5> &AddrModeAndSizeToOpcode, 4461 Register Dst, MachineOperand &LHS, MachineOperand &RHS, 4462 MachineIRBuilder &MIRBuilder) const { 4463 MachineRegisterInfo &MRI = MIRBuilder.getMF().getRegInfo(); 4464 assert(LHS.isReg() && RHS.isReg() && "Expected register operands?"); 4465 auto Ty = MRI.getType(LHS.getReg()); 4466 assert(!Ty.isVector() && "Expected a scalar or pointer?"); 4467 unsigned Size = Ty.getSizeInBits(); 4468 assert((Size == 32 || Size == 64) && "Expected a 32-bit or 64-bit type only"); 4469 bool Is32Bit = Size == 32; 4470 4471 // INSTRri form with positive arithmetic immediate. 4472 if (auto Fns = selectArithImmed(RHS)) 4473 return emitInstr(AddrModeAndSizeToOpcode[0][Is32Bit], {Dst}, {LHS}, 4474 MIRBuilder, Fns); 4475 4476 // INSTRri form with negative arithmetic immediate. 4477 if (auto Fns = selectNegArithImmed(RHS)) 4478 return emitInstr(AddrModeAndSizeToOpcode[3][Is32Bit], {Dst}, {LHS}, 4479 MIRBuilder, Fns); 4480 4481 // INSTRrx form. 4482 if (auto Fns = selectArithExtendedRegister(RHS)) 4483 return emitInstr(AddrModeAndSizeToOpcode[4][Is32Bit], {Dst}, {LHS}, 4484 MIRBuilder, Fns); 4485 4486 // INSTRrs form. 4487 if (auto Fns = selectShiftedRegister(RHS)) 4488 return emitInstr(AddrModeAndSizeToOpcode[1][Is32Bit], {Dst}, {LHS}, 4489 MIRBuilder, Fns); 4490 return emitInstr(AddrModeAndSizeToOpcode[2][Is32Bit], {Dst}, {LHS, RHS}, 4491 MIRBuilder); 4492 } 4493 4494 MachineInstr * 4495 AArch64InstructionSelector::emitADD(Register DefReg, MachineOperand &LHS, 4496 MachineOperand &RHS, 4497 MachineIRBuilder &MIRBuilder) const { 4498 const std::array<std::array<unsigned, 2>, 5> OpcTable{ 4499 {{AArch64::ADDXri, AArch64::ADDWri}, 4500 {AArch64::ADDXrs, AArch64::ADDWrs}, 4501 {AArch64::ADDXrr, AArch64::ADDWrr}, 4502 {AArch64::SUBXri, AArch64::SUBWri}, 4503 {AArch64::ADDXrx, AArch64::ADDWrx}}}; 4504 return emitAddSub(OpcTable, DefReg, LHS, RHS, MIRBuilder); 4505 } 4506 4507 MachineInstr * 4508 AArch64InstructionSelector::emitADDS(Register Dst, MachineOperand &LHS, 4509 MachineOperand &RHS, 4510 MachineIRBuilder &MIRBuilder) const { 4511 const std::array<std::array<unsigned, 2>, 5> OpcTable{ 4512 {{AArch64::ADDSXri, AArch64::ADDSWri}, 4513 {AArch64::ADDSXrs, AArch64::ADDSWrs}, 4514 {AArch64::ADDSXrr, AArch64::ADDSWrr}, 4515 {AArch64::SUBSXri, AArch64::SUBSWri}, 4516 {AArch64::ADDSXrx, AArch64::ADDSWrx}}}; 4517 return emitAddSub(OpcTable, Dst, LHS, RHS, MIRBuilder); 4518 } 4519 4520 MachineInstr * 4521 AArch64InstructionSelector::emitSUBS(Register Dst, MachineOperand &LHS, 4522 MachineOperand &RHS, 4523 MachineIRBuilder &MIRBuilder) const { 4524 const std::array<std::array<unsigned, 2>, 5> OpcTable{ 4525 {{AArch64::SUBSXri, AArch64::SUBSWri}, 4526 {AArch64::SUBSXrs, AArch64::SUBSWrs}, 4527 {AArch64::SUBSXrr, AArch64::SUBSWrr}, 4528 {AArch64::ADDSXri, AArch64::ADDSWri}, 4529 {AArch64::SUBSXrx, AArch64::SUBSWrx}}}; 4530 return emitAddSub(OpcTable, Dst, LHS, RHS, MIRBuilder); 4531 } 4532 4533 MachineInstr * 4534 AArch64InstructionSelector::emitCMN(MachineOperand &LHS, MachineOperand &RHS, 4535 MachineIRBuilder &MIRBuilder) const { 4536 MachineRegisterInfo &MRI = MIRBuilder.getMF().getRegInfo(); 4537 bool Is32Bit = (MRI.getType(LHS.getReg()).getSizeInBits() == 32); 4538 auto RC = Is32Bit ? &AArch64::GPR32RegClass : &AArch64::GPR64RegClass; 4539 return emitADDS(MRI.createVirtualRegister(RC), LHS, RHS, MIRBuilder); 4540 } 4541 4542 MachineInstr * 4543 AArch64InstructionSelector::emitTST(MachineOperand &LHS, MachineOperand &RHS, 4544 MachineIRBuilder &MIRBuilder) const { 4545 assert(LHS.isReg() && RHS.isReg() && "Expected register operands?"); 4546 MachineRegisterInfo &MRI = MIRBuilder.getMF().getRegInfo(); 4547 LLT Ty = MRI.getType(LHS.getReg()); 4548 unsigned RegSize = Ty.getSizeInBits(); 4549 bool Is32Bit = (RegSize == 32); 4550 const unsigned OpcTable[3][2] = {{AArch64::ANDSXri, AArch64::ANDSWri}, 4551 {AArch64::ANDSXrs, AArch64::ANDSWrs}, 4552 {AArch64::ANDSXrr, AArch64::ANDSWrr}}; 4553 // ANDS needs a logical immediate for its immediate form. Check if we can 4554 // fold one in. 4555 if (auto ValAndVReg = getIConstantVRegValWithLookThrough(RHS.getReg(), MRI)) { 4556 int64_t Imm = ValAndVReg->Value.getSExtValue(); 4557 4558 if (AArch64_AM::isLogicalImmediate(Imm, RegSize)) { 4559 auto TstMI = MIRBuilder.buildInstr(OpcTable[0][Is32Bit], {Ty}, {LHS}); 4560 TstMI.addImm(AArch64_AM::encodeLogicalImmediate(Imm, RegSize)); 4561 constrainSelectedInstRegOperands(*TstMI, TII, TRI, RBI); 4562 return &*TstMI; 4563 } 4564 } 4565 4566 if (auto Fns = selectLogicalShiftedRegister(RHS)) 4567 return emitInstr(OpcTable[1][Is32Bit], {Ty}, {LHS}, MIRBuilder, Fns); 4568 return emitInstr(OpcTable[2][Is32Bit], {Ty}, {LHS, RHS}, MIRBuilder); 4569 } 4570 4571 MachineInstr *AArch64InstructionSelector::emitIntegerCompare( 4572 MachineOperand &LHS, MachineOperand &RHS, MachineOperand &Predicate, 4573 MachineIRBuilder &MIRBuilder) const { 4574 assert(LHS.isReg() && RHS.isReg() && "Expected LHS and RHS to be registers!"); 4575 assert(Predicate.isPredicate() && "Expected predicate?"); 4576 MachineRegisterInfo &MRI = MIRBuilder.getMF().getRegInfo(); 4577 LLT CmpTy = MRI.getType(LHS.getReg()); 4578 assert(!CmpTy.isVector() && "Expected scalar or pointer"); 4579 unsigned Size = CmpTy.getSizeInBits(); 4580 (void)Size; 4581 assert((Size == 32 || Size == 64) && "Expected a 32-bit or 64-bit LHS/RHS?"); 4582 // Fold the compare into a cmn or tst if possible. 4583 if (auto FoldCmp = tryFoldIntegerCompare(LHS, RHS, Predicate, MIRBuilder)) 4584 return FoldCmp; 4585 auto Dst = MRI.cloneVirtualRegister(LHS.getReg()); 4586 return emitSUBS(Dst, LHS, RHS, MIRBuilder); 4587 } 4588 4589 MachineInstr *AArch64InstructionSelector::emitCSetForFCmp( 4590 Register Dst, CmpInst::Predicate Pred, MachineIRBuilder &MIRBuilder) const { 4591 MachineRegisterInfo &MRI = *MIRBuilder.getMRI(); 4592 #ifndef NDEBUG 4593 LLT Ty = MRI.getType(Dst); 4594 assert(!Ty.isVector() && Ty.getSizeInBits() == 32 && 4595 "Expected a 32-bit scalar register?"); 4596 #endif 4597 const Register ZReg = AArch64::WZR; 4598 AArch64CC::CondCode CC1, CC2; 4599 changeFCMPPredToAArch64CC(Pred, CC1, CC2); 4600 auto InvCC1 = AArch64CC::getInvertedCondCode(CC1); 4601 if (CC2 == AArch64CC::AL) 4602 return emitCSINC(/*Dst=*/Dst, /*Src1=*/ZReg, /*Src2=*/ZReg, InvCC1, 4603 MIRBuilder); 4604 const TargetRegisterClass *RC = &AArch64::GPR32RegClass; 4605 Register Def1Reg = MRI.createVirtualRegister(RC); 4606 Register Def2Reg = MRI.createVirtualRegister(RC); 4607 auto InvCC2 = AArch64CC::getInvertedCondCode(CC2); 4608 emitCSINC(/*Dst=*/Def1Reg, /*Src1=*/ZReg, /*Src2=*/ZReg, InvCC1, MIRBuilder); 4609 emitCSINC(/*Dst=*/Def2Reg, /*Src1=*/ZReg, /*Src2=*/ZReg, InvCC2, MIRBuilder); 4610 auto OrMI = MIRBuilder.buildInstr(AArch64::ORRWrr, {Dst}, {Def1Reg, Def2Reg}); 4611 constrainSelectedInstRegOperands(*OrMI, TII, TRI, RBI); 4612 return &*OrMI; 4613 } 4614 4615 MachineInstr * 4616 AArch64InstructionSelector::emitFPCompare(Register LHS, Register RHS, 4617 MachineIRBuilder &MIRBuilder, 4618 Optional<CmpInst::Predicate> Pred) const { 4619 MachineRegisterInfo &MRI = *MIRBuilder.getMRI(); 4620 LLT Ty = MRI.getType(LHS); 4621 if (Ty.isVector()) 4622 return nullptr; 4623 unsigned OpSize = Ty.getSizeInBits(); 4624 if (OpSize != 32 && OpSize != 64) 4625 return nullptr; 4626 4627 // If this is a compare against +0.0, then we don't have 4628 // to explicitly materialize a constant. 4629 const ConstantFP *FPImm = getConstantFPVRegVal(RHS, MRI); 4630 bool ShouldUseImm = FPImm && (FPImm->isZero() && !FPImm->isNegative()); 4631 4632 auto IsEqualityPred = [](CmpInst::Predicate P) { 4633 return P == CmpInst::FCMP_OEQ || P == CmpInst::FCMP_ONE || 4634 P == CmpInst::FCMP_UEQ || P == CmpInst::FCMP_UNE; 4635 }; 4636 if (!ShouldUseImm && Pred && IsEqualityPred(*Pred)) { 4637 // Try commutating the operands. 4638 const ConstantFP *LHSImm = getConstantFPVRegVal(LHS, MRI); 4639 if (LHSImm && (LHSImm->isZero() && !LHSImm->isNegative())) { 4640 ShouldUseImm = true; 4641 std::swap(LHS, RHS); 4642 } 4643 } 4644 unsigned CmpOpcTbl[2][2] = {{AArch64::FCMPSrr, AArch64::FCMPDrr}, 4645 {AArch64::FCMPSri, AArch64::FCMPDri}}; 4646 unsigned CmpOpc = CmpOpcTbl[ShouldUseImm][OpSize == 64]; 4647 4648 // Partially build the compare. Decide if we need to add a use for the 4649 // third operand based off whether or not we're comparing against 0.0. 4650 auto CmpMI = MIRBuilder.buildInstr(CmpOpc).addUse(LHS); 4651 CmpMI.setMIFlags(MachineInstr::NoFPExcept); 4652 if (!ShouldUseImm) 4653 CmpMI.addUse(RHS); 4654 constrainSelectedInstRegOperands(*CmpMI, TII, TRI, RBI); 4655 return &*CmpMI; 4656 } 4657 4658 MachineInstr *AArch64InstructionSelector::emitVectorConcat( 4659 Optional<Register> Dst, Register Op1, Register Op2, 4660 MachineIRBuilder &MIRBuilder) const { 4661 // We implement a vector concat by: 4662 // 1. Use scalar_to_vector to insert the lower vector into the larger dest 4663 // 2. Insert the upper vector into the destination's upper element 4664 // TODO: some of this code is common with G_BUILD_VECTOR handling. 4665 MachineRegisterInfo &MRI = MIRBuilder.getMF().getRegInfo(); 4666 4667 const LLT Op1Ty = MRI.getType(Op1); 4668 const LLT Op2Ty = MRI.getType(Op2); 4669 4670 if (Op1Ty != Op2Ty) { 4671 LLVM_DEBUG(dbgs() << "Could not do vector concat of differing vector tys"); 4672 return nullptr; 4673 } 4674 assert(Op1Ty.isVector() && "Expected a vector for vector concat"); 4675 4676 if (Op1Ty.getSizeInBits() >= 128) { 4677 LLVM_DEBUG(dbgs() << "Vector concat not supported for full size vectors"); 4678 return nullptr; 4679 } 4680 4681 // At the moment we just support 64 bit vector concats. 4682 if (Op1Ty.getSizeInBits() != 64) { 4683 LLVM_DEBUG(dbgs() << "Vector concat supported for 64b vectors"); 4684 return nullptr; 4685 } 4686 4687 const LLT ScalarTy = LLT::scalar(Op1Ty.getSizeInBits()); 4688 const RegisterBank &FPRBank = *RBI.getRegBank(Op1, MRI, TRI); 4689 const TargetRegisterClass *DstRC = 4690 getRegClassForTypeOnBank(Op1Ty.multiplyElements(2), FPRBank); 4691 4692 MachineInstr *WidenedOp1 = 4693 emitScalarToVector(ScalarTy.getSizeInBits(), DstRC, Op1, MIRBuilder); 4694 MachineInstr *WidenedOp2 = 4695 emitScalarToVector(ScalarTy.getSizeInBits(), DstRC, Op2, MIRBuilder); 4696 if (!WidenedOp1 || !WidenedOp2) { 4697 LLVM_DEBUG(dbgs() << "Could not emit a vector from scalar value"); 4698 return nullptr; 4699 } 4700 4701 // Now do the insert of the upper element. 4702 unsigned InsertOpc, InsSubRegIdx; 4703 std::tie(InsertOpc, InsSubRegIdx) = 4704 getInsertVecEltOpInfo(FPRBank, ScalarTy.getSizeInBits()); 4705 4706 if (!Dst) 4707 Dst = MRI.createVirtualRegister(DstRC); 4708 auto InsElt = 4709 MIRBuilder 4710 .buildInstr(InsertOpc, {*Dst}, {WidenedOp1->getOperand(0).getReg()}) 4711 .addImm(1) /* Lane index */ 4712 .addUse(WidenedOp2->getOperand(0).getReg()) 4713 .addImm(0); 4714 constrainSelectedInstRegOperands(*InsElt, TII, TRI, RBI); 4715 return &*InsElt; 4716 } 4717 4718 MachineInstr * 4719 AArch64InstructionSelector::emitCSINC(Register Dst, Register Src1, 4720 Register Src2, AArch64CC::CondCode Pred, 4721 MachineIRBuilder &MIRBuilder) const { 4722 auto &MRI = *MIRBuilder.getMRI(); 4723 const RegClassOrRegBank &RegClassOrBank = MRI.getRegClassOrRegBank(Dst); 4724 // If we used a register class, then this won't necessarily have an LLT. 4725 // Compute the size based off whether or not we have a class or bank. 4726 unsigned Size; 4727 if (const auto *RC = RegClassOrBank.dyn_cast<const TargetRegisterClass *>()) 4728 Size = TRI.getRegSizeInBits(*RC); 4729 else 4730 Size = MRI.getType(Dst).getSizeInBits(); 4731 // Some opcodes use s1. 4732 assert(Size <= 64 && "Expected 64 bits or less only!"); 4733 static const unsigned OpcTable[2] = {AArch64::CSINCWr, AArch64::CSINCXr}; 4734 unsigned Opc = OpcTable[Size == 64]; 4735 auto CSINC = MIRBuilder.buildInstr(Opc, {Dst}, {Src1, Src2}).addImm(Pred); 4736 constrainSelectedInstRegOperands(*CSINC, TII, TRI, RBI); 4737 return &*CSINC; 4738 } 4739 4740 std::pair<MachineInstr *, AArch64CC::CondCode> 4741 AArch64InstructionSelector::emitOverflowOp(unsigned Opcode, Register Dst, 4742 MachineOperand &LHS, 4743 MachineOperand &RHS, 4744 MachineIRBuilder &MIRBuilder) const { 4745 switch (Opcode) { 4746 default: 4747 llvm_unreachable("Unexpected opcode!"); 4748 case TargetOpcode::G_SADDO: 4749 return std::make_pair(emitADDS(Dst, LHS, RHS, MIRBuilder), AArch64CC::VS); 4750 case TargetOpcode::G_UADDO: 4751 return std::make_pair(emitADDS(Dst, LHS, RHS, MIRBuilder), AArch64CC::HS); 4752 case TargetOpcode::G_SSUBO: 4753 return std::make_pair(emitSUBS(Dst, LHS, RHS, MIRBuilder), AArch64CC::VS); 4754 case TargetOpcode::G_USUBO: 4755 return std::make_pair(emitSUBS(Dst, LHS, RHS, MIRBuilder), AArch64CC::LO); 4756 } 4757 } 4758 4759 /// Returns true if @p Val is a tree of AND/OR/CMP operations that can be 4760 /// expressed as a conjunction. 4761 /// \param CanNegate Set to true if we can negate the whole sub-tree just by 4762 /// changing the conditions on the CMP tests. 4763 /// (this means we can call emitConjunctionRec() with 4764 /// Negate==true on this sub-tree) 4765 /// \param MustBeFirst Set to true if this subtree needs to be negated and we 4766 /// cannot do the negation naturally. We are required to 4767 /// emit the subtree first in this case. 4768 /// \param WillNegate Is true if are called when the result of this 4769 /// subexpression must be negated. This happens when the 4770 /// outer expression is an OR. We can use this fact to know 4771 /// that we have a double negation (or (or ...) ...) that 4772 /// can be implemented for free. 4773 static bool canEmitConjunction(Register Val, bool &CanNegate, bool &MustBeFirst, 4774 bool WillNegate, MachineRegisterInfo &MRI, 4775 unsigned Depth = 0) { 4776 if (!MRI.hasOneNonDBGUse(Val)) 4777 return false; 4778 MachineInstr *ValDef = MRI.getVRegDef(Val); 4779 unsigned Opcode = ValDef->getOpcode(); 4780 if (Opcode == TargetOpcode::G_TRUNC) { 4781 // Look through a trunc. 4782 Val = ValDef->getOperand(1).getReg(); 4783 ValDef = MRI.getVRegDef(Val); 4784 Opcode = ValDef->getOpcode(); 4785 } 4786 if (isa<GAnyCmp>(ValDef)) { 4787 CanNegate = true; 4788 MustBeFirst = false; 4789 return true; 4790 } 4791 // Protect against exponential runtime and stack overflow. 4792 if (Depth > 6) 4793 return false; 4794 if (Opcode == TargetOpcode::G_AND || Opcode == TargetOpcode::G_OR) { 4795 bool IsOR = Opcode == TargetOpcode::G_OR; 4796 Register O0 = ValDef->getOperand(1).getReg(); 4797 Register O1 = ValDef->getOperand(2).getReg(); 4798 bool CanNegateL; 4799 bool MustBeFirstL; 4800 if (!canEmitConjunction(O0, CanNegateL, MustBeFirstL, IsOR, MRI, Depth + 1)) 4801 return false; 4802 bool CanNegateR; 4803 bool MustBeFirstR; 4804 if (!canEmitConjunction(O1, CanNegateR, MustBeFirstR, IsOR, MRI, Depth + 1)) 4805 return false; 4806 4807 if (MustBeFirstL && MustBeFirstR) 4808 return false; 4809 4810 if (IsOR) { 4811 // For an OR expression we need to be able to naturally negate at least 4812 // one side or we cannot do the transformation at all. 4813 if (!CanNegateL && !CanNegateR) 4814 return false; 4815 // If we the result of the OR will be negated and we can naturally negate 4816 // the leaves, then this sub-tree as a whole negates naturally. 4817 CanNegate = WillNegate && CanNegateL && CanNegateR; 4818 // If we cannot naturally negate the whole sub-tree, then this must be 4819 // emitted first. 4820 MustBeFirst = !CanNegate; 4821 } else { 4822 assert(Opcode == TargetOpcode::G_AND && "Must be G_AND"); 4823 // We cannot naturally negate an AND operation. 4824 CanNegate = false; 4825 MustBeFirst = MustBeFirstL || MustBeFirstR; 4826 } 4827 return true; 4828 } 4829 return false; 4830 } 4831 4832 MachineInstr *AArch64InstructionSelector::emitConditionalComparison( 4833 Register LHS, Register RHS, CmpInst::Predicate CC, 4834 AArch64CC::CondCode Predicate, AArch64CC::CondCode OutCC, 4835 MachineIRBuilder &MIB) const { 4836 // TODO: emit CMN as an optimization. 4837 auto &MRI = *MIB.getMRI(); 4838 LLT OpTy = MRI.getType(LHS); 4839 assert(OpTy.getSizeInBits() == 32 || OpTy.getSizeInBits() == 64); 4840 unsigned CCmpOpc; 4841 if (CmpInst::isIntPredicate(CC)) { 4842 CCmpOpc = OpTy.getSizeInBits() == 32 ? AArch64::CCMPWr : AArch64::CCMPXr; 4843 } else { 4844 switch (OpTy.getSizeInBits()) { 4845 case 16: 4846 CCmpOpc = AArch64::FCCMPHrr; 4847 break; 4848 case 32: 4849 CCmpOpc = AArch64::FCCMPSrr; 4850 break; 4851 case 64: 4852 CCmpOpc = AArch64::FCCMPDrr; 4853 break; 4854 default: 4855 return nullptr; 4856 } 4857 } 4858 AArch64CC::CondCode InvOutCC = AArch64CC::getInvertedCondCode(OutCC); 4859 unsigned NZCV = AArch64CC::getNZCVToSatisfyCondCode(InvOutCC); 4860 auto CCmp = 4861 MIB.buildInstr(CCmpOpc, {}, {LHS, RHS}).addImm(NZCV).addImm(Predicate); 4862 constrainSelectedInstRegOperands(*CCmp, TII, TRI, RBI); 4863 return &*CCmp; 4864 } 4865 4866 MachineInstr *AArch64InstructionSelector::emitConjunctionRec( 4867 Register Val, AArch64CC::CondCode &OutCC, bool Negate, Register CCOp, 4868 AArch64CC::CondCode Predicate, MachineIRBuilder &MIB) const { 4869 // We're at a tree leaf, produce a conditional comparison operation. 4870 auto &MRI = *MIB.getMRI(); 4871 MachineInstr *ValDef = MRI.getVRegDef(Val); 4872 unsigned Opcode = ValDef->getOpcode(); 4873 if (Opcode == TargetOpcode::G_TRUNC) { 4874 // Look through a trunc. 4875 Val = ValDef->getOperand(1).getReg(); 4876 ValDef = MRI.getVRegDef(Val); 4877 Opcode = ValDef->getOpcode(); 4878 } 4879 if (auto *Cmp = dyn_cast<GAnyCmp>(ValDef)) { 4880 Register LHS = Cmp->getLHSReg(); 4881 Register RHS = Cmp->getRHSReg(); 4882 CmpInst::Predicate CC = Cmp->getCond(); 4883 if (Negate) 4884 CC = CmpInst::getInversePredicate(CC); 4885 if (isa<GICmp>(Cmp)) { 4886 OutCC = changeICMPPredToAArch64CC(CC); 4887 } else { 4888 // Handle special FP cases. 4889 AArch64CC::CondCode ExtraCC; 4890 changeFPCCToANDAArch64CC(CC, OutCC, ExtraCC); 4891 // Some floating point conditions can't be tested with a single condition 4892 // code. Construct an additional comparison in this case. 4893 if (ExtraCC != AArch64CC::AL) { 4894 MachineInstr *ExtraCmp; 4895 if (!CCOp) 4896 ExtraCmp = emitFPCompare(LHS, RHS, MIB, CC); 4897 else 4898 ExtraCmp = 4899 emitConditionalComparison(LHS, RHS, CC, Predicate, ExtraCC, MIB); 4900 CCOp = ExtraCmp->getOperand(0).getReg(); 4901 Predicate = ExtraCC; 4902 } 4903 } 4904 4905 // Produce a normal comparison if we are first in the chain 4906 if (!CCOp) { 4907 auto Dst = MRI.cloneVirtualRegister(LHS); 4908 if (isa<GICmp>(Cmp)) 4909 return emitSUBS(Dst, Cmp->getOperand(2), Cmp->getOperand(3), MIB); 4910 return emitFPCompare(Cmp->getOperand(2).getReg(), 4911 Cmp->getOperand(3).getReg(), MIB); 4912 } 4913 // Otherwise produce a ccmp. 4914 return emitConditionalComparison(LHS, RHS, CC, Predicate, OutCC, MIB); 4915 } 4916 assert(MRI.hasOneNonDBGUse(Val) && "Valid conjunction/disjunction tree"); 4917 4918 bool IsOR = Opcode == TargetOpcode::G_OR; 4919 4920 Register LHS = ValDef->getOperand(1).getReg(); 4921 bool CanNegateL; 4922 bool MustBeFirstL; 4923 bool ValidL = canEmitConjunction(LHS, CanNegateL, MustBeFirstL, IsOR, MRI); 4924 assert(ValidL && "Valid conjunction/disjunction tree"); 4925 (void)ValidL; 4926 4927 Register RHS = ValDef->getOperand(2).getReg(); 4928 bool CanNegateR; 4929 bool MustBeFirstR; 4930 bool ValidR = canEmitConjunction(RHS, CanNegateR, MustBeFirstR, IsOR, MRI); 4931 assert(ValidR && "Valid conjunction/disjunction tree"); 4932 (void)ValidR; 4933 4934 // Swap sub-tree that must come first to the right side. 4935 if (MustBeFirstL) { 4936 assert(!MustBeFirstR && "Valid conjunction/disjunction tree"); 4937 std::swap(LHS, RHS); 4938 std::swap(CanNegateL, CanNegateR); 4939 std::swap(MustBeFirstL, MustBeFirstR); 4940 } 4941 4942 bool NegateR; 4943 bool NegateAfterR; 4944 bool NegateL; 4945 bool NegateAfterAll; 4946 if (Opcode == TargetOpcode::G_OR) { 4947 // Swap the sub-tree that we can negate naturally to the left. 4948 if (!CanNegateL) { 4949 assert(CanNegateR && "at least one side must be negatable"); 4950 assert(!MustBeFirstR && "invalid conjunction/disjunction tree"); 4951 assert(!Negate); 4952 std::swap(LHS, RHS); 4953 NegateR = false; 4954 NegateAfterR = true; 4955 } else { 4956 // Negate the left sub-tree if possible, otherwise negate the result. 4957 NegateR = CanNegateR; 4958 NegateAfterR = !CanNegateR; 4959 } 4960 NegateL = true; 4961 NegateAfterAll = !Negate; 4962 } else { 4963 assert(Opcode == TargetOpcode::G_AND && 4964 "Valid conjunction/disjunction tree"); 4965 assert(!Negate && "Valid conjunction/disjunction tree"); 4966 4967 NegateL = false; 4968 NegateR = false; 4969 NegateAfterR = false; 4970 NegateAfterAll = false; 4971 } 4972 4973 // Emit sub-trees. 4974 AArch64CC::CondCode RHSCC; 4975 MachineInstr *CmpR = 4976 emitConjunctionRec(RHS, RHSCC, NegateR, CCOp, Predicate, MIB); 4977 if (NegateAfterR) 4978 RHSCC = AArch64CC::getInvertedCondCode(RHSCC); 4979 MachineInstr *CmpL = emitConjunctionRec( 4980 LHS, OutCC, NegateL, CmpR->getOperand(0).getReg(), RHSCC, MIB); 4981 if (NegateAfterAll) 4982 OutCC = AArch64CC::getInvertedCondCode(OutCC); 4983 return CmpL; 4984 } 4985 4986 MachineInstr *AArch64InstructionSelector::emitConjunction( 4987 Register Val, AArch64CC::CondCode &OutCC, MachineIRBuilder &MIB) const { 4988 bool DummyCanNegate; 4989 bool DummyMustBeFirst; 4990 if (!canEmitConjunction(Val, DummyCanNegate, DummyMustBeFirst, false, 4991 *MIB.getMRI())) 4992 return nullptr; 4993 return emitConjunctionRec(Val, OutCC, false, Register(), AArch64CC::AL, MIB); 4994 } 4995 4996 bool AArch64InstructionSelector::tryOptSelectConjunction(GSelect &SelI, 4997 MachineInstr &CondMI) { 4998 AArch64CC::CondCode AArch64CC; 4999 MachineInstr *ConjMI = emitConjunction(SelI.getCondReg(), AArch64CC, MIB); 5000 if (!ConjMI) 5001 return false; 5002 5003 emitSelect(SelI.getReg(0), SelI.getTrueReg(), SelI.getFalseReg(), AArch64CC, MIB); 5004 SelI.eraseFromParent(); 5005 return true; 5006 } 5007 5008 bool AArch64InstructionSelector::tryOptSelect(GSelect &I) { 5009 MachineRegisterInfo &MRI = *MIB.getMRI(); 5010 // We want to recognize this pattern: 5011 // 5012 // $z = G_FCMP pred, $x, $y 5013 // ... 5014 // $w = G_SELECT $z, $a, $b 5015 // 5016 // Where the value of $z is *only* ever used by the G_SELECT (possibly with 5017 // some copies/truncs in between.) 5018 // 5019 // If we see this, then we can emit something like this: 5020 // 5021 // fcmp $x, $y 5022 // fcsel $w, $a, $b, pred 5023 // 5024 // Rather than emitting both of the rather long sequences in the standard 5025 // G_FCMP/G_SELECT select methods. 5026 5027 // First, check if the condition is defined by a compare. 5028 MachineInstr *CondDef = MRI.getVRegDef(I.getOperand(1).getReg()); 5029 while (CondDef) { 5030 // We can only fold if all of the defs have one use. 5031 Register CondDefReg = CondDef->getOperand(0).getReg(); 5032 if (!MRI.hasOneNonDBGUse(CondDefReg)) { 5033 // Unless it's another select. 5034 for (const MachineInstr &UI : MRI.use_nodbg_instructions(CondDefReg)) { 5035 if (CondDef == &UI) 5036 continue; 5037 if (UI.getOpcode() != TargetOpcode::G_SELECT) 5038 return false; 5039 } 5040 } 5041 5042 // We can skip over G_TRUNC since the condition is 1-bit. 5043 // Truncating/extending can have no impact on the value. 5044 unsigned Opc = CondDef->getOpcode(); 5045 if (Opc != TargetOpcode::COPY && Opc != TargetOpcode::G_TRUNC) 5046 break; 5047 5048 // Can't see past copies from physregs. 5049 if (Opc == TargetOpcode::COPY && 5050 Register::isPhysicalRegister(CondDef->getOperand(1).getReg())) 5051 return false; 5052 5053 CondDef = MRI.getVRegDef(CondDef->getOperand(1).getReg()); 5054 } 5055 5056 // Is the condition defined by a compare? 5057 unsigned CondOpc = CondDef->getOpcode(); 5058 if (CondOpc != TargetOpcode::G_ICMP && CondOpc != TargetOpcode::G_FCMP) { 5059 if (tryOptSelectConjunction(I, *CondDef)) 5060 return true; 5061 return false; 5062 } 5063 5064 AArch64CC::CondCode CondCode; 5065 if (CondOpc == TargetOpcode::G_ICMP) { 5066 auto Pred = 5067 static_cast<CmpInst::Predicate>(CondDef->getOperand(1).getPredicate()); 5068 CondCode = changeICMPPredToAArch64CC(Pred); 5069 emitIntegerCompare(CondDef->getOperand(2), CondDef->getOperand(3), 5070 CondDef->getOperand(1), MIB); 5071 } else { 5072 // Get the condition code for the select. 5073 auto Pred = 5074 static_cast<CmpInst::Predicate>(CondDef->getOperand(1).getPredicate()); 5075 AArch64CC::CondCode CondCode2; 5076 changeFCMPPredToAArch64CC(Pred, CondCode, CondCode2); 5077 5078 // changeFCMPPredToAArch64CC sets CondCode2 to AL when we require two 5079 // instructions to emit the comparison. 5080 // TODO: Handle FCMP_UEQ and FCMP_ONE. After that, this check will be 5081 // unnecessary. 5082 if (CondCode2 != AArch64CC::AL) 5083 return false; 5084 5085 if (!emitFPCompare(CondDef->getOperand(2).getReg(), 5086 CondDef->getOperand(3).getReg(), MIB)) { 5087 LLVM_DEBUG(dbgs() << "Couldn't emit compare for select!\n"); 5088 return false; 5089 } 5090 } 5091 5092 // Emit the select. 5093 emitSelect(I.getOperand(0).getReg(), I.getOperand(2).getReg(), 5094 I.getOperand(3).getReg(), CondCode, MIB); 5095 I.eraseFromParent(); 5096 return true; 5097 } 5098 5099 MachineInstr *AArch64InstructionSelector::tryFoldIntegerCompare( 5100 MachineOperand &LHS, MachineOperand &RHS, MachineOperand &Predicate, 5101 MachineIRBuilder &MIRBuilder) const { 5102 assert(LHS.isReg() && RHS.isReg() && Predicate.isPredicate() && 5103 "Unexpected MachineOperand"); 5104 MachineRegisterInfo &MRI = *MIRBuilder.getMRI(); 5105 // We want to find this sort of thing: 5106 // x = G_SUB 0, y 5107 // G_ICMP z, x 5108 // 5109 // In this case, we can fold the G_SUB into the G_ICMP using a CMN instead. 5110 // e.g: 5111 // 5112 // cmn z, y 5113 5114 // Check if the RHS or LHS of the G_ICMP is defined by a SUB 5115 MachineInstr *LHSDef = getDefIgnoringCopies(LHS.getReg(), MRI); 5116 MachineInstr *RHSDef = getDefIgnoringCopies(RHS.getReg(), MRI); 5117 auto P = static_cast<CmpInst::Predicate>(Predicate.getPredicate()); 5118 // Given this: 5119 // 5120 // x = G_SUB 0, y 5121 // G_ICMP x, z 5122 // 5123 // Produce this: 5124 // 5125 // cmn y, z 5126 if (isCMN(LHSDef, P, MRI)) 5127 return emitCMN(LHSDef->getOperand(2), RHS, MIRBuilder); 5128 5129 // Same idea here, but with the RHS of the compare instead: 5130 // 5131 // Given this: 5132 // 5133 // x = G_SUB 0, y 5134 // G_ICMP z, x 5135 // 5136 // Produce this: 5137 // 5138 // cmn z, y 5139 if (isCMN(RHSDef, P, MRI)) 5140 return emitCMN(LHS, RHSDef->getOperand(2), MIRBuilder); 5141 5142 // Given this: 5143 // 5144 // z = G_AND x, y 5145 // G_ICMP z, 0 5146 // 5147 // Produce this if the compare is signed: 5148 // 5149 // tst x, y 5150 if (!CmpInst::isUnsigned(P) && LHSDef && 5151 LHSDef->getOpcode() == TargetOpcode::G_AND) { 5152 // Make sure that the RHS is 0. 5153 auto ValAndVReg = getIConstantVRegValWithLookThrough(RHS.getReg(), MRI); 5154 if (!ValAndVReg || ValAndVReg->Value != 0) 5155 return nullptr; 5156 5157 return emitTST(LHSDef->getOperand(1), 5158 LHSDef->getOperand(2), MIRBuilder); 5159 } 5160 5161 return nullptr; 5162 } 5163 5164 bool AArch64InstructionSelector::selectShuffleVector( 5165 MachineInstr &I, MachineRegisterInfo &MRI) { 5166 const LLT DstTy = MRI.getType(I.getOperand(0).getReg()); 5167 Register Src1Reg = I.getOperand(1).getReg(); 5168 const LLT Src1Ty = MRI.getType(Src1Reg); 5169 Register Src2Reg = I.getOperand(2).getReg(); 5170 const LLT Src2Ty = MRI.getType(Src2Reg); 5171 ArrayRef<int> Mask = I.getOperand(3).getShuffleMask(); 5172 5173 MachineBasicBlock &MBB = *I.getParent(); 5174 MachineFunction &MF = *MBB.getParent(); 5175 LLVMContext &Ctx = MF.getFunction().getContext(); 5176 5177 // G_SHUFFLE_VECTOR is weird in that the source operands can be scalars, if 5178 // it's originated from a <1 x T> type. Those should have been lowered into 5179 // G_BUILD_VECTOR earlier. 5180 if (!Src1Ty.isVector() || !Src2Ty.isVector()) { 5181 LLVM_DEBUG(dbgs() << "Could not select a \"scalar\" G_SHUFFLE_VECTOR\n"); 5182 return false; 5183 } 5184 5185 unsigned BytesPerElt = DstTy.getElementType().getSizeInBits() / 8; 5186 5187 SmallVector<Constant *, 64> CstIdxs; 5188 for (int Val : Mask) { 5189 // For now, any undef indexes we'll just assume to be 0. This should be 5190 // optimized in future, e.g. to select DUP etc. 5191 Val = Val < 0 ? 0 : Val; 5192 for (unsigned Byte = 0; Byte < BytesPerElt; ++Byte) { 5193 unsigned Offset = Byte + Val * BytesPerElt; 5194 CstIdxs.emplace_back(ConstantInt::get(Type::getInt8Ty(Ctx), Offset)); 5195 } 5196 } 5197 5198 // Use a constant pool to load the index vector for TBL. 5199 Constant *CPVal = ConstantVector::get(CstIdxs); 5200 MachineInstr *IndexLoad = emitLoadFromConstantPool(CPVal, MIB); 5201 if (!IndexLoad) { 5202 LLVM_DEBUG(dbgs() << "Could not load from a constant pool"); 5203 return false; 5204 } 5205 5206 if (DstTy.getSizeInBits() != 128) { 5207 assert(DstTy.getSizeInBits() == 64 && "Unexpected shuffle result ty"); 5208 // This case can be done with TBL1. 5209 MachineInstr *Concat = emitVectorConcat(None, Src1Reg, Src2Reg, MIB); 5210 if (!Concat) { 5211 LLVM_DEBUG(dbgs() << "Could not do vector concat for tbl1"); 5212 return false; 5213 } 5214 5215 // The constant pool load will be 64 bits, so need to convert to FPR128 reg. 5216 IndexLoad = emitScalarToVector(64, &AArch64::FPR128RegClass, 5217 IndexLoad->getOperand(0).getReg(), MIB); 5218 5219 auto TBL1 = MIB.buildInstr( 5220 AArch64::TBLv16i8One, {&AArch64::FPR128RegClass}, 5221 {Concat->getOperand(0).getReg(), IndexLoad->getOperand(0).getReg()}); 5222 constrainSelectedInstRegOperands(*TBL1, TII, TRI, RBI); 5223 5224 auto Copy = 5225 MIB.buildInstr(TargetOpcode::COPY, {I.getOperand(0).getReg()}, {}) 5226 .addReg(TBL1.getReg(0), 0, AArch64::dsub); 5227 RBI.constrainGenericRegister(Copy.getReg(0), AArch64::FPR64RegClass, MRI); 5228 I.eraseFromParent(); 5229 return true; 5230 } 5231 5232 // For TBL2 we need to emit a REG_SEQUENCE to tie together two consecutive 5233 // Q registers for regalloc. 5234 SmallVector<Register, 2> Regs = {Src1Reg, Src2Reg}; 5235 auto RegSeq = createQTuple(Regs, MIB); 5236 auto TBL2 = MIB.buildInstr(AArch64::TBLv16i8Two, {I.getOperand(0)}, 5237 {RegSeq, IndexLoad->getOperand(0)}); 5238 constrainSelectedInstRegOperands(*TBL2, TII, TRI, RBI); 5239 I.eraseFromParent(); 5240 return true; 5241 } 5242 5243 MachineInstr *AArch64InstructionSelector::emitLaneInsert( 5244 Optional<Register> DstReg, Register SrcReg, Register EltReg, 5245 unsigned LaneIdx, const RegisterBank &RB, 5246 MachineIRBuilder &MIRBuilder) const { 5247 MachineInstr *InsElt = nullptr; 5248 const TargetRegisterClass *DstRC = &AArch64::FPR128RegClass; 5249 MachineRegisterInfo &MRI = *MIRBuilder.getMRI(); 5250 5251 // Create a register to define with the insert if one wasn't passed in. 5252 if (!DstReg) 5253 DstReg = MRI.createVirtualRegister(DstRC); 5254 5255 unsigned EltSize = MRI.getType(EltReg).getSizeInBits(); 5256 unsigned Opc = getInsertVecEltOpInfo(RB, EltSize).first; 5257 5258 if (RB.getID() == AArch64::FPRRegBankID) { 5259 auto InsSub = emitScalarToVector(EltSize, DstRC, EltReg, MIRBuilder); 5260 InsElt = MIRBuilder.buildInstr(Opc, {*DstReg}, {SrcReg}) 5261 .addImm(LaneIdx) 5262 .addUse(InsSub->getOperand(0).getReg()) 5263 .addImm(0); 5264 } else { 5265 InsElt = MIRBuilder.buildInstr(Opc, {*DstReg}, {SrcReg}) 5266 .addImm(LaneIdx) 5267 .addUse(EltReg); 5268 } 5269 5270 constrainSelectedInstRegOperands(*InsElt, TII, TRI, RBI); 5271 return InsElt; 5272 } 5273 5274 bool AArch64InstructionSelector::selectUSMovFromExtend( 5275 MachineInstr &MI, MachineRegisterInfo &MRI) { 5276 if (MI.getOpcode() != TargetOpcode::G_SEXT && 5277 MI.getOpcode() != TargetOpcode::G_ZEXT && 5278 MI.getOpcode() != TargetOpcode::G_ANYEXT) 5279 return false; 5280 bool IsSigned = MI.getOpcode() == TargetOpcode::G_SEXT; 5281 const Register DefReg = MI.getOperand(0).getReg(); 5282 const LLT DstTy = MRI.getType(DefReg); 5283 unsigned DstSize = DstTy.getSizeInBits(); 5284 5285 if (DstSize != 32 && DstSize != 64) 5286 return false; 5287 5288 MachineInstr *Extract = getOpcodeDef(TargetOpcode::G_EXTRACT_VECTOR_ELT, 5289 MI.getOperand(1).getReg(), MRI); 5290 int64_t Lane; 5291 if (!Extract || !mi_match(Extract->getOperand(2).getReg(), MRI, m_ICst(Lane))) 5292 return false; 5293 Register Src0 = Extract->getOperand(1).getReg(); 5294 5295 const LLT &VecTy = MRI.getType(Src0); 5296 5297 if (VecTy.getSizeInBits() != 128) { 5298 const MachineInstr *ScalarToVector = emitScalarToVector( 5299 VecTy.getSizeInBits(), &AArch64::FPR128RegClass, Src0, MIB); 5300 assert(ScalarToVector && "Didn't expect emitScalarToVector to fail!"); 5301 Src0 = ScalarToVector->getOperand(0).getReg(); 5302 } 5303 5304 unsigned Opcode; 5305 if (DstSize == 64 && VecTy.getScalarSizeInBits() == 32) 5306 Opcode = IsSigned ? AArch64::SMOVvi32to64 : AArch64::UMOVvi32; 5307 else if (DstSize == 64 && VecTy.getScalarSizeInBits() == 16) 5308 Opcode = IsSigned ? AArch64::SMOVvi16to64 : AArch64::UMOVvi16; 5309 else if (DstSize == 64 && VecTy.getScalarSizeInBits() == 8) 5310 Opcode = IsSigned ? AArch64::SMOVvi8to64 : AArch64::UMOVvi8; 5311 else if (DstSize == 32 && VecTy.getScalarSizeInBits() == 16) 5312 Opcode = IsSigned ? AArch64::SMOVvi16to32 : AArch64::UMOVvi16; 5313 else if (DstSize == 32 && VecTy.getScalarSizeInBits() == 8) 5314 Opcode = IsSigned ? AArch64::SMOVvi8to32 : AArch64::UMOVvi8; 5315 else 5316 llvm_unreachable("Unexpected type combo for S/UMov!"); 5317 5318 // We may need to generate one of these, depending on the type and sign of the 5319 // input: 5320 // DstReg = SMOV Src0, Lane; 5321 // NewReg = UMOV Src0, Lane; DstReg = SUBREG_TO_REG NewReg, sub_32; 5322 MachineInstr *ExtI = nullptr; 5323 if (DstSize == 64 && !IsSigned) { 5324 Register NewReg = MRI.createVirtualRegister(&AArch64::GPR32RegClass); 5325 MIB.buildInstr(Opcode, {NewReg}, {Src0}).addImm(Lane); 5326 ExtI = MIB.buildInstr(AArch64::SUBREG_TO_REG, {DefReg}, {}) 5327 .addImm(0) 5328 .addUse(NewReg) 5329 .addImm(AArch64::sub_32); 5330 RBI.constrainGenericRegister(DefReg, AArch64::GPR64RegClass, MRI); 5331 } else 5332 ExtI = MIB.buildInstr(Opcode, {DefReg}, {Src0}).addImm(Lane); 5333 5334 constrainSelectedInstRegOperands(*ExtI, TII, TRI, RBI); 5335 MI.eraseFromParent(); 5336 return true; 5337 } 5338 5339 bool AArch64InstructionSelector::selectInsertElt(MachineInstr &I, 5340 MachineRegisterInfo &MRI) { 5341 assert(I.getOpcode() == TargetOpcode::G_INSERT_VECTOR_ELT); 5342 5343 // Get information on the destination. 5344 Register DstReg = I.getOperand(0).getReg(); 5345 const LLT DstTy = MRI.getType(DstReg); 5346 unsigned VecSize = DstTy.getSizeInBits(); 5347 5348 // Get information on the element we want to insert into the destination. 5349 Register EltReg = I.getOperand(2).getReg(); 5350 const LLT EltTy = MRI.getType(EltReg); 5351 unsigned EltSize = EltTy.getSizeInBits(); 5352 if (EltSize < 16 || EltSize > 64) 5353 return false; // Don't support all element types yet. 5354 5355 // Find the definition of the index. Bail out if it's not defined by a 5356 // G_CONSTANT. 5357 Register IdxReg = I.getOperand(3).getReg(); 5358 auto VRegAndVal = getIConstantVRegValWithLookThrough(IdxReg, MRI); 5359 if (!VRegAndVal) 5360 return false; 5361 unsigned LaneIdx = VRegAndVal->Value.getSExtValue(); 5362 5363 // Perform the lane insert. 5364 Register SrcReg = I.getOperand(1).getReg(); 5365 const RegisterBank &EltRB = *RBI.getRegBank(EltReg, MRI, TRI); 5366 5367 if (VecSize < 128) { 5368 // If the vector we're inserting into is smaller than 128 bits, widen it 5369 // to 128 to do the insert. 5370 MachineInstr *ScalarToVec = 5371 emitScalarToVector(VecSize, &AArch64::FPR128RegClass, SrcReg, MIB); 5372 if (!ScalarToVec) 5373 return false; 5374 SrcReg = ScalarToVec->getOperand(0).getReg(); 5375 } 5376 5377 // Create an insert into a new FPR128 register. 5378 // Note that if our vector is already 128 bits, we end up emitting an extra 5379 // register. 5380 MachineInstr *InsMI = 5381 emitLaneInsert(None, SrcReg, EltReg, LaneIdx, EltRB, MIB); 5382 5383 if (VecSize < 128) { 5384 // If we had to widen to perform the insert, then we have to demote back to 5385 // the original size to get the result we want. 5386 Register DemoteVec = InsMI->getOperand(0).getReg(); 5387 const TargetRegisterClass *RC = 5388 getRegClassForTypeOnBank(DstTy, *RBI.getRegBank(DemoteVec, MRI, TRI)); 5389 if (RC != &AArch64::FPR32RegClass && RC != &AArch64::FPR64RegClass) { 5390 LLVM_DEBUG(dbgs() << "Unsupported register class!\n"); 5391 return false; 5392 } 5393 unsigned SubReg = 0; 5394 if (!getSubRegForClass(RC, TRI, SubReg)) 5395 return false; 5396 if (SubReg != AArch64::ssub && SubReg != AArch64::dsub) { 5397 LLVM_DEBUG(dbgs() << "Unsupported destination size! (" << VecSize 5398 << "\n"); 5399 return false; 5400 } 5401 MIB.buildInstr(TargetOpcode::COPY, {DstReg}, {}) 5402 .addReg(DemoteVec, 0, SubReg); 5403 RBI.constrainGenericRegister(DstReg, *RC, MRI); 5404 } else { 5405 // No widening needed. 5406 InsMI->getOperand(0).setReg(DstReg); 5407 constrainSelectedInstRegOperands(*InsMI, TII, TRI, RBI); 5408 } 5409 5410 I.eraseFromParent(); 5411 return true; 5412 } 5413 5414 MachineInstr * 5415 AArch64InstructionSelector::emitConstantVector(Register Dst, Constant *CV, 5416 MachineIRBuilder &MIRBuilder, 5417 MachineRegisterInfo &MRI) { 5418 LLT DstTy = MRI.getType(Dst); 5419 unsigned DstSize = DstTy.getSizeInBits(); 5420 if (CV->isNullValue()) { 5421 if (DstSize == 128) { 5422 auto Mov = 5423 MIRBuilder.buildInstr(AArch64::MOVIv2d_ns, {Dst}, {}).addImm(0); 5424 constrainSelectedInstRegOperands(*Mov, TII, TRI, RBI); 5425 return &*Mov; 5426 } 5427 5428 if (DstSize == 64) { 5429 auto Mov = 5430 MIRBuilder 5431 .buildInstr(AArch64::MOVIv2d_ns, {&AArch64::FPR128RegClass}, {}) 5432 .addImm(0); 5433 auto Copy = MIRBuilder.buildInstr(TargetOpcode::COPY, {Dst}, {}) 5434 .addReg(Mov.getReg(0), 0, AArch64::dsub); 5435 RBI.constrainGenericRegister(Dst, AArch64::FPR64RegClass, MRI); 5436 return &*Copy; 5437 } 5438 } 5439 5440 auto *CPLoad = emitLoadFromConstantPool(CV, MIRBuilder); 5441 if (!CPLoad) { 5442 LLVM_DEBUG(dbgs() << "Could not generate cp load for constant vector!"); 5443 return nullptr; 5444 } 5445 5446 auto Copy = MIRBuilder.buildCopy(Dst, CPLoad->getOperand(0)); 5447 RBI.constrainGenericRegister( 5448 Dst, *MRI.getRegClass(CPLoad->getOperand(0).getReg()), MRI); 5449 return &*Copy; 5450 } 5451 5452 bool AArch64InstructionSelector::tryOptConstantBuildVec( 5453 MachineInstr &I, LLT DstTy, MachineRegisterInfo &MRI) { 5454 assert(I.getOpcode() == TargetOpcode::G_BUILD_VECTOR); 5455 unsigned DstSize = DstTy.getSizeInBits(); 5456 assert(DstSize <= 128 && "Unexpected build_vec type!"); 5457 if (DstSize < 32) 5458 return false; 5459 // Check if we're building a constant vector, in which case we want to 5460 // generate a constant pool load instead of a vector insert sequence. 5461 SmallVector<Constant *, 16> Csts; 5462 for (unsigned Idx = 1; Idx < I.getNumOperands(); ++Idx) { 5463 // Try to find G_CONSTANT or G_FCONSTANT 5464 auto *OpMI = 5465 getOpcodeDef(TargetOpcode::G_CONSTANT, I.getOperand(Idx).getReg(), MRI); 5466 if (OpMI) 5467 Csts.emplace_back( 5468 const_cast<ConstantInt *>(OpMI->getOperand(1).getCImm())); 5469 else if ((OpMI = getOpcodeDef(TargetOpcode::G_FCONSTANT, 5470 I.getOperand(Idx).getReg(), MRI))) 5471 Csts.emplace_back( 5472 const_cast<ConstantFP *>(OpMI->getOperand(1).getFPImm())); 5473 else 5474 return false; 5475 } 5476 Constant *CV = ConstantVector::get(Csts); 5477 if (!emitConstantVector(I.getOperand(0).getReg(), CV, MIB, MRI)) 5478 return false; 5479 I.eraseFromParent(); 5480 return true; 5481 } 5482 5483 bool AArch64InstructionSelector::tryOptBuildVecToSubregToReg( 5484 MachineInstr &I, MachineRegisterInfo &MRI) { 5485 // Given: 5486 // %vec = G_BUILD_VECTOR %elt, %undef, %undef, ... %undef 5487 // 5488 // Select the G_BUILD_VECTOR as a SUBREG_TO_REG from %elt. 5489 Register Dst = I.getOperand(0).getReg(); 5490 Register EltReg = I.getOperand(1).getReg(); 5491 LLT EltTy = MRI.getType(EltReg); 5492 // If the index isn't on the same bank as its elements, then this can't be a 5493 // SUBREG_TO_REG. 5494 const RegisterBank &EltRB = *RBI.getRegBank(EltReg, MRI, TRI); 5495 const RegisterBank &DstRB = *RBI.getRegBank(Dst, MRI, TRI); 5496 if (EltRB != DstRB) 5497 return false; 5498 if (any_of(make_range(I.operands_begin() + 2, I.operands_end()), 5499 [&MRI](const MachineOperand &Op) { 5500 return !getOpcodeDef(TargetOpcode::G_IMPLICIT_DEF, Op.getReg(), 5501 MRI); 5502 })) 5503 return false; 5504 unsigned SubReg; 5505 const TargetRegisterClass *EltRC = getRegClassForTypeOnBank(EltTy, EltRB); 5506 if (!EltRC) 5507 return false; 5508 const TargetRegisterClass *DstRC = 5509 getRegClassForTypeOnBank(MRI.getType(Dst), DstRB); 5510 if (!DstRC) 5511 return false; 5512 if (!getSubRegForClass(EltRC, TRI, SubReg)) 5513 return false; 5514 auto SubregToReg = MIB.buildInstr(AArch64::SUBREG_TO_REG, {Dst}, {}) 5515 .addImm(0) 5516 .addUse(EltReg) 5517 .addImm(SubReg); 5518 I.eraseFromParent(); 5519 constrainSelectedInstRegOperands(*SubregToReg, TII, TRI, RBI); 5520 return RBI.constrainGenericRegister(Dst, *DstRC, MRI); 5521 } 5522 5523 bool AArch64InstructionSelector::selectBuildVector(MachineInstr &I, 5524 MachineRegisterInfo &MRI) { 5525 assert(I.getOpcode() == TargetOpcode::G_BUILD_VECTOR); 5526 // Until we port more of the optimized selections, for now just use a vector 5527 // insert sequence. 5528 const LLT DstTy = MRI.getType(I.getOperand(0).getReg()); 5529 const LLT EltTy = MRI.getType(I.getOperand(1).getReg()); 5530 unsigned EltSize = EltTy.getSizeInBits(); 5531 5532 if (tryOptConstantBuildVec(I, DstTy, MRI)) 5533 return true; 5534 if (tryOptBuildVecToSubregToReg(I, MRI)) 5535 return true; 5536 5537 if (EltSize < 16 || EltSize > 64) 5538 return false; // Don't support all element types yet. 5539 const RegisterBank &RB = *RBI.getRegBank(I.getOperand(1).getReg(), MRI, TRI); 5540 5541 const TargetRegisterClass *DstRC = &AArch64::FPR128RegClass; 5542 MachineInstr *ScalarToVec = 5543 emitScalarToVector(DstTy.getElementType().getSizeInBits(), DstRC, 5544 I.getOperand(1).getReg(), MIB); 5545 if (!ScalarToVec) 5546 return false; 5547 5548 Register DstVec = ScalarToVec->getOperand(0).getReg(); 5549 unsigned DstSize = DstTy.getSizeInBits(); 5550 5551 // Keep track of the last MI we inserted. Later on, we might be able to save 5552 // a copy using it. 5553 MachineInstr *PrevMI = nullptr; 5554 for (unsigned i = 2, e = DstSize / EltSize + 1; i < e; ++i) { 5555 // Note that if we don't do a subregister copy, we can end up making an 5556 // extra register. 5557 PrevMI = &*emitLaneInsert(None, DstVec, I.getOperand(i).getReg(), i - 1, RB, 5558 MIB); 5559 DstVec = PrevMI->getOperand(0).getReg(); 5560 } 5561 5562 // If DstTy's size in bits is less than 128, then emit a subregister copy 5563 // from DstVec to the last register we've defined. 5564 if (DstSize < 128) { 5565 // Force this to be FPR using the destination vector. 5566 const TargetRegisterClass *RC = 5567 getRegClassForTypeOnBank(DstTy, *RBI.getRegBank(DstVec, MRI, TRI)); 5568 if (!RC) 5569 return false; 5570 if (RC != &AArch64::FPR32RegClass && RC != &AArch64::FPR64RegClass) { 5571 LLVM_DEBUG(dbgs() << "Unsupported register class!\n"); 5572 return false; 5573 } 5574 5575 unsigned SubReg = 0; 5576 if (!getSubRegForClass(RC, TRI, SubReg)) 5577 return false; 5578 if (SubReg != AArch64::ssub && SubReg != AArch64::dsub) { 5579 LLVM_DEBUG(dbgs() << "Unsupported destination size! (" << DstSize 5580 << "\n"); 5581 return false; 5582 } 5583 5584 Register Reg = MRI.createVirtualRegister(RC); 5585 Register DstReg = I.getOperand(0).getReg(); 5586 5587 MIB.buildInstr(TargetOpcode::COPY, {DstReg}, {}).addReg(DstVec, 0, SubReg); 5588 MachineOperand &RegOp = I.getOperand(1); 5589 RegOp.setReg(Reg); 5590 RBI.constrainGenericRegister(DstReg, *RC, MRI); 5591 } else { 5592 // We don't need a subregister copy. Save a copy by re-using the 5593 // destination register on the final insert. 5594 assert(PrevMI && "PrevMI was null?"); 5595 PrevMI->getOperand(0).setReg(I.getOperand(0).getReg()); 5596 constrainSelectedInstRegOperands(*PrevMI, TII, TRI, RBI); 5597 } 5598 5599 I.eraseFromParent(); 5600 return true; 5601 } 5602 5603 bool AArch64InstructionSelector::selectVectorLoadIntrinsic(unsigned Opc, 5604 unsigned NumVecs, 5605 MachineInstr &I) { 5606 assert(I.getOpcode() == TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS); 5607 assert(Opc && "Expected an opcode?"); 5608 assert(NumVecs > 1 && NumVecs < 5 && "Only support 2, 3, or 4 vectors"); 5609 auto &MRI = *MIB.getMRI(); 5610 LLT Ty = MRI.getType(I.getOperand(0).getReg()); 5611 unsigned Size = Ty.getSizeInBits(); 5612 assert((Size == 64 || Size == 128) && 5613 "Destination must be 64 bits or 128 bits?"); 5614 unsigned SubReg = Size == 64 ? AArch64::dsub0 : AArch64::qsub0; 5615 auto Ptr = I.getOperand(I.getNumOperands() - 1).getReg(); 5616 assert(MRI.getType(Ptr).isPointer() && "Expected a pointer type?"); 5617 auto Load = MIB.buildInstr(Opc, {Ty}, {Ptr}); 5618 Load.cloneMemRefs(I); 5619 constrainSelectedInstRegOperands(*Load, TII, TRI, RBI); 5620 Register SelectedLoadDst = Load->getOperand(0).getReg(); 5621 for (unsigned Idx = 0; Idx < NumVecs; ++Idx) { 5622 auto Vec = MIB.buildInstr(TargetOpcode::COPY, {I.getOperand(Idx)}, {}) 5623 .addReg(SelectedLoadDst, 0, SubReg + Idx); 5624 // Emit the subreg copies and immediately select them. 5625 // FIXME: We should refactor our copy code into an emitCopy helper and 5626 // clean up uses of this pattern elsewhere in the selector. 5627 selectCopy(*Vec, TII, MRI, TRI, RBI); 5628 } 5629 return true; 5630 } 5631 5632 bool AArch64InstructionSelector::selectIntrinsicWithSideEffects( 5633 MachineInstr &I, MachineRegisterInfo &MRI) { 5634 // Find the intrinsic ID. 5635 unsigned IntrinID = I.getIntrinsicID(); 5636 5637 const LLT S8 = LLT::scalar(8); 5638 const LLT S16 = LLT::scalar(16); 5639 const LLT S32 = LLT::scalar(32); 5640 const LLT S64 = LLT::scalar(64); 5641 const LLT P0 = LLT::pointer(0, 64); 5642 // Select the instruction. 5643 switch (IntrinID) { 5644 default: 5645 return false; 5646 case Intrinsic::aarch64_ldxp: 5647 case Intrinsic::aarch64_ldaxp: { 5648 auto NewI = MIB.buildInstr( 5649 IntrinID == Intrinsic::aarch64_ldxp ? AArch64::LDXPX : AArch64::LDAXPX, 5650 {I.getOperand(0).getReg(), I.getOperand(1).getReg()}, 5651 {I.getOperand(3)}); 5652 NewI.cloneMemRefs(I); 5653 constrainSelectedInstRegOperands(*NewI, TII, TRI, RBI); 5654 break; 5655 } 5656 case Intrinsic::trap: 5657 MIB.buildInstr(AArch64::BRK, {}, {}).addImm(1); 5658 break; 5659 case Intrinsic::debugtrap: 5660 MIB.buildInstr(AArch64::BRK, {}, {}).addImm(0xF000); 5661 break; 5662 case Intrinsic::ubsantrap: 5663 MIB.buildInstr(AArch64::BRK, {}, {}) 5664 .addImm(I.getOperand(1).getImm() | ('U' << 8)); 5665 break; 5666 case Intrinsic::aarch64_neon_ld2: { 5667 LLT Ty = MRI.getType(I.getOperand(0).getReg()); 5668 unsigned Opc = 0; 5669 if (Ty == LLT::fixed_vector(8, S8)) 5670 Opc = AArch64::LD2Twov8b; 5671 else if (Ty == LLT::fixed_vector(16, S8)) 5672 Opc = AArch64::LD2Twov16b; 5673 else if (Ty == LLT::fixed_vector(4, S16)) 5674 Opc = AArch64::LD2Twov4h; 5675 else if (Ty == LLT::fixed_vector(8, S16)) 5676 Opc = AArch64::LD2Twov8h; 5677 else if (Ty == LLT::fixed_vector(2, S32)) 5678 Opc = AArch64::LD2Twov2s; 5679 else if (Ty == LLT::fixed_vector(4, S32)) 5680 Opc = AArch64::LD2Twov4s; 5681 else if (Ty == LLT::fixed_vector(2, S64) || Ty == LLT::fixed_vector(2, P0)) 5682 Opc = AArch64::LD2Twov2d; 5683 else if (Ty == S64 || Ty == P0) 5684 Opc = AArch64::LD1Twov1d; 5685 else 5686 llvm_unreachable("Unexpected type for ld2!"); 5687 selectVectorLoadIntrinsic(Opc, 2, I); 5688 break; 5689 } 5690 case Intrinsic::aarch64_neon_ld4: { 5691 LLT Ty = MRI.getType(I.getOperand(0).getReg()); 5692 unsigned Opc = 0; 5693 if (Ty == LLT::fixed_vector(8, S8)) 5694 Opc = AArch64::LD4Fourv8b; 5695 else if (Ty == LLT::fixed_vector(16, S8)) 5696 Opc = AArch64::LD4Fourv16b; 5697 else if (Ty == LLT::fixed_vector(4, S16)) 5698 Opc = AArch64::LD4Fourv4h; 5699 else if (Ty == LLT::fixed_vector(8, S16)) 5700 Opc = AArch64::LD4Fourv8h; 5701 else if (Ty == LLT::fixed_vector(2, S32)) 5702 Opc = AArch64::LD4Fourv2s; 5703 else if (Ty == LLT::fixed_vector(4, S32)) 5704 Opc = AArch64::LD4Fourv4s; 5705 else if (Ty == LLT::fixed_vector(2, S64) || Ty == LLT::fixed_vector(2, P0)) 5706 Opc = AArch64::LD4Fourv2d; 5707 else if (Ty == S64 || Ty == P0) 5708 Opc = AArch64::LD1Fourv1d; 5709 else 5710 llvm_unreachable("Unexpected type for ld4!"); 5711 selectVectorLoadIntrinsic(Opc, 4, I); 5712 break; 5713 } 5714 case Intrinsic::aarch64_neon_st2: { 5715 Register Src1 = I.getOperand(1).getReg(); 5716 Register Src2 = I.getOperand(2).getReg(); 5717 Register Ptr = I.getOperand(3).getReg(); 5718 LLT Ty = MRI.getType(Src1); 5719 unsigned Opc; 5720 if (Ty == LLT::fixed_vector(8, S8)) 5721 Opc = AArch64::ST2Twov8b; 5722 else if (Ty == LLT::fixed_vector(16, S8)) 5723 Opc = AArch64::ST2Twov16b; 5724 else if (Ty == LLT::fixed_vector(4, S16)) 5725 Opc = AArch64::ST2Twov4h; 5726 else if (Ty == LLT::fixed_vector(8, S16)) 5727 Opc = AArch64::ST2Twov8h; 5728 else if (Ty == LLT::fixed_vector(2, S32)) 5729 Opc = AArch64::ST2Twov2s; 5730 else if (Ty == LLT::fixed_vector(4, S32)) 5731 Opc = AArch64::ST2Twov4s; 5732 else if (Ty == LLT::fixed_vector(2, S64) || Ty == LLT::fixed_vector(2, P0)) 5733 Opc = AArch64::ST2Twov2d; 5734 else if (Ty == S64 || Ty == P0) 5735 Opc = AArch64::ST1Twov1d; 5736 else 5737 llvm_unreachable("Unexpected type for st2!"); 5738 SmallVector<Register, 2> Regs = {Src1, Src2}; 5739 Register Tuple = Ty.getSizeInBits() == 128 ? createQTuple(Regs, MIB) 5740 : createDTuple(Regs, MIB); 5741 auto Store = MIB.buildInstr(Opc, {}, {Tuple, Ptr}); 5742 Store.cloneMemRefs(I); 5743 constrainSelectedInstRegOperands(*Store, TII, TRI, RBI); 5744 break; 5745 } 5746 case Intrinsic::aarch64_mops_memset_tag: { 5747 // Transform 5748 // %dst:gpr(p0) = \ 5749 // G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.aarch64.mops.memset.tag), 5750 // \ %dst:gpr(p0), %val:gpr(s64), %n:gpr(s64) 5751 // where %dst is updated, into 5752 // %Rd:GPR64common, %Rn:GPR64) = \ 5753 // MOPSMemorySetTaggingPseudo \ 5754 // %Rd:GPR64common, %Rn:GPR64, %Rm:GPR64 5755 // where Rd and Rn are tied. 5756 // It is expected that %val has been extended to s64 in legalization. 5757 // Note that the order of the size/value operands are swapped. 5758 5759 Register DstDef = I.getOperand(0).getReg(); 5760 // I.getOperand(1) is the intrinsic function 5761 Register DstUse = I.getOperand(2).getReg(); 5762 Register ValUse = I.getOperand(3).getReg(); 5763 Register SizeUse = I.getOperand(4).getReg(); 5764 5765 // MOPSMemorySetTaggingPseudo has two defs; the intrinsic call has only one. 5766 // Therefore an additional virtual register is requried for the updated size 5767 // operand. This value is not accessible via the semantics of the intrinsic. 5768 Register SizeDef = MRI.createGenericVirtualRegister(LLT::scalar(64)); 5769 5770 auto Memset = MIB.buildInstr(AArch64::MOPSMemorySetTaggingPseudo, 5771 {DstDef, SizeDef}, {DstUse, SizeUse, ValUse}); 5772 Memset.cloneMemRefs(I); 5773 constrainSelectedInstRegOperands(*Memset, TII, TRI, RBI); 5774 break; 5775 } 5776 } 5777 5778 I.eraseFromParent(); 5779 return true; 5780 } 5781 5782 bool AArch64InstructionSelector::selectIntrinsic(MachineInstr &I, 5783 MachineRegisterInfo &MRI) { 5784 unsigned IntrinID = I.getIntrinsicID(); 5785 5786 switch (IntrinID) { 5787 default: 5788 break; 5789 case Intrinsic::aarch64_crypto_sha1h: { 5790 Register DstReg = I.getOperand(0).getReg(); 5791 Register SrcReg = I.getOperand(2).getReg(); 5792 5793 // FIXME: Should this be an assert? 5794 if (MRI.getType(DstReg).getSizeInBits() != 32 || 5795 MRI.getType(SrcReg).getSizeInBits() != 32) 5796 return false; 5797 5798 // The operation has to happen on FPRs. Set up some new FPR registers for 5799 // the source and destination if they are on GPRs. 5800 if (RBI.getRegBank(SrcReg, MRI, TRI)->getID() != AArch64::FPRRegBankID) { 5801 SrcReg = MRI.createVirtualRegister(&AArch64::FPR32RegClass); 5802 MIB.buildCopy({SrcReg}, {I.getOperand(2)}); 5803 5804 // Make sure the copy ends up getting constrained properly. 5805 RBI.constrainGenericRegister(I.getOperand(2).getReg(), 5806 AArch64::GPR32RegClass, MRI); 5807 } 5808 5809 if (RBI.getRegBank(DstReg, MRI, TRI)->getID() != AArch64::FPRRegBankID) 5810 DstReg = MRI.createVirtualRegister(&AArch64::FPR32RegClass); 5811 5812 // Actually insert the instruction. 5813 auto SHA1Inst = MIB.buildInstr(AArch64::SHA1Hrr, {DstReg}, {SrcReg}); 5814 constrainSelectedInstRegOperands(*SHA1Inst, TII, TRI, RBI); 5815 5816 // Did we create a new register for the destination? 5817 if (DstReg != I.getOperand(0).getReg()) { 5818 // Yep. Copy the result of the instruction back into the original 5819 // destination. 5820 MIB.buildCopy({I.getOperand(0)}, {DstReg}); 5821 RBI.constrainGenericRegister(I.getOperand(0).getReg(), 5822 AArch64::GPR32RegClass, MRI); 5823 } 5824 5825 I.eraseFromParent(); 5826 return true; 5827 } 5828 case Intrinsic::ptrauth_sign: { 5829 Register DstReg = I.getOperand(0).getReg(); 5830 Register ValReg = I.getOperand(2).getReg(); 5831 uint64_t Key = I.getOperand(3).getImm(); 5832 Register DiscReg = I.getOperand(4).getReg(); 5833 auto DiscVal = getIConstantVRegVal(DiscReg, MRI); 5834 bool IsDiscZero = DiscVal && DiscVal->isNullValue(); 5835 5836 if (Key > 3) 5837 return false; 5838 5839 unsigned Opcodes[][4] = { 5840 {AArch64::PACIA, AArch64::PACIB, AArch64::PACDA, AArch64::PACDB}, 5841 {AArch64::PACIZA, AArch64::PACIZB, AArch64::PACDZA, AArch64::PACDZB}}; 5842 unsigned Opcode = Opcodes[IsDiscZero][Key]; 5843 5844 auto PAC = MIB.buildInstr(Opcode, {DstReg}, {ValReg}); 5845 5846 if (!IsDiscZero) { 5847 PAC.addUse(DiscReg); 5848 RBI.constrainGenericRegister(DiscReg, AArch64::GPR64spRegClass, MRI); 5849 } 5850 5851 RBI.constrainGenericRegister(DstReg, AArch64::GPR64RegClass, MRI); 5852 I.eraseFromParent(); 5853 return true; 5854 } 5855 case Intrinsic::frameaddress: 5856 case Intrinsic::returnaddress: { 5857 MachineFunction &MF = *I.getParent()->getParent(); 5858 MachineFrameInfo &MFI = MF.getFrameInfo(); 5859 5860 unsigned Depth = I.getOperand(2).getImm(); 5861 Register DstReg = I.getOperand(0).getReg(); 5862 RBI.constrainGenericRegister(DstReg, AArch64::GPR64RegClass, MRI); 5863 5864 if (Depth == 0 && IntrinID == Intrinsic::returnaddress) { 5865 if (!MFReturnAddr) { 5866 // Insert the copy from LR/X30 into the entry block, before it can be 5867 // clobbered by anything. 5868 MFI.setReturnAddressIsTaken(true); 5869 MFReturnAddr = getFunctionLiveInPhysReg( 5870 MF, TII, AArch64::LR, AArch64::GPR64RegClass, I.getDebugLoc()); 5871 } 5872 5873 if (STI.hasPAuth()) { 5874 MIB.buildInstr(AArch64::XPACI, {DstReg}, {MFReturnAddr}); 5875 } else { 5876 MIB.buildCopy({Register(AArch64::LR)}, {MFReturnAddr}); 5877 MIB.buildInstr(AArch64::XPACLRI); 5878 MIB.buildCopy({DstReg}, {Register(AArch64::LR)}); 5879 } 5880 5881 I.eraseFromParent(); 5882 return true; 5883 } 5884 5885 MFI.setFrameAddressIsTaken(true); 5886 Register FrameAddr(AArch64::FP); 5887 while (Depth--) { 5888 Register NextFrame = MRI.createVirtualRegister(&AArch64::GPR64spRegClass); 5889 auto Ldr = 5890 MIB.buildInstr(AArch64::LDRXui, {NextFrame}, {FrameAddr}).addImm(0); 5891 constrainSelectedInstRegOperands(*Ldr, TII, TRI, RBI); 5892 FrameAddr = NextFrame; 5893 } 5894 5895 if (IntrinID == Intrinsic::frameaddress) 5896 MIB.buildCopy({DstReg}, {FrameAddr}); 5897 else { 5898 MFI.setReturnAddressIsTaken(true); 5899 5900 if (STI.hasPAuth()) { 5901 Register TmpReg = MRI.createVirtualRegister(&AArch64::GPR64RegClass); 5902 MIB.buildInstr(AArch64::LDRXui, {TmpReg}, {FrameAddr}).addImm(1); 5903 MIB.buildInstr(AArch64::XPACI, {DstReg}, {TmpReg}); 5904 } else { 5905 MIB.buildInstr(AArch64::LDRXui, {Register(AArch64::LR)}, {FrameAddr}) 5906 .addImm(1); 5907 MIB.buildInstr(AArch64::XPACLRI); 5908 MIB.buildCopy({DstReg}, {Register(AArch64::LR)}); 5909 } 5910 } 5911 5912 I.eraseFromParent(); 5913 return true; 5914 } 5915 case Intrinsic::swift_async_context_addr: 5916 auto Sub = MIB.buildInstr(AArch64::SUBXri, {I.getOperand(0).getReg()}, 5917 {Register(AArch64::FP)}) 5918 .addImm(8) 5919 .addImm(0); 5920 constrainSelectedInstRegOperands(*Sub, TII, TRI, RBI); 5921 5922 MF->getFrameInfo().setFrameAddressIsTaken(true); 5923 MF->getInfo<AArch64FunctionInfo>()->setHasSwiftAsyncContext(true); 5924 I.eraseFromParent(); 5925 return true; 5926 } 5927 return false; 5928 } 5929 5930 InstructionSelector::ComplexRendererFns 5931 AArch64InstructionSelector::selectShiftA_32(const MachineOperand &Root) const { 5932 auto MaybeImmed = getImmedFromMO(Root); 5933 if (MaybeImmed == None || *MaybeImmed > 31) 5934 return None; 5935 uint64_t Enc = (32 - *MaybeImmed) & 0x1f; 5936 return {{[=](MachineInstrBuilder &MIB) { MIB.addImm(Enc); }}}; 5937 } 5938 5939 InstructionSelector::ComplexRendererFns 5940 AArch64InstructionSelector::selectShiftB_32(const MachineOperand &Root) const { 5941 auto MaybeImmed = getImmedFromMO(Root); 5942 if (MaybeImmed == None || *MaybeImmed > 31) 5943 return None; 5944 uint64_t Enc = 31 - *MaybeImmed; 5945 return {{[=](MachineInstrBuilder &MIB) { MIB.addImm(Enc); }}}; 5946 } 5947 5948 InstructionSelector::ComplexRendererFns 5949 AArch64InstructionSelector::selectShiftA_64(const MachineOperand &Root) const { 5950 auto MaybeImmed = getImmedFromMO(Root); 5951 if (MaybeImmed == None || *MaybeImmed > 63) 5952 return None; 5953 uint64_t Enc = (64 - *MaybeImmed) & 0x3f; 5954 return {{[=](MachineInstrBuilder &MIB) { MIB.addImm(Enc); }}}; 5955 } 5956 5957 InstructionSelector::ComplexRendererFns 5958 AArch64InstructionSelector::selectShiftB_64(const MachineOperand &Root) const { 5959 auto MaybeImmed = getImmedFromMO(Root); 5960 if (MaybeImmed == None || *MaybeImmed > 63) 5961 return None; 5962 uint64_t Enc = 63 - *MaybeImmed; 5963 return {{[=](MachineInstrBuilder &MIB) { MIB.addImm(Enc); }}}; 5964 } 5965 5966 /// Helper to select an immediate value that can be represented as a 12-bit 5967 /// value shifted left by either 0 or 12. If it is possible to do so, return 5968 /// the immediate and shift value. If not, return None. 5969 /// 5970 /// Used by selectArithImmed and selectNegArithImmed. 5971 InstructionSelector::ComplexRendererFns 5972 AArch64InstructionSelector::select12BitValueWithLeftShift( 5973 uint64_t Immed) const { 5974 unsigned ShiftAmt; 5975 if (Immed >> 12 == 0) { 5976 ShiftAmt = 0; 5977 } else if ((Immed & 0xfff) == 0 && Immed >> 24 == 0) { 5978 ShiftAmt = 12; 5979 Immed = Immed >> 12; 5980 } else 5981 return None; 5982 5983 unsigned ShVal = AArch64_AM::getShifterImm(AArch64_AM::LSL, ShiftAmt); 5984 return {{ 5985 [=](MachineInstrBuilder &MIB) { MIB.addImm(Immed); }, 5986 [=](MachineInstrBuilder &MIB) { MIB.addImm(ShVal); }, 5987 }}; 5988 } 5989 5990 /// SelectArithImmed - Select an immediate value that can be represented as 5991 /// a 12-bit value shifted left by either 0 or 12. If so, return true with 5992 /// Val set to the 12-bit value and Shift set to the shifter operand. 5993 InstructionSelector::ComplexRendererFns 5994 AArch64InstructionSelector::selectArithImmed(MachineOperand &Root) const { 5995 // This function is called from the addsub_shifted_imm ComplexPattern, 5996 // which lists [imm] as the list of opcode it's interested in, however 5997 // we still need to check whether the operand is actually an immediate 5998 // here because the ComplexPattern opcode list is only used in 5999 // root-level opcode matching. 6000 auto MaybeImmed = getImmedFromMO(Root); 6001 if (MaybeImmed == None) 6002 return None; 6003 return select12BitValueWithLeftShift(*MaybeImmed); 6004 } 6005 6006 /// SelectNegArithImmed - As above, but negates the value before trying to 6007 /// select it. 6008 InstructionSelector::ComplexRendererFns 6009 AArch64InstructionSelector::selectNegArithImmed(MachineOperand &Root) const { 6010 // We need a register here, because we need to know if we have a 64 or 32 6011 // bit immediate. 6012 if (!Root.isReg()) 6013 return None; 6014 auto MaybeImmed = getImmedFromMO(Root); 6015 if (MaybeImmed == None) 6016 return None; 6017 uint64_t Immed = *MaybeImmed; 6018 6019 // This negation is almost always valid, but "cmp wN, #0" and "cmn wN, #0" 6020 // have the opposite effect on the C flag, so this pattern mustn't match under 6021 // those circumstances. 6022 if (Immed == 0) 6023 return None; 6024 6025 // Check if we're dealing with a 32-bit type on the root or a 64-bit type on 6026 // the root. 6027 MachineRegisterInfo &MRI = Root.getParent()->getMF()->getRegInfo(); 6028 if (MRI.getType(Root.getReg()).getSizeInBits() == 32) 6029 Immed = ~((uint32_t)Immed) + 1; 6030 else 6031 Immed = ~Immed + 1ULL; 6032 6033 if (Immed & 0xFFFFFFFFFF000000ULL) 6034 return None; 6035 6036 Immed &= 0xFFFFFFULL; 6037 return select12BitValueWithLeftShift(Immed); 6038 } 6039 6040 /// Return true if it is worth folding MI into an extended register. That is, 6041 /// if it's safe to pull it into the addressing mode of a load or store as a 6042 /// shift. 6043 bool AArch64InstructionSelector::isWorthFoldingIntoExtendedReg( 6044 MachineInstr &MI, const MachineRegisterInfo &MRI) const { 6045 // Always fold if there is one use, or if we're optimizing for size. 6046 Register DefReg = MI.getOperand(0).getReg(); 6047 if (MRI.hasOneNonDBGUse(DefReg) || 6048 MI.getParent()->getParent()->getFunction().hasOptSize()) 6049 return true; 6050 6051 // It's better to avoid folding and recomputing shifts when we don't have a 6052 // fastpath. 6053 if (!STI.hasLSLFast()) 6054 return false; 6055 6056 // We have a fastpath, so folding a shift in and potentially computing it 6057 // many times may be beneficial. Check if this is only used in memory ops. 6058 // If it is, then we should fold. 6059 return all_of(MRI.use_nodbg_instructions(DefReg), 6060 [](MachineInstr &Use) { return Use.mayLoadOrStore(); }); 6061 } 6062 6063 static bool isSignExtendShiftType(AArch64_AM::ShiftExtendType Type) { 6064 switch (Type) { 6065 case AArch64_AM::SXTB: 6066 case AArch64_AM::SXTH: 6067 case AArch64_AM::SXTW: 6068 return true; 6069 default: 6070 return false; 6071 } 6072 } 6073 6074 InstructionSelector::ComplexRendererFns 6075 AArch64InstructionSelector::selectExtendedSHL( 6076 MachineOperand &Root, MachineOperand &Base, MachineOperand &Offset, 6077 unsigned SizeInBytes, bool WantsExt) const { 6078 assert(Base.isReg() && "Expected base to be a register operand"); 6079 assert(Offset.isReg() && "Expected offset to be a register operand"); 6080 6081 MachineRegisterInfo &MRI = Root.getParent()->getMF()->getRegInfo(); 6082 MachineInstr *OffsetInst = MRI.getVRegDef(Offset.getReg()); 6083 6084 unsigned OffsetOpc = OffsetInst->getOpcode(); 6085 bool LookedThroughZExt = false; 6086 if (OffsetOpc != TargetOpcode::G_SHL && OffsetOpc != TargetOpcode::G_MUL) { 6087 // Try to look through a ZEXT. 6088 if (OffsetOpc != TargetOpcode::G_ZEXT || !WantsExt) 6089 return None; 6090 6091 OffsetInst = MRI.getVRegDef(OffsetInst->getOperand(1).getReg()); 6092 OffsetOpc = OffsetInst->getOpcode(); 6093 LookedThroughZExt = true; 6094 6095 if (OffsetOpc != TargetOpcode::G_SHL && OffsetOpc != TargetOpcode::G_MUL) 6096 return None; 6097 } 6098 // Make sure that the memory op is a valid size. 6099 int64_t LegalShiftVal = Log2_32(SizeInBytes); 6100 if (LegalShiftVal == 0) 6101 return None; 6102 if (!isWorthFoldingIntoExtendedReg(*OffsetInst, MRI)) 6103 return None; 6104 6105 // Now, try to find the specific G_CONSTANT. Start by assuming that the 6106 // register we will offset is the LHS, and the register containing the 6107 // constant is the RHS. 6108 Register OffsetReg = OffsetInst->getOperand(1).getReg(); 6109 Register ConstantReg = OffsetInst->getOperand(2).getReg(); 6110 auto ValAndVReg = getIConstantVRegValWithLookThrough(ConstantReg, MRI); 6111 if (!ValAndVReg) { 6112 // We didn't get a constant on the RHS. If the opcode is a shift, then 6113 // we're done. 6114 if (OffsetOpc == TargetOpcode::G_SHL) 6115 return None; 6116 6117 // If we have a G_MUL, we can use either register. Try looking at the RHS. 6118 std::swap(OffsetReg, ConstantReg); 6119 ValAndVReg = getIConstantVRegValWithLookThrough(ConstantReg, MRI); 6120 if (!ValAndVReg) 6121 return None; 6122 } 6123 6124 // The value must fit into 3 bits, and must be positive. Make sure that is 6125 // true. 6126 int64_t ImmVal = ValAndVReg->Value.getSExtValue(); 6127 6128 // Since we're going to pull this into a shift, the constant value must be 6129 // a power of 2. If we got a multiply, then we need to check this. 6130 if (OffsetOpc == TargetOpcode::G_MUL) { 6131 if (!isPowerOf2_32(ImmVal)) 6132 return None; 6133 6134 // Got a power of 2. So, the amount we'll shift is the log base-2 of that. 6135 ImmVal = Log2_32(ImmVal); 6136 } 6137 6138 if ((ImmVal & 0x7) != ImmVal) 6139 return None; 6140 6141 // We are only allowed to shift by LegalShiftVal. This shift value is built 6142 // into the instruction, so we can't just use whatever we want. 6143 if (ImmVal != LegalShiftVal) 6144 return None; 6145 6146 unsigned SignExtend = 0; 6147 if (WantsExt) { 6148 // Check if the offset is defined by an extend, unless we looked through a 6149 // G_ZEXT earlier. 6150 if (!LookedThroughZExt) { 6151 MachineInstr *ExtInst = getDefIgnoringCopies(OffsetReg, MRI); 6152 auto Ext = getExtendTypeForInst(*ExtInst, MRI, true); 6153 if (Ext == AArch64_AM::InvalidShiftExtend) 6154 return None; 6155 6156 SignExtend = isSignExtendShiftType(Ext) ? 1 : 0; 6157 // We only support SXTW for signed extension here. 6158 if (SignExtend && Ext != AArch64_AM::SXTW) 6159 return None; 6160 OffsetReg = ExtInst->getOperand(1).getReg(); 6161 } 6162 6163 // Need a 32-bit wide register here. 6164 MachineIRBuilder MIB(*MRI.getVRegDef(Root.getReg())); 6165 OffsetReg = moveScalarRegClass(OffsetReg, AArch64::GPR32RegClass, MIB); 6166 } 6167 6168 // We can use the LHS of the GEP as the base, and the LHS of the shift as an 6169 // offset. Signify that we are shifting by setting the shift flag to 1. 6170 return {{[=](MachineInstrBuilder &MIB) { MIB.addUse(Base.getReg()); }, 6171 [=](MachineInstrBuilder &MIB) { MIB.addUse(OffsetReg); }, 6172 [=](MachineInstrBuilder &MIB) { 6173 // Need to add both immediates here to make sure that they are both 6174 // added to the instruction. 6175 MIB.addImm(SignExtend); 6176 MIB.addImm(1); 6177 }}}; 6178 } 6179 6180 /// This is used for computing addresses like this: 6181 /// 6182 /// ldr x1, [x2, x3, lsl #3] 6183 /// 6184 /// Where x2 is the base register, and x3 is an offset register. The shift-left 6185 /// is a constant value specific to this load instruction. That is, we'll never 6186 /// see anything other than a 3 here (which corresponds to the size of the 6187 /// element being loaded.) 6188 InstructionSelector::ComplexRendererFns 6189 AArch64InstructionSelector::selectAddrModeShiftedExtendXReg( 6190 MachineOperand &Root, unsigned SizeInBytes) const { 6191 if (!Root.isReg()) 6192 return None; 6193 MachineRegisterInfo &MRI = Root.getParent()->getMF()->getRegInfo(); 6194 6195 // We want to find something like this: 6196 // 6197 // val = G_CONSTANT LegalShiftVal 6198 // shift = G_SHL off_reg val 6199 // ptr = G_PTR_ADD base_reg shift 6200 // x = G_LOAD ptr 6201 // 6202 // And fold it into this addressing mode: 6203 // 6204 // ldr x, [base_reg, off_reg, lsl #LegalShiftVal] 6205 6206 // Check if we can find the G_PTR_ADD. 6207 MachineInstr *PtrAdd = 6208 getOpcodeDef(TargetOpcode::G_PTR_ADD, Root.getReg(), MRI); 6209 if (!PtrAdd || !isWorthFoldingIntoExtendedReg(*PtrAdd, MRI)) 6210 return None; 6211 6212 // Now, try to match an opcode which will match our specific offset. 6213 // We want a G_SHL or a G_MUL. 6214 MachineInstr *OffsetInst = 6215 getDefIgnoringCopies(PtrAdd->getOperand(2).getReg(), MRI); 6216 return selectExtendedSHL(Root, PtrAdd->getOperand(1), 6217 OffsetInst->getOperand(0), SizeInBytes, 6218 /*WantsExt=*/false); 6219 } 6220 6221 /// This is used for computing addresses like this: 6222 /// 6223 /// ldr x1, [x2, x3] 6224 /// 6225 /// Where x2 is the base register, and x3 is an offset register. 6226 /// 6227 /// When possible (or profitable) to fold a G_PTR_ADD into the address calculation, 6228 /// this will do so. Otherwise, it will return None. 6229 InstructionSelector::ComplexRendererFns 6230 AArch64InstructionSelector::selectAddrModeRegisterOffset( 6231 MachineOperand &Root) const { 6232 MachineRegisterInfo &MRI = Root.getParent()->getMF()->getRegInfo(); 6233 6234 // We need a GEP. 6235 MachineInstr *Gep = MRI.getVRegDef(Root.getReg()); 6236 if (Gep->getOpcode() != TargetOpcode::G_PTR_ADD) 6237 return None; 6238 6239 // If this is used more than once, let's not bother folding. 6240 // TODO: Check if they are memory ops. If they are, then we can still fold 6241 // without having to recompute anything. 6242 if (!MRI.hasOneNonDBGUse(Gep->getOperand(0).getReg())) 6243 return None; 6244 6245 // Base is the GEP's LHS, offset is its RHS. 6246 return {{[=](MachineInstrBuilder &MIB) { 6247 MIB.addUse(Gep->getOperand(1).getReg()); 6248 }, 6249 [=](MachineInstrBuilder &MIB) { 6250 MIB.addUse(Gep->getOperand(2).getReg()); 6251 }, 6252 [=](MachineInstrBuilder &MIB) { 6253 // Need to add both immediates here to make sure that they are both 6254 // added to the instruction. 6255 MIB.addImm(0); 6256 MIB.addImm(0); 6257 }}}; 6258 } 6259 6260 /// This is intended to be equivalent to selectAddrModeXRO in 6261 /// AArch64ISelDAGtoDAG. It's used for selecting X register offset loads. 6262 InstructionSelector::ComplexRendererFns 6263 AArch64InstructionSelector::selectAddrModeXRO(MachineOperand &Root, 6264 unsigned SizeInBytes) const { 6265 MachineRegisterInfo &MRI = Root.getParent()->getMF()->getRegInfo(); 6266 if (!Root.isReg()) 6267 return None; 6268 MachineInstr *PtrAdd = 6269 getOpcodeDef(TargetOpcode::G_PTR_ADD, Root.getReg(), MRI); 6270 if (!PtrAdd) 6271 return None; 6272 6273 // Check for an immediates which cannot be encoded in the [base + imm] 6274 // addressing mode, and can't be encoded in an add/sub. If this happens, we'll 6275 // end up with code like: 6276 // 6277 // mov x0, wide 6278 // add x1 base, x0 6279 // ldr x2, [x1, x0] 6280 // 6281 // In this situation, we can use the [base, xreg] addressing mode to save an 6282 // add/sub: 6283 // 6284 // mov x0, wide 6285 // ldr x2, [base, x0] 6286 auto ValAndVReg = 6287 getIConstantVRegValWithLookThrough(PtrAdd->getOperand(2).getReg(), MRI); 6288 if (ValAndVReg) { 6289 unsigned Scale = Log2_32(SizeInBytes); 6290 int64_t ImmOff = ValAndVReg->Value.getSExtValue(); 6291 6292 // Skip immediates that can be selected in the load/store addresing 6293 // mode. 6294 if (ImmOff % SizeInBytes == 0 && ImmOff >= 0 && 6295 ImmOff < (0x1000 << Scale)) 6296 return None; 6297 6298 // Helper lambda to decide whether or not it is preferable to emit an add. 6299 auto isPreferredADD = [](int64_t ImmOff) { 6300 // Constants in [0x0, 0xfff] can be encoded in an add. 6301 if ((ImmOff & 0xfffffffffffff000LL) == 0x0LL) 6302 return true; 6303 6304 // Can it be encoded in an add lsl #12? 6305 if ((ImmOff & 0xffffffffff000fffLL) != 0x0LL) 6306 return false; 6307 6308 // It can be encoded in an add lsl #12, but we may not want to. If it is 6309 // possible to select this as a single movz, then prefer that. A single 6310 // movz is faster than an add with a shift. 6311 return (ImmOff & 0xffffffffff00ffffLL) != 0x0LL && 6312 (ImmOff & 0xffffffffffff0fffLL) != 0x0LL; 6313 }; 6314 6315 // If the immediate can be encoded in a single add/sub, then bail out. 6316 if (isPreferredADD(ImmOff) || isPreferredADD(-ImmOff)) 6317 return None; 6318 } 6319 6320 // Try to fold shifts into the addressing mode. 6321 auto AddrModeFns = selectAddrModeShiftedExtendXReg(Root, SizeInBytes); 6322 if (AddrModeFns) 6323 return AddrModeFns; 6324 6325 // If that doesn't work, see if it's possible to fold in registers from 6326 // a GEP. 6327 return selectAddrModeRegisterOffset(Root); 6328 } 6329 6330 /// This is used for computing addresses like this: 6331 /// 6332 /// ldr x0, [xBase, wOffset, sxtw #LegalShiftVal] 6333 /// 6334 /// Where we have a 64-bit base register, a 32-bit offset register, and an 6335 /// extend (which may or may not be signed). 6336 InstructionSelector::ComplexRendererFns 6337 AArch64InstructionSelector::selectAddrModeWRO(MachineOperand &Root, 6338 unsigned SizeInBytes) const { 6339 MachineRegisterInfo &MRI = Root.getParent()->getMF()->getRegInfo(); 6340 6341 MachineInstr *PtrAdd = 6342 getOpcodeDef(TargetOpcode::G_PTR_ADD, Root.getReg(), MRI); 6343 if (!PtrAdd || !isWorthFoldingIntoExtendedReg(*PtrAdd, MRI)) 6344 return None; 6345 6346 MachineOperand &LHS = PtrAdd->getOperand(1); 6347 MachineOperand &RHS = PtrAdd->getOperand(2); 6348 MachineInstr *OffsetInst = getDefIgnoringCopies(RHS.getReg(), MRI); 6349 6350 // The first case is the same as selectAddrModeXRO, except we need an extend. 6351 // In this case, we try to find a shift and extend, and fold them into the 6352 // addressing mode. 6353 // 6354 // E.g. 6355 // 6356 // off_reg = G_Z/S/ANYEXT ext_reg 6357 // val = G_CONSTANT LegalShiftVal 6358 // shift = G_SHL off_reg val 6359 // ptr = G_PTR_ADD base_reg shift 6360 // x = G_LOAD ptr 6361 // 6362 // In this case we can get a load like this: 6363 // 6364 // ldr x0, [base_reg, ext_reg, sxtw #LegalShiftVal] 6365 auto ExtendedShl = selectExtendedSHL(Root, LHS, OffsetInst->getOperand(0), 6366 SizeInBytes, /*WantsExt=*/true); 6367 if (ExtendedShl) 6368 return ExtendedShl; 6369 6370 // There was no shift. We can try and fold a G_Z/S/ANYEXT in alone though. 6371 // 6372 // e.g. 6373 // ldr something, [base_reg, ext_reg, sxtw] 6374 if (!isWorthFoldingIntoExtendedReg(*OffsetInst, MRI)) 6375 return None; 6376 6377 // Check if this is an extend. We'll get an extend type if it is. 6378 AArch64_AM::ShiftExtendType Ext = 6379 getExtendTypeForInst(*OffsetInst, MRI, /*IsLoadStore=*/true); 6380 if (Ext == AArch64_AM::InvalidShiftExtend) 6381 return None; 6382 6383 // Need a 32-bit wide register. 6384 MachineIRBuilder MIB(*PtrAdd); 6385 Register ExtReg = moveScalarRegClass(OffsetInst->getOperand(1).getReg(), 6386 AArch64::GPR32RegClass, MIB); 6387 unsigned SignExtend = Ext == AArch64_AM::SXTW; 6388 6389 // Base is LHS, offset is ExtReg. 6390 return {{[=](MachineInstrBuilder &MIB) { MIB.addUse(LHS.getReg()); }, 6391 [=](MachineInstrBuilder &MIB) { MIB.addUse(ExtReg); }, 6392 [=](MachineInstrBuilder &MIB) { 6393 MIB.addImm(SignExtend); 6394 MIB.addImm(0); 6395 }}}; 6396 } 6397 6398 /// Select a "register plus unscaled signed 9-bit immediate" address. This 6399 /// should only match when there is an offset that is not valid for a scaled 6400 /// immediate addressing mode. The "Size" argument is the size in bytes of the 6401 /// memory reference, which is needed here to know what is valid for a scaled 6402 /// immediate. 6403 InstructionSelector::ComplexRendererFns 6404 AArch64InstructionSelector::selectAddrModeUnscaled(MachineOperand &Root, 6405 unsigned Size) const { 6406 MachineRegisterInfo &MRI = 6407 Root.getParent()->getParent()->getParent()->getRegInfo(); 6408 6409 if (!Root.isReg()) 6410 return None; 6411 6412 if (!isBaseWithConstantOffset(Root, MRI)) 6413 return None; 6414 6415 MachineInstr *RootDef = MRI.getVRegDef(Root.getReg()); 6416 6417 MachineOperand &OffImm = RootDef->getOperand(2); 6418 if (!OffImm.isReg()) 6419 return None; 6420 MachineInstr *RHS = MRI.getVRegDef(OffImm.getReg()); 6421 if (RHS->getOpcode() != TargetOpcode::G_CONSTANT) 6422 return None; 6423 int64_t RHSC; 6424 MachineOperand &RHSOp1 = RHS->getOperand(1); 6425 if (!RHSOp1.isCImm() || RHSOp1.getCImm()->getBitWidth() > 64) 6426 return None; 6427 RHSC = RHSOp1.getCImm()->getSExtValue(); 6428 6429 // If the offset is valid as a scaled immediate, don't match here. 6430 if ((RHSC & (Size - 1)) == 0 && RHSC >= 0 && RHSC < (0x1000 << Log2_32(Size))) 6431 return None; 6432 if (RHSC >= -256 && RHSC < 256) { 6433 MachineOperand &Base = RootDef->getOperand(1); 6434 return {{ 6435 [=](MachineInstrBuilder &MIB) { MIB.add(Base); }, 6436 [=](MachineInstrBuilder &MIB) { MIB.addImm(RHSC); }, 6437 }}; 6438 } 6439 return None; 6440 } 6441 6442 InstructionSelector::ComplexRendererFns 6443 AArch64InstructionSelector::tryFoldAddLowIntoImm(MachineInstr &RootDef, 6444 unsigned Size, 6445 MachineRegisterInfo &MRI) const { 6446 if (RootDef.getOpcode() != AArch64::G_ADD_LOW) 6447 return None; 6448 MachineInstr &Adrp = *MRI.getVRegDef(RootDef.getOperand(1).getReg()); 6449 if (Adrp.getOpcode() != AArch64::ADRP) 6450 return None; 6451 6452 // TODO: add heuristics like isWorthFoldingADDlow() from SelectionDAG. 6453 auto Offset = Adrp.getOperand(1).getOffset(); 6454 if (Offset % Size != 0) 6455 return None; 6456 6457 auto GV = Adrp.getOperand(1).getGlobal(); 6458 if (GV->isThreadLocal()) 6459 return None; 6460 6461 auto &MF = *RootDef.getParent()->getParent(); 6462 if (GV->getPointerAlignment(MF.getDataLayout()) < Size) 6463 return None; 6464 6465 unsigned OpFlags = STI.ClassifyGlobalReference(GV, MF.getTarget()); 6466 MachineIRBuilder MIRBuilder(RootDef); 6467 Register AdrpReg = Adrp.getOperand(0).getReg(); 6468 return {{[=](MachineInstrBuilder &MIB) { MIB.addUse(AdrpReg); }, 6469 [=](MachineInstrBuilder &MIB) { 6470 MIB.addGlobalAddress(GV, Offset, 6471 OpFlags | AArch64II::MO_PAGEOFF | 6472 AArch64II::MO_NC); 6473 }}}; 6474 } 6475 6476 /// Select a "register plus scaled unsigned 12-bit immediate" address. The 6477 /// "Size" argument is the size in bytes of the memory reference, which 6478 /// determines the scale. 6479 InstructionSelector::ComplexRendererFns 6480 AArch64InstructionSelector::selectAddrModeIndexed(MachineOperand &Root, 6481 unsigned Size) const { 6482 MachineFunction &MF = *Root.getParent()->getParent()->getParent(); 6483 MachineRegisterInfo &MRI = MF.getRegInfo(); 6484 6485 if (!Root.isReg()) 6486 return None; 6487 6488 MachineInstr *RootDef = MRI.getVRegDef(Root.getReg()); 6489 if (RootDef->getOpcode() == TargetOpcode::G_FRAME_INDEX) { 6490 return {{ 6491 [=](MachineInstrBuilder &MIB) { MIB.add(RootDef->getOperand(1)); }, 6492 [=](MachineInstrBuilder &MIB) { MIB.addImm(0); }, 6493 }}; 6494 } 6495 6496 CodeModel::Model CM = MF.getTarget().getCodeModel(); 6497 // Check if we can fold in the ADD of small code model ADRP + ADD address. 6498 if (CM == CodeModel::Small) { 6499 auto OpFns = tryFoldAddLowIntoImm(*RootDef, Size, MRI); 6500 if (OpFns) 6501 return OpFns; 6502 } 6503 6504 if (isBaseWithConstantOffset(Root, MRI)) { 6505 MachineOperand &LHS = RootDef->getOperand(1); 6506 MachineOperand &RHS = RootDef->getOperand(2); 6507 MachineInstr *LHSDef = MRI.getVRegDef(LHS.getReg()); 6508 MachineInstr *RHSDef = MRI.getVRegDef(RHS.getReg()); 6509 6510 int64_t RHSC = (int64_t)RHSDef->getOperand(1).getCImm()->getZExtValue(); 6511 unsigned Scale = Log2_32(Size); 6512 if ((RHSC & (Size - 1)) == 0 && RHSC >= 0 && RHSC < (0x1000 << Scale)) { 6513 if (LHSDef->getOpcode() == TargetOpcode::G_FRAME_INDEX) 6514 return {{ 6515 [=](MachineInstrBuilder &MIB) { MIB.add(LHSDef->getOperand(1)); }, 6516 [=](MachineInstrBuilder &MIB) { MIB.addImm(RHSC >> Scale); }, 6517 }}; 6518 6519 return {{ 6520 [=](MachineInstrBuilder &MIB) { MIB.add(LHS); }, 6521 [=](MachineInstrBuilder &MIB) { MIB.addImm(RHSC >> Scale); }, 6522 }}; 6523 } 6524 } 6525 6526 // Before falling back to our general case, check if the unscaled 6527 // instructions can handle this. If so, that's preferable. 6528 if (selectAddrModeUnscaled(Root, Size)) 6529 return None; 6530 6531 return {{ 6532 [=](MachineInstrBuilder &MIB) { MIB.add(Root); }, 6533 [=](MachineInstrBuilder &MIB) { MIB.addImm(0); }, 6534 }}; 6535 } 6536 6537 /// Given a shift instruction, return the correct shift type for that 6538 /// instruction. 6539 static AArch64_AM::ShiftExtendType getShiftTypeForInst(MachineInstr &MI) { 6540 switch (MI.getOpcode()) { 6541 default: 6542 return AArch64_AM::InvalidShiftExtend; 6543 case TargetOpcode::G_SHL: 6544 return AArch64_AM::LSL; 6545 case TargetOpcode::G_LSHR: 6546 return AArch64_AM::LSR; 6547 case TargetOpcode::G_ASHR: 6548 return AArch64_AM::ASR; 6549 case TargetOpcode::G_ROTR: 6550 return AArch64_AM::ROR; 6551 } 6552 } 6553 6554 /// Select a "shifted register" operand. If the value is not shifted, set the 6555 /// shift operand to a default value of "lsl 0". 6556 InstructionSelector::ComplexRendererFns 6557 AArch64InstructionSelector::selectShiftedRegister(MachineOperand &Root, 6558 bool AllowROR) const { 6559 if (!Root.isReg()) 6560 return None; 6561 MachineRegisterInfo &MRI = 6562 Root.getParent()->getParent()->getParent()->getRegInfo(); 6563 6564 // Check if the operand is defined by an instruction which corresponds to 6565 // a ShiftExtendType. E.g. a G_SHL, G_LSHR, etc. 6566 MachineInstr *ShiftInst = MRI.getVRegDef(Root.getReg()); 6567 AArch64_AM::ShiftExtendType ShType = getShiftTypeForInst(*ShiftInst); 6568 if (ShType == AArch64_AM::InvalidShiftExtend) 6569 return None; 6570 if (ShType == AArch64_AM::ROR && !AllowROR) 6571 return None; 6572 if (!isWorthFoldingIntoExtendedReg(*ShiftInst, MRI)) 6573 return None; 6574 6575 // Need an immediate on the RHS. 6576 MachineOperand &ShiftRHS = ShiftInst->getOperand(2); 6577 auto Immed = getImmedFromMO(ShiftRHS); 6578 if (!Immed) 6579 return None; 6580 6581 // We have something that we can fold. Fold in the shift's LHS and RHS into 6582 // the instruction. 6583 MachineOperand &ShiftLHS = ShiftInst->getOperand(1); 6584 Register ShiftReg = ShiftLHS.getReg(); 6585 6586 unsigned NumBits = MRI.getType(ShiftReg).getSizeInBits(); 6587 unsigned Val = *Immed & (NumBits - 1); 6588 unsigned ShiftVal = AArch64_AM::getShifterImm(ShType, Val); 6589 6590 return {{[=](MachineInstrBuilder &MIB) { MIB.addUse(ShiftReg); }, 6591 [=](MachineInstrBuilder &MIB) { MIB.addImm(ShiftVal); }}}; 6592 } 6593 6594 AArch64_AM::ShiftExtendType AArch64InstructionSelector::getExtendTypeForInst( 6595 MachineInstr &MI, MachineRegisterInfo &MRI, bool IsLoadStore) const { 6596 unsigned Opc = MI.getOpcode(); 6597 6598 // Handle explicit extend instructions first. 6599 if (Opc == TargetOpcode::G_SEXT || Opc == TargetOpcode::G_SEXT_INREG) { 6600 unsigned Size; 6601 if (Opc == TargetOpcode::G_SEXT) 6602 Size = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits(); 6603 else 6604 Size = MI.getOperand(2).getImm(); 6605 assert(Size != 64 && "Extend from 64 bits?"); 6606 switch (Size) { 6607 case 8: 6608 return IsLoadStore ? AArch64_AM::InvalidShiftExtend : AArch64_AM::SXTB; 6609 case 16: 6610 return IsLoadStore ? AArch64_AM::InvalidShiftExtend : AArch64_AM::SXTH; 6611 case 32: 6612 return AArch64_AM::SXTW; 6613 default: 6614 return AArch64_AM::InvalidShiftExtend; 6615 } 6616 } 6617 6618 if (Opc == TargetOpcode::G_ZEXT || Opc == TargetOpcode::G_ANYEXT) { 6619 unsigned Size = MRI.getType(MI.getOperand(1).getReg()).getSizeInBits(); 6620 assert(Size != 64 && "Extend from 64 bits?"); 6621 switch (Size) { 6622 case 8: 6623 return IsLoadStore ? AArch64_AM::InvalidShiftExtend : AArch64_AM::UXTB; 6624 case 16: 6625 return IsLoadStore ? AArch64_AM::InvalidShiftExtend : AArch64_AM::UXTH; 6626 case 32: 6627 return AArch64_AM::UXTW; 6628 default: 6629 return AArch64_AM::InvalidShiftExtend; 6630 } 6631 } 6632 6633 // Don't have an explicit extend. Try to handle a G_AND with a constant mask 6634 // on the RHS. 6635 if (Opc != TargetOpcode::G_AND) 6636 return AArch64_AM::InvalidShiftExtend; 6637 6638 Optional<uint64_t> MaybeAndMask = getImmedFromMO(MI.getOperand(2)); 6639 if (!MaybeAndMask) 6640 return AArch64_AM::InvalidShiftExtend; 6641 uint64_t AndMask = *MaybeAndMask; 6642 switch (AndMask) { 6643 default: 6644 return AArch64_AM::InvalidShiftExtend; 6645 case 0xFF: 6646 return !IsLoadStore ? AArch64_AM::UXTB : AArch64_AM::InvalidShiftExtend; 6647 case 0xFFFF: 6648 return !IsLoadStore ? AArch64_AM::UXTH : AArch64_AM::InvalidShiftExtend; 6649 case 0xFFFFFFFF: 6650 return AArch64_AM::UXTW; 6651 } 6652 } 6653 6654 Register AArch64InstructionSelector::moveScalarRegClass( 6655 Register Reg, const TargetRegisterClass &RC, MachineIRBuilder &MIB) const { 6656 MachineRegisterInfo &MRI = *MIB.getMRI(); 6657 auto Ty = MRI.getType(Reg); 6658 assert(!Ty.isVector() && "Expected scalars only!"); 6659 if (Ty.getSizeInBits() == TRI.getRegSizeInBits(RC)) 6660 return Reg; 6661 6662 // Create a copy and immediately select it. 6663 // FIXME: We should have an emitCopy function? 6664 auto Copy = MIB.buildCopy({&RC}, {Reg}); 6665 selectCopy(*Copy, TII, MRI, TRI, RBI); 6666 return Copy.getReg(0); 6667 } 6668 6669 /// Select an "extended register" operand. This operand folds in an extend 6670 /// followed by an optional left shift. 6671 InstructionSelector::ComplexRendererFns 6672 AArch64InstructionSelector::selectArithExtendedRegister( 6673 MachineOperand &Root) const { 6674 if (!Root.isReg()) 6675 return None; 6676 MachineRegisterInfo &MRI = 6677 Root.getParent()->getParent()->getParent()->getRegInfo(); 6678 6679 uint64_t ShiftVal = 0; 6680 Register ExtReg; 6681 AArch64_AM::ShiftExtendType Ext; 6682 MachineInstr *RootDef = getDefIgnoringCopies(Root.getReg(), MRI); 6683 if (!RootDef) 6684 return None; 6685 6686 if (!isWorthFoldingIntoExtendedReg(*RootDef, MRI)) 6687 return None; 6688 6689 // Check if we can fold a shift and an extend. 6690 if (RootDef->getOpcode() == TargetOpcode::G_SHL) { 6691 // Look for a constant on the RHS of the shift. 6692 MachineOperand &RHS = RootDef->getOperand(2); 6693 Optional<uint64_t> MaybeShiftVal = getImmedFromMO(RHS); 6694 if (!MaybeShiftVal) 6695 return None; 6696 ShiftVal = *MaybeShiftVal; 6697 if (ShiftVal > 4) 6698 return None; 6699 // Look for a valid extend instruction on the LHS of the shift. 6700 MachineOperand &LHS = RootDef->getOperand(1); 6701 MachineInstr *ExtDef = getDefIgnoringCopies(LHS.getReg(), MRI); 6702 if (!ExtDef) 6703 return None; 6704 Ext = getExtendTypeForInst(*ExtDef, MRI); 6705 if (Ext == AArch64_AM::InvalidShiftExtend) 6706 return None; 6707 ExtReg = ExtDef->getOperand(1).getReg(); 6708 } else { 6709 // Didn't get a shift. Try just folding an extend. 6710 Ext = getExtendTypeForInst(*RootDef, MRI); 6711 if (Ext == AArch64_AM::InvalidShiftExtend) 6712 return None; 6713 ExtReg = RootDef->getOperand(1).getReg(); 6714 6715 // If we have a 32 bit instruction which zeroes out the high half of a 6716 // register, we get an implicit zero extend for free. Check if we have one. 6717 // FIXME: We actually emit the extend right now even though we don't have 6718 // to. 6719 if (Ext == AArch64_AM::UXTW && MRI.getType(ExtReg).getSizeInBits() == 32) { 6720 MachineInstr *ExtInst = MRI.getVRegDef(ExtReg); 6721 if (isDef32(*ExtInst)) 6722 return None; 6723 } 6724 } 6725 6726 // We require a GPR32 here. Narrow the ExtReg if needed using a subregister 6727 // copy. 6728 MachineIRBuilder MIB(*RootDef); 6729 ExtReg = moveScalarRegClass(ExtReg, AArch64::GPR32RegClass, MIB); 6730 6731 return {{[=](MachineInstrBuilder &MIB) { MIB.addUse(ExtReg); }, 6732 [=](MachineInstrBuilder &MIB) { 6733 MIB.addImm(getArithExtendImm(Ext, ShiftVal)); 6734 }}}; 6735 } 6736 6737 void AArch64InstructionSelector::renderTruncImm(MachineInstrBuilder &MIB, 6738 const MachineInstr &MI, 6739 int OpIdx) const { 6740 const MachineRegisterInfo &MRI = MI.getParent()->getParent()->getRegInfo(); 6741 assert(MI.getOpcode() == TargetOpcode::G_CONSTANT && OpIdx == -1 && 6742 "Expected G_CONSTANT"); 6743 Optional<int64_t> CstVal = 6744 getIConstantVRegSExtVal(MI.getOperand(0).getReg(), MRI); 6745 assert(CstVal && "Expected constant value"); 6746 MIB.addImm(*CstVal); 6747 } 6748 6749 void AArch64InstructionSelector::renderLogicalImm32( 6750 MachineInstrBuilder &MIB, const MachineInstr &I, int OpIdx) const { 6751 assert(I.getOpcode() == TargetOpcode::G_CONSTANT && OpIdx == -1 && 6752 "Expected G_CONSTANT"); 6753 uint64_t CstVal = I.getOperand(1).getCImm()->getZExtValue(); 6754 uint64_t Enc = AArch64_AM::encodeLogicalImmediate(CstVal, 32); 6755 MIB.addImm(Enc); 6756 } 6757 6758 void AArch64InstructionSelector::renderLogicalImm64( 6759 MachineInstrBuilder &MIB, const MachineInstr &I, int OpIdx) const { 6760 assert(I.getOpcode() == TargetOpcode::G_CONSTANT && OpIdx == -1 && 6761 "Expected G_CONSTANT"); 6762 uint64_t CstVal = I.getOperand(1).getCImm()->getZExtValue(); 6763 uint64_t Enc = AArch64_AM::encodeLogicalImmediate(CstVal, 64); 6764 MIB.addImm(Enc); 6765 } 6766 6767 void AArch64InstructionSelector::renderFPImm16(MachineInstrBuilder &MIB, 6768 const MachineInstr &MI, 6769 int OpIdx) const { 6770 assert(MI.getOpcode() == TargetOpcode::G_FCONSTANT && OpIdx == -1 && 6771 "Expected G_FCONSTANT"); 6772 MIB.addImm( 6773 AArch64_AM::getFP16Imm(MI.getOperand(1).getFPImm()->getValueAPF())); 6774 } 6775 6776 void AArch64InstructionSelector::renderFPImm32(MachineInstrBuilder &MIB, 6777 const MachineInstr &MI, 6778 int OpIdx) const { 6779 assert(MI.getOpcode() == TargetOpcode::G_FCONSTANT && OpIdx == -1 && 6780 "Expected G_FCONSTANT"); 6781 MIB.addImm( 6782 AArch64_AM::getFP32Imm(MI.getOperand(1).getFPImm()->getValueAPF())); 6783 } 6784 6785 void AArch64InstructionSelector::renderFPImm64(MachineInstrBuilder &MIB, 6786 const MachineInstr &MI, 6787 int OpIdx) const { 6788 assert(MI.getOpcode() == TargetOpcode::G_FCONSTANT && OpIdx == -1 && 6789 "Expected G_FCONSTANT"); 6790 MIB.addImm( 6791 AArch64_AM::getFP64Imm(MI.getOperand(1).getFPImm()->getValueAPF())); 6792 } 6793 6794 void AArch64InstructionSelector::renderFPImm32SIMDModImmType4( 6795 MachineInstrBuilder &MIB, const MachineInstr &MI, int OpIdx) const { 6796 assert(MI.getOpcode() == TargetOpcode::G_FCONSTANT && OpIdx == -1 && 6797 "Expected G_FCONSTANT"); 6798 MIB.addImm(AArch64_AM::encodeAdvSIMDModImmType4(MI.getOperand(1) 6799 .getFPImm() 6800 ->getValueAPF() 6801 .bitcastToAPInt() 6802 .getZExtValue())); 6803 } 6804 6805 bool AArch64InstructionSelector::isLoadStoreOfNumBytes( 6806 const MachineInstr &MI, unsigned NumBytes) const { 6807 if (!MI.mayLoadOrStore()) 6808 return false; 6809 assert(MI.hasOneMemOperand() && 6810 "Expected load/store to have only one mem op!"); 6811 return (*MI.memoperands_begin())->getSize() == NumBytes; 6812 } 6813 6814 bool AArch64InstructionSelector::isDef32(const MachineInstr &MI) const { 6815 const MachineRegisterInfo &MRI = MI.getParent()->getParent()->getRegInfo(); 6816 if (MRI.getType(MI.getOperand(0).getReg()).getSizeInBits() != 32) 6817 return false; 6818 6819 // Only return true if we know the operation will zero-out the high half of 6820 // the 64-bit register. Truncates can be subregister copies, which don't 6821 // zero out the high bits. Copies and other copy-like instructions can be 6822 // fed by truncates, or could be lowered as subregister copies. 6823 switch (MI.getOpcode()) { 6824 default: 6825 return true; 6826 case TargetOpcode::COPY: 6827 case TargetOpcode::G_BITCAST: 6828 case TargetOpcode::G_TRUNC: 6829 case TargetOpcode::G_PHI: 6830 return false; 6831 } 6832 } 6833 6834 6835 // Perform fixups on the given PHI instruction's operands to force them all 6836 // to be the same as the destination regbank. 6837 static void fixupPHIOpBanks(MachineInstr &MI, MachineRegisterInfo &MRI, 6838 const AArch64RegisterBankInfo &RBI) { 6839 assert(MI.getOpcode() == TargetOpcode::G_PHI && "Expected a G_PHI"); 6840 Register DstReg = MI.getOperand(0).getReg(); 6841 const RegisterBank *DstRB = MRI.getRegBankOrNull(DstReg); 6842 assert(DstRB && "Expected PHI dst to have regbank assigned"); 6843 MachineIRBuilder MIB(MI); 6844 6845 // Go through each operand and ensure it has the same regbank. 6846 for (MachineOperand &MO : llvm::drop_begin(MI.operands())) { 6847 if (!MO.isReg()) 6848 continue; 6849 Register OpReg = MO.getReg(); 6850 const RegisterBank *RB = MRI.getRegBankOrNull(OpReg); 6851 if (RB != DstRB) { 6852 // Insert a cross-bank copy. 6853 auto *OpDef = MRI.getVRegDef(OpReg); 6854 const LLT &Ty = MRI.getType(OpReg); 6855 MachineBasicBlock &OpDefBB = *OpDef->getParent(); 6856 6857 // Any instruction we insert must appear after all PHIs in the block 6858 // for the block to be valid MIR. 6859 MachineBasicBlock::iterator InsertPt = std::next(OpDef->getIterator()); 6860 if (InsertPt != OpDefBB.end() && InsertPt->isPHI()) 6861 InsertPt = OpDefBB.getFirstNonPHI(); 6862 MIB.setInsertPt(*OpDef->getParent(), InsertPt); 6863 auto Copy = MIB.buildCopy(Ty, OpReg); 6864 MRI.setRegBank(Copy.getReg(0), *DstRB); 6865 MO.setReg(Copy.getReg(0)); 6866 } 6867 } 6868 } 6869 6870 void AArch64InstructionSelector::processPHIs(MachineFunction &MF) { 6871 // We're looking for PHIs, build a list so we don't invalidate iterators. 6872 MachineRegisterInfo &MRI = MF.getRegInfo(); 6873 SmallVector<MachineInstr *, 32> Phis; 6874 for (auto &BB : MF) { 6875 for (auto &MI : BB) { 6876 if (MI.getOpcode() == TargetOpcode::G_PHI) 6877 Phis.emplace_back(&MI); 6878 } 6879 } 6880 6881 for (auto *MI : Phis) { 6882 // We need to do some work here if the operand types are < 16 bit and they 6883 // are split across fpr/gpr banks. Since all types <32b on gpr 6884 // end up being assigned gpr32 regclasses, we can end up with PHIs here 6885 // which try to select between a gpr32 and an fpr16. Ideally RBS shouldn't 6886 // be selecting heterogenous regbanks for operands if possible, but we 6887 // still need to be able to deal with it here. 6888 // 6889 // To fix this, if we have a gpr-bank operand < 32b in size and at least 6890 // one other operand is on the fpr bank, then we add cross-bank copies 6891 // to homogenize the operand banks. For simplicity the bank that we choose 6892 // to settle on is whatever bank the def operand has. For example: 6893 // 6894 // %endbb: 6895 // %dst:gpr(s16) = G_PHI %in1:gpr(s16), %bb1, %in2:fpr(s16), %bb2 6896 // => 6897 // %bb2: 6898 // ... 6899 // %in2_copy:gpr(s16) = COPY %in2:fpr(s16) 6900 // ... 6901 // %endbb: 6902 // %dst:gpr(s16) = G_PHI %in1:gpr(s16), %bb1, %in2_copy:gpr(s16), %bb2 6903 bool HasGPROp = false, HasFPROp = false; 6904 for (const MachineOperand &MO : llvm::drop_begin(MI->operands())) { 6905 if (!MO.isReg()) 6906 continue; 6907 const LLT &Ty = MRI.getType(MO.getReg()); 6908 if (!Ty.isValid() || !Ty.isScalar()) 6909 break; 6910 if (Ty.getSizeInBits() >= 32) 6911 break; 6912 const RegisterBank *RB = MRI.getRegBankOrNull(MO.getReg()); 6913 // If for some reason we don't have a regbank yet. Don't try anything. 6914 if (!RB) 6915 break; 6916 6917 if (RB->getID() == AArch64::GPRRegBankID) 6918 HasGPROp = true; 6919 else 6920 HasFPROp = true; 6921 } 6922 // We have heterogenous regbanks, need to fixup. 6923 if (HasGPROp && HasFPROp) 6924 fixupPHIOpBanks(*MI, MRI, RBI); 6925 } 6926 } 6927 6928 namespace llvm { 6929 InstructionSelector * 6930 createAArch64InstructionSelector(const AArch64TargetMachine &TM, 6931 AArch64Subtarget &Subtarget, 6932 AArch64RegisterBankInfo &RBI) { 6933 return new AArch64InstructionSelector(TM, Subtarget, RBI); 6934 } 6935 } 6936