File indexing completed on 2026-05-10 08:43:25
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #ifndef LLVM_CODEGEN_GLOBALISEL_LEGALIZERHELPER_H
0021 #define LLVM_CODEGEN_GLOBALISEL_LEGALIZERHELPER_H
0022
0023 #include "llvm/CodeGen/GlobalISel/CallLowering.h"
0024 #include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
0025 #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
0026 #include "llvm/CodeGen/RuntimeLibcallUtil.h"
0027 #include "llvm/CodeGen/TargetOpcodes.h"
0028
0029 namespace llvm {
0030
0031 class APInt;
0032 class GAnyLoad;
0033 class GLoadStore;
0034 class GStore;
0035 class GenericMachineInstr;
0036 class MachineFunction;
0037 class MachineIRBuilder;
0038 class MachineInstr;
0039 class MachineInstrBuilder;
0040 struct MachinePointerInfo;
0041 template <typename T> class SmallVectorImpl;
0042 class LegalizerInfo;
0043 class MachineRegisterInfo;
0044 class GISelChangeObserver;
0045 class LostDebugLocObserver;
0046 class TargetLowering;
0047
0048 class LegalizerHelper {
0049 public:
0050
0051
0052 MachineIRBuilder &MIRBuilder;
0053
0054
0055 GISelChangeObserver &Observer;
0056
0057 private:
0058 MachineRegisterInfo &MRI;
0059 const LegalizerInfo &LI;
0060 const TargetLowering &TLI;
0061 GISelKnownBits *KB;
0062
0063 public:
0064 enum LegalizeResult {
0065
0066
0067 AlreadyLegal,
0068
0069
0070 Legalized,
0071
0072
0073
0074 UnableToLegalize,
0075 };
0076
0077
0078 const LegalizerInfo &getLegalizerInfo() const { return LI; }
0079 const TargetLowering &getTargetLowering() const { return TLI; }
0080 GISelKnownBits *getKnownBits() const { return KB; }
0081
0082 LegalizerHelper(MachineFunction &MF, GISelChangeObserver &Observer,
0083 MachineIRBuilder &B);
0084 LegalizerHelper(MachineFunction &MF, const LegalizerInfo &LI,
0085 GISelChangeObserver &Observer, MachineIRBuilder &B,
0086 GISelKnownBits *KB = nullptr);
0087
0088
0089
0090
0091
0092
0093
0094
0095 LegalizeResult legalizeInstrStep(MachineInstr &MI,
0096 LostDebugLocObserver &LocObserver);
0097
0098
0099 LegalizeResult libcall(MachineInstr &MI, LostDebugLocObserver &LocObserver);
0100
0101
0102
0103 LegalizeResult narrowScalar(MachineInstr &MI, unsigned TypeIdx, LLT NarrowTy);
0104
0105
0106
0107
0108 LegalizeResult widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy);
0109
0110
0111 LegalizeResult bitcast(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
0112
0113
0114
0115 LegalizeResult lower(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
0116
0117
0118
0119 LegalizeResult fewerElementsVector(MachineInstr &MI, unsigned TypeIdx,
0120 LLT NarrowTy);
0121
0122
0123
0124 LegalizeResult moreElementsVector(MachineInstr &MI, unsigned TypeIdx,
0125 LLT MoreTy);
0126
0127
0128
0129
0130
0131
0132 Register coerceToScalar(Register Val);
0133
0134
0135
0136
0137
0138 void widenScalarSrc(MachineInstr &MI, LLT WideTy, unsigned OpIdx,
0139 unsigned ExtOpcode);
0140
0141
0142
0143
0144 void narrowScalarSrc(MachineInstr &MI, LLT NarrowTy, unsigned OpIdx);
0145
0146
0147
0148
0149 void widenScalarDst(MachineInstr &MI, LLT WideTy, unsigned OpIdx = 0,
0150 unsigned TruncOpcode = TargetOpcode::G_TRUNC);
0151
0152
0153
0154
0155 void narrowScalarDst(MachineInstr &MI, LLT NarrowTy, unsigned OpIdx,
0156 unsigned ExtOpcode);
0157
0158
0159
0160 void moreElementsVectorDst(MachineInstr &MI, LLT MoreTy, unsigned OpIdx);
0161
0162
0163
0164
0165 void moreElementsVectorSrc(MachineInstr &MI, LLT MoreTy, unsigned OpIdx);
0166
0167
0168
0169 void bitcastSrc(MachineInstr &MI, LLT CastTy, unsigned OpIdx);
0170
0171
0172
0173 void bitcastDst(MachineInstr &MI, LLT CastTy, unsigned OpIdx);
0174
0175 private:
0176 LegalizeResult
0177 widenScalarMergeValues(MachineInstr &MI, unsigned TypeIdx, LLT WideTy);
0178 LegalizeResult
0179 widenScalarUnmergeValues(MachineInstr &MI, unsigned TypeIdx, LLT WideTy);
0180 LegalizeResult
0181 widenScalarExtract(MachineInstr &MI, unsigned TypeIdx, LLT WideTy);
0182 LegalizeResult
0183 widenScalarInsert(MachineInstr &MI, unsigned TypeIdx, LLT WideTy);
0184 LegalizeResult widenScalarAddSubOverflow(MachineInstr &MI, unsigned TypeIdx,
0185 LLT WideTy);
0186 LegalizeResult widenScalarAddSubShlSat(MachineInstr &MI, unsigned TypeIdx,
0187 LLT WideTy);
0188 LegalizeResult widenScalarMulo(MachineInstr &MI, unsigned TypeIdx,
0189 LLT WideTy);
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200 void insertParts(Register DstReg, LLT ResultTy,
0201 LLT PartTy, ArrayRef<Register> PartRegs,
0202 LLT LeftoverTy = LLT(), ArrayRef<Register> LeftoverRegs = {});
0203
0204
0205 void mergeMixedSubvectors(Register DstReg, ArrayRef<Register> PartRegs);
0206
0207 void appendVectorElts(SmallVectorImpl<Register> &Elts, Register Reg);
0208
0209
0210
0211
0212
0213 LLT extractGCDType(SmallVectorImpl<Register> &Parts, LLT DstTy,
0214 LLT NarrowTy, Register SrcReg);
0215
0216
0217
0218
0219 void extractGCDType(SmallVectorImpl<Register> &Parts, LLT GCDTy,
0220 Register SrcReg);
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237 LLT buildLCMMergePieces(LLT DstTy, LLT NarrowTy, LLT GCDTy,
0238 SmallVectorImpl<Register> &VRegs,
0239 unsigned PadStrategy = TargetOpcode::G_ANYEXT);
0240
0241
0242
0243
0244 void buildWidenedRemergeToDst(Register DstReg, LLT LCMTy,
0245 ArrayRef<Register> RemergeRegs);
0246
0247
0248
0249
0250 void multiplyRegisters(SmallVectorImpl<Register> &DstRegs,
0251 ArrayRef<Register> Src1Regs,
0252 ArrayRef<Register> Src2Regs, LLT NarrowTy);
0253
0254 void changeOpcode(MachineInstr &MI, unsigned NewOpcode);
0255
0256 LegalizeResult tryNarrowPow2Reduction(MachineInstr &MI, Register SrcReg,
0257 LLT SrcTy, LLT NarrowTy,
0258 unsigned ScalarOpc);
0259
0260
0261 LegalizeResult lowerMemset(MachineInstr &MI, Register Dst, Register Val,
0262 uint64_t KnownLen, Align Alignment,
0263 bool IsVolatile);
0264 LegalizeResult lowerMemcpyInline(MachineInstr &MI, Register Dst, Register Src,
0265 uint64_t KnownLen, Align DstAlign,
0266 Align SrcAlign, bool IsVolatile);
0267 LegalizeResult lowerMemcpy(MachineInstr &MI, Register Dst, Register Src,
0268 uint64_t KnownLen, uint64_t Limit, Align DstAlign,
0269 Align SrcAlign, bool IsVolatile);
0270 LegalizeResult lowerMemmove(MachineInstr &MI, Register Dst, Register Src,
0271 uint64_t KnownLen, Align DstAlign, Align SrcAlign,
0272 bool IsVolatile);
0273
0274
0275 LegalizeResult createGetStateLibcall(MachineIRBuilder &MIRBuilder,
0276 MachineInstr &MI,
0277 LostDebugLocObserver &LocObserver);
0278 LegalizeResult createSetStateLibcall(MachineIRBuilder &MIRBuilder,
0279 MachineInstr &MI,
0280 LostDebugLocObserver &LocObserver);
0281 LegalizeResult createResetStateLibcall(MachineIRBuilder &MIRBuilder,
0282 MachineInstr &MI,
0283 LostDebugLocObserver &LocObserver);
0284 LegalizeResult createFCMPLibcall(MachineIRBuilder &MIRBuilder,
0285 MachineInstr &MI,
0286 LostDebugLocObserver &LocObserver);
0287
0288 MachineInstrBuilder
0289 getNeutralElementForVecReduce(unsigned Opcode, MachineIRBuilder &MIRBuilder,
0290 LLT Ty);
0291
0292 public:
0293
0294
0295 Align getStackTemporaryAlignment(LLT Type, Align MinAlign = Align()) const;
0296
0297
0298 MachineInstrBuilder createStackTemporary(TypeSize Bytes, Align Alignment,
0299 MachinePointerInfo &PtrInfo);
0300
0301
0302
0303 MachineInstrBuilder createStackStoreLoad(const DstOp &Res, const SrcOp &Val);
0304
0305
0306 LegalizeResult scalarizeVectorBooleanStore(GStore &MI);
0307
0308
0309
0310
0311
0312 Register getVectorElementPointer(Register VecPtr, LLT VecTy, Register Index);
0313
0314
0315
0316
0317
0318
0319
0320 LegalizeResult fewerElementsVectorMultiEltType(
0321 GenericMachineInstr &MI, unsigned NumElts,
0322 std::initializer_list<unsigned> NonVecOpIndices = {});
0323
0324 LegalizeResult fewerElementsVectorPhi(GenericMachineInstr &MI,
0325 unsigned NumElts);
0326
0327 LegalizeResult moreElementsVectorPhi(MachineInstr &MI, unsigned TypeIdx,
0328 LLT MoreTy);
0329 LegalizeResult moreElementsVectorShuffle(MachineInstr &MI, unsigned TypeIdx,
0330 LLT MoreTy);
0331
0332 LegalizeResult fewerElementsVectorUnmergeValues(MachineInstr &MI,
0333 unsigned TypeIdx,
0334 LLT NarrowTy);
0335 LegalizeResult fewerElementsVectorMerge(MachineInstr &MI, unsigned TypeIdx,
0336 LLT NarrowTy);
0337 LegalizeResult fewerElementsVectorExtractInsertVectorElt(MachineInstr &MI,
0338 unsigned TypeIdx,
0339 LLT NarrowTy);
0340
0341
0342 LegalizeResult equalizeVectorShuffleLengths(MachineInstr &MI);
0343
0344 LegalizeResult reduceLoadStoreWidth(GLoadStore &MI, unsigned TypeIdx,
0345 LLT NarrowTy);
0346
0347 LegalizeResult narrowScalarShiftByConstant(MachineInstr &MI, const APInt &Amt,
0348 LLT HalfTy, LLT ShiftAmtTy);
0349
0350 LegalizeResult fewerElementsVectorReductions(MachineInstr &MI,
0351 unsigned TypeIdx, LLT NarrowTy);
0352 LegalizeResult fewerElementsVectorSeqReductions(MachineInstr &MI,
0353 unsigned TypeIdx,
0354 LLT NarrowTy);
0355
0356
0357
0358 LegalizeResult fewerElementsBitcast(MachineInstr &MI, unsigned TypeIdx,
0359 LLT NarrowTy);
0360
0361 LegalizeResult fewerElementsVectorShuffle(MachineInstr &MI, unsigned TypeIdx,
0362 LLT NarrowTy);
0363
0364 LegalizeResult narrowScalarShift(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
0365 LegalizeResult narrowScalarAddSub(MachineInstr &MI, unsigned TypeIdx,
0366 LLT NarrowTy);
0367 LegalizeResult narrowScalarMul(MachineInstr &MI, LLT Ty);
0368 LegalizeResult narrowScalarFPTOI(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
0369 LegalizeResult narrowScalarExtract(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
0370 LegalizeResult narrowScalarInsert(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
0371
0372 LegalizeResult narrowScalarBasic(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
0373 LegalizeResult narrowScalarExt(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
0374 LegalizeResult narrowScalarSelect(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
0375 LegalizeResult narrowScalarCTLZ(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
0376 LegalizeResult narrowScalarCTTZ(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
0377 LegalizeResult narrowScalarCTPOP(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
0378 LegalizeResult narrowScalarFLDEXP(MachineInstr &MI, unsigned TypeIdx, LLT Ty);
0379
0380
0381 LegalizeResult bitcastExtractVectorElt(MachineInstr &MI, unsigned TypeIdx,
0382 LLT CastTy);
0383
0384
0385 LegalizeResult bitcastInsertVectorElt(MachineInstr &MI, unsigned TypeIdx,
0386 LLT CastTy);
0387 LegalizeResult bitcastConcatVector(MachineInstr &MI, unsigned TypeIdx,
0388 LLT CastTy);
0389 LegalizeResult bitcastShuffleVector(MachineInstr &MI, unsigned TypeIdx,
0390 LLT CastTy);
0391 LegalizeResult bitcastExtractSubvector(MachineInstr &MI, unsigned TypeIdx,
0392 LLT CastTy);
0393 LegalizeResult bitcastInsertSubvector(MachineInstr &MI, unsigned TypeIdx,
0394 LLT CastTy);
0395
0396 LegalizeResult lowerConstant(MachineInstr &MI);
0397 LegalizeResult lowerFConstant(MachineInstr &MI);
0398 LegalizeResult lowerBitcast(MachineInstr &MI);
0399 LegalizeResult lowerLoad(GAnyLoad &MI);
0400 LegalizeResult lowerStore(GStore &MI);
0401 LegalizeResult lowerBitCount(MachineInstr &MI);
0402 LegalizeResult lowerFunnelShiftWithInverse(MachineInstr &MI);
0403 LegalizeResult lowerFunnelShiftAsShifts(MachineInstr &MI);
0404 LegalizeResult lowerFunnelShift(MachineInstr &MI);
0405 LegalizeResult lowerEXT(MachineInstr &MI);
0406 LegalizeResult lowerTRUNC(MachineInstr &MI);
0407 LegalizeResult lowerRotateWithReverseRotate(MachineInstr &MI);
0408 LegalizeResult lowerRotate(MachineInstr &MI);
0409
0410 LegalizeResult lowerU64ToF32BitOps(MachineInstr &MI);
0411 LegalizeResult lowerU64ToF32WithSITOFP(MachineInstr &MI);
0412 LegalizeResult lowerU64ToF64BitFloatOps(MachineInstr &MI);
0413 LegalizeResult lowerUITOFP(MachineInstr &MI);
0414 LegalizeResult lowerSITOFP(MachineInstr &MI);
0415 LegalizeResult lowerFPTOUI(MachineInstr &MI);
0416 LegalizeResult lowerFPTOSI(MachineInstr &MI);
0417 LegalizeResult lowerFPTOINT_SAT(MachineInstr &MI);
0418
0419 LegalizeResult lowerFPTRUNC_F64_TO_F16(MachineInstr &MI);
0420 LegalizeResult lowerFPTRUNC(MachineInstr &MI);
0421 LegalizeResult lowerFPOWI(MachineInstr &MI);
0422
0423 LegalizeResult lowerISFPCLASS(MachineInstr &MI);
0424
0425 LegalizeResult lowerThreewayCompare(MachineInstr &MI);
0426 LegalizeResult lowerMinMax(MachineInstr &MI);
0427 LegalizeResult lowerFCopySign(MachineInstr &MI);
0428 LegalizeResult lowerFMinNumMaxNum(MachineInstr &MI);
0429 LegalizeResult lowerFMad(MachineInstr &MI);
0430 LegalizeResult lowerIntrinsicRound(MachineInstr &MI);
0431 LegalizeResult lowerFFloor(MachineInstr &MI);
0432 LegalizeResult lowerMergeValues(MachineInstr &MI);
0433 LegalizeResult lowerUnmergeValues(MachineInstr &MI);
0434 LegalizeResult lowerExtractInsertVectorElt(MachineInstr &MI);
0435 LegalizeResult lowerShuffleVector(MachineInstr &MI);
0436 LegalizeResult lowerVECTOR_COMPRESS(MachineInstr &MI);
0437 Register getDynStackAllocTargetPtr(Register SPReg, Register AllocSize,
0438 Align Alignment, LLT PtrTy);
0439 LegalizeResult lowerDynStackAlloc(MachineInstr &MI);
0440 LegalizeResult lowerStackSave(MachineInstr &MI);
0441 LegalizeResult lowerStackRestore(MachineInstr &MI);
0442 LegalizeResult lowerExtract(MachineInstr &MI);
0443 LegalizeResult lowerInsert(MachineInstr &MI);
0444 LegalizeResult lowerSADDO_SSUBO(MachineInstr &MI);
0445 LegalizeResult lowerAddSubSatToMinMax(MachineInstr &MI);
0446 LegalizeResult lowerAddSubSatToAddoSubo(MachineInstr &MI);
0447 LegalizeResult lowerShlSat(MachineInstr &MI);
0448 LegalizeResult lowerBswap(MachineInstr &MI);
0449 LegalizeResult lowerBitreverse(MachineInstr &MI);
0450 LegalizeResult lowerReadWriteRegister(MachineInstr &MI);
0451 LegalizeResult lowerSMULH_UMULH(MachineInstr &MI);
0452 LegalizeResult lowerSelect(MachineInstr &MI);
0453 LegalizeResult lowerDIVREM(MachineInstr &MI);
0454 LegalizeResult lowerAbsToAddXor(MachineInstr &MI);
0455 LegalizeResult lowerAbsToMaxNeg(MachineInstr &MI);
0456 LegalizeResult lowerAbsToCNeg(MachineInstr &MI);
0457 LegalizeResult lowerFAbs(MachineInstr &MI);
0458 LegalizeResult lowerVectorReduction(MachineInstr &MI);
0459 LegalizeResult lowerMemcpyInline(MachineInstr &MI);
0460 LegalizeResult lowerMemCpyFamily(MachineInstr &MI, unsigned MaxLen = 0);
0461 LegalizeResult lowerVAArg(MachineInstr &MI);
0462 };
0463
0464
0465
0466 LegalizerHelper::LegalizeResult
0467 createLibcall(MachineIRBuilder &MIRBuilder, const char *Name,
0468 const CallLowering::ArgInfo &Result,
0469 ArrayRef<CallLowering::ArgInfo> Args, CallingConv::ID CC,
0470 LostDebugLocObserver &LocObserver, MachineInstr *MI = nullptr);
0471
0472
0473 LegalizerHelper::LegalizeResult
0474 createLibcall(MachineIRBuilder &MIRBuilder, RTLIB::Libcall Libcall,
0475 const CallLowering::ArgInfo &Result,
0476 ArrayRef<CallLowering::ArgInfo> Args,
0477 LostDebugLocObserver &LocObserver, MachineInstr *MI = nullptr);
0478
0479
0480 LegalizerHelper::LegalizeResult
0481 createMemLibcall(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI,
0482 MachineInstr &MI, LostDebugLocObserver &LocObserver);
0483
0484
0485 }
0486
0487 #endif