diff --git a/llvm/include/llvm/CodeGen/GlobalISel/Utils.h b/llvm/include/llvm/CodeGen/GlobalISel/Utils.h --- a/llvm/include/llvm/CodeGen/GlobalISel/Utils.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/Utils.h @@ -49,6 +49,29 @@ class ConstantFP; class APFloat; +// Convenience macros for extracting common registers from a MachineInstr. +#define Get2RegsFromMI(A, B, MI) \ + Register A = MI.getOperand(0).getReg(); \ + Register B = MI.getOperand(1).getReg(); + +#define Get3RegsFromMI(A, B, C, MI) \ + Register A = MI.getOperand(0).getReg(); \ + Register B = MI.getOperand(1).getReg(); \ + Register C = MI.getOperand(2).getReg(); + +#define Get4RegsFromMI(A, B, C, D, MI) \ + Register A = MI.getOperand(0).getReg(); \ + Register B = MI.getOperand(1).getReg(); \ + Register C = MI.getOperand(2).getReg(); \ + Register D = MI.getOperand(3).getReg(); + +#define Get5RegsFromMI(A, B, C, D, E, MI) \ + Register A = MI.getOperand(0).getReg(); \ + Register B = MI.getOperand(1).getReg(); \ + Register C = MI.getOperand(2).getReg(); \ + Register D = MI.getOperand(3).getReg(); \ + Register E = MI.getOperand(4).getReg(); + // Convenience macros for dealing with vector reduction opcodes. #define GISEL_VECREDUCE_CASES_ALL \ case TargetOpcode::G_VECREDUCE_SEQ_FADD: \ diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -1506,12 +1506,11 @@ if (TypeIdx != 1) return UnableToLegalize; - Register DstReg = MI.getOperand(0).getReg(); + Get2RegsFromMI(DstReg, Src1, MI) LLT DstTy = MRI.getType(DstReg); if (DstTy.isVector()) return UnableToLegalize; - Register Src1 = MI.getOperand(1).getReg(); LLT SrcTy = MRI.getType(Src1); const int DstSize = DstTy.getSizeInBits(); const int SrcSize = SrcTy.getSizeInBits(); @@ -1755,10 +1754,8 @@ LegalizerHelper::LegalizeResult LegalizerHelper::widenScalarExtract(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) { - Register DstReg = MI.getOperand(0).getReg(); - Register SrcReg = MI.getOperand(1).getReg(); + Get2RegsFromMI(DstReg, SrcReg, MI) LLT SrcTy = MRI.getType(SrcReg); - LLT DstTy = MRI.getType(DstReg); unsigned Offset = MI.getOperand(2).getImm(); @@ -1980,10 +1977,7 @@ } bool IsSigned = MI.getOpcode() == TargetOpcode::G_SMULO; - Register Result = MI.getOperand(0).getReg(); - Register OriginalOverflow = MI.getOperand(1).getReg(); - Register LHS = MI.getOperand(2).getReg(); - Register RHS = MI.getOperand(3).getReg(); + Get4RegsFromMI(Result, OriginalOverflow, LHS, RHS, MI) LLT SrcTy = MRI.getType(LHS); LLT OverflowTy = MRI.getType(OriginalOverflow); unsigned SrcBitWidth = SrcTy.getScalarSizeInBits(); @@ -2660,8 +2654,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerBitcast(MachineInstr &MI) { - Register Dst = MI.getOperand(0).getReg(); - Register Src = MI.getOperand(1).getReg(); + Get2RegsFromMI(Dst, Src, MI) LLT DstTy = MRI.getType(Dst); LLT SrcTy = MRI.getType(Src); @@ -2760,9 +2753,7 @@ if (TypeIdx != 1) return UnableToLegalize; - Register Dst = MI.getOperand(0).getReg(); - Register SrcVec = MI.getOperand(1).getReg(); - Register Idx = MI.getOperand(2).getReg(); + Get3RegsFromMI(Dst, SrcVec, Idx, MI) LLT SrcVecTy = MRI.getType(SrcVec); LLT IdxTy = MRI.getType(Idx); @@ -2900,10 +2891,7 @@ if (TypeIdx != 0) return UnableToLegalize; - Register Dst = MI.getOperand(0).getReg(); - Register SrcVec = MI.getOperand(1).getReg(); - Register Val = MI.getOperand(2).getReg(); - Register Idx = MI.getOperand(3).getReg(); + Get4RegsFromMI(Dst, SrcVec, Val, Idx, MI) LLT VecTy = MRI.getType(Dst); LLT IdxTy = MRI.getType(Idx); @@ -3304,10 +3292,7 @@ case TargetOpcode::G_UMULO: { // Generate G_UMULH/G_SMULH to check for overflow and a normal G_MUL for the // result. - Register Res = MI.getOperand(0).getReg(); - Register Overflow = MI.getOperand(1).getReg(); - Register LHS = MI.getOperand(2).getReg(); - Register RHS = MI.getOperand(3).getReg(); + Get4RegsFromMI(Res, Overflow, LHS, RHS, MI) LLT Ty = MRI.getType(Res); unsigned Opcode = MI.getOpcode() == TargetOpcode::G_SMULO @@ -3338,7 +3323,7 @@ return Legalized; } case TargetOpcode::G_FNEG: { - Register Res = MI.getOperand(0).getReg(); + Get2RegsFromMI(Res, SubByReg, MI) LLT Ty = MRI.getType(Res); // TODO: Handle vector types once we are able to @@ -3347,14 +3332,13 @@ return UnableToLegalize; auto SignMask = MIRBuilder.buildConstant(Ty, APInt::getSignMask(Ty.getSizeInBits())); - Register SubByReg = MI.getOperand(1).getReg(); MIRBuilder.buildXor(Res, SubByReg, SignMask); MI.eraseFromParent(); return Legalized; } case TargetOpcode::G_FSUB: case TargetOpcode::G_STRICT_FSUB: { - Register Res = MI.getOperand(0).getReg(); + Get3RegsFromMI(Res, LHS, RHS, MI) LLT Ty = MRI.getType(Res); // Lower (G_FSUB LHS, RHS) to (G_FADD LHS, (G_FNEG RHS)). @@ -3362,8 +3346,6 @@ // end up with an infinite loop as G_FSUB is used to legalize G_FNEG. if (LI.getAction({G_FNEG, {Ty}}).Action == Lower) return UnableToLegalize; - Register LHS = MI.getOperand(1).getReg(); - Register RHS = MI.getOperand(2).getReg(); auto Neg = MIRBuilder.buildFNeg(Ty, RHS); if (MI.getOpcode() == TargetOpcode::G_STRICT_FSUB) @@ -3387,11 +3369,7 @@ return Legalized; } case TargetOpcode::G_ATOMIC_CMPXCHG_WITH_SUCCESS: { - Register OldValRes = MI.getOperand(0).getReg(); - Register SuccessRes = MI.getOperand(1).getReg(); - Register Addr = MI.getOperand(2).getReg(); - Register CmpVal = MI.getOperand(3).getReg(); - Register NewVal = MI.getOperand(4).getReg(); + Get5RegsFromMI(OldValRes, SuccessRes, Addr, CmpVal, NewVal, MI) MIRBuilder.buildAtomicCmpXchg(OldValRes, Addr, CmpVal, NewVal, **MI.memoperands_begin()); MIRBuilder.buildICmp(CmpInst::ICMP_EQ, SuccessRes, OldValRes, CmpVal); @@ -3411,10 +3389,7 @@ case TargetOpcode::G_CTPOP: return lowerBitCount(MI); case G_UADDO: { - Register Res = MI.getOperand(0).getReg(); - Register CarryOut = MI.getOperand(1).getReg(); - Register LHS = MI.getOperand(2).getReg(); - Register RHS = MI.getOperand(3).getReg(); + Get4RegsFromMI(Res, CarryOut, LHS, RHS, MI) MIRBuilder.buildAdd(Res, LHS, RHS); MIRBuilder.buildICmp(CmpInst::ICMP_ULT, CarryOut, Res, RHS); @@ -3423,11 +3398,7 @@ return Legalized; } case G_UADDE: { - Register Res = MI.getOperand(0).getReg(); - Register CarryOut = MI.getOperand(1).getReg(); - Register LHS = MI.getOperand(2).getReg(); - Register RHS = MI.getOperand(3).getReg(); - Register CarryIn = MI.getOperand(4).getReg(); + Get5RegsFromMI(Res, CarryOut, LHS, RHS, CarryIn, MI) LLT Ty = MRI.getType(Res); auto TmpRes = MIRBuilder.buildAdd(Ty, LHS, RHS); @@ -3439,10 +3410,7 @@ return Legalized; } case G_USUBO: { - Register Res = MI.getOperand(0).getReg(); - Register BorrowOut = MI.getOperand(1).getReg(); - Register LHS = MI.getOperand(2).getReg(); - Register RHS = MI.getOperand(3).getReg(); + Get4RegsFromMI(Res, BorrowOut, LHS, RHS, MI) MIRBuilder.buildSub(Res, LHS, RHS); MIRBuilder.buildICmp(CmpInst::ICMP_ULT, BorrowOut, LHS, RHS); @@ -3451,11 +3419,7 @@ return Legalized; } case G_USUBE: { - Register Res = MI.getOperand(0).getReg(); - Register BorrowOut = MI.getOperand(1).getReg(); - Register LHS = MI.getOperand(2).getReg(); - Register RHS = MI.getOperand(3).getReg(); - Register BorrowIn = MI.getOperand(4).getReg(); + Get5RegsFromMI(Res, BorrowOut, LHS, RHS, BorrowIn, MI) const LLT CondTy = MRI.getType(BorrowOut); const LLT Ty = MRI.getType(Res); @@ -3500,8 +3464,7 @@ assert(MI.getOperand(2).isImm() && "Expected immediate"); int64_t SizeInBits = MI.getOperand(2).getImm(); - Register DstReg = MI.getOperand(0).getReg(); - Register SrcReg = MI.getOperand(1).getReg(); + Get2RegsFromMI(DstReg, SrcReg, MI) LLT DstTy = MRI.getType(DstReg); Register TmpRes = MRI.createGenericVirtualRegister(DstTy); @@ -3988,8 +3951,7 @@ LegalizerHelper::fewerElementsVectorExtractInsertVectorElt(MachineInstr &MI, unsigned TypeIdx, LLT NarrowVecTy) { - Register DstReg = MI.getOperand(0).getReg(); - Register SrcVec = MI.getOperand(1).getReg(); + Get2RegsFromMI(DstReg, SrcVec, MI) Register InsertVal; bool IsInsert = MI.getOpcode() == TargetOpcode::G_INSERT_VECTOR_ELT; @@ -4308,9 +4270,7 @@ if (TypeIdx != 0) return UnableToLegalize; - Register DstReg = MI.getOperand(0).getReg(); - Register Src1Reg = MI.getOperand(1).getReg(); - Register Src2Reg = MI.getOperand(2).getReg(); + Get3RegsFromMI(DstReg, Src1Reg, Src2Reg, MI) ArrayRef Mask = MI.getOperand(3).getShuffleMask(); LLT DstTy = MRI.getType(DstReg); LLT Src1Ty = MRI.getType(Src1Reg); @@ -4504,9 +4464,8 @@ // The semantics of the normal non-sequential reductions allow us to freely // re-associate the operation. - Register SrcReg = MI.getOperand(1).getReg(); + Get2RegsFromMI(DstReg, SrcReg, MI) LLT SrcTy = MRI.getType(SrcReg); - Register DstReg = MI.getOperand(0).getReg(); LLT DstTy = MRI.getType(DstReg); if (NarrowTy.isVector() && @@ -4917,8 +4876,7 @@ Observer.changedInstr(MI); return Legalized; case TargetOpcode::G_SELECT: { - Register DstReg = MI.getOperand(0).getReg(); - Register CondReg = MI.getOperand(1).getReg(); + Get2RegsFromMI(DstReg, CondReg, MI) LLT DstTy = MRI.getType(DstReg); LLT CondTy = MRI.getType(CondReg); if (TypeIdx == 1) { @@ -5044,9 +5002,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::moreElementsVectorShuffle(MachineInstr &MI, unsigned int TypeIdx, LLT MoreTy) { - Register DstReg = MI.getOperand(0).getReg(); - Register Src1Reg = MI.getOperand(1).getReg(); - Register Src2Reg = MI.getOperand(2).getReg(); + Get3RegsFromMI(DstReg, Src1Reg, Src2Reg, MI) ArrayRef Mask = MI.getOperand(3).getShuffleMask(); LLT DstTy = MRI.getType(DstReg); LLT Src1Ty = MRI.getType(Src1Reg); @@ -5248,9 +5204,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalarMul(MachineInstr &MI, LLT NarrowTy) { - Register DstReg = MI.getOperand(0).getReg(); - Register Src1 = MI.getOperand(1).getReg(); - Register Src2 = MI.getOperand(2).getReg(); + Get3RegsFromMI(DstReg, Src1, Src2, MI) LLT Ty = MRI.getType(DstReg); if (Ty.isVector()) @@ -5501,8 +5455,7 @@ if (TypeIdx != 0) return UnableToLegalize; - Register DstReg = MI.getOperand(0).getReg(); - Register SrcReg = MI.getOperand(1).getReg(); + Get2RegsFromMI(DstReg, SrcReg, MI) LLT DstTy = MRI.getType(DstReg); if (DstTy.isVector()) @@ -5569,8 +5522,7 @@ if (TypeIdx != 1) return UnableToLegalize; - Register DstReg = MI.getOperand(0).getReg(); - Register SrcReg = MI.getOperand(1).getReg(); + Get2RegsFromMI(DstReg, SrcReg, MI) LLT DstTy = MRI.getType(DstReg); LLT SrcTy = MRI.getType(SrcReg); unsigned NarrowSize = NarrowTy.getSizeInBits(); @@ -5605,8 +5557,7 @@ if (TypeIdx != 1) return UnableToLegalize; - Register DstReg = MI.getOperand(0).getReg(); - Register SrcReg = MI.getOperand(1).getReg(); + Get2RegsFromMI(DstReg, SrcReg, MI) LLT DstTy = MRI.getType(DstReg); LLT SrcTy = MRI.getType(SrcReg); unsigned NarrowSize = NarrowTy.getSizeInBits(); @@ -5679,8 +5630,7 @@ return Legalized; } case TargetOpcode::G_CTLZ: { - Register DstReg = MI.getOperand(0).getReg(); - Register SrcReg = MI.getOperand(1).getReg(); + Get2RegsFromMI(DstReg, SrcReg, MI) LLT DstTy = MRI.getType(DstReg); LLT SrcTy = MRI.getType(SrcReg); unsigned Len = SrcTy.getSizeInBits(); @@ -5729,8 +5679,7 @@ return Legalized; } case TargetOpcode::G_CTTZ: { - Register DstReg = MI.getOperand(0).getReg(); - Register SrcReg = MI.getOperand(1).getReg(); + Get2RegsFromMI(DstReg, SrcReg, MI) LLT DstTy = MRI.getType(DstReg); LLT SrcTy = MRI.getType(SrcReg); @@ -5838,10 +5787,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerFunnelShiftWithInverse(MachineInstr &MI) { - Register Dst = MI.getOperand(0).getReg(); - Register X = MI.getOperand(1).getReg(); - Register Y = MI.getOperand(2).getReg(); - Register Z = MI.getOperand(3).getReg(); + Get4RegsFromMI(Dst, X, Y, Z, MI) LLT Ty = MRI.getType(Dst); LLT ShTy = MRI.getType(Z); @@ -5880,10 +5826,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerFunnelShiftAsShifts(MachineInstr &MI) { - Register Dst = MI.getOperand(0).getReg(); - Register X = MI.getOperand(1).getReg(); - Register Y = MI.getOperand(2).getReg(); - Register Z = MI.getOperand(3).getReg(); + Get4RegsFromMI(Dst, X, Y, Z, MI) LLT Ty = MRI.getType(Dst); LLT ShTy = MRI.getType(Z); @@ -5962,9 +5905,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerRotateWithReverseRotate(MachineInstr &MI) { - Register Dst = MI.getOperand(0).getReg(); - Register Src = MI.getOperand(1).getReg(); - Register Amt = MI.getOperand(2).getReg(); + Get3RegsFromMI(Dst, Src, Amt, MI) LLT AmtTy = MRI.getType(Amt); auto Zero = MIRBuilder.buildConstant(AmtTy, 0); bool IsLeft = MI.getOpcode() == TargetOpcode::G_ROTL; @@ -5976,9 +5917,7 @@ } LegalizerHelper::LegalizeResult LegalizerHelper::lowerRotate(MachineInstr &MI) { - Register Dst = MI.getOperand(0).getReg(); - Register Src = MI.getOperand(1).getReg(); - Register Amt = MI.getOperand(2).getReg(); + Get3RegsFromMI(Dst, Src, Amt, MI) LLT DstTy = MRI.getType(Dst); LLT SrcTy = MRI.getType(Src); LLT AmtTy = MRI.getType(Amt); @@ -6051,8 +5990,7 @@ // representation. LegalizerHelper::LegalizeResult LegalizerHelper::lowerU64ToF32BitOps(MachineInstr &MI) { - Register Dst = MI.getOperand(0).getReg(); - Register Src = MI.getOperand(1).getReg(); + Get2RegsFromMI(Dst, Src, MI) const LLT S64 = LLT::scalar(64); const LLT S32 = LLT::scalar(32); const LLT S1 = LLT::scalar(1); @@ -6107,8 +6045,7 @@ } LegalizerHelper::LegalizeResult LegalizerHelper::lowerUITOFP(MachineInstr &MI) { - Register Dst = MI.getOperand(0).getReg(); - Register Src = MI.getOperand(1).getReg(); + Get2RegsFromMI(Dst, Src, MI) LLT DstTy = MRI.getType(Dst); LLT SrcTy = MRI.getType(Src); @@ -6135,8 +6072,7 @@ } LegalizerHelper::LegalizeResult LegalizerHelper::lowerSITOFP(MachineInstr &MI) { - Register Dst = MI.getOperand(0).getReg(); - Register Src = MI.getOperand(1).getReg(); + Get2RegsFromMI(Dst, Src, MI) LLT DstTy = MRI.getType(Dst); LLT SrcTy = MRI.getType(Src); @@ -6181,8 +6117,7 @@ } LegalizerHelper::LegalizeResult LegalizerHelper::lowerFPTOUI(MachineInstr &MI) { - Register Dst = MI.getOperand(0).getReg(); - Register Src = MI.getOperand(1).getReg(); + Get2RegsFromMI(Dst, Src, MI) LLT DstTy = MRI.getType(Dst); LLT SrcTy = MRI.getType(Src); const LLT S64 = LLT::scalar(64); @@ -6224,8 +6159,7 @@ } LegalizerHelper::LegalizeResult LegalizerHelper::lowerFPTOSI(MachineInstr &MI) { - Register Dst = MI.getOperand(0).getReg(); - Register Src = MI.getOperand(1).getReg(); + Get2RegsFromMI(Dst, Src, MI) LLT DstTy = MRI.getType(Dst); LLT SrcTy = MRI.getType(Src); const LLT S64 = LLT::scalar(64); @@ -6293,9 +6227,7 @@ // f64 -> f16 conversion using round-to-nearest-even rounding mode. LegalizerHelper::LegalizeResult LegalizerHelper::lowerFPTRUNC_F64_TO_F16(MachineInstr &MI) { - Register Dst = MI.getOperand(0).getReg(); - Register Src = MI.getOperand(1).getReg(); - + Get2RegsFromMI(Dst, Src, MI) if (MRI.getType(Src).isVector()) // TODO: Handle vectors directly. return UnableToLegalize; @@ -6398,9 +6330,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerFPTRUNC(MachineInstr &MI) { - Register Dst = MI.getOperand(0).getReg(); - Register Src = MI.getOperand(1).getReg(); - + Get2RegsFromMI(Dst, Src, MI) LLT DstTy = MRI.getType(Dst); LLT SrcTy = MRI.getType(Src); const LLT S64 = LLT::scalar(64); @@ -6415,9 +6345,7 @@ // TODO: If RHS is a constant SelectionDAGBuilder expands this into a // multiplication tree. LegalizerHelper::LegalizeResult LegalizerHelper::lowerFPOWI(MachineInstr &MI) { - Register Dst = MI.getOperand(0).getReg(); - Register Src0 = MI.getOperand(1).getReg(); - Register Src1 = MI.getOperand(2).getReg(); + Get3RegsFromMI(Dst, Src0, Src1, MI) LLT Ty = MRI.getType(Dst); auto CvtSrc1 = MIRBuilder.buildSITOFP(Ty, Src1); @@ -6442,9 +6370,7 @@ } LegalizerHelper::LegalizeResult LegalizerHelper::lowerMinMax(MachineInstr &MI) { - Register Dst = MI.getOperand(0).getReg(); - Register Src0 = MI.getOperand(1).getReg(); - Register Src1 = MI.getOperand(2).getReg(); + Get3RegsFromMI(Dst, Src0, Src1, MI) const CmpInst::Predicate Pred = minMaxToCompare(MI.getOpcode()); LLT CmpType = MRI.getType(Dst).changeElementSize(1); @@ -6458,9 +6384,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerFCopySign(MachineInstr &MI) { - Register Dst = MI.getOperand(0).getReg(); - Register Src0 = MI.getOperand(1).getReg(); - Register Src1 = MI.getOperand(2).getReg(); + Get3RegsFromMI(Dst, Src0, Src1, MI) const LLT Src0Ty = MRI.getType(Src0); const LLT Src1Ty = MRI.getType(Src1); @@ -6505,9 +6429,7 @@ unsigned NewOp = MI.getOpcode() == TargetOpcode::G_FMINNUM ? TargetOpcode::G_FMINNUM_IEEE : TargetOpcode::G_FMAXNUM_IEEE; - Register Dst = MI.getOperand(0).getReg(); - Register Src0 = MI.getOperand(1).getReg(); - Register Src1 = MI.getOperand(2).getReg(); + Get3RegsFromMI(Dst, Src0, Src1, MI) LLT Ty = MRI.getType(Dst); if (!MI.getFlag(MachineInstr::FmNoNans)) { @@ -6546,8 +6468,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerIntrinsicRound(MachineInstr &MI) { - Register DstReg = MI.getOperand(0).getReg(); - Register X = MI.getOperand(1).getReg(); + Get2RegsFromMI(DstReg, X, MI) const unsigned Flags = MI.getFlags(); const LLT Ty = MRI.getType(DstReg); const LLT CondTy = Ty.changeElementSize(1); @@ -6577,10 +6498,8 @@ return Legalized; } -LegalizerHelper::LegalizeResult -LegalizerHelper::lowerFFloor(MachineInstr &MI) { - Register DstReg = MI.getOperand(0).getReg(); - Register SrcReg = MI.getOperand(1).getReg(); +LegalizerHelper::LegalizeResult LegalizerHelper::lowerFFloor(MachineInstr &MI) { + Get2RegsFromMI(DstReg, SrcReg, MI) unsigned Flags = MI.getFlags(); LLT Ty = MRI.getType(DstReg); const LLT CondTy = Ty.changeElementSize(1); @@ -6607,8 +6526,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::lowerMergeValues(MachineInstr &MI) { const unsigned NumOps = MI.getNumOperands(); - Register DstReg = MI.getOperand(0).getReg(); - Register Src0Reg = MI.getOperand(1).getReg(); + Get2RegsFromMI(DstReg, Src0Reg, MI) LLT DstTy = MRI.getType(DstReg); LLT SrcTy = MRI.getType(Src0Reg); unsigned PartSize = SrcTy.getSizeInBits();