32#define DEBUG_TYPE "legalize-types"
42void DAGTypeLegalizer::PromoteIntegerResult(
SDNode *
N,
unsigned ResNo) {
47 if (CustomLowerNode(
N,
N->getValueType(ResNo),
true)) {
52 switch (
N->getOpcode()) {
55 dbgs() <<
"PromoteIntegerResult #" << ResNo <<
": ";
56 N->dump(&DAG);
dbgs() <<
"\n";
63 case ISD::VP_BITREVERSE:
66 case ISD::BSWAP: Res = PromoteIntRes_BSWAP(
N);
break;
69 case ISD::VP_CTLZ_ZERO_UNDEF:
72 case ISD::CTLZ: Res = PromoteIntRes_CTLZ(
N);
break;
73 case ISD::CTLS: Res = PromoteIntRes_CTLS(
N);
break;
76 case ISD::CTPOP: Res = PromoteIntRes_CTPOP_PARITY(
N);
break;
77 case ISD::VP_CTTZ_ZERO_UNDEF:
80 case ISD::CTTZ: Res = PromoteIntRes_CTTZ(
N);
break;
83 case ISD::VP_CTTZ_ELTS_ZERO_UNDEF:
84 case ISD::VP_CTTZ_ELTS:
85 Res = PromoteIntRes_VP_CttzElements(
N);
88 Res = PromoteIntRes_EXTRACT_VECTOR_ELT(
N);
break;
98 Res = PromoteIntRes_VECTOR_COMPRESS(
N);
104 Res = PromoteIntRes_Select(
N);
109 case ISD::SETCC: Res = PromoteIntRes_SETCC(
N);
break;
111 case ISD::SMAX: Res = PromoteIntRes_SExtIntBinOp(
N);
break;
113 case ISD::UMAX: Res = PromoteIntRes_UMINUMAX(
N);
break;
116 case ISD::VP_SHL: Res = PromoteIntRes_SHL(
N);
break;
118 Res = PromoteIntRes_SIGN_EXTEND_INREG(
N);
break;
120 case ISD::VP_SRA: Res = PromoteIntRes_SRA(
N);
break;
122 case ISD::VP_SRL: Res = PromoteIntRes_SRL(
N);
break;
123 case ISD::VP_TRUNCATE:
126 case ISD::UNDEF: Res = PromoteIntRes_UNDEF(
N);
break;
127 case ISD::VAARG: Res = PromoteIntRes_VAARG(
N);
break;
131 Res = PromoteIntRes_EXTRACT_SUBVECTOR(
N);
break;
133 Res = PromoteIntRes_INSERT_SUBVECTOR(
N);
break;
135 Res = PromoteIntRes_VECTOR_REVERSE(
N);
break;
137 Res = PromoteIntRes_VECTOR_SHUFFLE(
N);
break;
140 Res = PromoteIntRes_VECTOR_SPLICE(
N);
144 Res = PromoteIntRes_VECTOR_INTERLEAVE_DEINTERLEAVE(
N);
147 Res = PromoteIntRes_INSERT_VECTOR_ELT(
N);
break;
149 Res = PromoteIntRes_BUILD_VECTOR(
N);
153 Res = PromoteIntRes_ScalarOp(
N);
157 Res = PromoteIntRes_CONCAT_VECTORS(
N);
break;
162 Res = PromoteIntRes_EXTEND_VECTOR_INREG(
N);
break;
165 Res = PromoteIntRes_VECTOR_FIND_LAST_ACTIVE(
N);
169 Res = PromoteIntRes_GET_ACTIVE_LANE_MASK(
N);
175 Res = PromoteIntRes_PARTIAL_REDUCE_MLA(
N);
179 case ISD::VP_SIGN_EXTEND:
181 case ISD::VP_ZERO_EXTEND:
184 case ISD::VP_FP_TO_SINT:
185 case ISD::VP_FP_TO_UINT:
193 Res = PromoteIntRes_FP_TO_XINT_SAT(
N);
break;
197 Res = PromoteIntRes_FP_TO_FP16_BF16(
N);
201 Res = PromoteIntRes_STRICT_FP_TO_FP16_BF16(
N);
216 case ISD::VP_MUL: Res = PromoteIntRes_SimpleIntBinOp(
N);
break;
226 case ISD::VP_SREM: Res = PromoteIntRes_SExtIntBinOp(
N);
break;
236 case ISD::VP_UREM: Res = PromoteIntRes_ZExtIntBinOp(
N);
break;
240 Res = PromoteIntRes_ZExtMaskedIntBinOp(
N);
244 Res = PromoteIntRes_SExtMaskedIntBinOp(
N);
248 case ISD::SSUBO: Res = PromoteIntRes_SADDSUBO(
N, ResNo);
break;
250 case ISD::USUBO: Res = PromoteIntRes_UADDSUBO(
N, ResNo);
break;
252 case ISD::UMULO: Res = PromoteIntRes_XMULO(
N, ResNo);
break;
268 Res = PromoteIntRes_ADDSUBSHLSAT<EmptyMatchContext>(
N);
270 case ISD::VP_SADDSAT:
271 case ISD::VP_UADDSAT:
272 case ISD::VP_SSUBSAT:
273 case ISD::VP_USUBSAT:
274 Res = PromoteIntRes_ADDSUBSHLSAT<VPMatchContext>(
N);
279 Res = PromoteIntRes_CMP(
N);
292 case ISD::ABS: Res = PromoteIntRes_ABS(
N);
break;
325 Res = PromoteIntRes_VECREDUCE(
N);
328 case ISD::VP_REDUCE_ADD:
329 case ISD::VP_REDUCE_MUL:
330 case ISD::VP_REDUCE_AND:
331 case ISD::VP_REDUCE_OR:
332 case ISD::VP_REDUCE_XOR:
333 case ISD::VP_REDUCE_SMAX:
334 case ISD::VP_REDUCE_SMIN:
335 case ISD::VP_REDUCE_UMAX:
336 case ISD::VP_REDUCE_UMIN:
337 Res = PromoteIntRes_VP_REDUCE(
N);
342 Res = PromoteIntRes_LOOP_DEPENDENCE_MASK(
N);
346 Res = PromoteIntRes_FREEZE(
N);
351 Res = PromoteIntRes_Rotate(
N);
356 Res = PromoteIntRes_FunnelShift(
N);
361 Res = PromoteIntRes_VPFunnelShift(
N);
367 Res = PromoteIntRes_CLMUL(
N);
371 Res = PromoteIntRes_IS_FPCLASS(
N);
374 Res = PromoteIntRes_FFREXP(
N);
379 Res = PromoteIntRes_XRINT(
N);
383 Res = PromoteIntRes_PATCHPOINT(
N);
386 Res = PromoteIntRes_READ_REGISTER(
N);
392 SetPromotedInteger(
SDValue(
N, ResNo), Res);
397 SDValue Op = DisintegrateMERGE_VALUES(
N, ResNo);
398 return GetPromotedInteger(
Op);
401SDValue DAGTypeLegalizer::PromoteIntRes_LOOP_DEPENDENCE_MASK(
SDNode *
N) {
403 EVT NewVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
404 return DAG.getNode(
N->getOpcode(), SDLoc(
N), NewVT,
N->ops());
409 SDValue Op = SExtPromotedInteger(
N->getOperand(0));
411 Op.getValueType(),
Op,
N->getOperand(1));
416 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
418 Op.getValueType(),
Op,
N->getOperand(1));
422 EVT ResVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
425 switch (TLI.getExtendForAtomicOps()) {
441 DAG.getAtomicLoad(ExtType, SDLoc(
N),
N->getMemoryVT(), ResVT,
442 N->getChain(),
N->getBasePtr(),
N->getMemOperand());
452 switch (TLI.getExtendForAtomicRMWArg(
N->getOpcode())) {
454 Op2 = SExtPromotedInteger(Op2);
457 Op2 = ZExtPromotedInteger(Op2);
460 Op2 = GetPromotedInteger(Op2);
465 SDValue Res = DAG.getAtomic(
N->getOpcode(), SDLoc(
N),
467 N->getChain(),
N->getBasePtr(),
468 Op2,
N->getMemOperand());
479 EVT SVT = getSetCCResultType(
N->getOperand(2).getValueType());
480 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(1));
484 if (!TLI.isTypeLegal(SVT))
487 SDVTList VTs = DAG.getVTList(
N->getValueType(0), SVT, MVT::Other);
488 SDValue Res = DAG.getAtomicCmpSwap(
490 N->getChain(),
N->getBasePtr(),
N->getOperand(2),
N->getOperand(3),
494 return DAG.getSExtOrTrunc(Res.
getValue(1), SDLoc(
N), NVT);
500 SDValue Op3 = GetPromotedInteger(
N->getOperand(3));
501 switch (TLI.getExtendForAtomicCmpSwapArg()) {
503 Op2 = SExtPromotedInteger(Op2);
506 Op2 = ZExtPromotedInteger(Op2);
509 Op2 = GetPromotedInteger(Op2);
516 DAG.getVTList(Op2.
getValueType(),
N->getValueType(1), MVT::Other);
517 SDValue Res = DAG.getAtomicCmpSwap(
518 N->getOpcode(), SDLoc(
N),
N->getMemoryVT(), VTs,
N->getChain(),
519 N->getBasePtr(), Op2, Op3,
N->getMemOperand());
521 for (
unsigned i = 1, NumResults =
N->getNumValues(); i < NumResults; ++i)
529 EVT NInVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT);
530 EVT OutVT =
N->getValueType(0);
531 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
534 switch (getTypeAction(InVT)) {
540 return DAG.getNode(
ISD::BITCAST, dl, NOutVT, GetPromotedInteger(InOp));
544 return DAG.getNode(
ISD::ANY_EXTEND, dl, NOutVT, GetSoftenedFloat(InOp));
547 return DAG.getNode(
ISD::ANY_EXTEND, dl, NOutVT, GetSoftPromotedHalf(InOp));
555 BitConvertToInteger(GetScalarizedVector(InOp)));
564 GetSplitVector(
N->getOperand(0),
Lo,
Hi);
565 Lo = BitConvertToInteger(
Lo);
566 Hi = BitConvertToInteger(
Hi);
568 if (DAG.getDataLayout().isBigEndian())
574 JoinIntegers(
Lo,
Hi));
589 if (DAG.getDataLayout().isBigEndian()) {
593 DAG.getShiftAmountConstant(ShiftAmt, NOutVT, dl));
608 if (isTypeLegal(WideOutVT)) {
609 InOp = DAG.getBitcast(WideOutVT, GetWidenedVector(InOp));
611 DAG.getVectorIdxConstant(0, dl));
620 DAG.getDataLayout().isLittleEndian()) {
631 if (isTypeLegal(WideVecVT)) {
633 DAG.getUNDEF(WideVecVT), InOp,
634 DAG.getVectorIdxConstant(0, dl));
642 CreateStackStoreLoad(InOp, OutVT));
646 SDValue V = GetPromotedInteger(
N->getOperand(0));
648 V.getValueType(), V);
652 SDValue Op = GetPromotedInteger(
N->getOperand(0));
653 EVT OVT =
N->getValueType(0);
654 EVT NVT =
Op.getValueType();
662 !TLI.isOperationLegalOrCustomOrPromote(
ISD::BSWAP, NVT)) {
663 if (
SDValue Res = TLI.expandBSWAP(
N, DAG))
668 SDValue ShAmt = DAG.getShiftAmountConstant(DiffBits, NVT, dl);
674 return DAG.getNode(ISD::VP_SRL, dl, NVT,
675 DAG.getNode(ISD::VP_BSWAP, dl, NVT,
Op, Mask, EVL), ShAmt,
680 SDValue Op = GetPromotedInteger(
N->getOperand(0));
681 EVT OVT =
N->getValueType(0);
682 EVT NVT =
Op.getValueType();
691 if (
SDValue Res = TLI.expandBITREVERSE(
N, DAG))
696 SDValue ShAmt = DAG.getShiftAmountConstant(DiffBits, NVT, dl);
702 return DAG.
getNode(ISD::VP_SRL, dl, NVT,
703 DAG.getNode(ISD::VP_BITREVERSE, dl, NVT,
Op, Mask, EVL),
711 TLI.getTypeToTransformTo(*DAG.getContext(),
712 N->getValueType(0)), JoinIntegers(
N->getOperand(0),
717 EVT VT =
N->getValueType(0);
724 TLI.getTypeToTransformTo(*DAG.getContext(), VT),
731 EVT OVT =
N->getValueType(0);
732 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
738 if (!OVT.
isVector() && TLI.isTypeLegal(NVT) &&
739 !TLI.isOperationLegalOrCustomOrPromote(
ISD::CTLZ, NVT) &&
741 if (
SDValue Result = TLI.expandCTLZ(
N, DAG)) {
747 unsigned CtlzOpcode =
N->getOpcode();
748 if (CtlzOpcode ==
ISD::CTLZ || CtlzOpcode == ISD::VP_CTLZ) {
750 SDValue ExtractLeadingBits = DAG.getConstant(
753 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
757 if (!
N->isVPOpcode())
758 return DAG.getNode(
ISD::SUB, dl, NVT,
759 DAG.getNode(
N->getOpcode(), dl, NVT,
Op),
763 return DAG.
getNode(ISD::VP_SUB, dl, NVT,
764 DAG.getNode(
N->getOpcode(), dl, NVT,
Op, Mask, EVL),
765 ExtractLeadingBits, Mask, EVL,
769 CtlzOpcode == ISD::VP_CTLZ_ZERO_UNDEF) {
771 SDValue Op = GetPromotedInteger(
N->getOperand(0));
775 DAG.getShiftAmountConstant(SHLAmount,
Op.getValueType(), dl);
776 if (!
N->isVPOpcode()) {
778 return DAG.getNode(CtlzOpcode, dl, NVT,
Op);
783 Op = DAG.getNode(ISD::VP_SHL, dl, NVT,
Op, ShiftConst, Mask, EVL);
784 return DAG.getNode(CtlzOpcode, dl, NVT,
Op, Mask, EVL);
790 EVT OVT =
N->getValueType(0);
791 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
794 SDValue ExtractLeadingBits = DAG.getConstant(
797 SDValue Op = SExtPromotedInteger(
N->getOperand(0));
803 EVT OVT =
N->getValueType(0);
804 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
812 !TLI.isOperationLegalOrCustomOrPromote(
ISD::CTPOP, NVT)) {
813 if (
SDValue Result = TLI.expandCTPOP(
N, DAG)) {
820 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
821 if (!
N->isVPOpcode())
822 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
Op.getValueType(),
Op);
826 return DAG.
getNode(
N->getOpcode(), SDLoc(
N),
Op.getValueType(),
Op, Mask,
831 SDValue Op = GetPromotedInteger(
N->getOperand(0));
832 EVT OVT =
N->getValueType(0);
833 EVT NVT =
Op.getValueType();
840 if (!OVT.
isVector() && TLI.isTypeLegal(NVT) &&
841 !TLI.isOperationLegalOrCustomOrPromote(
ISD::CTTZ, NVT) &&
845 if (
SDValue Result = TLI.expandCTTZ(
N, DAG)) {
851 unsigned NewOpc =
N->getOpcode();
852 if (NewOpc ==
ISD::CTTZ || NewOpc == ISD::VP_CTTZ) {
859 Op = DAG.getNode(
ISD::OR, dl, NVT,
Op, DAG.getConstant(TopBit, dl, NVT));
863 DAG.getNode(ISD::VP_OR, dl, NVT,
Op, DAG.getConstant(TopBit, dl, NVT),
864 N->getOperand(1),
N->getOperand(2));
865 NewOpc = ISD::VP_CTTZ_ZERO_UNDEF;
868 if (!
N->isVPOpcode())
869 return DAG.getNode(NewOpc, dl, NVT,
Op);
870 return DAG.getNode(NewOpc, dl, NVT,
Op,
N->getOperand(1),
N->getOperand(2));
873SDValue DAGTypeLegalizer::PromoteIntRes_VP_CttzElements(
SDNode *
N) {
875 EVT NewVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
876 return DAG.getNode(
N->getOpcode(),
DL, NewVT,
N->ops());
879SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_VECTOR_ELT(
SDNode *
N) {
881 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
888 if (TLI.getTypeAction(*DAG.getContext(), Op0.
getValueType())
894 EVT SVT =
In.getValueType().getScalarType();
897 return DAG.getAnyExtOrTrunc(Ext, dl, NVT);
905 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
907 TLI.getPreferredFPToIntOpcode(
N->getOpcode(),
N->getValueType(0), NVT);
911 if (
N->isStrictFPOpcode()) {
912 Res = DAG.
getNode(NewOpc, dl, {NVT, MVT::Other},
913 {
N->getOperand(0),
N->getOperand(1)});
917 }
else if (NewOpc == ISD::VP_FP_TO_SINT || NewOpc == ISD::VP_FP_TO_UINT) {
918 Res = DAG.
getNode(NewOpc, dl, NVT, {
N->getOperand(0),
N->getOperand(1),
921 Res = DAG.
getNode(NewOpc, dl, NVT,
N->getOperand(0));
933 N->getOpcode() == ISD::VP_FP_TO_UINT)
937 DAG.getValueType(
N->getValueType(0).getScalarType()));
940SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_XINT_SAT(
SDNode *
N) {
942 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
944 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0),
948SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_FP16_BF16(
SDNode *
N) {
949 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
952 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
955SDValue DAGTypeLegalizer::PromoteIntRes_STRICT_FP_TO_FP16_BF16(
SDNode *
N) {
956 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
959 SDValue Res = DAG.
getNode(
N->getOpcode(), dl, DAG.getVTList(NVT, MVT::Other),
960 N->getOperand(0),
N->getOperand(1));
966 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
968 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
972 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
976 DAG.
getNode(
N->getOpcode(), dl, {NVT, MVT::Other},
N->getOperand(0));
985 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
988 if (getTypeAction(
N->getOperand(0).getValueType())
990 SDValue Res = GetPromotedInteger(
N->getOperand(0));
999 DAG.getValueType(
N->getOperand(0).getValueType()));
1001 return DAG.getZeroExtendInReg(Res, dl,
N->getOperand(0).getValueType());
1008 if (
N->getNumOperands() != 1) {
1009 assert(
N->getNumOperands() == 3 &&
"Unexpected number of operands!");
1010 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1011 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0),
1012 N->getOperand(1),
N->getOperand(2));
1014 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
1019 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1023 SDValue Res = DAG.getExtLoad(ExtType, dl, NVT,
N->getChain(),
N->getBasePtr(),
1024 N->getMemoryVT(),
N->getMemOperand());
1033 assert(!
N->isIndexed() &&
"Indexed vp_load during type legalization!");
1034 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1037 :
N->getExtensionType();
1040 DAG.getExtLoadVP(ExtType, dl, NVT,
N->getChain(),
N->getBasePtr(),
1041 N->getMask(),
N->getVectorLength(),
N->getMemoryVT(),
1042 N->getMemOperand(),
N->isExpandingLoad());
1050 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1051 SDValue ExtPassThru = GetPromotedInteger(
N->getPassThru());
1058 SDValue Res = DAG.getMaskedLoad(NVT, dl,
N->getChain(),
N->getBasePtr(),
1059 N->getOffset(),
N->getMask(), ExtPassThru,
1060 N->getMemoryVT(),
N->getMemOperand(),
1061 N->getAddressingMode(), ExtType,
1062 N->isExpandingLoad());
1070 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1071 SDValue ExtPassThru = GetPromotedInteger(
N->getPassThru());
1073 "Gather result type and the passThru argument type should be the same");
1080 SDValue Ops[] = {
N->getChain(), ExtPassThru,
N->getMask(),
N->getBasePtr(),
1081 N->getIndex(),
N->getScale() };
1082 SDValue Res = DAG.getMaskedGather(DAG.getVTList(NVT, MVT::Other),
1083 N->getMemoryVT(), dl,
Ops,
1084 N->getMemOperand(),
N->getIndexType(),
1092SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_COMPRESS(
SDNode *
N) {
1093 SDValue Vec = GetPromotedInteger(
N->getOperand(0));
1094 SDValue Passthru = GetPromotedInteger(
N->getOperand(2));
1096 N->getOperand(1), Passthru);
1103 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(1));
1104 EVT VT =
N->getValueType(0);
1105 EVT SVT = getSetCCResultType(VT);
1106 SDValue Ops[3] = {
N->getOperand(0),
N->getOperand(1) };
1107 unsigned NumOps =
N->getNumOperands();
1110 Ops[2] = PromoteTargetBoolean(
N->getOperand(2), VT);
1118 ReplaceValueWith(
SDValue(
N, 0), Res);
1121 return DAG.getBoolExtOrTrunc(Res.
getValue(1), dl, NVT, VT);
1124template <
class MatchContextClass>
1136 MatchContextClass matcher(DAG, TLI,
N);
1138 unsigned Opcode = matcher.getRootBaseOpcode();
1144 SExtOrZExtPromotedOperands(Op1, Op2);
1150 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
1152 if (TLI.isSExtCheaperThanZExt(OVT, NVT)) {
1153 Op1 = SExtPromotedInteger(Op1);
1154 Op2 = SExtPromotedInteger(Op2);
1155 return matcher.getNode(
ISD::UADDSAT, dl, NVT, Op1, Op2);
1158 Op1 = ZExtPromotedInteger(Op1);
1159 Op2 = ZExtPromotedInteger(Op2);
1162 SDValue SatMax = DAG.getConstant(MaxVal, dl, NVT);
1164 return matcher.getNode(
ISD::UMIN, dl, NVT,
Add, SatMax);
1171 Op1 = GetPromotedInteger(Op1);
1173 Op2 = ZExtPromotedInteger(Op2);
1175 Op1 = SExtPromotedInteger(Op1);
1176 Op2 = SExtPromotedInteger(Op2);
1183 if (IsShift || matcher.isOperationLegal(Opcode, PromotedType)) {
1196 "addition, subtraction or left shift");
1199 unsigned SHLAmount = NewBits - OldBits;
1201 DAG.getShiftAmountConstant(SHLAmount, PromotedType, dl);
1206 SDValue Result = matcher.getNode(Opcode, dl, PromotedType, Op1, Op2);
1207 return matcher.getNode(ShiftOp, dl, PromotedType, Result, ShiftAmount);
1213 SDValue SatMin = DAG.getConstant(MinVal, dl, PromotedType);
1214 SDValue SatMax = DAG.getConstant(MaxVal, dl, PromotedType);
1215 SDValue Result = matcher.getNode(AddOp, dl, PromotedType, Op1, Op2);
1216 Result = matcher.getNode(
ISD::SMIN, dl, PromotedType, Result, SatMax);
1217 Result = matcher.getNode(
ISD::SMAX, dl, PromotedType, Result, SatMin);
1224 SDValue Op1Promoted, Op2Promoted;
1230 Op1Promoted = SExtPromotedInteger(
N->getOperand(0));
1231 Op2Promoted = SExtPromotedInteger(
N->getOperand(1));
1233 Op1Promoted = ZExtPromotedInteger(
N->getOperand(0));
1234 Op2Promoted = ZExtPromotedInteger(
N->getOperand(1));
1236 EVT OldType =
N->getOperand(0).getValueType();
1248 DAG.getShiftAmountConstant(DiffSize, PromotedType, dl));
1249 SDValue Result = DAG.getNode(
N->getOpcode(), dl, PromotedType, Op1Promoted,
1250 Op2Promoted,
N->getOperand(2));
1252 return DAG.getNode(ShiftOp, dl, PromotedType, Result,
1253 DAG.getShiftAmountConstant(DiffSize, PromotedType, dl));
1255 return DAG.getNode(
N->getOpcode(), dl, PromotedType, Op1Promoted, Op2Promoted,
1260 unsigned SatW,
bool Signed,
1263 EVT VT = V.getValueType();
1290 EVT VT =
LHS.getValueType();
1306 assert(Res &&
"Expanding DIVFIX with wide type failed?");
1312 "Tried to saturate to more than the original type?");
1321 SDValue Op1Promoted, Op2Promoted;
1327 Op1Promoted = SExtPromotedInteger(
N->getOperand(0));
1328 Op2Promoted = SExtPromotedInteger(
N->getOperand(1));
1330 Op1Promoted = ZExtPromotedInteger(
N->getOperand(0));
1331 Op2Promoted = ZExtPromotedInteger(
N->getOperand(1));
1334 unsigned Scale =
N->getConstantOperandVal(2);
1338 if (TLI.isTypeLegal(PromotedType)) {
1340 TLI.getFixedPointOperationAction(
N->getOpcode(), PromotedType, Scale);
1343 N->getValueType(0).getScalarSizeInBits();
1347 DAG.getShiftAmountConstant(Diff, PromotedType, dl));
1348 SDValue Res = DAG.
getNode(
N->getOpcode(), dl, PromotedType, Op1Promoted,
1349 Op2Promoted,
N->getOperand(2));
1352 DAG.getShiftAmountConstant(Diff, PromotedType, dl));
1358 if (
SDValue Res = TLI.expandFixedPointDiv(
N->getOpcode(), dl, Op1Promoted,
1359 Op2Promoted, Scale, DAG)) {
1362 N->getValueType(0).getScalarSizeInBits(),
1370 N->getValueType(0).getScalarSizeInBits());
1373SDValue DAGTypeLegalizer::PromoteIntRes_SADDSUBO(
SDNode *
N,
unsigned ResNo) {
1375 return PromoteIntRes_Overflow(
N);
1379 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1380 SDValue RHS = SExtPromotedInteger(
N->getOperand(1));
1381 EVT OVT =
N->getOperand(0).getValueType();
1382 EVT NVT =
LHS.getValueType();
1392 DAG.getValueType(OVT));
1394 Ofl = DAG.getSetCC(dl,
N->getValueType(1), Ofl, Res,
ISD::SETNE);
1397 ReplaceValueWith(
SDValue(
N, 1), Ofl);
1403 EVT PromotedResultTy =
1404 TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1405 return DAG.
getNode(
N->getOpcode(), SDLoc(
N), PromotedResultTy,
1406 N->getOperand(0),
N->getOperand(1));
1412 SDValue LHS = GetPromotedInteger(
N->getOperand(1));
1413 SDValue RHS = GetPromotedInteger(
N->getOperand(2));
1415 unsigned Opcode =
N->getOpcode();
1416 if (Opcode == ISD::VP_SELECT || Opcode == ISD::VP_MERGE)
1417 return DAG.getNode(Opcode, SDLoc(
N),
LHS.getValueType(), Mask,
LHS,
RHS,
1419 return DAG.getNode(Opcode, SDLoc(
N),
LHS.getValueType(), Mask,
LHS,
RHS);
1423 SDValue LHS = GetPromotedInteger(
N->getOperand(2));
1424 SDValue RHS = GetPromotedInteger(
N->getOperand(3));
1426 LHS.getValueType(),
N->getOperand(0),
1427 N->getOperand(1),
LHS,
RHS,
N->getOperand(4));
1432 EVT InVT =
N->getOperand(OpNo).getValueType();
1433 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1435 EVT SVT = getSetCCResultType(InVT);
1442 InVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT);
1443 SVT = getSetCCResultType(InVT);
1451 assert(SVT.
isVector() ==
N->getOperand(OpNo).getValueType().isVector() &&
1452 "Vector compare must return a vector result!");
1456 if (
N->isStrictFPOpcode()) {
1457 SDVTList VTs = DAG.getVTList({SVT, MVT::Other});
1458 SDValue Opers[] = {
N->getOperand(0),
N->getOperand(1),
1459 N->getOperand(2),
N->getOperand(3)};
1460 SetCC = DAG.
getNode(
N->getOpcode(), dl, VTs, Opers,
N->getFlags());
1465 SetCC = DAG.
getNode(
N->getOpcode(), dl, SVT,
N->getOperand(0),
1466 N->getOperand(1),
N->getOperand(2),
N->getFlags());
1469 return DAG.getSExtOrTrunc(SetCC, dl, NVT);
1476 EVT NResVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1481 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(1));
1482 EVT VT =
N->getValueType(0);
1486 DAG.
getNode(
N->getOpcode(), dl, DAG.getVTList(VT, NVT),
N->getOperand(0));
1488 ReplaceValueWith(
SDValue(
N, 0), Res);
1493 SDValue LHS = GetPromotedInteger(
N->getOperand(0));
1496 RHS = ZExtPromotedInteger(
RHS);
1497 if (
N->getOpcode() != ISD::VP_SHL)
1498 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1506SDValue DAGTypeLegalizer::PromoteIntRes_SIGN_EXTEND_INREG(
SDNode *
N) {
1507 SDValue Op = GetPromotedInteger(
N->getOperand(0));
1509 Op.getValueType(),
Op,
N->getOperand(1));
1512SDValue DAGTypeLegalizer::PromoteIntRes_SimpleIntBinOp(
SDNode *
N) {
1516 SDValue LHS = GetPromotedInteger(
N->getOperand(0));
1517 SDValue RHS = GetPromotedInteger(
N->getOperand(1));
1518 if (
N->getNumOperands() == 2)
1519 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1520 assert(
N->getNumOperands() == 4 &&
"Unexpected number of operands!");
1521 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1522 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS,
1523 N->getOperand(2),
N->getOperand(3));
1528 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1529 SDValue RHS = SExtPromotedInteger(
N->getOperand(1));
1530 if (
N->getNumOperands() == 2)
1531 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1532 assert(
N->getNumOperands() == 4 &&
"Unexpected number of operands!");
1533 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1542 SDValue LHS = ZExtPromotedInteger(
N->getOperand(0));
1543 SDValue RHS = ZExtPromotedInteger(
N->getOperand(1));
1544 if (
N->getNumOperands() == 2)
1545 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1546 assert(
N->getNumOperands() == 4 &&
"Unexpected number of operands!");
1547 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1555SDValue DAGTypeLegalizer::PromoteIntRes_ZExtMaskedIntBinOp(
SDNode *
N) {
1556 SDValue LHS = ZExtPromotedInteger(
N->getOperand(0));
1557 SDValue RHS = ZExtPromotedInteger(
N->getOperand(1));
1559 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS,
1563SDValue DAGTypeLegalizer::PromoteIntRes_SExtMaskedIntBinOp(
SDNode *
N) {
1564 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1565 SDValue RHS = SExtPromotedInteger(
N->getOperand(1));
1567 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS,
1577 SExtOrZExtPromotedOperands(
LHS,
RHS);
1579 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
1585 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1588 RHS = ZExtPromotedInteger(
RHS);
1589 if (
N->getOpcode() != ISD::VP_SRA)
1590 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1601 SDValue LHS = ZExtPromotedInteger(
N->getOperand(0));
1603 RHS = ZExtPromotedInteger(
RHS);
1604 if (
N->getOpcode() != ISD::VP_SRL)
1605 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1615 SDValue Res = TLI.expandROT(
N,
true , DAG);
1616 ReplaceValueWith(
SDValue(
N, 0), Res);
1621 SDValue Hi = GetPromotedInteger(
N->getOperand(0));
1622 SDValue Lo = GetPromotedInteger(
N->getOperand(1));
1625 Amt = ZExtPromotedInteger(Amt);
1629 EVT OldVT =
N->getOperand(0).getValueType();
1630 EVT VT =
Lo.getValueType();
1631 unsigned Opcode =
N->getOpcode();
1638 DAG.getConstant(OldBits,
DL, AmtVT));
1646 !TLI.isOperationLegalOrCustom(Opcode, VT)) {
1647 SDValue HiShift = DAG.getShiftAmountConstant(OldBits, VT,
DL);
1649 Lo = DAG.getZeroExtendInReg(
Lo,
DL, OldVT);
1659 DAG.getShiftAmountConstant(NewBits - OldBits, VT,
DL));
1665 DAG.getConstant(NewBits - OldBits,
DL, AmtVT));
1667 return DAG.getNode(Opcode,
DL, VT,
Hi,
Lo, Amt);
1671SDValue DAGTypeLegalizer::PromoteIntRes_VPFunnelShift(
SDNode *
N) {
1672 SDValue Hi = GetPromotedInteger(
N->getOperand(0));
1673 SDValue Lo = GetPromotedInteger(
N->getOperand(1));
1678 Amt = ZExtPromotedInteger(Amt);
1682 EVT OldVT =
N->getOperand(0).getValueType();
1683 EVT VT =
Lo.getValueType();
1684 unsigned Opcode =
N->getOpcode();
1685 bool IsFSHR = Opcode == ISD::VP_FSHR;
1690 Amt = DAG.
getNode(ISD::VP_UREM,
DL, AmtVT, Amt,
1691 DAG.getConstant(OldBits,
DL, AmtVT), Mask, EVL);
1699 !TLI.isOperationLegalOrCustom(Opcode, VT)) {
1700 SDValue HiShift = DAG.getConstant(OldBits,
DL, VT);
1701 Hi = DAG.
getNode(ISD::VP_SHL,
DL, VT,
Hi, HiShift, Mask, EVL);
1702 Lo = DAG.getVPZeroExtendInReg(
Lo, Mask, EVL,
DL, OldVT);
1704 Res = DAG.
getNode(IsFSHR ? ISD::VP_SRL : ISD::VP_SHL,
DL, VT, Res, Amt,
1707 Res = DAG.
getNode(ISD::VP_SRL,
DL, VT, Res, HiShift, Mask, EVL);
1712 SDValue ShiftOffset = DAG.getConstant(NewBits - OldBits,
DL, AmtVT);
1713 Lo = DAG.getNode(ISD::VP_SHL,
DL, VT,
Lo, ShiftOffset, Mask, EVL);
1718 Amt = DAG.
getNode(ISD::VP_ADD,
DL, AmtVT, Amt, ShiftOffset, Mask, EVL);
1720 return DAG.getNode(Opcode,
DL, VT,
Hi,
Lo, Amt, Mask, EVL);
1724 unsigned Opcode =
N->getOpcode();
1727 EVT OldVT =
N->getOperand(0).getValueType();
1728 EVT VT = TLI.getTypeToTransformTo(*DAG.getContext(), OldVT);
1731 if (!TLI.isOperationLegalOrCustomOrPromote(
ISD::CLMUL, VT)) {
1732 if (
SDValue Res = TLI.expandCLMUL(
N, DAG))
1735 SDValue X = GetPromotedInteger(
N->getOperand(0));
1736 SDValue Y = GetPromotedInteger(
N->getOperand(1));
1740 SDValue X = ZExtPromotedInteger(
N->getOperand(0));
1741 SDValue Y = ZExtPromotedInteger(
N->getOperand(1));
1745 if (NewBits < 2 * OldBits) {
1747 unsigned ShAmt = Opcode ==
ISD::CLMULH ? OldBits : OldBits - 1;
1749 DAG.getShiftAmountConstant(ShAmt, VT,
DL));
1751 ShAmt = Opcode ==
ISD::CLMULH ? NewBits - OldBits : NewBits - OldBits + 1;
1753 DAG.getShiftAmountConstant(ShAmt, VT,
DL));
1758 unsigned ShAmt = Opcode ==
ISD::CLMULH ? OldBits : OldBits - 1;
1760 DAG.getShiftAmountConstant(ShAmt, VT,
DL));
1764 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1776 Res = GetPromotedInteger(InOp);
1783 "Dst and Src must have the same number of elements");
1785 "Promoted vector type must be a power of two");
1788 GetSplitVector(InOp, EOp1, EOp2);
1796 assert(
N->getOpcode() == ISD::VP_TRUNCATE &&
1797 "Expected VP_TRUNCATE opcode");
1798 SDValue MaskLo, MaskHi, EVLLo, EVLHi;
1799 std::tie(MaskLo, MaskHi) = SplitMask(
N->getOperand(1));
1800 std::tie(EVLLo, EVLHi) =
1801 DAG.SplitEVL(
N->getOperand(2),
N->getValueType(0), dl);
1802 EOp1 = DAG.
getNode(ISD::VP_TRUNCATE, dl, HalfNVT, EOp1, MaskLo, EVLLo);
1803 EOp2 = DAG.
getNode(ISD::VP_TRUNCATE, dl, HalfNVT, EOp2, MaskHi, EVLHi);
1810 SDValue WideInOp = GetWidenedVector(InOp);
1815 N->getValueType(0).getScalarType(), NumElem);
1824 SDValue ZeroIdx = DAG.getVectorIdxConstant(0, dl);
1830 if (
N->getOpcode() == ISD::VP_TRUNCATE)
1831 return DAG.getNode(ISD::VP_TRUNCATE, dl, NVT, Res,
N->getOperand(1),
1836SDValue DAGTypeLegalizer::PromoteIntRes_UADDSUBO(
SDNode *
N,
unsigned ResNo) {
1838 return PromoteIntRes_Overflow(
N);
1842 SDValue LHS = ZExtPromotedInteger(
N->getOperand(0));
1843 SDValue RHS = ZExtPromotedInteger(
N->getOperand(1));
1844 EVT OVT =
N->getOperand(0).getValueType();
1845 EVT NVT =
LHS.getValueType();
1854 SDValue Ofl = DAG.getZeroExtendInReg(Res, dl, OVT);
1856 Ofl = DAG.getSetCC(dl,
N->getValueType(1), Ofl, Res,
ISD::SETNE);
1859 ReplaceValueWith(
SDValue(
N, 1), Ofl);
1870 return PromoteIntRes_Overflow(
N);
1882 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1883 SDValue RHS = SExtPromotedInteger(
N->getOperand(1));
1885 EVT ValueVTs[] = {
LHS.getValueType(),
N->getValueType(1)};
1888 SDValue Res = DAG.
getNode(
N->getOpcode(), SDLoc(
N), DAG.getVTList(ValueVTs),
1899 assert(ResNo == 1 &&
"Don't know how to promote other results yet.");
1900 return PromoteIntRes_Overflow(
N);
1904 EVT OVT =
N->getValueType(0);
1905 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
1911 !TLI.isOperationLegalOrCustomOrPromote(
ISD::ABS, NVT) &&
1912 !TLI.isOperationLegal(
ISD::SMAX, NVT)) {
1913 if (
SDValue Res = TLI.expandABS(
N, DAG))
1917 SDValue Op0 = SExtPromotedInteger(
N->getOperand(0));
1921SDValue DAGTypeLegalizer::PromoteIntRes_XMULO(
SDNode *
N,
unsigned ResNo) {
1924 return PromoteIntRes_Overflow(
N);
1928 EVT SmallVT =
LHS.getValueType();
1935 LHS = SExtPromotedInteger(
LHS);
1936 RHS = SExtPromotedInteger(
RHS);
1938 LHS = ZExtPromotedInteger(
LHS);
1939 RHS = ZExtPromotedInteger(
RHS);
1941 SDVTList VTs = DAG.getVTList(
LHS.getValueType(),
N->getValueType(1));
1953 DAG.getShiftAmountConstant(Shift,
Mul.getValueType(),
DL));
1954 Overflow = DAG.getSetCC(
DL,
N->getValueType(1),
Hi,
1955 DAG.getConstant(0,
DL,
Hi.getValueType()),
1960 Mul, DAG.getValueType(SmallVT));
1970 ReplaceValueWith(
SDValue(
N, 1), Overflow);
1975 return DAG.getUNDEF(TLI.getTypeToTransformTo(*DAG.getContext(),
1976 N->getValueType(0)));
1980 EVT VT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1982 const APInt &MulImm =
N->getConstantOperandAPInt(0);
1989 EVT VT =
N->getValueType(0);
1992 MVT RegVT = TLI.getRegisterType(*DAG.getContext(), VT);
1993 unsigned NumRegs = TLI.getNumRegisters(*DAG.getContext(), VT);
1997 for (
unsigned i = 0; i < NumRegs; ++i) {
1998 Parts[i] = DAG.getVAArg(RegVT, dl, Chain, Ptr,
N->getOperand(2),
1999 N->getConstantOperandVal(3));
2004 if (DAG.getDataLayout().isBigEndian())
2005 std::reverse(Parts.begin(), Parts.end());
2008 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
2010 for (
unsigned i = 1; i < NumRegs; ++i) {
2015 DAG.getShiftAmountConstant(i * RegVT.
getSizeInBits(), NVT, dl));
2021 ReplaceValueWith(
SDValue(
N, 1), Chain);
2034bool DAGTypeLegalizer::PromoteIntegerOperand(
SDNode *
N,
unsigned OpNo) {
2037 if (CustomLowerNode(
N,
N->getOperand(OpNo).getValueType(),
false)) {
2042 switch (
N->getOpcode()) {
2045 dbgs() <<
"PromoteIntegerOperand Op #" << OpNo <<
": ";
2046 N->dump(&DAG);
dbgs() <<
"\n";
2052 Res = PromoteIntOp_ANY_EXTEND_VECTOR_INREG(
N);
2058 case ISD::BR_CC: Res = PromoteIntOp_BR_CC(
N, OpNo);
break;
2059 case ISD::BRCOND: Res = PromoteIntOp_BRCOND(
N, OpNo);
break;
2064 Res = PromoteIntOp_COND_LOOP(
N, OpNo);
2068 Res = PromoteIntOp_FAKE_USE(
N);
2071 Res = PromoteIntOp_INSERT_VECTOR_ELT(
N, OpNo);
2075 Res = PromoteIntOp_ScalarOp(
N);
2078 case ISD::SELECT: Res = PromoteIntOp_SELECT(
N, OpNo);
break;
2081 case ISD::SETCC: Res = PromoteIntOp_SETCC(
N, OpNo);
break;
2083 case ISD::VP_SIGN_EXTEND: Res = PromoteIntOp_VP_SIGN_EXTEND(
N);
break;
2084 case ISD::VP_SINT_TO_FP:
2101 Res = PromoteIntOp_VECTOR_COMPRESS(
N, OpNo);
2103 case ISD::VP_TRUNCATE:
2107 case ISD::VP_UINT_TO_FP:
2110 Res = PromoteIntOp_CONVERT_FROM_ARBITRARY_FP(
N);
2115 case ISD::VP_ZERO_EXTEND: Res = PromoteIntOp_VP_ZERO_EXTEND(
N);
break;
2126 Res = PromoteIntOp_Shift(
N);
2130 case ISD::UCMP: Res = PromoteIntOp_CMP(
N);
break;
2133 case ISD::FSHR: Res = PromoteIntOp_FunnelShift(
N);
break;
2159 case ISD::VP_REDUCE_ADD:
2160 case ISD::VP_REDUCE_MUL:
2161 case ISD::VP_REDUCE_AND:
2162 case ISD::VP_REDUCE_OR:
2163 case ISD::VP_REDUCE_XOR:
2164 case ISD::VP_REDUCE_SMAX:
2165 case ISD::VP_REDUCE_SMIN:
2166 case ISD::VP_REDUCE_UMAX:
2167 case ISD::VP_REDUCE_UMIN:
2168 Res = PromoteIntOp_VP_REDUCE(
N, OpNo);
2173 Res = PromoteIntOp_STACKMAP(
N, OpNo);
2176 Res = PromoteIntOp_PATCHPOINT(
N, OpNo);
2179 Res = PromoteIntOp_WRITE_REGISTER(
N, OpNo);
2181 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
2182 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
2183 Res = PromoteIntOp_VP_STRIDED(
N, OpNo);
2185 case ISD::EXPERIMENTAL_VP_SPLICE:
2186 Res = PromoteIntOp_VP_SPLICE(
N, OpNo);
2189 Res = PromoteIntOp_VECTOR_HISTOGRAM(
N, OpNo);
2194 Res = PromoteIntOp_UnaryBooleanVectorOp(
N, OpNo);
2197 Res = PromoteIntOp_GET_ACTIVE_LANE_MASK(
N);
2203 Res = PromoteIntOp_MaskedBinOp(
N, OpNo);
2208 Res = PromoteIntOp_PARTIAL_REDUCE_MLA(
N);
2213 if (!Res.
getNode())
return false;
2220 const bool IsStrictFp =
N->isStrictFPOpcode();
2222 N->getNumValues() == (IsStrictFp ? 2 : 1) &&
2223 "Invalid operand expansion");
2227 ReplaceValueWith(
SDValue(
N, 0), Res);
2241 if (TLI.isSExtCheaperThanZExt(
LHS.getValueType(), OpL.
getValueType())) {
2245 unsigned OpLEffectiveBits =
2246 DAG.computeKnownBits(OpL).countMaxActiveBits();
2247 unsigned OpREffectiveBits =
2248 DAG.computeKnownBits(OpR).countMaxActiveBits();
2249 if (OpLEffectiveBits <=
LHS.getScalarValueSizeInBits() &&
2250 OpREffectiveBits <=
RHS.getScalarValueSizeInBits()) {
2257 LHS = SExtPromotedInteger(
LHS);
2258 RHS = SExtPromotedInteger(
RHS);
2267 unsigned OpLEffectiveBits = DAG.ComputeMaxSignificantBits(OpL);
2268 unsigned OpREffectiveBits = DAG.ComputeMaxSignificantBits(OpR);
2269 if (OpLEffectiveBits <=
LHS.getScalarValueSizeInBits() &&
2270 OpREffectiveBits <=
RHS.getScalarValueSizeInBits()) {
2277 LHS = ZExtPromotedInteger(
LHS);
2278 RHS = ZExtPromotedInteger(
RHS);
2292 LHS = SExtPromotedInteger(
LHS);
2293 RHS = SExtPromotedInteger(
RHS);
2298 "Unknown integer comparison!");
2300 SExtOrZExtPromotedOperands(
LHS,
RHS);
2304 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2308SDValue DAGTypeLegalizer::PromoteIntOp_ANY_EXTEND_VECTOR_INREG(
SDNode *
N) {
2309 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2310 EVT ResVT =
N->getValueType(0);
2311 EVT OpVT =
Op.getValueType();
2314 Op = DAG.getExtractSubvector(SDLoc(
Op), NewVT,
Op, 0);
2319 SDValue Op1 = GetPromotedInteger(
N->getOperand(1));
2320 return DAG.getAtomic(
N->getOpcode(), SDLoc(
N),
N->getMemoryVT(),
2321 N->getChain(), Op1,
N->getBasePtr(),
N->getMemOperand());
2325 EVT OutVT =
N->getValueType(0);
2328 EVT NInVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT);
2331 switch (getTypeAction(InVT)) {
2335 DAG.getDataLayout().isLittleEndian()) {
2345 if (isTypeLegal(WideVecVT)) {
2346 SDValue Promoted = GetPromotedInteger(InOp);
2349 DAG.getVectorIdxConstant(0, dl));
2362 return CreateStackStoreLoad(InOp, OutVT);
2365SDValue DAGTypeLegalizer::PromoteIntOp_BR_CC(
SDNode *
N,
unsigned OpNo) {
2366 assert(OpNo == 2 &&
"Don't know how to promote this operand!");
2374 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2375 N->getOperand(1),
LHS,
RHS,
N->getOperand(4)),
2379SDValue DAGTypeLegalizer::PromoteIntOp_BRCOND(
SDNode *
N,
unsigned OpNo) {
2380 assert(OpNo == 1 &&
"only know how to promote condition");
2383 SDValue Cond = PromoteTargetBoolean(
N->getOperand(1), MVT::Other);
2386 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
Cond,
2387 N->getOperand(2)), 0);
2390SDValue DAGTypeLegalizer::PromoteIntOp_COND_LOOP(
SDNode *
N,
unsigned OpNo) {
2391 assert(OpNo == 1 &&
"only know how to promote condition");
2394 SDValue Cond = PromoteTargetBoolean(
N->getOperand(1), MVT::Other);
2397 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
Cond), 0);
2402 EVT OVT =
N->getOperand(0).getValueType();
2403 SDValue Lo = ZExtPromotedInteger(
N->getOperand(0));
2404 SDValue Hi = GetPromotedInteger(
N->getOperand(1));
2405 assert(
Lo.getValueType() ==
N->getValueType(0) &&
"Operand over promoted?");
2410 DAG.getShiftAmountConstant(OVT.
getSizeInBits(),
N->getValueType(0), dl));
2411 return DAG.getNode(
ISD::OR, dl,
N->getValueType(0),
Lo,
Hi);
2420 assert(!((NumElts & 1) && (!TLI.isTypeLegal(VecVT))) &&
2421 "Legal vector of one illegal element?");
2426 assert(
N->getOperand(0).getValueSizeInBits() >=
2427 N->getValueType(0).getScalarSizeInBits() &&
2428 "Type of inserted value narrower than vector element type!");
2431 for (
unsigned i = 0; i < NumElts; ++i)
2432 NewOps.
push_back(GetPromotedInteger(
N->getOperand(i)));
2434 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2437SDValue DAGTypeLegalizer::PromoteIntOp_INSERT_VECTOR_ELT(
SDNode *
N,
2444 assert(
N->getOperand(1).getValueSizeInBits() >=
2445 N->getValueType(0).getScalarSizeInBits() &&
2446 "Type of inserted value narrower than vector element type!");
2447 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2448 GetPromotedInteger(
N->getOperand(1)),
2453 assert(OpNo == 2 &&
"Different operand and result vector types?");
2456 SDValue Idx = DAG.getZExtOrTrunc(
N->getOperand(2), SDLoc(
N),
2457 TLI.getVectorIdxTy(DAG.getDataLayout()));
2458 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2459 N->getOperand(1), Idx), 0);
2463 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2467 return SDValue(DAG.UpdateNodeOperands(
N,
Op), 0);
2470SDValue DAGTypeLegalizer::PromoteIntOp_SELECT(
SDNode *
N,
unsigned OpNo) {
2471 assert(OpNo == 0 &&
"Only know how to promote the condition!");
2473 EVT OpTy =
N->getOperand(1).getValueType();
2476 if (
SDValue Res = WidenVSELECTMask(
N))
2477 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
N->getValueType(0),
2478 Res,
N->getOperand(1),
N->getOperand(2));
2482 Cond = PromoteTargetBoolean(
Cond, OpVT);
2484 return SDValue(DAG.UpdateNodeOperands(
N,
Cond,
N->getOperand(1),
2485 N->getOperand(2)), 0);
2488SDValue DAGTypeLegalizer::PromoteIntOp_SELECT_CC(
SDNode *
N,
unsigned OpNo) {
2489 assert(OpNo == 0 &&
"Don't know how to promote this operand!");
2497 N->getOperand(3),
N->getOperand(4)), 0);
2500SDValue DAGTypeLegalizer::PromoteIntOp_SETCC(
SDNode *
N,
unsigned OpNo) {
2501 assert(OpNo == 0 &&
"Don't know how to promote this operand!");
2509 return SDValue(DAG.UpdateNodeOperands(
N,
LHS,
RHS,
N->getOperand(2)), 0);
2511 assert(
N->getOpcode() == ISD::VP_SETCC &&
"Expected VP_SETCC opcode");
2514 N->getOperand(3),
N->getOperand(4)),
2519 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2520 ZExtPromotedInteger(
N->getOperand(1))), 0);
2528 LHS = SExtPromotedInteger(
LHS);
2529 RHS = SExtPromotedInteger(
RHS);
2531 SExtOrZExtPromotedOperands(
LHS,
RHS);
2538 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
N->getOperand(1),
2539 ZExtPromotedInteger(
N->getOperand(2))), 0);
2543 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2547 Op, DAG.getValueType(
N->getOperand(0).getValueType()));
2550SDValue DAGTypeLegalizer::PromoteIntOp_VP_SIGN_EXTEND(
SDNode *
N) {
2552 EVT VT =
N->getValueType(0);
2553 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2555 Op = DAG.getNode(ISD::VP_ZERO_EXTEND, dl, VT,
Op,
N->getOperand(1),
2559 SDValue ShAmt = DAG.getShiftAmountConstant(Diff, VT, dl);
2561 SDValue Shl = DAG.getNode(ISD::VP_SHL, dl, VT,
Op, ShAmt,
N->getOperand(1),
2563 return DAG.getNode(ISD::VP_SRA, dl, VT, Shl, ShAmt,
N->getOperand(1),
2568 if (
N->getOpcode() == ISD::VP_SINT_TO_FP)
2569 return SDValue(DAG.UpdateNodeOperands(
N,
2570 SExtPromotedInteger(
N->getOperand(0)),
2571 N->getOperand(1),
N->getOperand(2)),
2573 return SDValue(DAG.UpdateNodeOperands(
N,
2574 SExtPromotedInteger(
N->getOperand(0))), 0);
2577SDValue DAGTypeLegalizer::PromoteIntOp_STRICT_SINT_TO_FP(
SDNode *
N) {
2578 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2579 SExtPromotedInteger(
N->getOperand(1))), 0);
2584 SDValue Ch =
N->getChain(), Ptr =
N->getBasePtr();
2587 SDValue Val = GetPromotedInteger(
N->getValue());
2590 return DAG.getTruncStore(Ch, dl, Val, Ptr,
2591 N->getMemoryVT(),
N->getMemOperand());
2597 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2598 assert(!
N->isIndexed() &&
"expecting unindexed vp_store!");
2600 SDValue DataOp = GetPromotedInteger(
N->getValue());
2601 return DAG.getTruncStoreVP(
N->getChain(), SDLoc(
N), DataOp,
N->getBasePtr(),
2602 N->getMask(),
N->getVectorLength(),
2603 N->getMemoryVT(),
N->getMemOperand(),
2604 N->isCompressingStore());
2615 Mask = PromoteTargetBoolean(Mask, DataVT);
2618 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2621 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2622 DataOp = GetPromotedInteger(DataOp);
2624 return DAG.getMaskedStore(
N->getChain(), SDLoc(
N), DataOp,
N->getBasePtr(),
2625 N->getOffset(), Mask,
N->getMemoryVT(),
2626 N->getMemOperand(),
N->getAddressingMode(),
2627 true,
N->isCompressingStore());
2632 assert(OpNo == 3 &&
"Only know how to promote the mask!");
2633 EVT DataVT =
N->getValueType(0);
2634 SDValue Mask = PromoteTargetBoolean(
N->getOperand(OpNo), DataVT);
2636 NewOps[OpNo] =
Mask;
2637 SDNode *Res = DAG.UpdateNodeOperands(
N, NewOps);
2653 EVT DataVT =
N->getValueType(0);
2654 NewOps[OpNo] = PromoteTargetBoolean(
N->getOperand(OpNo), DataVT);
2655 }
else if (OpNo == 4) {
2657 if (
N->isIndexSigned())
2659 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2661 NewOps[OpNo] = ZExtPromotedInteger(
N->getOperand(OpNo));
2663 NewOps[OpNo] = GetPromotedInteger(
N->getOperand(OpNo));
2665 SDNode *Res = DAG.UpdateNodeOperands(
N, NewOps);
2677 bool TruncateStore =
N->isTruncatingStore();
2682 EVT DataVT =
N->getValue().getValueType();
2683 NewOps[OpNo] = PromoteTargetBoolean(
N->getOperand(OpNo), DataVT);
2684 }
else if (OpNo == 4) {
2686 if (
N->isIndexSigned())
2688 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2690 NewOps[OpNo] = ZExtPromotedInteger(
N->getOperand(OpNo));
2692 NewOps[OpNo] = GetPromotedInteger(
N->getOperand(OpNo));
2693 TruncateStore =
true;
2696 return DAG.getMaskedScatter(DAG.getVTList(MVT::Other),
N->getMemoryVT(),
2697 SDLoc(
N), NewOps,
N->getMemOperand(),
2698 N->getIndexType(), TruncateStore);
2703 assert(OpNo == 1 &&
"Can only promote VECTOR_COMPRESS mask.");
2707 SDValue Mask = PromoteTargetBoolean(
N->getOperand(1), VT);
2712 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2713 if (
N->getOpcode() == ISD::VP_TRUNCATE)
2714 return DAG.getNode(ISD::VP_TRUNCATE, SDLoc(
N),
N->getValueType(0),
Op,
2715 N->getOperand(1),
N->getOperand(2));
2720 if (
N->getOpcode() == ISD::VP_UINT_TO_FP)
2721 return SDValue(DAG.UpdateNodeOperands(
N,
2722 ZExtPromotedInteger(
N->getOperand(0)),
2723 N->getOperand(1),
N->getOperand(2)),
2725 return SDValue(DAG.UpdateNodeOperands(
N,
2726 ZExtPromotedInteger(
N->getOperand(0))), 0);
2729SDValue DAGTypeLegalizer::PromoteIntOp_CONVERT_FROM_ARBITRARY_FP(
SDNode *
N) {
2730 return SDValue(DAG.UpdateNodeOperands(
N, GetPromotedInteger(
N->getOperand(0)),
2735SDValue DAGTypeLegalizer::PromoteIntOp_STRICT_UINT_TO_FP(
SDNode *
N) {
2736 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2737 ZExtPromotedInteger(
N->getOperand(1))), 0);
2744 EVT VT =
N->getValueType(0);
2749 if (
N->getFlags().hasNonNeg() &&
Op.getValueType() == VT &&
2750 TLI.isSExtCheaperThanZExt(Src.getValueType(), VT)) {
2751 unsigned OpEffectiveBits = DAG.ComputeMaxSignificantBits(
Op);
2752 if (OpEffectiveBits <= Src.getScalarValueSizeInBits())
2757 return DAG.getZeroExtendInReg(
Op, dl, Src.getValueType());
2760SDValue DAGTypeLegalizer::PromoteIntOp_VP_ZERO_EXTEND(
SDNode *
N) {
2762 EVT VT =
N->getValueType(0);
2763 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2765 Op = DAG.getNode(ISD::VP_ZERO_EXTEND, dl, VT,
Op,
N->getOperand(1),
2767 return DAG.getVPZeroExtendInReg(
Op,
N->getOperand(1),
N->getOperand(2), dl,
2768 N->getOperand(0).getValueType());
2772 SDValue Op2 = ZExtPromotedInteger(
N->getOperand(2));
2774 DAG.UpdateNodeOperands(
N,
N->getOperand(0),
N->getOperand(1), Op2), 0);
2777SDValue DAGTypeLegalizer::PromoteIntOp_FRAMERETURNADDR(
SDNode *
N) {
2779 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
2780 return SDValue(DAG.UpdateNodeOperands(
N,
Op), 0);
2789 unsigned OpOffset = IsStrict ? 1 : 0;
2796 RTLIB::LibcallImpl LCImpl = DAG.getLibcalls().getLibcallImpl(LC);
2797 if (LCImpl == RTLIB::Unsupported) {
2803 if (IsPowI &&
N->getValueType(0).isVector())
2804 return DAG.UnrollVectorOp(
N);
2806 NewOps[1 + OpOffset] = SExtPromotedInteger(
N->getOperand(1 + OpOffset));
2807 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2817 assert(DAG.getLibInfo().getIntSize() ==
2818 N->getOperand(1 + OpOffset).getValueType().getSizeInBits() &&
2819 "POWI exponent should match with sizeof(int) when doing the libcall.");
2820 TargetLowering::MakeLibCallOptions CallOptions;
2822 SDValue Ops[2] = {
N->getOperand(0 + OpOffset),
N->getOperand(1 + OpOffset)};
2823 std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(
2824 DAG, LCImpl,
N->getValueType(0),
Ops, CallOptions, SDLoc(
N), Chain);
2825 ReplaceValueWith(
SDValue(
N, 0), Tmp.first);
2827 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
2832 switch (
N->getOpcode()) {
2840 case ISD::VP_REDUCE_ADD:
2841 case ISD::VP_REDUCE_MUL:
2842 case ISD::VP_REDUCE_AND:
2843 case ISD::VP_REDUCE_OR:
2844 case ISD::VP_REDUCE_XOR:
2848 case ISD::VP_REDUCE_SMAX:
2849 case ISD::VP_REDUCE_SMIN:
2853 case ISD::VP_REDUCE_UMAX:
2854 case ISD::VP_REDUCE_UMIN:
2864 return GetPromotedInteger(V);
2866 return SExtPromotedInteger(V);
2868 return ZExtPromotedInteger(V);
2874 SDValue Op = PromoteIntOpVectorReduction(
N,
N->getOperand(0));
2876 EVT OrigEltVT =
N->getOperand(0).getValueType().getVectorElementType();
2877 EVT InVT =
Op.getValueType();
2879 EVT ResVT =
N->getValueType(0);
2880 unsigned Opcode =
N->getOpcode();
2897 switch (TLI.getBooleanContents(InVT)) {
2900 Op = ZExtPromotedInteger(
N->getOperand(0));
2903 Op = SExtPromotedInteger(
N->getOperand(0));
2916 switch (TLI.getBooleanContents(InVT)) {
2919 Op = ZExtPromotedInteger(
N->getOperand(0));
2922 Op = SExtPromotedInteger(
N->getOperand(0));
2928 return DAG.getNode(Opcode, SDLoc(
N), ResVT,
Op);
2932 SDValue Reduce = DAG.getNode(Opcode, dl, EltVT,
Op);
2936SDValue DAGTypeLegalizer::PromoteIntOp_VP_REDUCE(
SDNode *
N,
unsigned OpNo) {
2943 NewOps[2] = PromoteTargetBoolean(
Op,
N->getOperand(1).getValueType());
2944 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2947 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2949 Op = PromoteIntOpVectorReduction(
N,
Op);
2953 EVT VT =
N->getValueType(0);
2954 EVT EltVT =
Op.getValueType().getScalarType();
2957 return DAG.getNode(
N->getOpcode(), SDLoc(
N), VT, NewOps);
2969 SDValue Op = ZExtPromotedInteger(
N->getOperand(1));
2970 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
Op), 0);
2973SDValue DAGTypeLegalizer::PromoteIntOp_STACKMAP(
SDNode *
N,
unsigned OpNo) {
2976 NewOps[OpNo] = GetPromotedInteger(NewOps[OpNo]);
2977 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2980SDValue DAGTypeLegalizer::PromoteIntOp_PATCHPOINT(
SDNode *
N,
unsigned OpNo) {
2983 NewOps[OpNo] = GetPromotedInteger(NewOps[OpNo]);
2984 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2989 const Function &Fn = DAG.getMachineFunction().getFunction();
2991 "cannot use llvm.write_register with illegal type", Fn,
2993 return N->getOperand(0);
2996SDValue DAGTypeLegalizer::PromoteIntOp_VP_STRIDED(
SDNode *
N,
unsigned OpNo) {
2997 assert((
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_LOAD && OpNo == 3) ||
2998 (
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_STORE && OpNo == 4));
3001 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
3003 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
3006SDValue DAGTypeLegalizer::PromoteIntOp_VP_SPLICE(
SDNode *
N,
unsigned OpNo) {
3010 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
3011 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
3014 assert((OpNo == 4 || OpNo == 5) &&
"Unexpected operand for promotion");
3016 NewOps[OpNo] = ZExtPromotedInteger(
N->getOperand(OpNo));
3017 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
3020SDValue DAGTypeLegalizer::PromoteIntOp_VECTOR_HISTOGRAM(
SDNode *
N,
3022 assert(OpNo == 1 &&
"Unexpected operand for promotion");
3024 NewOps[1] = GetPromotedInteger(
N->getOperand(1));
3025 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
3028SDValue DAGTypeLegalizer::PromoteIntOp_UnaryBooleanVectorOp(
SDNode *
N,
3030 assert(OpNo == 0 &&
"Unexpected operand for promotion");
3034 if (TLI.getBooleanContents(
Op.getValueType()) ==
3036 NewOp = SExtPromotedInteger(
Op);
3038 NewOp = ZExtPromotedInteger(
Op);
3040 return SDValue(DAG.UpdateNodeOperands(
N, NewOp), 0);
3043SDValue DAGTypeLegalizer::PromoteIntOp_GET_ACTIVE_LANE_MASK(
SDNode *
N) {
3045 NewOps[0] = ZExtPromotedInteger(
N->getOperand(0));
3046 NewOps[1] = ZExtPromotedInteger(
N->getOperand(1));
3047 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
3050SDValue DAGTypeLegalizer::PromoteIntOp_MaskedBinOp(
SDNode *
N,
unsigned OpNo) {
3053 NewOps[2] = PromoteTargetBoolean(NewOps[2],
N->getValueType(0));
3054 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
3057SDValue DAGTypeLegalizer::PromoteIntOp_PARTIAL_REDUCE_MLA(
SDNode *
N) {
3059 switch (
N->getOpcode()) {
3061 NewOps[1] = SExtPromotedInteger(
N->getOperand(1));
3062 NewOps[2] = SExtPromotedInteger(
N->getOperand(2));
3065 NewOps[1] = ZExtPromotedInteger(
N->getOperand(1));
3066 NewOps[2] = ZExtPromotedInteger(
N->getOperand(2));
3069 NewOps[1] = SExtPromotedInteger(
N->getOperand(1));
3070 NewOps[2] = ZExtPromotedInteger(
N->getOperand(2));
3075 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
3086void DAGTypeLegalizer::ExpandIntegerResult(
SDNode *
N,
unsigned ResNo) {
3092 if (CustomLowerNode(
N,
N->getValueType(ResNo),
true))
3095 switch (
N->getOpcode()) {
3098 dbgs() <<
"ExpandIntegerResult #" << ResNo <<
": ";
3099 N->dump(&DAG);
dbgs() <<
"\n";
3177 std::pair<SDValue, SDValue> Tmp = ExpandAtomic(
N);
3178 SplitInteger(Tmp.first,
Lo,
Hi);
3179 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
3184 SDVTList VTs = DAG.getVTList(
N->getValueType(0), MVT::Other);
3185 SDValue Tmp = DAG.getAtomicCmpSwap(
3187 N->getOperand(0),
N->getOperand(1),
N->getOperand(2),
N->getOperand(3),
3196 SplitInteger(Tmp,
Lo,
Hi);
3275 ExpandIntRes_Rotate(
N,
Lo,
Hi);
3280 ExpandIntRes_FunnelShift(
N,
Lo,
Hi);
3286 ExpandIntRes_CLMUL(
N,
Lo,
Hi);
3290 ExpandIntRes_VSCALE(
N,
Lo,
Hi);
3294 ExpandIntRes_READ_REGISTER(
N,
Lo,
Hi);
3299 ExpandIntRes_CTTZ_ELTS(
N,
Lo,
Hi);
3309std::pair <SDValue, SDValue> DAGTypeLegalizer::ExpandAtomic(
SDNode *Node) {
3310 unsigned Opc =
Node->getOpcode();
3316 EVT RetVT =
Node->getValueType(0);
3317 TargetLowering::MakeLibCallOptions CallOptions;
3320 RTLIB::LibcallImpl LCImpl = DAG.getLibcalls().getLibcallImpl(LC);
3321 if (LCImpl != RTLIB::Unsupported) {
3323 Ops.push_back(
Node->getOperand(1));
3326 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
3327 "Unexpected atomic op or value type!");
3329 LCImpl = DAG.getLibcalls().getLibcallImpl(LC);
3331 return TLI.makeLibCall(DAG, LCImpl, RetVT,
Ops, CallOptions, SDLoc(Node),
3332 Node->getOperand(0));
3337void DAGTypeLegalizer::ExpandShiftByConstant(
SDNode *
N,
const APInt &Amt,
3342 GetExpandedInteger(
N->getOperand(0), InL, InH);
3357 if (Amt.
uge(VTBits)) {
3358 Lo =
Hi = DAG.getConstant(0,
DL, NVT);
3359 }
else if (Amt.
ugt(NVTBits)) {
3360 Lo = DAG.getConstant(0,
DL, NVT);
3362 DAG.getShiftAmountConstant(Amt - NVTBits, NVT,
DL));
3363 }
else if (Amt == NVTBits) {
3364 Lo = DAG.getConstant(0,
DL, NVT);
3368 DAG.getShiftAmountConstant(Amt, NVT,
DL));
3370 if (TLI.isOperationLegal(
ISD::FSHL, NVT)) {
3372 DAG.getShiftAmountConstant(Amt, NVT,
DL));
3377 DAG.getShiftAmountConstant(Amt, NVT,
DL)),
3379 DAG.getShiftAmountConstant(-Amt + NVTBits, NVT,
DL)));
3386 if (Amt.
uge(VTBits)) {
3387 Lo =
Hi = DAG.getConstant(0,
DL, NVT);
3388 }
else if (Amt.
ugt(NVTBits)) {
3390 DAG.getShiftAmountConstant(Amt - NVTBits, NVT,
DL));
3391 Hi = DAG.getConstant(0,
DL, NVT);
3392 }
else if (Amt == NVTBits) {
3394 Hi = DAG.getConstant(0,
DL, NVT);
3397 if (TLI.isOperationLegal(
ISD::FSHR, NVT)) {
3399 DAG.getShiftAmountConstant(Amt, NVT,
DL));
3404 DAG.getShiftAmountConstant(Amt, NVT,
DL)),
3406 DAG.getShiftAmountConstant(-Amt + NVTBits, NVT,
DL)));
3409 DAG.getShiftAmountConstant(Amt, NVT,
DL));
3415 if (Amt.
uge(VTBits)) {
3417 DAG.getShiftAmountConstant(NVTBits - 1, NVT,
DL));
3418 }
else if (Amt.
ugt(NVTBits)) {
3420 DAG.getShiftAmountConstant(Amt - NVTBits, NVT,
DL));
3422 DAG.getShiftAmountConstant(NVTBits - 1, NVT,
DL));
3423 }
else if (Amt == NVTBits) {
3426 DAG.getShiftAmountConstant(NVTBits - 1, NVT,
DL));
3429 if (TLI.isOperationLegal(
ISD::FSHR, NVT)) {
3431 DAG.getShiftAmountConstant(Amt, NVT,
DL));
3436 DAG.getShiftAmountConstant(Amt, NVT,
DL)),
3438 DAG.getShiftAmountConstant(-Amt + NVTBits, NVT,
DL)));
3441 DAG.getShiftAmountConstant(Amt, NVT,
DL));
3449bool DAGTypeLegalizer::
3451 unsigned Opc =
N->getOpcode();
3454 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
3459 "Expanded integer type size not a power of two!");
3463 KnownBits Known = DAG.computeKnownBits(Amt);
3466 if (((Known.
Zero | Known.
One) & HighBitMask) == 0)
3471 GetExpandedInteger(In, InL, InH);
3478 DAG.getConstant(~HighBitMask, dl, ShTy));
3483 Lo = DAG.getConstant(0, dl, NVT);
3484 Hi = DAG.getNode(
ISD::SHL, dl, NVT, InL, Amt);
3487 Hi = DAG.getConstant(0, dl, NVT);
3488 Lo = DAG.getNode(
ISD::SRL, dl, NVT, InH, Amt);
3492 DAG.getConstant(NVTBits - 1, dl, ShTy));
3493 Lo = DAG.getNode(
ISD::SRA, dl, NVT, InH, Amt);
3505 DAG.getConstant(NVTBits - 1, dl, ShTy));
3521 SDValue Sh1 = DAG.getNode(Op2, dl, NVT, InL, DAG.getConstant(1, dl, ShTy));
3523 SDValue Sh2 = DAG.getNode(Op2, dl, NVT, Sh1, Amt2);
3525 Lo = DAG.getNode(
Opc, dl, NVT, InL, Amt);
3526 Hi = DAG.getNode(
ISD::OR, dl, NVT, DAG.getNode(Op1, dl, NVT, InH, Amt),Sh2);
3538bool DAGTypeLegalizer::
3541 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
3545 "Expanded integer type size not a power of two!");
3550 GetExpandedInteger(
N->getOperand(0), InL, InH);
3552 SDValue NVBitsNode = DAG.getConstant(NVTBits, dl, ShTy);
3555 SDValue isShort = DAG.getSetCC(dl, getSetCCResultType(ShTy),
3558 Amt, DAG.getConstant(0, dl, ShTy),
3562 switch (
N->getOpcode()) {
3568 DAG.getNode(
ISD::SHL, dl, NVT, InH, Amt),
3569 DAG.getNode(
ISD::SRL, dl, NVT, InL, AmtLack));
3572 LoL = DAG.getConstant(0, dl, NVT);
3575 Lo = DAG.getSelect(dl, NVT, isShort, LoS, LoL);
3576 Hi = DAG.getSelect(dl, NVT,
isZero, InH,
3577 DAG.getSelect(dl, NVT, isShort, HiS, HiL));
3583 DAG.getNode(
ISD::SRL, dl, NVT, InL, Amt),
3586 DAG.getNode(
ISD::SHL, dl, NVT, InH, AmtLack));
3589 HiL = DAG.getConstant(0, dl, NVT);
3592 Lo = DAG.getSelect(dl, NVT,
isZero, InL,
3593 DAG.getSelect(dl, NVT, isShort, LoS, LoL));
3594 Hi = DAG.getSelect(dl, NVT, isShort, HiS, HiL);
3600 DAG.getNode(
ISD::SRL, dl, NVT, InL, Amt),
3601 DAG.getNode(
ISD::SHL, dl, NVT, InH, AmtLack));
3605 DAG.getConstant(NVTBits - 1, dl, ShTy));
3608 Lo = DAG.getSelect(dl, NVT,
isZero, InL,
3609 DAG.getSelect(dl, NVT, isShort, LoS, LoL));
3610 Hi = DAG.getSelect(dl, NVT, isShort, HiS, HiL);
3635 EVT NewVT = getSetCCResultType(
LHS.getValueType());
3640 Res = DAG.getBoolExtOrTrunc(Res,
DL,
N->getValueType(0), NewVT);
3641 SplitInteger(Res,
Lo,
Hi);
3644void DAGTypeLegalizer::ExpandIntRes_MINMAX(
SDNode *
N,
3653 unsigned NumBits =
N->getValueType(0).getScalarSizeInBits();
3654 unsigned NumHalfBits = NumBits / 2;
3655 if (DAG.ComputeNumSignBits(
LHS) > NumHalfBits &&
3656 DAG.ComputeNumSignBits(
RHS) > NumHalfBits) {
3657 SDValue LHSL, LHSH, RHSL, RHSH;
3658 GetExpandedInteger(
LHS, LHSL, LHSH);
3659 GetExpandedInteger(
RHS, RHSL, RHSH);
3662 Lo = DAG.getNode(
N->getOpcode(),
DL, NVT, LHSL, RHSL);
3664 DAG.getShiftAmountConstant(NumHalfBits - 1, NVT,
DL));
3672 SDValue LHSL, LHSH, RHSL, RHSH;
3673 GetExpandedInteger(
LHS, LHSL, LHSH);
3674 GetExpandedInteger(
RHS, RHSL, RHSH);
3676 EVT CCT = getSetCCResultType(NVT);
3679 DAG.getSetCC(
DL, CCT, LHSH, DAG.getConstant(0,
DL, NVT),
ISD::SETLT);
3681 Lo = DAG.getSelect(
DL, NVT, HiNeg, LHSL, DAG.getAllOnesConstant(
DL, NVT));
3683 Lo = DAG.getSelect(
DL, NVT, HiNeg, DAG.getConstant(0,
DL, NVT), LHSL);
3685 Hi = DAG.getNode(
N->getOpcode(),
DL, NVT, {LHSH, RHSH});
3689 const APInt *RHSVal =
nullptr;
3691 RHSVal = &RHSConst->getAPIntValue();
3698 SDValue LHSL, LHSH, RHSL, RHSH;
3699 GetExpandedInteger(
LHS, LHSL, LHSH);
3700 GetExpandedInteger(
RHS, RHSL, RHSH);
3702 EVT CCT = getSetCCResultType(NVT);
3708 Hi = DAG.getNode(
N->getOpcode(),
DL, NVT, {LHSH, RHSH});
3711 SDValue IsHiLeft = DAG.getSetCC(
DL, CCT, LHSH, RHSH, CondC);
3715 SDValue LoCmp = DAG.getSelect(
DL, NVT, IsHiLeft, LHSL, RHSL);
3718 SDValue LoMinMax = DAG.getNode(LoOpc,
DL, NVT, {LHSL, RHSL});
3720 Lo = DAG.getSelect(
DL, NVT, IsHiEq, LoMinMax, LoCmp);
3727 switch (
N->getOpcode()) {
3754 EVT VT =
N->getValueType(0);
3755 EVT CCT = getSetCCResultType(VT);
3758 SplitInteger(Result,
Lo,
Hi);
3762 SDValue ExpandedCMP = TLI.expandCMP(
N, DAG);
3763 SplitInteger(ExpandedCMP,
Lo,
Hi);
3766void DAGTypeLegalizer::ExpandIntRes_ADDSUB(
SDNode *
N,
3770 SDValue LHSL, LHSH, RHSL, RHSH;
3771 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3772 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3775 SDValue LoOps[2] = { LHSL, RHSL };
3776 SDValue HiOps[3] = { LHSH, RHSH };
3778 bool HasOpCarry = TLI.isOperationLegalOrCustom(
3780 TLI.getTypeToExpandTo(*DAG.getContext(), NVT));
3782 SDVTList VTList = DAG.getVTList(NVT, getSetCCResultType(NVT));
3786 Hi = DAG.computeKnownBits(HiOps[2]).isZero()
3792 Hi = DAG.computeKnownBits(HiOps[2]).isZero()
3805 TLI.isOperationLegalOrCustom(
N->getOpcode() ==
ISD::ADD ?
3807 TLI.getTypeToExpandTo(*DAG.getContext(), NVT));
3810 SDVTList VTList = DAG.getVTList(NVT, MVT::Glue);
3824 TLI.isOperationLegalOrCustom(
N->getOpcode() ==
ISD::ADD ?
3826 TLI.getTypeToExpandTo(*DAG.getContext(), NVT));
3830 EVT OvfVT = getSetCCResultType(NVT);
3831 SDVTList VTList = DAG.getVTList(NVT, OvfVT);
3846 OVF = DAG.
getNode(
ISD::AND, dl, OvfVT, DAG.getConstant(1, dl, OvfVT), OVF);
3849 OVF = DAG.getZExtOrTrunc(OVF, dl, NVT);
3853 OVF = DAG.getSExtOrTrunc(OVF, dl, NVT);
3865 Cmp = DAG.getSetCC(dl, getSetCCResultType(NVT),
Lo,
3869 Cmp = DAG.getSetCC(dl, getSetCCResultType(NVT), LoOps[0],
3872 Cmp = DAG.getSetCC(dl, getSetCCResultType(NVT), LoOps[0],
3875 Cmp = DAG.getSetCC(dl, getSetCCResultType(NVT),
Lo, LoOps[0],
3880 Carry = DAG.getZExtOrTrunc(Cmp, dl, NVT);
3882 Carry = DAG.getSelect(dl, NVT, Cmp, DAG.getConstant(1, dl, NVT),
3883 DAG.getConstant(0, dl, NVT));
3886 Hi = DAG.getNode(
ISD::SUB, dl, NVT, HiOps[0], Carry);
3895 DAG.getSetCC(dl, getSetCCResultType(LoOps[0].
getValueType()),
3900 Borrow = DAG.getZExtOrTrunc(Cmp, dl, NVT);
3902 Borrow = DAG.getSelect(dl, NVT, Cmp, DAG.getConstant(1, dl, NVT),
3903 DAG.getConstant(0, dl, NVT));
3909void DAGTypeLegalizer::ExpandIntRes_ADDSUBC(
SDNode *
N,
3912 SDValue LHSL, LHSH, RHSL, RHSH;
3914 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3915 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3916 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(), MVT::Glue);
3917 SDValue LoOps[2] = { LHSL, RHSL };
3918 SDValue HiOps[3] = { LHSH, RHSH };
3932 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3935void DAGTypeLegalizer::ExpandIntRes_ADDSUBE(
SDNode *
N,
3938 SDValue LHSL, LHSH, RHSL, RHSH;
3940 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3941 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3942 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(), MVT::Glue);
3944 SDValue HiOps[3] = { LHSH, RHSH };
3946 Lo = DAG.
getNode(
N->getOpcode(), dl, VTList, LoOps);
3948 Hi = DAG.
getNode(
N->getOpcode(), dl, VTList, HiOps);
3952 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3955void DAGTypeLegalizer::ExpandIntRes_UADDSUBO(
SDNode *
N,
3963 unsigned CarryOp, NoCarryOp;
3965 switch(
N->getOpcode()) {
3980 bool HasCarryOp = TLI.isOperationLegalOrCustom(
3981 CarryOp, TLI.getTypeToExpandTo(*DAG.getContext(),
LHS.getValueType()));
3985 SDValue LHSL, LHSH, RHSL, RHSH;
3986 GetExpandedInteger(
LHS, LHSL, LHSH);
3987 GetExpandedInteger(
RHS, RHSL, RHSH);
3988 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(),
N->getValueType(1));
3989 SDValue LoOps[2] = { LHSL, RHSL };
3990 SDValue HiOps[3] = { LHSH, RHSH };
3992 Lo = DAG.
getNode(
N->getOpcode(), dl, VTList, LoOps);
3994 Hi = DAG.
getNode(CarryOp, dl, VTList, HiOps);
4001 SplitInteger(Sum,
Lo,
Hi);
4007 Ovf = DAG.getSetCC(dl,
N->getValueType(1),
Or,
4008 DAG.getConstant(0, dl,
Lo.getValueType()),
ISD::SETEQ);
4012 DAG.getSetCC(dl,
N->getValueType(1),
LHS,
4017 Ovf = DAG.getSetCC(dl,
N->getValueType(1), Sum,
LHS,
Cond);
4023 ReplaceValueWith(
SDValue(
N, 1), Ovf);
4029 SDValue LHSL, LHSH, RHSL, RHSH;
4031 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
4032 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
4033 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(),
N->getValueType(1));
4037 Lo = DAG.
getNode(
N->getOpcode(), dl, VTList, LoOps);
4039 Hi = DAG.
getNode(
N->getOpcode(), dl, VTList, HiOps);
4043 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
4046void DAGTypeLegalizer::ExpandIntRes_SADDSUBO_CARRY(
SDNode *
N,
4049 SDValue LHSL, LHSH, RHSL, RHSH;
4051 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
4052 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
4053 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(),
N->getValueType(1));
4058 Lo = DAG.getNode(CarryOp, dl, VTList, { LHSL, RHSL,
N->
getOperand(2) });
4059 Hi = DAG.getNode(
N->getOpcode(), dl, VTList, { LHSH, RHSH, Lo.getValue(1) });
4063 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
4066void DAGTypeLegalizer::ExpandIntRes_ANY_EXTEND(
SDNode *
N,
4068 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
4071 if (
Op.getValueType().bitsLE(NVT)) {
4074 Hi = DAG.getUNDEF(NVT);
4078 assert(getTypeAction(
Op.getValueType()) ==
4080 "Only know how to promote this result!");
4083 "Operand over promoted?");
4085 SplitInteger(Res,
Lo,
Hi);
4089void DAGTypeLegalizer::ExpandIntRes_AssertSext(
SDNode *
N,
4092 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
4093 EVT NVT =
Lo.getValueType();
4098 if (NVTBits < EVTBits) {
4101 EVTBits - NVTBits)));
4106 DAG.getShiftAmountConstant(NVTBits - 1, NVT, dl));
4110void DAGTypeLegalizer::ExpandIntRes_AssertZext(
SDNode *
N,
4113 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
4114 EVT NVT =
Lo.getValueType();
4119 if (NVTBits < EVTBits) {
4122 EVTBits - NVTBits)));
4126 Hi = DAG.getConstant(0, dl, NVT);
4130void DAGTypeLegalizer::ExpandIntRes_BITREVERSE(
SDNode *
N,
4133 GetExpandedInteger(
N->getOperand(0),
Hi,
Lo);
4138void DAGTypeLegalizer::ExpandIntRes_BSWAP(
SDNode *
N,
4141 GetExpandedInteger(
N->getOperand(0),
Hi,
Lo);
4150 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
4151 EVT NVT =
Lo.getValueType();
4154 Hi = DAG.getConstant(0, dl, NVT);
4157void DAGTypeLegalizer::ExpandIntRes_Constant(
SDNode *
N,
4159 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
4162 const APInt &Cst =
Constant->getAPIntValue();
4163 bool IsTarget =
Constant->isTargetOpcode();
4164 bool IsOpaque =
Constant->isOpaque();
4166 Lo = DAG.getConstant(Cst.
trunc(NBitWidth), dl, NVT, IsTarget, IsOpaque);
4167 Hi = DAG.getConstant(Cst.
lshr(NBitWidth).
trunc(NBitWidth), dl, NVT, IsTarget,
4175 GetExpandedInteger(N0,
Lo,
Hi);
4176 EVT NVT =
Lo.getValueType();
4182 Hi = DAG.getConstant(0, dl, NVT);
4192 bool HasSubCarry = TLI.isOperationLegalOrCustom(
4197 DAG.getShiftAmountConstant(NVT.
getSizeInBits() - 1, NVT, dl));
4198 SDVTList VTList = DAG.getVTList(NVT, getSetCCResultType(NVT));
4207 EVT VT =
N->getValueType(0);
4209 DAG.getConstant(0, dl, VT), N0);
4211 SplitInteger(Neg, NegLo, NegHi);
4213 SDValue HiIsNeg = DAG.getSetCC(dl, getSetCCResultType(NVT),
Hi,
4215 Lo = DAG.getSelect(dl, NVT, HiIsNeg, NegLo,
Lo);
4216 Hi = DAG.getSelect(dl, NVT, HiIsNeg, NegHi,
Hi);
4219void DAGTypeLegalizer::ExpandIntRes_CTLZ(
SDNode *
N,
4223 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
4224 EVT NVT =
Lo.getValueType();
4226 SDValue HiNotZero = DAG.getSetCC(dl, getSetCCResultType(NVT),
Hi,
4229 SDValue LoLZ = DAG.getNode(
N->getOpcode(), dl, NVT,
Lo);
4232 Lo = DAG.getSelect(dl, NVT, HiNotZero, HiLZ,
4233 DAG.getNode(
ISD::ADD, dl, NVT, LoLZ,
4236 Hi = DAG.getConstant(0, dl, NVT);
4244 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
4245 EVT NVT =
Lo.getValueType();
4248 SDValue Constant0 = DAG.getConstant(0, dl, NVT);
4249 SDValue ConstantBWM1 = DAG.getConstant(NVTBits - 1, dl, NVT);
4252 SDValue IsAllSignBits = DAG.getSetCC(dl, getSetCCResultType(NVT), HiCTLS,
4255 DAG.getSetCC(dl, getSetCCResultType(NVT),
Hi, Constant0,
ISD::SETLT);
4257 DAG.getSelect(dl, NVT, IsNegative, DAG.getNOT(dl,
Lo, NVT),
Lo);
4259 Lo = DAG.getSelect(dl, NVT, IsAllSignBits,
4260 DAG.getNode(
ISD::ADD, dl, NVT, LoCLZ, ConstantBWM1),
4262 Hi = DAG.getConstant(0, dl, NVT);
4267 SplitInteger(Result,
Lo,
Hi);
4272 EVT VT =
N->getValueType(0);
4277 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
4278 "LibCall explicitly requested, but not available");
4280 if (RTLIB::LibcallImpl LCImpl = DAG.getLibcalls().getLibcallImpl(LC)) {
4281 TargetLowering::MakeLibCallOptions CallOptions;
4285 TLI.makeLibCall(DAG, LCImpl, IntVT,
Op, CallOptions,
DL).first;
4286 SplitInteger(DAG.getSExtOrTrunc(Res,
DL, VT),
Lo,
Hi);
4294 GetExpandedInteger(
Op,
Lo,
Hi);
4295 EVT NVT =
Lo.getValueType();
4298 Hi = DAG.getConstant(0,
DL, NVT);
4301void DAGTypeLegalizer::ExpandIntRes_CTTZ(
SDNode *
N,
4305 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
4306 EVT NVT =
Lo.getValueType();
4308 SDValue LoNotZero = DAG.getSetCC(dl, getSetCCResultType(NVT),
Lo,
4314 Lo = DAG.getSelect(dl, NVT, LoNotZero, LoLZ,
4315 DAG.getNode(
ISD::ADD, dl, NVT, HiLZ,
4318 Hi = DAG.getConstant(0, dl, NVT);
4324 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
4331 DAG.getShiftAmountConstant(NBitWidth - 1, NVT, dl));
4335 ReplaceValueWith(
SDValue(
N, 1), Chain);
4343 Chain =
Op.getValue(1);
4352 EVT VT =
N->getValueType(0);
4356 bool IsStrict =
N->isStrictFPOpcode();
4358 SDValue Op =
N->getOperand(IsStrict ? 1 : 0);
4362 Op.getValueType() == MVT::bf16) {
4368 EVT OpVT =
Op.getValueType();
4372 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected fp-to-xint conversion!");
4373 TargetLowering::MakeLibCallOptions CallOptions;
4378 std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(DAG, LC, VT,
Op,
4379 CallOptions, dl, Chain);
4380 SplitInteger(Tmp.first,
Lo,
Hi);
4383 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
4388 SDValue Res = TLI.expandFP_TO_INT_SAT(
N, DAG);
4389 SplitInteger(Res,
Lo,
Hi);
4395 bool IsStrict =
N->isStrictFPOpcode();
4396 SDValue Op =
N->getOperand(IsStrict ? 1 : 0);
4399 EVT VT =
Op.getValueType();
4401 if (VT == MVT::f16) {
4407 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
4411 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected lround input type!");
4415 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected lrint input type!");
4419 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected llround input type!");
4423 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected llrint input type!");
4427 EVT RetVT =
N->getValueType(0);
4429 TargetLowering::MakeLibCallOptions CallOptions;
4431 std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(DAG, LC, RetVT,
4432 Op, CallOptions, dl,
4434 SplitInteger(Tmp.first,
Lo,
Hi);
4436 if (
N->isStrictFPOpcode())
4437 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
4440void DAGTypeLegalizer::ExpandIntRes_LOAD(
LoadSDNode *
N,
4442 assert(!
N->isAtomic() &&
"Should have been a ATOMIC_LOAD?");
4445 ExpandRes_NormalLoad(
N,
Lo,
Hi);
4451 EVT VT =
N->getValueType(0);
4452 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
4457 AAMDNodes AAInfo =
N->getAAInfo();
4462 if (
N->getMemoryVT().bitsLE(NVT)) {
4463 EVT MemVT =
N->getMemoryVT();
4465 Lo = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr,
N->getPointerInfo(), MemVT,
4466 N->getBaseAlign(), MMOFlags, AAInfo);
4474 unsigned LoSize =
Lo.getValueSizeInBits();
4476 DAG.getShiftAmountConstant(LoSize - 1, NVT, dl));
4479 Hi = DAG.getConstant(0, dl, NVT);
4483 Hi = DAG.getUNDEF(NVT);
4485 }
else if (DAG.getDataLayout().isLittleEndian()) {
4487 Lo = DAG.getLoad(NVT, dl, Ch, Ptr,
N->getPointerInfo(),
N->getBaseAlign(),
4490 unsigned ExcessBits =
4497 Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr,
4498 N->getPointerInfo().getWithOffset(IncrementSize), NEVT,
4499 N->getBaseAlign(), MMOFlags, AAInfo);
4508 EVT MemVT =
N->getMemoryVT();
4511 unsigned ExcessBits = (EBytes - IncrementSize)*8;
4514 Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr,
N->getPointerInfo(),
4517 N->getBaseAlign(), MMOFlags, AAInfo);
4523 N->getPointerInfo().getWithOffset(IncrementSize),
4525 N->getBaseAlign(), MMOFlags, AAInfo);
4537 DAG.getShiftAmountConstant(ExcessBits, NVT, dl)));
4541 DAG.getShiftAmountConstant(
4548 ReplaceValueWith(
SDValue(
N, 1), Ch);
4551void DAGTypeLegalizer::ExpandIntRes_Logical(
SDNode *
N,
4555 GetExpandedInteger(
N->getOperand(0), LL, LH);
4556 GetExpandedInteger(
N->getOperand(1), RL, RH);
4560 Flags.setDisjoint(
N->getFlags().hasDisjoint());
4562 Lo = DAG.getNode(
N->getOpcode(), dl, LL.
getValueType(), LL, RL, Flags);
4563 Hi = DAG.getNode(
N->getOpcode(), dl, LL.
getValueType(), LH, RH, Flags);
4566void DAGTypeLegalizer::ExpandIntRes_MUL(
SDNode *
N,
4568 EVT VT =
N->getValueType(0);
4569 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
4573 GetExpandedInteger(
N->getOperand(0), LL, LH);
4574 GetExpandedInteger(
N->getOperand(1), RL, RH);
4576 if (TLI.expandMUL(
N,
Lo,
Hi, NVT, DAG,
4583 RTLIB::LibcallImpl LCImpl = DAG.getLibcalls().getLibcallImpl(LC);
4584 if (LCImpl == RTLIB::Unsupported) {
4587 TLI.forceExpandMultiply(DAG, dl,
false,
Lo,
Hi, LL, RL, LH, RH);
4593 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
4594 TargetLowering::MakeLibCallOptions CallOptions;
4596 SplitInteger(TLI.makeLibCall(DAG, LCImpl, VT,
Ops, CallOptions, dl).first,
Lo,
4603 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
4604 SDVTList VTs = DAG.getVTList(NVT, NVT, MVT::Other);
4605 SDValue R = DAG.getNode(
N->getOpcode(),
DL, VTs,
N->getOperand(0));
4608 ReplaceValueWith(
SDValue(
N, 1),
R.getValue(2));
4613 SplitInteger(Result,
Lo,
Hi);
4619 SplitInteger(Result,
Lo,
Hi);
4625 SplitInteger(Result,
Lo,
Hi);
4636 EVT VT =
N->getValueType(0);
4640 uint64_t Scale =
N->getConstantOperandVal(2);
4652 EVT BoolVT = getSetCCResultType(VT);
4654 Result = DAG.getNode(MulOp, dl, DAG.getVTList(VT, BoolVT),
LHS,
RHS);
4660 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
4661 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
4667 Result = DAG.getSelect(dl, VT, ProdNeg, SatMin, SatMax);
4668 Result = DAG.getSelect(dl, VT, Overflow, Result, Product);
4673 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
4674 Result = DAG.getSelect(dl, VT, Overflow, SatMax, Product);
4677 SplitInteger(Result,
Lo,
Hi);
4683 assert(Scale <= VTSize &&
"Scale can't be larger than the value type size.");
4685 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
4687 GetExpandedInteger(
LHS, LL, LH);
4688 GetExpandedInteger(
RHS, RL, RH);
4692 if (!TLI.expandMUL_LOHI(LoHiOp, VT, dl,
LHS,
RHS, Result, NVT, DAG,
4699 TLI.forceExpandWideMUL(DAG, dl,
Signed,
LHS,
RHS, LoTmp, HiTmp);
4700 SplitInteger(LoTmp, Result[0], Result[1]);
4701 SplitInteger(HiTmp, Result[2], Result[3]);
4703 assert(
Result.size() == 4 &&
"Unexpected number of partlets in the result");
4706 assert((VTSize == NVTSize * 2) &&
"Expected the new value type to be half "
4707 "the size of the current value type");
4728 uint64_t Part0 = Scale / NVTSize;
4729 if (Scale % NVTSize) {
4730 SDValue ShiftAmount = DAG.getShiftAmountConstant(Scale % NVTSize, NVT, dl);
4733 Hi = DAG.getNode(
ISD::FSHR, dl, NVT, Result[Part0 + 2], Result[Part0 + 1],
4745 if (Scale == VTSize)
4764 SDValue NVTZero = DAG.getConstant(0, dl, NVT);
4765 SDValue NVTNeg1 = DAG.getAllOnesConstant(dl, NVT);
4766 EVT BoolNVT = getSetCCResultType(NVT);
4769 if (Scale < NVTSize) {
4772 DAG.getNode(
ISD::SRL, dl, NVT, ResultHL,
4773 DAG.getShiftAmountConstant(Scale, NVT, dl));
4774 SDValue Tmp = DAG.getNode(
ISD::OR, dl, NVT, HLAdjusted, ResultHH);
4775 SatMax = DAG.getSetCC(dl, BoolNVT, Tmp, NVTZero,
ISD::SETNE);
4776 }
else if (Scale == NVTSize) {
4778 SatMax = DAG.getSetCC(dl, BoolNVT, ResultHH, NVTZero,
ISD::SETNE);
4779 }
else if (Scale < VTSize) {
4783 DAG.getShiftAmountConstant(Scale - NVTSize, NVT, dl));
4784 SatMax = DAG.getSetCC(dl, BoolNVT, HLAdjusted, NVTZero,
ISD::SETNE);
4787 "(and saturation can't happen with Scale==VTSize).");
4789 Hi = DAG.getSelect(dl, NVT, SatMax, NVTNeg1,
Hi);
4790 Lo = DAG.getSelect(dl, NVT, SatMax, NVTNeg1,
Lo);
4794 if (Scale < NVTSize) {
4799 unsigned OverflowBits = VTSize - Scale + 1;
4800 assert(OverflowBits <= VTSize && OverflowBits > NVTSize &&
4801 "Extent of overflow bits must start within HL");
4802 SDValue HLHiMask = DAG.getConstant(
4804 SDValue HLLoMask = DAG.getConstant(
4811 DAG.getNode(
ISD::AND, dl, BoolNVT, HHEQ0, HLUGT));
4817 DAG.getNode(
ISD::AND, dl, BoolNVT, HHEQ, HLULT));
4818 }
else if (Scale == NVTSize) {
4824 DAG.getNode(
ISD::AND, dl, BoolNVT, HHEQ0, HLNeg));
4830 DAG.getNode(
ISD::AND, dl, BoolNVT, HHEQ, HLPos));
4831 }
else if (Scale < VTSize) {
4834 unsigned OverflowBits = VTSize - Scale + 1;
4835 SDValue HHHiMask = DAG.getConstant(
4837 SDValue HHLoMask = DAG.getConstant(
4839 SatMax = DAG.getSetCC(dl, BoolNVT, ResultHH, HHLoMask,
ISD::SETGT);
4840 SatMin = DAG.getSetCC(dl, BoolNVT, ResultHH, HHHiMask,
ISD::SETLT);
4847 Hi = DAG.getSelect(dl, NVT, SatMax, DAG.getConstant(MaxHi, dl, NVT),
Hi);
4848 Lo = DAG.getSelect(dl, NVT, SatMax, DAG.getConstant(MaxLo, dl, NVT),
Lo);
4851 Hi = DAG.getSelect(dl, NVT, SatMin, DAG.getConstant(MinHi, dl, NVT),
Hi);
4852 Lo = DAG.getSelect(dl, NVT, SatMin, NVTZero,
Lo);
4859 SDValue Res = TLI.expandFixedPointDiv(
N->getOpcode(), dl,
N->getOperand(0),
4861 N->getConstantOperandVal(2), DAG);
4865 N->getConstantOperandVal(2), TLI, DAG);
4866 SplitInteger(Res,
Lo,
Hi);
4869void DAGTypeLegalizer::ExpandIntRes_SADDSUBO(
SDNode *Node,
4872 "Node has unexpected Opcode");
4882 bool HasCarryOp = TLI.isOperationLegalOrCustom(
4883 CarryOp, TLI.getTypeToExpandTo(*DAG.getContext(),
LHS.getValueType()));
4887 SDValue LHSL, LHSH, RHSL, RHSH;
4888 GetExpandedInteger(
LHS, LHSL, LHSH);
4889 GetExpandedInteger(
RHS, RHSL, RHSH);
4890 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(),
Node->getValueType(1));
4893 Hi = DAG.getNode(CarryOp, dl, VTList, { LHSH, RHSH,
Lo.
getValue(1) });
4902 SplitInteger(Sum,
Lo,
Hi);
4927 EVT VT =
LHS.getValueType();
4930 SignsMatch = DAG.getNOT(dl, SignsMatch, VT);
4934 EVT OType =
Node->getValueType(1);
4935 Ovf = DAG.getSetCC(dl, OType, Ovf, DAG.getConstant(0, dl, VT),
ISD::SETLT);
4939 ReplaceValueWith(
SDValue(Node, 1), Ovf);
4942void DAGTypeLegalizer::ExpandIntRes_SDIV(
SDNode *
N,
4944 EVT VT =
N->getValueType(0);
4946 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
4955 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported SDIV!");
4957 TargetLowering::MakeLibCallOptions CallOptions;
4959 SplitInteger(TLI.makeLibCall(DAG, LC, VT,
Ops, CallOptions, dl).first,
Lo,
Hi);
4962void DAGTypeLegalizer::ExpandIntRes_ShiftThroughStack(
SDNode *
N,
SDValue &
Lo,
4965 SDValue Shiftee =
N->getOperand(0);
4972 LoadVT = TLI.getTypeToTransformTo(*DAG.getContext(), LoadVT);
4973 }
while (!TLI.isTypeLegal(LoadVT));
4978 "Shifting unit is not a a power of two!");
4980 const bool IsOneStepShift =
4981 DAG.computeKnownBits(ShAmt).countMinTrailingZeros() >=
4986 if (!IsOneStepShift)
4987 ShAmt = DAG.getFreeze(ShAmt);
4990 assert(VTBitWidth % 8 == 0 &&
"Shifting a not byte multiple value?");
4991 unsigned VTByteWidth = VTBitWidth / 8;
4993 "Shiftee type size is not a power of two!");
4994 unsigned StackSlotByteWidth = 2 * VTByteWidth;
4995 unsigned StackSlotBitWidth = 8 * StackSlotByteWidth;
5000 Align StackAlign = DAG.getReducedAlign(StackSlotVT,
false);
5002 DAG.CreateStackTemporary(StackSlotVT.
getStoreSize(), StackAlign);
5003 EVT PtrTy =
StackPtr.getValueType();
5004 SDValue Ch = DAG.getEntryNode();
5007 DAG.getMachineFunction(),
5013 unsigned WideningOpc =
5015 Init = DAG.
getNode(WideningOpc, dl, StackSlotVT, Shiftee);
5018 SDValue AllZeros = DAG.getConstant(0, dl, VT);
5022 Ch = DAG.getStore(Ch, dl, Init, StackPtr, StackPtrInfo, StackAlign);
5028 Flags.setExact(IsOneStepShift);
5031 DAG.getConstant(
Log2_32(ShiftUnitInBits), dl, ShAmtVT), Flags);
5033 DAG.getNode(
ISD::SHL, dl, ShAmtVT, SrlTmp,
5034 DAG.getConstant(
Log2_32(ShiftUnitInBits), dl, ShAmtVT));
5037 DAG.getNode(
ISD::SRL, dl, ShAmtVT, BitOffset,
5042 DAG.getConstant(VTByteWidth - 1, dl, ShAmtVT));
5049 if (DAG.getDataLayout().isBigEndian())
5050 WillIndexUpwards = !WillIndexUpwards;
5053 if (WillIndexUpwards) {
5056 AdjStackPtr = DAG.getMemBasePlusOffset(
5057 StackPtr, DAG.getConstant(VTByteWidth, dl, PtrTy), dl);
5058 ByteOffset = DAG.getNegative(ByteOffset, dl, ShAmtVT);
5062 ByteOffset = DAG.getSExtOrTrunc(ByteOffset, dl, PtrTy);
5063 AdjStackPtr = DAG.getMemBasePlusOffset(AdjStackPtr, ByteOffset, dl);
5067 DAG.getLoad(VT, dl, Ch, AdjStackPtr,
5072 if (!IsOneStepShift) {
5074 DAG.getNode(
ISD::AND, dl, ShAmtVT, ShAmt,
5075 DAG.getConstant(ShiftUnitInBits - 1, dl, ShAmtVT));
5076 Res = DAG.
getNode(
N->getOpcode(), dl, VT, Res, ShAmtRem);
5080 SplitInteger(Res,
Lo,
Hi);
5083void DAGTypeLegalizer::ExpandIntRes_Shift(
SDNode *
N,
5085 EVT VT =
N->getValueType(0);
5086 unsigned Opc =
N->getOpcode();
5092 return ExpandShiftByConstant(
N, CN->getAPIntValue(),
Lo,
Hi);
5096 if (ExpandShiftWithKnownAmountBit(
N,
Lo,
Hi))
5113 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
5115 const bool LegalOrCustom =
5119 unsigned ExpansionFactor = 1;
5121 for (EVT TmpVT = NVT;;) {
5122 EVT NewTMPVT = TLI.getTypeToTransformTo(*DAG.getContext(), TmpVT);
5123 if (NewTMPVT == TmpVT)
5130 TLI.preferredShiftLegalizationStrategy(DAG,
N, ExpansionFactor);
5133 return ExpandIntRes_ShiftThroughStack(
N,
Lo,
Hi);
5135 if (LegalOrCustom &&
5139 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
5145 SDValue ShiftOp =
N->getOperand(1);
5146 EVT ShiftTy = TLI.getShiftAmountTy(VT, DAG.getDataLayout());
5148 ShiftOp = DAG.getZExtOrTrunc(ShiftOp, dl, ShiftTy);
5151 Lo = DAG.
getNode(PartsOpc, dl, DAG.getVTList(VT, VT),
Ops);
5152 Hi =
Lo.getValue(1);
5157 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
5171 if (RTLIB::LibcallImpl LibcallImpl = DAG.getLibcalls().getLibcallImpl(LC)) {
5174 SDValue ShAmt = DAG.getZExtOrTrunc(
N->getOperand(1), dl, ShAmtTy);
5176 TargetLowering::MakeLibCallOptions CallOptions;
5179 TLI.makeLibCall(DAG, LibcallImpl, VT,
Ops, CallOptions, dl).first,
Lo,
5184 if (!ExpandShiftWithUnknownAmountBit(
N,
Lo,
Hi))
5188void DAGTypeLegalizer::ExpandIntRes_SIGN_EXTEND(
SDNode *
N,
5190 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
5193 if (
Op.getValueType().bitsLE(NVT)) {
5199 DAG.getShiftAmountConstant(LoSize - 1, NVT, dl));
5203 assert(getTypeAction(
Op.getValueType()) ==
5205 "Only know how to promote this result!");
5208 "Operand over promoted?");
5210 SplitInteger(Res,
Lo,
Hi);
5218void DAGTypeLegalizer::
5221 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
5224 if (EVT.
bitsLE(
Lo.getValueType())) {
5232 DAG.getShiftAmountConstant(
Hi.getValueSizeInBits() - 1,
5233 Hi.getValueType(), dl));
5244void DAGTypeLegalizer::ExpandIntRes_SREM(
SDNode *
N,
5246 EVT VT =
N->getValueType(0);
5248 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
5257 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported SREM!");
5259 TargetLowering::MakeLibCallOptions CallOptions;
5261 SplitInteger(TLI.makeLibCall(DAG, LC, VT,
Ops, CallOptions, dl).first,
Lo,
Hi);
5264void DAGTypeLegalizer::ExpandIntRes_TRUNCATE(
SDNode *
N,
5266 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
5276void DAGTypeLegalizer::ExpandIntRes_XMULO(
SDNode *
N,
5278 EVT VT =
N->getValueType(0);
5297 SDValue LHSHigh, LHSLow, RHSHigh, RHSLow;
5298 GetExpandedInteger(
LHS, LHSLow, LHSHigh);
5299 GetExpandedInteger(
RHS, RHSLow, RHSHigh);
5301 EVT BitVT =
N->getValueType(1);
5302 SDVTList VTHalfWithO = DAG.getVTList(HalfVT, BitVT);
5304 SDValue HalfZero = DAG.getConstant(0, dl, HalfVT);
5306 DAG.getSetCC(dl, BitVT, LHSHigh, HalfZero,
ISD::SETNE),
5307 DAG.getSetCC(dl, BitVT, RHSHigh, HalfZero,
ISD::SETNE));
5326 SplitInteger(Three,
Lo,
Hi);
5330 ReplaceValueWith(
SDValue(
N, 1), Overflow);
5335 EVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
5340 RTLIB::LibcallImpl LCImpl = DAG.getLibcalls().getLibcallImpl(LC);
5344 if (LCImpl == RTLIB::Unsupported ||
5346 DAG.getMachineFunction().getName()) {
5349 TLI.forceExpandWideMUL(DAG, dl,
true,
N->getOperand(0),
5350 N->getOperand(1), MulLo, MulHi);
5355 DAG.getSetCC(dl,
N->getValueType(1), MulHi, SRA,
ISD::SETNE);
5356 SplitInteger(MulLo,
Lo,
Hi);
5357 ReplaceValueWith(
SDValue(
N, 1), Overflow);
5361 SDValue Temp = DAG.CreateStackTemporary(PtrVT);
5364 DAG.getStore(DAG.getEntryNode(), dl, DAG.getConstant(0, dl, PtrVT), Temp,
5365 MachinePointerInfo());
5369 EVT ArgVT =
Op.getValueType();
5371 TargetLowering::ArgListEntry
Entry(
Op, ArgTy);
5372 Entry.IsSExt =
true;
5373 Entry.IsZExt =
false;
5374 Args.push_back(Entry);
5378 TargetLowering::ArgListEntry
Entry(
5380 Entry.IsSExt =
true;
5381 Entry.IsZExt =
false;
5382 Args.push_back(Entry);
5384 SDValue Func = DAG.getExternalSymbol(LCImpl, PtrVT);
5386 TargetLowering::CallLoweringInfo CLI(DAG);
5389 .setLibCallee(DAG.getLibcalls().getLibcallImplCallingConv(LCImpl), RetTy,
5390 Func, std::move(Args))
5393 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
5395 SplitInteger(CallInfo.first,
Lo,
Hi);
5397 DAG.getLoad(PtrVT, dl, CallInfo.second, Temp, MachinePointerInfo());
5398 SDValue Ofl = DAG.getSetCC(dl,
N->getValueType(1), Temp2,
5399 DAG.getConstant(0, dl, PtrVT),
5402 ReplaceValueWith(
SDValue(
N, 1), Ofl);
5405void DAGTypeLegalizer::ExpandIntRes_UDIV(
SDNode *
N,
5407 EVT VT =
N->getValueType(0);
5409 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
5419 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
5421 if (isTypeLegal(NVT)) {
5423 GetExpandedInteger(
N->getOperand(0), InL, InH);
5425 if (TLI.expandDIVREMByConstant(
N, Result, NVT, DAG, InL, InH)) {
5434 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported UDIV!");
5436 TargetLowering::MakeLibCallOptions CallOptions;
5437 SplitInteger(TLI.makeLibCall(DAG, LC, VT,
Ops, CallOptions, dl).first,
Lo,
Hi);
5440void DAGTypeLegalizer::ExpandIntRes_UREM(
SDNode *
N,
5442 EVT VT =
N->getValueType(0);
5444 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
5454 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
5456 if (isTypeLegal(NVT)) {
5458 GetExpandedInteger(
N->getOperand(0), InL, InH);
5460 if (TLI.expandDIVREMByConstant(
N, Result, NVT, DAG, InL, InH)) {
5469 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported UREM!");
5471 TargetLowering::MakeLibCallOptions CallOptions;
5472 SplitInteger(TLI.makeLibCall(DAG, LC, VT,
Ops, CallOptions, dl).first,
Lo,
Hi);
5475void DAGTypeLegalizer::ExpandIntRes_ZERO_EXTEND(
SDNode *
N,
5477 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
5480 if (
Op.getValueType().bitsLE(NVT)) {
5483 Hi = DAG.getConstant(0, dl, NVT);
5487 assert(getTypeAction(
Op.getValueType()) ==
5489 "Only know how to promote this result!");
5492 "Operand over promoted?");
5494 SplitInteger(Res,
Lo,
Hi);
5496 Hi = DAG.getZeroExtendInReg(
Hi, dl,
5502void DAGTypeLegalizer::ExpandIntRes_ATOMIC_LOAD(
SDNode *
N,
5506 SDVTList VTs = DAG.getVTList(VT, MVT::i1, MVT::Other);
5508 SDValue Swap = DAG.getAtomicCmpSwap(
5517void DAGTypeLegalizer::ExpandIntRes_VECREDUCE(
SDNode *
N,
5521 SDValue Res = TLI.expandVecReduce(
N, DAG);
5522 SplitInteger(Res,
Lo,
Hi);
5525void DAGTypeLegalizer::ExpandIntRes_Rotate(
SDNode *
N,
5531 N->getOperand(0),
N->getOperand(1));
5532 SplitInteger(Res,
Lo,
Hi);
5539 GetExpandedInteger(
N->getOperand(0), In3, In4);
5540 GetExpandedInteger(
N->getOperand(1), In1, In2);
5544 unsigned Opc =
N->getOpcode();
5547 EVT ShAmtCCVT = getSetCCResultType(ShAmtVT);
5552 DAG.getConstant(HalfVTBits,
DL, ShAmtVT));
5554 DAG.getSetCC(
DL, ShAmtCCVT, AndNode, DAG.getConstant(0,
DL, ShAmtVT),
5558 EVT NewShAmtVT = TLI.getShiftAmountTy(HalfVT, DAG.getDataLayout());
5559 SDValue NewShAmt = DAG.getAnyExtOrTrunc(ShAmt,
DL, NewShAmtVT);
5564 Lo = DAG.getNode(
Opc,
DL, HalfVT, Select2, Select1, NewShAmt);
5565 Hi = DAG.getNode(
Opc,
DL, HalfVT, Select3, Select2, NewShAmt);
5570 SDValue Res = TLI.expandCLMUL(
N, DAG);
5571 return SplitInteger(Res,
Lo,
Hi);
5575 GetExpandedInteger(
N->getOperand(0), LL, LH);
5576 GetExpandedInteger(
N->getOperand(1), RL, RH);
5590 Hi = DAG.getNode(
ISD::XOR,
DL, HalfVT, LoH, HiLoCross);
5595 EVT VT =
N->getValueType(0);
5602 SDValue VScaleBase = DAG.getVScale(dl, HalfVT, One);
5605 SplitInteger(Res,
Lo,
Hi);
5612 "cannot use llvm.read_register with illegal type", Fn,
N->getDebugLoc()));
5613 ReplaceValueWith(
SDValue(
N, 1),
N->getOperand(0));
5615 std::tie(LoVT, HiVT) = DAG.GetSplitDestVTs(
N->getValueType(0));
5616 Lo = DAG.getPOISON(LoVT);
5617 Hi = DAG.getPOISON(HiVT);
5624 EVT VT =
N->getSimpleValueType(0);
5625 EVT IdxVT = TLI.getVectorIdxTy(DAG.getDataLayout());
5627 "VectorIdxTy should be smaller than type to be expanded?");
5631 SplitInteger(Res,
Lo,
Hi);
5642bool DAGTypeLegalizer::ExpandIntegerOperand(
SDNode *
N,
unsigned OpNo) {
5646 if (CustomLowerNode(
N,
N->getOperand(OpNo).getValueType(),
false))
5649 switch (
N->getOpcode()) {
5652 dbgs() <<
"ExpandIntegerOperand Op #" << OpNo <<
": ";
5653 N->dump(&DAG);
dbgs() <<
"\n";
5658 case ISD::BR_CC: Res = ExpandIntOp_BR_CC(
N);
break;
5662 Res = ExpandOp_FAKE_USE(
N);
5668 case ISD::SETCC: Res = ExpandIntOp_SETCC(
N);
break;
5681 case ISD::ROTR: Res = ExpandIntOp_Shift(
N);
break;
5686 case ISD::UCMP: Res = ExpandIntOp_CMP(
N);
break;
5690 Res = ExpandIntOp_STACKMAP(
N, OpNo);
5693 Res = ExpandIntOp_PATCHPOINT(
N, OpNo);
5695 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
5696 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
5697 Res = ExpandIntOp_VP_STRIDED(
N, OpNo);
5700 Res = ExpandIntOp_WRITE_REGISTER(
N, OpNo);
5705 if (!Res.
getNode())
return false;
5713 "Invalid operand expansion");
5715 ReplaceValueWith(
SDValue(
N, 0), Res);
5721void DAGTypeLegalizer::IntegerExpandSetCCOperands(
SDValue &NewLHS,
5725 SDValue LHSLo, LHSHi, RHSLo, RHSHi;
5726 GetExpandedInteger(NewLHS, LHSLo, LHSHi);
5727 GetExpandedInteger(NewRHS, RHSLo, RHSHi);
5740 NewRHS = DAG.getConstant(0, dl, NewLHS.
getValueType());
5747 if ((CCCode ==
ISD::SETLT && CST->isZero()) ||
5748 (CCCode ==
ISD::SETGT && CST->isAllOnes())) {
5778 LoCmp = TLI.SimplifySetCC(getSetCCResultType(LHSLo.
getValueType()), LHSLo,
5779 RHSLo, LowCC,
false, DagCombineInfo, dl);
5781 LoCmp = DAG.getSetCC(dl, getSetCCResultType(LHSLo.
getValueType()), LHSLo,
5784 HiCmp = TLI.SimplifySetCC(getSetCCResultType(LHSHi.
getValueType()), LHSHi,
5785 RHSHi, CCCode,
false, DagCombineInfo, dl);
5789 LHSHi, RHSHi, DAG.getCondCode(CCCode));
5798 if ((EqAllowed && (HiCmpC && HiCmpC->
isZero())) ||
5800 ((HiCmpC && HiCmpC->
isOne()) || (LoCmpC && LoCmpC->
isZero())))) {
5809 if (LHSHi == RHSHi) {
5818 EVT ExpandVT = TLI.getTypeToExpandTo(*DAG.getContext(), HiVT);
5819 bool HasSETCCCARRY = TLI.isOperationLegalOrCustom(
ISD::SETCCCARRY, ExpandVT);
5822 if (HasSETCCCARRY) {
5825 bool FlipOperands =
false;
5842 SDVTList VTList = DAG.getVTList(LoVT, getSetCCResultType(LoVT));
5846 DAG.getCondCode(CCCode));
5852 NewLHS = TLI.SimplifySetCC(getSetCCResultType(HiVT), LHSHi, RHSHi,
ISD::SETEQ,
5853 false, DagCombineInfo, dl);
5856 DAG.getSetCC(dl, getSetCCResultType(HiVT), LHSHi, RHSHi,
ISD::SETEQ);
5857 NewLHS = DAG.getSelect(dl, LoCmp.
getValueType(), NewLHS, LoCmp, HiCmp);
5864 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(
N));
5869 NewRHS = DAG.getConstant(0, SDLoc(
N), NewLHS.
getValueType());
5874 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
5875 DAG.getCondCode(CCCode), NewLHS, NewRHS,
5876 N->getOperand(4)), 0);
5882 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(
N));
5887 NewRHS = DAG.getConstant(0, SDLoc(
N), NewLHS.
getValueType());
5892 return SDValue(DAG.UpdateNodeOperands(
N, NewLHS, NewRHS,
5893 N->getOperand(2),
N->getOperand(3),
5894 DAG.getCondCode(CCCode)), 0);
5900 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(
N));
5905 "Unexpected setcc expansion!");
5911 DAG.UpdateNodeOperands(
N, NewLHS, NewRHS, DAG.getCondCode(CCCode)), 0);
5919 SDLoc dl = SDLoc(
N);
5921 SDValue LHSLo, LHSHi, RHSLo, RHSHi;
5922 GetExpandedInteger(
LHS, LHSLo, LHSHi);
5923 GetExpandedInteger(
RHS, RHSLo, RHSHi);
5936 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
5946 GetExpandedInteger(
N->getOperand(1),
Lo,
Hi);
5947 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
Lo), 0);
5951 return TLI.expandCMP(
N, DAG);
5959 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
5960 return SDValue(DAG.UpdateNodeOperands(
N,
Lo), 0);
5964 bool IsStrict =
N->isStrictFPOpcode();
5968 SDValue Op =
N->getOperand(IsStrict ? 1 : 0);
5969 EVT DstVT =
N->getValueType(0);
5972 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
5973 "Don't know how to expand this XINT_TO_FP!");
5974 TargetLowering::MakeLibCallOptions CallOptions;
5976 std::pair<SDValue, SDValue> Tmp =
5977 TLI.makeLibCall(DAG, LC, DstVT,
Op, CallOptions, SDLoc(
N), Chain);
5982 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
5983 ReplaceValueWith(
SDValue(
N, 0), Tmp.first);
5988 assert(!
N->isAtomic() &&
"Should have been a ATOMIC_STORE?");
5991 return ExpandOp_NormalStore(
N, OpNo);
5994 assert(OpNo == 1 &&
"Can only expand the stored value so far");
5996 EVT VT =
N->getOperand(1).getValueType();
5997 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
6001 AAMDNodes AAInfo =
N->getAAInfo();
6007 if (
N->getMemoryVT().bitsLE(NVT)) {
6008 GetExpandedInteger(
N->getValue(),
Lo,
Hi);
6009 return DAG.getTruncStore(Ch, dl,
Lo, Ptr,
N->getPointerInfo(),
6010 N->getMemoryVT(),
N->getBaseAlign(), MMOFlags,
6014 if (DAG.getDataLayout().isLittleEndian()) {
6016 GetExpandedInteger(
N->getValue(),
Lo,
Hi);
6018 Lo = DAG.getStore(Ch, dl,
Lo, Ptr,
N->getPointerInfo(),
N->getBaseAlign(),
6021 unsigned ExcessBits =
6028 Hi = DAG.getTruncStore(Ch, dl,
Hi, Ptr,
6029 N->getPointerInfo().getWithOffset(IncrementSize),
6030 NEVT,
N->getBaseAlign(), MMOFlags, AAInfo);
6036 GetExpandedInteger(
N->getValue(),
Lo,
Hi);
6038 EVT ExtVT =
N->getMemoryVT();
6041 unsigned ExcessBits = (EBytes - IncrementSize)*8;
6049 DAG.getShiftAmountConstant(NVT.
getSizeInBits() - ExcessBits, NVT, dl));
6053 DAG.getShiftAmountConstant(ExcessBits, NVT, dl)));
6057 Hi = DAG.getTruncStore(Ch, dl,
Hi, Ptr,
N->getPointerInfo(), HiVT,
6058 N->getBaseAlign(), MMOFlags, AAInfo);
6063 Lo = DAG.getTruncStore(Ch, dl,
Lo, Ptr,
6064 N->getPointerInfo().getWithOffset(IncrementSize),
6066 N->getBaseAlign(), MMOFlags, AAInfo);
6072 GetExpandedInteger(
N->getOperand(0), InL, InH);
6081 N->getOperand(0),
N->getOperand(2),
N->getOperand(1),
6086SDValue DAGTypeLegalizer::ExpandIntOp_VP_STRIDED(
SDNode *
N,
unsigned OpNo) {
6087 assert((
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_LOAD && OpNo == 3) ||
6088 (
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_STORE && OpNo == 4));
6092 GetExpandedInteger(NewOps[OpNo], NewOps[OpNo],
Hi);
6094 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
6097SDValue DAGTypeLegalizer::ExpandIntOp_WRITE_REGISTER(
SDNode *
N,
unsigned OpNo) {
6100 "cannot use llvm.write_register with illegal type", Fn,
6103 return N->getOperand(0);
6106SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_SPLICE(
SDNode *
N) {
6109 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6110 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
6113 return DAG.getNode(
N->getOpcode(), dl, OutVT, V0, V1,
N->getOperand(2));
6116SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_INTERLEAVE_DEINTERLEAVE(
SDNode *
N) {
6118 unsigned Factor =
N->getNumOperands();
6121 for (
unsigned i = 0; i != Factor; i++)
6122 Ops[i] = GetPromotedInteger(
N->getOperand(i));
6127 for (
unsigned i = 0; i != Factor; i++)
6133SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_SUBVECTOR(
SDNode *
N) {
6135 EVT OutVT =
N->getValueType(0);
6136 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6137 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6141 SDValue BaseIdx =
N->getOperand(1);
6158 DAG.getConstant(
alignDown(IdxVal, NElts), dl,
6162 DAG.getConstant(IdxVal % NElts, dl, BaseIdx.
getValueType()));
6168 SDValue Ops[] = {GetWidenedVector(InOp0), BaseIdx};
6177 SDValue Ops[] = { GetPromotedInteger(InOp0), BaseIdx };
6181 "Promoted operand has an element type greater than result");
6194 InOp0 = GetPromotedInteger(InOp0);
6201 Ops.reserve(OutNumElems);
6202 for (
unsigned i = 0; i != OutNumElems; ++i) {
6207 N->getOperand(0), Index);
6208 SDValue Op = DAG.getAnyExtOrTrunc(Ext, dl, NOutVTElem);
6213 return DAG.getBuildVector(NOutVT, dl,
Ops);
6216SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_SUBVECTOR(
SDNode *
N) {
6217 EVT OutVT =
N->getValueType(0);
6218 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6219 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6231 Vec = GetPromotedInteger(Vec);
6237SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_REVERSE(
SDNode *
N) {
6240 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6246SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_SHUFFLE(
SDNode *
N) {
6248 EVT VT =
N->getValueType(0);
6253 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6254 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
6257 return DAG.getVectorShuffle(OutVT, dl, V0, V1, NewMask);
6261 EVT OutVT =
N->getValueType(0);
6262 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6263 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6264 unsigned NumElems =
N->getNumOperands();
6271 Ops.reserve(NumElems);
6272 for (
unsigned i = 0; i != NumElems; ++i) {
6274 EVT OpVT =
Op.getValueType();
6279 if (OpVT.
bitsLT(NOutVTElem)) {
6285 ExtOpc = NOutExtOpc;
6286 Op = DAG.getNode(ExtOpc, dl, NOutVTElem,
Op);
6291 return DAG.getBuildVector(NOutVT, dl,
Ops);
6298 assert(!
N->getOperand(0).getValueType().isVector() &&
6299 "Input must be a scalar");
6301 EVT OutVT =
N->getValueType(0);
6302 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6303 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6307 return DAG.getNode(
N->getOpcode(), dl, NOutVT,
Op);
6312 EVT OutVT =
N->getValueType(0);
6313 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6315 "Type must be promoted to a scalable vector type");
6316 const APInt &StepVal =
N->getConstantOperandAPInt(0);
6317 return DAG.getStepVector(dl, NOutVT,
6321SDValue DAGTypeLegalizer::PromoteIntRes_CONCAT_VECTORS(
SDNode *
N) {
6324 EVT OutVT =
N->getValueType(0);
6325 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6326 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6328 unsigned NumOperands =
N->getNumOperands();
6333 SDUse *MaxSizedValue = std::max_element(
6335 EVT AVT = A.getValueType().getVectorElementType();
6336 EVT BVT = B.getValueType().getVectorElementType();
6337 return AVT.getScalarSizeInBits() < BVT.getScalarSizeInBits();
6343 for (
unsigned I = 0;
I < NumOperands; ++
I) {
6345 EVT OpVT =
Op.getValueType();
6347 Op = GetPromotedInteger(
Op);
6350 "Unhandled legalization type");
6354 Op = DAG.getAnyExtOrTrunc(
6362 return DAG.getAnyExtOrTrunc(
6370 unsigned NumElem =
N->getOperand(0).getValueType().getVectorNumElements();
6371 assert(NumElem * NumOperands == NumOutElem &&
6372 "Unexpected number of elements");
6376 for (
unsigned i = 0; i < NumOperands; ++i) {
6379 Op = GetPromotedInteger(
Op);
6380 EVT SclrTy =
Op.getValueType().getVectorElementType();
6381 assert(NumElem ==
Op.getValueType().getVectorNumElements() &&
6382 "Unexpected number of elements");
6384 for (
unsigned j = 0;
j < NumElem; ++
j) {
6386 DAG.getVectorIdxConstant(j, dl));
6387 Ops[i * NumElem +
j] = DAG.getAnyExtOrTrunc(Ext, dl, OutElemTy);
6391 return DAG.getBuildVector(NOutVT, dl,
Ops);
6394SDValue DAGTypeLegalizer::PromoteIntRes_EXTEND_VECTOR_INREG(
SDNode *
N) {
6395 EVT VT =
N->getValueType(0);
6396 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
6397 assert(NVT.
isVector() &&
"This type must be promoted to a vector type");
6405 if (getTypeAction(
N->getOperand(0).getValueType())
6409 switch(
N->getOpcode()) {
6411 Promoted = SExtPromotedInteger(
N->getOperand(0));
6414 Promoted = ZExtPromotedInteger(
N->getOperand(0));
6417 Promoted = GetPromotedInteger(
N->getOperand(0));
6429 DAG.getVectorIdxConstant(0, dl));
6431 return DAG.getNode(
N->getOpcode(), dl, NVT, Promoted);
6435 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
6438SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_FIND_LAST_ACTIVE(
SDNode *
N) {
6439 EVT VT =
N->getValueType(0);
6440 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
6444SDValue DAGTypeLegalizer::PromoteIntRes_GET_ACTIVE_LANE_MASK(
SDNode *
N) {
6445 EVT VT =
N->getValueType(0);
6446 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
6450SDValue DAGTypeLegalizer::PromoteIntRes_PARTIAL_REDUCE_MLA(
SDNode *
N) {
6452 EVT VT =
N->getValueType(0);
6453 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
6454 SDValue ExtAcc = GetPromotedInteger(
N->getOperand(0));
6455 return DAG.getNode(
N->getOpcode(),
DL, NVT, ExtAcc,
N->getOperand(1),
6459SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_VECTOR_ELT(
SDNode *
N) {
6460 EVT OutVT =
N->getValueType(0);
6461 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6462 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6467 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6470 NOutVTElem,
N->getOperand(1));
6472 V0, ConvElem,
N->getOperand(2));
6479 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
6480 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->ops());
6488 SDValue Start = PromoteIntOpVectorReduction(
N,
N->getOperand(0));
6489 return DAG.getNode(
N->getOpcode(),
DL,
Start.getValueType(), Start,
6490 N->getOperand(1),
N->getOperand(2),
N->getOperand(3));
6494 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
6497 assert(
N->getNumValues() == 3 &&
"Expected 3 values for PATCHPOINT");
6498 SDVTList VTList = DAG.getVTList({NVT, MVT::Other, MVT::Glue});
6506 DAG.ReplaceAllUsesOfValuesWith(From, To, 2);
6511SDValue DAGTypeLegalizer::PromoteIntRes_READ_REGISTER(
SDNode *
N) {
6514 "cannot use llvm.read_register with illegal type", Fn,
N->getDebugLoc()));
6516 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
6517 ReplaceValueWith(
SDValue(
N, 1),
N->getOperand(0));
6518 return DAG.getPOISON(NVT);
6521SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_VECTOR_ELT(
SDNode *
N) {
6523 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6524 SDValue V1 = DAG.getZExtOrTrunc(
N->getOperand(1), dl,
6525 TLI.getVectorIdxTy(DAG.getDataLayout()));
6532 return DAG.getAnyExtOrTrunc(Ext, dl,
N->getValueType(0));
6535SDValue DAGTypeLegalizer::PromoteIntOp_INSERT_SUBVECTOR(
SDNode *
N) {
6540 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
6545 V0 = DAG.getAnyExtOrTrunc(V0, dl, PromVT);
6547 return DAG.getAnyExtOrTrunc(Ext, dl,
N->getValueType(0));
6559 TLI.getTypeToTransformTo(*DAG.getContext(), InVT1), V1);
6560 return DAG.getNode(
N->getOpcode(), dl,
N->getValueType(0), V0, VPromoted);
6563SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_SUBVECTOR(
SDNode *
N) {
6565 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6573SDValue DAGTypeLegalizer::PromoteIntOp_CONCAT_VECTORS(
SDNode *
N) {
6576 EVT ResVT =
N->getValueType(0);
6577 unsigned NumElems =
N->getNumOperands();
6580 SDValue ResVec = DAG.getUNDEF(ResVT);
6584 unsigned OpNumElts =
Op.getValueType().getVectorMinNumElements();
6586 DAG.getIntPtrConstant(
OpIdx * OpNumElts, dl));
6598 for (
unsigned VecIdx = 0; VecIdx != NumElems; ++VecIdx) {
6599 SDValue Incoming = GetPromotedInteger(
N->getOperand(VecIdx));
6603 for (
unsigned i=0; i<NumElem; ++i) {
6606 DAG.getVectorIdxConstant(i, dl));
6612 return DAG.getBuildVector(
N->getValueType(0), dl, NewOps);
6615SDValue DAGTypeLegalizer::ExpandIntOp_STACKMAP(
SDNode *
N,
unsigned OpNo) {
6628 for (
unsigned I = 0;
I < OpNo;
I++)
6631 EVT Ty =
Op.getValueType();
6632 SDLoc
DL = SDLoc(
N);
6635 DAG.getTargetConstant(StackMaps::ConstantOp,
DL, MVT::i64));
6643 for (
unsigned I = OpNo + 1;
I <
N->getNumOperands();
I++)
6648 for (
unsigned ResNum = 0; ResNum <
N->getNumValues(); ResNum++)
6654SDValue DAGTypeLegalizer::ExpandIntOp_PATCHPOINT(
SDNode *
N,
unsigned OpNo) {
6667 for (
unsigned I = 0;
I < OpNo;
I++)
6670 EVT Ty =
Op.getValueType();
6671 SDLoc
DL = SDLoc(
N);
6674 DAG.getTargetConstant(StackMaps::ConstantOp,
DL, MVT::i64));
6682 for (
unsigned I = OpNo + 1;
I <
N->getNumOperands();
I++)
6687 for (
unsigned ResNum = 0; ResNum <
N->getNumValues(); ResNum++)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static SDValue SaturateWidenedDIVFIX(SDValue V, SDLoc &dl, unsigned SatW, bool Signed, const TargetLowering &TLI, SelectionDAG &DAG)
static SDValue fpExtendHelper(SDValue Op, SDValue &Chain, bool IsStrict, EVT VT, SDLoc DL, SelectionDAG &DAG)
static SDValue earlyExpandDIVFIX(SDNode *N, SDValue LHS, SDValue RHS, unsigned Scale, const TargetLowering &TLI, SelectionDAG &DAG, unsigned SatW=0)
static unsigned getExtendForIntVecReduction(SDNode *N)
static std::pair< ISD::CondCode, ISD::NodeType > getExpandedMinMaxOps(int Op)
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
MachineInstr unsigned OpIdx
const SmallVectorImpl< MachineOperand > & Cond
static Type * getValueType(Value *V, bool LookThroughCmp=false)
Returns the "element type" of the given value/instruction V.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
This file describes how to lower LLVM code to machine code.
Class for arbitrary precision integers.
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
unsigned getActiveBits() const
Compute the number of active bits in the value.
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
unsigned countLeadingOnes() const
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
bool intersects(const APInt &RHS) const
This operation tests if there are any pairs of corresponding bits between this APInt and RHS that are...
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
unsigned countTrailingZeros() const
unsigned countLeadingZeros() const
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
unsigned countTrailingOnes() const
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
This is an SDNode representing atomic operations.
const APInt & getValue() const
Return the constant as an APInt value reference.
const ConstantInt * getConstantIntValue() const
uint64_t getZExtValue() const
@ NewNode
This is a new node, not before seen, that was created in the process of legalizing some other node.
const Function & getFunction() const
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
This class is used to represent ISD::LOAD nodes.
unsigned getVectorNumElements() const
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
static MVT getVectorVT(MVT VT, unsigned NumElements)
MVT getVectorElementType() const
Flags
Flags values. These may be or'd together.
This class is used to represent an MGATHER node.
This class is used to represent an MLOAD node.
This class is used to represent an MSCATTER node.
This class is used to represent an MSTORE node.
MachineMemOperand * getMemOperand() const
Return the unique MachineMemOperand object describing the memory reference performed by operation.
EVT getMemoryVT() const
Return the type of the in-memory value.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
bool isStrictFPOpcode()
Test if this node is a strict floating point pseudo-op.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
SDNodeFlags getFlags() const
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
const SDValue & getOperand(unsigned Num) const
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
EVT getValueType() const
Convenience function for get().getValueType().
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
uint64_t getScalarValueSizeInBits() const
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
SDValue getExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT, unsigned Opcode)
Convert Op, which must be of integer type, to the integer type VT, by either any/sign/zero-extending ...
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVMContext * getContext() const
ArrayRef< int > getMask() const
void reserve(size_type N)
void push_back(const T &Elt)
This class is used to represent ISD::STORE nodes.
LegalizeAction
This enum indicates whether operations are valid for a target, and if not, what action should be used...
ShiftLegalizationStrategy
Return the preferred strategy to legalize tihs SHIFT instruction, with ExpansionFactor being the recu...
@ TypeScalarizeScalableVector
BooleanContent
Enum that describes how the target represents true/false values.
@ ZeroOrOneBooleanContent
@ UndefinedBooleanContent
@ ZeroOrNegativeOneBooleanContent
std::vector< ArgListEntry > ArgListTy
static ISD::NodeType getExtendForContent(BooleanContent Content)
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
SDValue expandFixedPointDiv(unsigned Opcode, const SDLoc &dl, SDValue LHS, SDValue RHS, unsigned Scale, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US]DIVFIX[SAT].
static constexpr TypeSize getFixed(ScalarTy ExactSize)
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
This class is used to represent a VP_LOAD node.
This class is used to represent a VP_STORE node.
constexpr bool hasKnownScalarFactor(const FixedOrScalableQuantity &RHS) const
Returns true if there exists a value X where RHS.multiplyCoefficientBy(X) will result in a value whos...
constexpr ScalarTy getKnownScalarFactor(const FixedOrScalableQuantity &RHS) const
Returns a value X where RHS.multiplyCoefficientBy(X) will result in a value whose quantity matches ou...
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
constexpr LeafTy divideCoefficientBy(ScalarTy RHS) const
We do not provide the '/' operator here because division for polynomial types does not work in the sa...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
bool isNON_EXTLoad(const SDNode *N)
Returns true if the specified node is a non-extending load.
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
@ POISON
POISON - A poison node.
@ PARTIAL_REDUCE_SMLA
PARTIAL_REDUCE_[U|S]MLA(Accumulator, Input1, Input2) The partial reduction nodes sign or zero extend ...
@ LOOP_DEPENDENCE_RAW_MASK
@ COND_LOOP
COND_LOOP is a conditional branch to self, used for implementing efficient conditional traps.
@ MLOAD
Masked load and store - consecutive vector load and store operations with additional mask operand tha...
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
@ BSWAP
Byte Swap and Counting operators.
@ SMULFIX
RESULT = [US]MULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication on 2 integers with the same...
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
@ ADD
Simple integer binary arithmetic operators.
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ SMULFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
@ CTTZ_ELTS
Returns the number of number of trailing (least significant) zero elements in a vector.
@ VECTOR_FIND_LAST_ACTIVE
Finds the index of the last active mask element Operands: Mask.
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
@ SDIVREM
SDIVREM/UDIVREM - Divide two integers and produce both a quotient and remainder result.
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
@ FAKE_USE
FAKE_USE represents a use of the operand but does not do anything.
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
@ CLMUL
Carry-less multiplication operations.
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ SDIVFIX
RESULT = [US]DIVFIX(LHS, RHS, SCALE) - Perform fixed point division on 2 integers with the same width...
@ CONVERT_FROM_ARBITRARY_FP
CONVERT_FROM_ARBITRARY_FP - This operator converts from an arbitrary floating-point represented as an...
@ SET_ROUNDING
Set rounding mode.
@ SIGN_EXTEND
Conversion operators.
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
@ READSTEADYCOUNTER
READSTEADYCOUNTER - This corresponds to the readfixedcounter intrinsic.
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
@ SETCCCARRY
Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, but op #2 is a boolean indicating ...
@ BR_CC
BR_CC - Conditional branch.
@ SSUBO
Same for subtraction.
@ VECTOR_INTERLEAVE
VECTOR_INTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor to...
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
@ UNDEF
UNDEF - An undefined node.
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ CTLS
Count leading redundant sign bits.
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ GET_ROUNDING
Returns current rounding mode: -1 Undefined 0 Round to 0 1 Round to nearest, ties to even 2 Round to ...
@ SHL
Shift and rotation operations.
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
@ READ_REGISTER
READ_REGISTER, WRITE_REGISTER - This node represents llvm.register on the DAG, which implements the n...
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
@ PATCHPOINT
The llvm.experimental.patchpoint.
@ SMULO
Same for multiplication.
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
@ MASKED_UDIV
Masked vector arithmetic that returns poison on disabled lanes.
@ VECTOR_REVERSE
VECTOR_REVERSE(VECTOR) - Returns a vector, of the same type as VECTOR, whose elements are shuffled us...
@ SDIVFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
@ STRICT_SINT_TO_FP
STRICT_[US]INT_TO_FP - Convert a signed or unsigned integer to a floating point value.
@ MGATHER
Masked gather and scatter - load and store operations for a vector of random addresses with additiona...
@ BF16_TO_FP
BF16_TO_FP, FP_TO_BF16 - These operators are used to perform promotions and truncation for bfloat16.
@ FRAMEADDR
FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and llvm.returnaddress on the DAG.
@ STRICT_FP_TO_SINT
STRICT_FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
@ READCYCLECOUNTER
READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic.
@ STRICT_FP_EXTEND
X = STRICT_FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
@ AND
Bitwise operators - logical and, logical or, logical xor.
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
@ STACKMAP
The llvm.experimental.stackmap intrinsic.
@ SPLAT_VECTOR_PARTS
SPLAT_VECTOR_PARTS(SCALAR1, SCALAR2, ...) - Returns a vector with the scalar values joined together a...
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
@ EXPERIMENTAL_VECTOR_HISTOGRAM
Experimental vector histogram intrinsic Operands: Input Chain, Inc, Mask, Base, Index,...
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
@ VAARG
VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, and the alignment.
@ BRCOND
BRCOND - Conditional branch.
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
@ VECTOR_DEINTERLEAVE
VECTOR_DEINTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor ...
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
@ SADDO_CARRY
Carry-using overflow-aware nodes for multiple precision addition and subtraction.
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
@ LOOP_DEPENDENCE_WAR_MASK
The llvm.loop.dependence.
bool isNormalStore(const SDNode *N)
Returns true if the specified node is a non-truncating and unindexed store.
bool isTrueWhenEqual(CondCode Cond)
Return true if the specified condition returns true if the two operands to the condition are equal.
bool isUNINDEXEDLoad(const SDNode *N)
Returns true if the specified node is an unindexed load.
bool isSignedIntSetCC(CondCode Code)
Return true if this is a setcc instruction that performs a signed comparison when used with integer o...
bool isUNINDEXEDStore(const SDNode *N)
Returns true if the specified node is an unindexed store.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
bool isUnsignedIntSetCC(CondCode Code)
Return true if this is a setcc instruction that performs an unsigned comparison when used with intege...
bool isNormalLoad(const SDNode *N)
Returns true if the specified node is a non-extending and unindexed load.
bool isIntEqualitySetCC(CondCode Code)
Return true if this is a setcc instruction that performs an equality comparison when used with intege...
LLVM_ABI Libcall getPOWI(EVT RetVT)
getPOWI - Return the POWI_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getSINTTOFP(EVT OpVT, EVT RetVT)
getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getUREM(EVT VT)
LLVM_ABI Libcall getSHL(EVT VT)
LLVM_ABI Libcall getSYNC(unsigned Opc, MVT VT)
Return the SYNC_FETCH_AND_* value for the given opcode and type, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getLDEXP(EVT RetVT)
getLDEXP - Return the LDEXP_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getUINTTOFP(EVT OpVT, EVT RetVT)
getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getSDIV(EVT VT)
LLVM_ABI Libcall getSRL(EVT VT)
LLVM_ABI Libcall getSRA(EVT VT)
LLVM_ABI Libcall getUDIV(EVT VT)
LLVM_ABI Libcall getFPTOUINT(EVT OpVT, EVT RetVT)
getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getLLROUND(EVT VT)
LLVM_ABI Libcall getLROUND(EVT VT)
LLVM_ABI Libcall getFPTOSINT(EVT OpVT, EVT RetVT)
getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getLRINT(EVT RetVT)
LLVM_ABI Libcall getOUTLINE_ATOMIC(unsigned Opc, AtomicOrdering Order, MVT VT)
Return the outline atomics value for the given opcode, atomic ordering and type, or UNKNOWN_LIBCALL i...
LLVM_ABI Libcall getLLRINT(EVT RetVT)
LLVM_ABI Libcall getSREM(EVT VT)
LLVM_ABI Libcall getMUL(EVT VT)
LLVM_ABI Libcall getCTPOP(EVT VT)
LLVM_ABI Libcall getMULO(EVT VT)
NodeAddr< NodeBase * > Node
NodeAddr< FuncNode * > Func
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
constexpr T alignDown(U Value, V Align, W Skew=0)
Returns the largest unsigned integer less than or equal to Value and is Skew mod Align.
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
@ Success
The lock was released successfully.
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ Or
Bitwise or logical OR of integers.
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
LLVM_ABI bool isAllOnesConstant(SDValue V)
Returns true if V is an integer constant with all bits set.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
ElementCount getVectorElementCount() const
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
bool isByteSized() const
Return true if the bit size is a multiple of 8.
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
uint64_t getScalarSizeInBits() const
TypeSize getStoreSizeInBits() const
Return the number of bits overwritten by a store of the specified value type.
EVT changeVectorElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element type...
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
bool isVector() const
Return true if this is a vector value type.
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
bool bitsEq(EVT VT) const
Return true if this has the same number of bits as VT.
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
EVT getVectorElementType() const
Given a vector type, return the type of each element.
EVT changeElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a type whose attributes match ourselves with the exception of the element type that i...
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
bool bitsLE(EVT VT) const
Return true if this has no more bits than VT.
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
static LLVM_ABI MachinePointerInfo getUnknownStack(MachineFunction &MF)
Stack memory without other information.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl)
Get the libcall routine name for the specified libcall implementation.
MakeLibCallOptions & setTypeListBeforeSoften(ArrayRef< EVT > OpsVT, EVT RetVT)
MakeLibCallOptions & setIsSigned(bool Value=true)