Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 1 | //===- AMDGPUInstructionSelector --------------------------------*- C++ -*-==// |
| 2 | // |
Chandler Carruth | 2946cd7 | 2019-01-19 08:50:56 +0000 | [diff] [blame] | 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 |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | /// \file |
| 9 | /// This file declares the targeting of the InstructionSelector class for |
| 10 | /// AMDGPU. |
| 11 | //===----------------------------------------------------------------------===// |
| 12 | |
| 13 | #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUINSTRUCTIONSELECTOR_H |
| 14 | #define LLVM_LIB_TARGET_AMDGPU_AMDGPUINSTRUCTIONSELECTOR_H |
| 15 | |
Yaxun Liu | 1a14bfa | 2017-03-27 14:04:01 +0000 | [diff] [blame] | 16 | #include "AMDGPU.h" |
Matt Arsenault | b1cc4f5 | 2018-06-25 16:17:48 +0000 | [diff] [blame] | 17 | #include "AMDGPUArgumentUsageInfo.h" |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 18 | #include "llvm/ADT/ArrayRef.h" |
| 19 | #include "llvm/ADT/SmallVector.h" |
Matt Arsenault | 2ab25f9 | 2019-07-01 16:06:02 +0000 | [diff] [blame] | 20 | #include "llvm/CodeGen/Register.h" |
Chandler Carruth | 6bda14b | 2017-06-06 11:49:48 +0000 | [diff] [blame] | 21 | #include "llvm/CodeGen/GlobalISel/InstructionSelector.h" |
Matt Arsenault | 3b7668a | 2019-07-01 13:34:26 +0000 | [diff] [blame] | 22 | #include "llvm/IR/InstrTypes.h" |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 23 | |
Tom Stellard | 1dc9020 | 2018-05-10 20:53:06 +0000 | [diff] [blame] | 24 | namespace { |
| 25 | #define GET_GLOBALISEL_PREDICATE_BITSET |
Tom Stellard | 5bfbae5 | 2018-07-11 20:59:01 +0000 | [diff] [blame] | 26 | #define AMDGPUSubtarget GCNSubtarget |
Tom Stellard | 1dc9020 | 2018-05-10 20:53:06 +0000 | [diff] [blame] | 27 | #include "AMDGPUGenGlobalISel.inc" |
| 28 | #undef GET_GLOBALISEL_PREDICATE_BITSET |
Tom Stellard | 5bfbae5 | 2018-07-11 20:59:01 +0000 | [diff] [blame] | 29 | #undef AMDGPUSubtarget |
Tom Stellard | 1dc9020 | 2018-05-10 20:53:06 +0000 | [diff] [blame] | 30 | } |
| 31 | |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 32 | namespace llvm { |
| 33 | |
| 34 | class AMDGPUInstrInfo; |
| 35 | class AMDGPURegisterBankInfo; |
Tom Stellard | 5bfbae5 | 2018-07-11 20:59:01 +0000 | [diff] [blame] | 36 | class GCNSubtarget; |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 37 | class MachineInstr; |
Matt Arsenault | 3ecab8e | 2019-09-19 16:26:14 +0000 | [diff] [blame] | 38 | class MachineIRBuilder; |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 39 | class MachineOperand; |
| 40 | class MachineRegisterInfo; |
| 41 | class SIInstrInfo; |
Matt Arsenault | b1cc4f5 | 2018-06-25 16:17:48 +0000 | [diff] [blame] | 42 | class SIMachineFunctionInfo; |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 43 | class SIRegisterInfo; |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 44 | |
| 45 | class AMDGPUInstructionSelector : public InstructionSelector { |
Matt Arsenault | 76f44f6 | 2019-09-28 03:41:13 +0000 | [diff] [blame] | 46 | private: |
| 47 | MachineRegisterInfo *MRI; |
| 48 | |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 49 | public: |
Tom Stellard | 5bfbae5 | 2018-07-11 20:59:01 +0000 | [diff] [blame] | 50 | AMDGPUInstructionSelector(const GCNSubtarget &STI, |
Tom Stellard | 1dc9020 | 2018-05-10 20:53:06 +0000 | [diff] [blame] | 51 | const AMDGPURegisterBankInfo &RBI, |
| 52 | const AMDGPUTargetMachine &TM); |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 53 | |
Amara Emerson | e14c91b | 2019-08-13 06:26:59 +0000 | [diff] [blame] | 54 | bool select(MachineInstr &I) override; |
Tom Stellard | 1dc9020 | 2018-05-10 20:53:06 +0000 | [diff] [blame] | 55 | static const char *getName(); |
Daniel Sanders | f76f315 | 2017-11-16 00:46:35 +0000 | [diff] [blame] | 56 | |
Matt Arsenault | 76f44f6 | 2019-09-28 03:41:13 +0000 | [diff] [blame] | 57 | void setupMF(MachineFunction &MF, GISelKnownBits &KB, |
| 58 | CodeGenCoverage &CoverageInfo) override; |
| 59 | |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 60 | private: |
| 61 | struct GEPInfo { |
| 62 | const MachineInstr &GEP; |
| 63 | SmallVector<unsigned, 2> SgprParts; |
| 64 | SmallVector<unsigned, 2> VgprParts; |
| 65 | int64_t Imm; |
| 66 | GEPInfo(const MachineInstr &GEP) : GEP(GEP), Imm(0) { } |
| 67 | }; |
| 68 | |
Tom Stellard | 79b5c38 | 2019-02-20 21:02:37 +0000 | [diff] [blame] | 69 | bool isInstrUniform(const MachineInstr &MI) const; |
Matt Arsenault | 2ab25f9 | 2019-07-01 16:06:02 +0000 | [diff] [blame] | 70 | bool isVCC(Register Reg, const MachineRegisterInfo &MRI) const; |
| 71 | |
Tom Stellard | 1dc9020 | 2018-05-10 20:53:06 +0000 | [diff] [blame] | 72 | /// tblgen-erated 'select' implementation. |
| 73 | bool selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const; |
| 74 | |
Matt Arsenault | 0a52e9d | 2019-07-01 16:34:48 +0000 | [diff] [blame] | 75 | MachineOperand getSubOperand64(MachineOperand &MO, |
| 76 | const TargetRegisterClass &SubRC, |
| 77 | unsigned SubIdx) const; |
Tom Stellard | 1e0edad | 2018-05-10 21:20:10 +0000 | [diff] [blame] | 78 | bool selectCOPY(MachineInstr &I) const; |
Matt Arsenault | e100625 | 2019-07-01 16:32:47 +0000 | [diff] [blame] | 79 | bool selectPHI(MachineInstr &I) const; |
Matt Arsenault | dbb6c03 | 2019-06-24 18:02:18 +0000 | [diff] [blame] | 80 | bool selectG_TRUNC(MachineInstr &I) const; |
Matt Arsenault | d7ffa2a | 2019-06-25 13:18:11 +0000 | [diff] [blame] | 81 | bool selectG_SZA_EXT(MachineInstr &I) const; |
Matt Arsenault | fdea5e0 | 2019-10-01 02:23:20 +0000 | [diff] [blame] | 82 | bool selectG_SITOFP_UITOFP(MachineInstr &I) const; |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 83 | bool selectG_CONSTANT(MachineInstr &I) const; |
Matt Arsenault | c8291c9 | 2019-07-15 19:50:07 +0000 | [diff] [blame] | 84 | bool selectG_AND_OR_XOR(MachineInstr &I) const; |
Matt Arsenault | e6d10f9 | 2019-07-09 14:05:11 +0000 | [diff] [blame] | 85 | bool selectG_ADD_SUB(MachineInstr &I) const; |
Matt Arsenault | 54167ea | 2019-10-01 01:23:13 +0000 | [diff] [blame] | 86 | bool selectG_UADDO_USUBO(MachineInstr &I) const; |
Tom Stellard | 41f3219 | 2019-02-28 23:37:48 +0000 | [diff] [blame] | 87 | bool selectG_EXTRACT(MachineInstr &I) const; |
Matt Arsenault | 9b7ffc4 | 2019-07-09 14:02:20 +0000 | [diff] [blame] | 88 | bool selectG_MERGE_VALUES(MachineInstr &I) const; |
Matt Arsenault | 872f38b | 2019-07-09 14:02:26 +0000 | [diff] [blame] | 89 | bool selectG_UNMERGE_VALUES(MachineInstr &I) const; |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 90 | bool selectG_GEP(MachineInstr &I) const; |
Tom Stellard | 3f1c6fe | 2018-06-21 23:38:20 +0000 | [diff] [blame] | 91 | bool selectG_IMPLICIT_DEF(MachineInstr &I) const; |
Tom Stellard | 33634d1b | 2019-03-01 00:50:26 +0000 | [diff] [blame] | 92 | bool selectG_INSERT(MachineInstr &I) const; |
Amara Emerson | e14c91b | 2019-08-13 06:26:59 +0000 | [diff] [blame] | 93 | bool selectG_INTRINSIC(MachineInstr &I) const; |
Matt Arsenault | 3ecab8e | 2019-09-19 16:26:14 +0000 | [diff] [blame] | 94 | |
| 95 | std::tuple<Register, unsigned, unsigned> |
| 96 | splitBufferOffsets(MachineIRBuilder &B, Register OrigOffset) const; |
| 97 | |
| 98 | bool selectStoreIntrinsic(MachineInstr &MI, bool IsFormat) const; |
| 99 | |
Amara Emerson | e14c91b | 2019-08-13 06:26:59 +0000 | [diff] [blame] | 100 | bool selectG_INTRINSIC_W_SIDE_EFFECTS(MachineInstr &I) const; |
Matt Arsenault | 3b7668a | 2019-07-01 13:34:26 +0000 | [diff] [blame] | 101 | int getS_CMPOpcode(CmpInst::Predicate P, unsigned Size) const; |
Tom Stellard | 8b1c53b | 2019-06-17 16:27:43 +0000 | [diff] [blame] | 102 | bool selectG_ICMP(MachineInstr &I) const; |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 103 | bool hasVgprParts(ArrayRef<GEPInfo> AddrInfo) const; |
| 104 | void getAddrModeInfo(const MachineInstr &Load, const MachineRegisterInfo &MRI, |
| 105 | SmallVectorImpl<GEPInfo> &AddrInfo) const; |
| 106 | bool selectSMRD(MachineInstr &I, ArrayRef<GEPInfo> AddrInfo) const; |
Matt Arsenault | 3baf4d3 | 2019-08-01 03:09:15 +0000 | [diff] [blame] | 107 | |
| 108 | void initM0(MachineInstr &I) const; |
Amara Emerson | e14c91b | 2019-08-13 06:26:59 +0000 | [diff] [blame] | 109 | bool selectG_LOAD_ATOMICRMW(MachineInstr &I) const; |
| 110 | bool selectG_STORE(MachineInstr &I) const; |
Tom Stellard | 8b1c53b | 2019-06-17 16:27:43 +0000 | [diff] [blame] | 111 | bool selectG_SELECT(MachineInstr &I) const; |
Matt Arsenault | 6464280 | 2019-07-01 15:39:27 +0000 | [diff] [blame] | 112 | bool selectG_BRCOND(MachineInstr &I) const; |
Matt Arsenault | cda82f0 | 2019-07-01 15:48:18 +0000 | [diff] [blame] | 113 | bool selectG_FRAME_INDEX(MachineInstr &I) const; |
Matt Arsenault | c34b403 | 2019-09-09 15:46:13 +0000 | [diff] [blame] | 114 | bool selectG_PTR_MASK(MachineInstr &I) const; |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 115 | |
Matt Arsenault | 4f64ade | 2019-07-01 15:18:56 +0000 | [diff] [blame] | 116 | std::pair<Register, unsigned> |
Matt Arsenault | 76f44f6 | 2019-09-28 03:41:13 +0000 | [diff] [blame] | 117 | selectVOP3ModsImpl(Register Src) const; |
Matt Arsenault | 4f64ade | 2019-07-01 15:18:56 +0000 | [diff] [blame] | 118 | |
Tom Stellard | 1dc9020 | 2018-05-10 20:53:06 +0000 | [diff] [blame] | 119 | InstructionSelector::ComplexRendererFns |
Tom Stellard | 26fac0f | 2018-06-22 02:54:57 +0000 | [diff] [blame] | 120 | selectVCSRC(MachineOperand &Root) const; |
| 121 | |
| 122 | InstructionSelector::ComplexRendererFns |
Tom Stellard | 1dc9020 | 2018-05-10 20:53:06 +0000 | [diff] [blame] | 123 | selectVSRC0(MachineOperand &Root) const; |
| 124 | |
Tom Stellard | dcc95e9 | 2018-05-11 05:44:16 +0000 | [diff] [blame] | 125 | InstructionSelector::ComplexRendererFns |
| 126 | selectVOP3Mods0(MachineOperand &Root) const; |
Tom Stellard | 46bbbc3 | 2018-06-13 22:30:47 +0000 | [diff] [blame] | 127 | InstructionSelector::ComplexRendererFns |
Matt Arsenault | 77e3e9c | 2019-09-09 18:29:45 +0000 | [diff] [blame] | 128 | selectVOP3Mods0Clamp0OMod(MachineOperand &Root) const; |
| 129 | InstructionSelector::ComplexRendererFns |
Tom Stellard | 9a65357 | 2018-06-22 02:34:29 +0000 | [diff] [blame] | 130 | selectVOP3OMods(MachineOperand &Root) const; |
| 131 | InstructionSelector::ComplexRendererFns |
Tom Stellard | 46bbbc3 | 2018-06-13 22:30:47 +0000 | [diff] [blame] | 132 | selectVOP3Mods(MachineOperand &Root) const; |
Tom Stellard | dcc95e9 | 2018-05-11 05:44:16 +0000 | [diff] [blame] | 133 | |
Tom Stellard | 79b5c38 | 2019-02-20 21:02:37 +0000 | [diff] [blame] | 134 | InstructionSelector::ComplexRendererFns |
Matt Arsenault | d6c1f5b | 2019-09-09 18:29:37 +0000 | [diff] [blame] | 135 | selectVOP3OpSelMods0(MachineOperand &Root) const; |
| 136 | InstructionSelector::ComplexRendererFns |
| 137 | selectVOP3OpSelMods(MachineOperand &Root) const; |
| 138 | |
| 139 | InstructionSelector::ComplexRendererFns |
Tom Stellard | 79b5c38 | 2019-02-20 21:02:37 +0000 | [diff] [blame] | 140 | selectSmrdImm(MachineOperand &Root) const; |
| 141 | InstructionSelector::ComplexRendererFns |
| 142 | selectSmrdImm32(MachineOperand &Root) const; |
| 143 | InstructionSelector::ComplexRendererFns |
| 144 | selectSmrdSgpr(MachineOperand &Root) const; |
| 145 | |
Matt Arsenault | 35c9659 | 2019-07-16 18:05:29 +0000 | [diff] [blame] | 146 | template <bool Signed> |
| 147 | InstructionSelector::ComplexRendererFns |
| 148 | selectFlatOffsetImpl(MachineOperand &Root) const; |
| 149 | InstructionSelector::ComplexRendererFns |
| 150 | selectFlatOffset(MachineOperand &Root) const; |
| 151 | |
| 152 | InstructionSelector::ComplexRendererFns |
| 153 | selectFlatOffsetSigned(MachineOperand &Root) const; |
| 154 | |
Matt Arsenault | 7161fb0 | 2019-07-16 19:22:21 +0000 | [diff] [blame] | 155 | InstructionSelector::ComplexRendererFns |
| 156 | selectMUBUFScratchOffen(MachineOperand &Root) const; |
| 157 | InstructionSelector::ComplexRendererFns |
| 158 | selectMUBUFScratchOffset(MachineOperand &Root) const; |
| 159 | |
Matt Arsenault | 3594011 | 2019-08-01 00:53:38 +0000 | [diff] [blame] | 160 | bool isDSOffsetLegal(const MachineRegisterInfo &MRI, |
| 161 | const MachineOperand &Base, |
| 162 | int64_t Offset, unsigned OffsetBits) const; |
| 163 | |
| 164 | InstructionSelector::ComplexRendererFns |
| 165 | selectDS1Addr1Offset(MachineOperand &Root) const; |
| 166 | |
Matt Arsenault | 59b91aa | 2019-10-01 02:07:25 +0000 | [diff] [blame] | 167 | void renderTruncImm32(MachineInstrBuilder &MIB, |
| 168 | const MachineInstr &MI) const; |
| 169 | |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 170 | const SIInstrInfo &TII; |
| 171 | const SIRegisterInfo &TRI; |
| 172 | const AMDGPURegisterBankInfo &RBI; |
Tom Stellard | 1dc9020 | 2018-05-10 20:53:06 +0000 | [diff] [blame] | 173 | const AMDGPUTargetMachine &TM; |
Tom Stellard | 5bfbae5 | 2018-07-11 20:59:01 +0000 | [diff] [blame] | 174 | const GCNSubtarget &STI; |
Tom Stellard | 1dc9020 | 2018-05-10 20:53:06 +0000 | [diff] [blame] | 175 | bool EnableLateStructurizeCFG; |
| 176 | #define GET_GLOBALISEL_PREDICATES_DECL |
Tom Stellard | 5bfbae5 | 2018-07-11 20:59:01 +0000 | [diff] [blame] | 177 | #define AMDGPUSubtarget GCNSubtarget |
Tom Stellard | 1dc9020 | 2018-05-10 20:53:06 +0000 | [diff] [blame] | 178 | #include "AMDGPUGenGlobalISel.inc" |
| 179 | #undef GET_GLOBALISEL_PREDICATES_DECL |
Tom Stellard | 5bfbae5 | 2018-07-11 20:59:01 +0000 | [diff] [blame] | 180 | #undef AMDGPUSubtarget |
Tom Stellard | 1dc9020 | 2018-05-10 20:53:06 +0000 | [diff] [blame] | 181 | |
| 182 | #define GET_GLOBALISEL_TEMPORARIES_DECL |
| 183 | #include "AMDGPUGenGlobalISel.inc" |
| 184 | #undef GET_GLOBALISEL_TEMPORARIES_DECL |
Tom Stellard | ca16621 | 2017-01-30 21:56:46 +0000 | [diff] [blame] | 185 | }; |
| 186 | |
| 187 | } // End llvm namespace. |
| 188 | #endif |