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";
62 case ISD::BITCAST: Res = PromoteIntRes_BITCAST(
N);
break;
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;
75 case ISD::CTPOP: Res = PromoteIntRes_CTPOP_PARITY(
N);
break;
76 case ISD::VP_CTTZ_ZERO_UNDEF:
79 case ISD::CTTZ: Res = PromoteIntRes_CTTZ(
N);
break;
80 case ISD::VP_CTTZ_ELTS_ZERO_UNDEF:
81 case ISD::VP_CTTZ_ELTS:
82 Res = PromoteIntRes_VP_CttzElements(
N);
85 Res = PromoteIntRes_EXTRACT_VECTOR_ELT(
N);
break;
95 Res = PromoteIntRes_VECTOR_COMPRESS(
N);
101 Res = PromoteIntRes_Select(
N);
106 case ISD::SETCC: Res = PromoteIntRes_SETCC(
N);
break;
108 case ISD::SMAX: Res = PromoteIntRes_SExtIntBinOp(
N);
break;
110 case ISD::UMAX: Res = PromoteIntRes_UMINUMAX(
N);
break;
113 case ISD::VP_SHL: Res = PromoteIntRes_SHL(
N);
break;
115 Res = PromoteIntRes_SIGN_EXTEND_INREG(
N);
break;
117 case ISD::VP_SRA: Res = PromoteIntRes_SRA(
N);
break;
119 case ISD::VP_SRL: Res = PromoteIntRes_SRL(
N);
break;
120 case ISD::VP_TRUNCATE:
123 case ISD::UNDEF: Res = PromoteIntRes_UNDEF(
N);
break;
124 case ISD::VAARG: Res = PromoteIntRes_VAARG(
N);
break;
125 case ISD::VSCALE: Res = PromoteIntRes_VSCALE(
N);
break;
128 Res = PromoteIntRes_EXTRACT_SUBVECTOR(
N);
break;
130 Res = PromoteIntRes_INSERT_SUBVECTOR(
N);
break;
132 Res = PromoteIntRes_VECTOR_REVERSE(
N);
break;
134 Res = PromoteIntRes_VECTOR_SHUFFLE(
N);
break;
136 Res = PromoteIntRes_VECTOR_SPLICE(
N);
break;
139 Res = PromoteIntRes_VECTOR_INTERLEAVE_DEINTERLEAVE(
N);
142 Res = PromoteIntRes_INSERT_VECTOR_ELT(
N);
break;
144 Res = PromoteIntRes_BUILD_VECTOR(
N);
148 case ISD::EXPERIMENTAL_VP_SPLAT:
149 Res = PromoteIntRes_ScalarOp(
N);
153 Res = PromoteIntRes_CONCAT_VECTORS(
N);
break;
158 Res = PromoteIntRes_EXTEND_VECTOR_INREG(
N);
break;
160 case ISD::VECTOR_FIND_LAST_ACTIVE:
161 Res = PromoteIntRes_VECTOR_FIND_LAST_ACTIVE(
N);
164 case ISD::GET_ACTIVE_LANE_MASK:
165 Res = PromoteIntRes_GET_ACTIVE_LANE_MASK(
N);
168 case ISD::PARTIAL_REDUCE_UMLA:
169 case ISD::PARTIAL_REDUCE_SMLA:
170 case ISD::PARTIAL_REDUCE_SUMLA:
171 Res = PromoteIntRes_PARTIAL_REDUCE_MLA(
N);
175 case ISD::VP_SIGN_EXTEND:
177 case ISD::VP_ZERO_EXTEND:
180 case ISD::VP_FP_TO_SINT:
181 case ISD::VP_FP_TO_UINT:
189 Res = PromoteIntRes_FP_TO_XINT_SAT(
N);
break;
191 case ISD::FP_TO_BF16:
192 case ISD::FP_TO_FP16:
193 Res = PromoteIntRes_FP_TO_FP16_BF16(
N);
195 case ISD::STRICT_FP_TO_BF16:
196 case ISD::STRICT_FP_TO_FP16:
197 Res = PromoteIntRes_STRICT_FP_TO_FP16_BF16(
N);
212 case ISD::VP_MUL: Res = PromoteIntRes_SimpleIntBinOp(
N);
break;
222 case ISD::VP_SREM: Res = PromoteIntRes_SExtIntBinOp(
N);
break;
232 case ISD::VP_UREM: Res = PromoteIntRes_ZExtIntBinOp(
N);
break;
235 case ISD::SSUBO: Res = PromoteIntRes_SADDSUBO(
N, ResNo);
break;
237 case ISD::USUBO: Res = PromoteIntRes_UADDSUBO(
N, ResNo);
break;
239 case ISD::UMULO: Res = PromoteIntRes_XMULO(
N, ResNo);
break;
255 Res = PromoteIntRes_ADDSUBSHLSAT<EmptyMatchContext>(
N);
257 case ISD::VP_SADDSAT:
258 case ISD::VP_UADDSAT:
259 case ISD::VP_SSUBSAT:
260 case ISD::VP_USUBSAT:
261 Res = PromoteIntRes_ADDSUBSHLSAT<VPMatchContext>(
N);
266 Res = PromoteIntRes_CMP(
N);
279 case ISD::ABS: Res = PromoteIntRes_ABS(
N);
break;
281 case ISD::ATOMIC_LOAD:
284 case ISD::ATOMIC_LOAD_ADD:
285 case ISD::ATOMIC_LOAD_SUB:
286 case ISD::ATOMIC_LOAD_AND:
287 case ISD::ATOMIC_LOAD_CLR:
288 case ISD::ATOMIC_LOAD_OR:
289 case ISD::ATOMIC_LOAD_XOR:
290 case ISD::ATOMIC_LOAD_NAND:
291 case ISD::ATOMIC_LOAD_MIN:
292 case ISD::ATOMIC_LOAD_MAX:
293 case ISD::ATOMIC_LOAD_UMIN:
294 case ISD::ATOMIC_LOAD_UMAX:
295 case ISD::ATOMIC_SWAP:
298 case ISD::ATOMIC_CMP_SWAP:
299 case ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS:
303 case ISD::VECREDUCE_ADD:
304 case ISD::VECREDUCE_MUL:
305 case ISD::VECREDUCE_AND:
306 case ISD::VECREDUCE_OR:
307 case ISD::VECREDUCE_XOR:
308 case ISD::VECREDUCE_SMAX:
309 case ISD::VECREDUCE_SMIN:
310 case ISD::VECREDUCE_UMAX:
311 case ISD::VECREDUCE_UMIN:
312 Res = PromoteIntRes_VECREDUCE(
N);
315 case ISD::VP_REDUCE_ADD:
316 case ISD::VP_REDUCE_MUL:
317 case ISD::VP_REDUCE_AND:
318 case ISD::VP_REDUCE_OR:
319 case ISD::VP_REDUCE_XOR:
320 case ISD::VP_REDUCE_SMAX:
321 case ISD::VP_REDUCE_SMIN:
322 case ISD::VP_REDUCE_UMAX:
323 case ISD::VP_REDUCE_UMIN:
324 Res = PromoteIntRes_VP_REDUCE(
N);
329 Res = PromoteIntRes_LOOP_DEPENDENCE_MASK(
N);
333 Res = PromoteIntRes_FREEZE(
N);
338 Res = PromoteIntRes_Rotate(
N);
343 Res = PromoteIntRes_FunnelShift(
N);
348 Res = PromoteIntRes_VPFunnelShift(
N);
352 Res = PromoteIntRes_IS_FPCLASS(
N);
355 Res = PromoteIntRes_FFREXP(
N);
360 Res = PromoteIntRes_XRINT(
N);
363 case ISD::PATCHPOINT:
364 Res = PromoteIntRes_PATCHPOINT(
N);
367 Res = PromoteIntRes_READ_REGISTER(
N);
373 SetPromotedInteger(
SDValue(
N, ResNo), Res);
378 SDValue Op = DisintegrateMERGE_VALUES(
N, ResNo);
379 return GetPromotedInteger(
Op);
382SDValue DAGTypeLegalizer::PromoteIntRes_LOOP_DEPENDENCE_MASK(
SDNode *
N) {
384 EVT NewVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
385 return DAG.getNode(
N->getOpcode(), SDLoc(
N), NewVT,
N->ops());
390 SDValue Op = SExtPromotedInteger(
N->getOperand(0));
392 Op.getValueType(),
Op,
N->getOperand(1));
397 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
399 Op.getValueType(),
Op,
N->getOperand(1));
403 EVT ResVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
406 switch (TLI.getExtendForAtomicOps()) {
422 DAG.getAtomicLoad(ExtType, SDLoc(
N),
N->getMemoryVT(), ResVT,
423 N->getChain(),
N->getBasePtr(),
N->getMemOperand());
432 SDValue Op2 = GetPromotedInteger(
N->getOperand(2));
433 SDValue Res = DAG.getAtomic(
N->getOpcode(), SDLoc(
N),
435 N->getChain(),
N->getBasePtr(),
436 Op2,
N->getMemOperand());
446 assert(
N->getOpcode() == ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS);
447 EVT SVT = getSetCCResultType(
N->getOperand(2).getValueType());
448 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(1));
452 if (!TLI.isTypeLegal(SVT))
455 SDVTList VTs = DAG.getVTList(
N->getValueType(0), SVT, MVT::Other);
456 SDValue Res = DAG.getAtomicCmpSwap(
457 ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS, SDLoc(
N),
N->getMemoryVT(), VTs,
458 N->getChain(),
N->getBasePtr(),
N->getOperand(2),
N->getOperand(3),
462 return DAG.getSExtOrTrunc(Res.
getValue(1), SDLoc(
N), NVT);
468 SDValue Op3 = GetPromotedInteger(
N->getOperand(3));
469 switch (TLI.getExtendForAtomicCmpSwapArg()) {
471 Op2 = SExtPromotedInteger(Op2);
474 Op2 = ZExtPromotedInteger(Op2);
477 Op2 = GetPromotedInteger(Op2);
484 DAG.getVTList(Op2.
getValueType(),
N->getValueType(1), MVT::Other);
485 SDValue Res = DAG.getAtomicCmpSwap(
486 N->getOpcode(), SDLoc(
N),
N->getMemoryVT(), VTs,
N->getChain(),
487 N->getBasePtr(), Op2, Op3,
N->getMemOperand());
489 for (
unsigned i = 1, NumResults =
N->getNumValues(); i < NumResults; ++i)
497 EVT NInVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT);
498 EVT OutVT =
N->getValueType(0);
499 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
502 switch (getTypeAction(InVT)) {
508 return DAG.getNode(ISD::BITCAST, dl, NOutVT, GetPromotedInteger(InOp));
512 return DAG.getNode(
ISD::ANY_EXTEND, dl, NOutVT, GetSoftenedFloat(InOp));
515 return DAG.getNode(
ISD::ANY_EXTEND, dl, NOutVT, GetSoftPromotedHalf(InOp));
519 return DAG.getNode(ISD::FP_TO_FP16, dl, NOutVT, GetPromotedFloat(InOp));
529 BitConvertToInteger(GetScalarizedVector(InOp)));
538 GetSplitVector(
N->getOperand(0),
Lo,
Hi);
539 Lo = BitConvertToInteger(
Lo);
540 Hi = BitConvertToInteger(
Hi);
542 if (DAG.getDataLayout().isBigEndian())
548 JoinIntegers(
Lo,
Hi));
549 return DAG.getNode(ISD::BITCAST, dl, NOutVT, InOp);
559 DAG.
getNode(ISD::BITCAST, dl, NOutVT, GetWidenedVector(InOp));
563 if (DAG.getDataLayout().isBigEndian()) {
567 DAG.getShiftAmountConstant(ShiftAmt, NOutVT, dl));
582 if (isTypeLegal(WideOutVT)) {
583 InOp = DAG.getBitcast(WideOutVT, GetWidenedVector(InOp));
585 DAG.getVectorIdxConstant(0, dl));
594 DAG.getDataLayout().isLittleEndian()) {
605 if (isTypeLegal(WideVecVT)) {
607 DAG.getUNDEF(WideVecVT), InOp,
608 DAG.getVectorIdxConstant(0, dl));
610 return DAG.getNode(ISD::BITCAST, dl, NOutVT, Inserted);
616 CreateStackStoreLoad(InOp, OutVT));
620 SDValue V = GetPromotedInteger(
N->getOperand(0));
622 V.getValueType(), V);
626 SDValue Op = GetPromotedInteger(
N->getOperand(0));
627 EVT OVT =
N->getValueType(0);
628 EVT NVT =
Op.getValueType();
636 !TLI.isOperationLegalOrCustomOrPromote(
ISD::BSWAP, NVT)) {
637 if (
SDValue Res = TLI.expandBSWAP(
N, DAG))
642 SDValue ShAmt = DAG.getShiftAmountConstant(DiffBits, NVT, dl);
648 return DAG.getNode(ISD::VP_SRL, dl, NVT,
649 DAG.getNode(ISD::VP_BSWAP, dl, NVT,
Op, Mask, EVL), ShAmt,
654 SDValue Op = GetPromotedInteger(
N->getOperand(0));
655 EVT OVT =
N->getValueType(0);
656 EVT NVT =
Op.getValueType();
665 if (
SDValue Res = TLI.expandBITREVERSE(
N, DAG))
670 SDValue ShAmt = DAG.getShiftAmountConstant(DiffBits, NVT, dl);
676 return DAG.
getNode(ISD::VP_SRL, dl, NVT,
677 DAG.getNode(ISD::VP_BITREVERSE, dl, NVT,
Op, Mask, EVL),
685 TLI.getTypeToTransformTo(*DAG.getContext(),
686 N->getValueType(0)), JoinIntegers(
N->getOperand(0),
691 EVT VT =
N->getValueType(0);
698 TLI.getTypeToTransformTo(*DAG.getContext(), VT),
705 EVT OVT =
N->getValueType(0);
706 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
712 if (!OVT.
isVector() && TLI.isTypeLegal(NVT) &&
713 !TLI.isOperationLegalOrCustomOrPromote(
ISD::CTLZ, NVT) &&
715 if (
SDValue Result = TLI.expandCTLZ(
N, DAG)) {
721 unsigned CtlzOpcode =
N->getOpcode();
722 if (CtlzOpcode ==
ISD::CTLZ || CtlzOpcode == ISD::VP_CTLZ) {
724 SDValue ExtractLeadingBits = DAG.getConstant(
727 if (!
N->isVPOpcode()) {
729 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
730 return DAG.getNode(
ISD::SUB, dl, NVT,
731 DAG.getNode(
N->getOpcode(), dl, NVT,
Op),
737 SDValue Op = VPZExtPromotedInteger(
N->getOperand(0), Mask, EVL);
738 return DAG.getNode(ISD::VP_SUB, dl, NVT,
739 DAG.getNode(
N->getOpcode(), dl, NVT,
Op, Mask, EVL),
740 ExtractLeadingBits, Mask, EVL);
743 CtlzOpcode == ISD::VP_CTLZ_ZERO_UNDEF) {
745 SDValue Op = GetPromotedInteger(
N->getOperand(0));
749 DAG.getShiftAmountConstant(SHLAmount,
Op.getValueType(), dl);
750 if (!
N->isVPOpcode()) {
752 return DAG.getNode(CtlzOpcode, dl, NVT,
Op);
757 Op = DAG.getNode(ISD::VP_SHL, dl, NVT,
Op, ShiftConst, Mask, EVL);
758 return DAG.getNode(CtlzOpcode, dl, NVT,
Op, Mask, EVL);
764 EVT OVT =
N->getValueType(0);
765 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
773 !TLI.isOperationLegalOrCustomOrPromote(
ISD::CTPOP, NVT)) {
774 if (
SDValue Result = TLI.expandCTPOP(
N, DAG)) {
781 if (!
N->isVPOpcode()) {
782 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
783 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
Op.getValueType(),
Op);
788 SDValue Op = VPZExtPromotedInteger(
N->getOperand(0), Mask, EVL);
789 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
Op.getValueType(),
Op, Mask,
794 SDValue Op = GetPromotedInteger(
N->getOperand(0));
795 EVT OVT =
N->getValueType(0);
796 EVT NVT =
Op.getValueType();
803 if (!OVT.
isVector() && TLI.isTypeLegal(NVT) &&
804 !TLI.isOperationLegalOrCustomOrPromote(
ISD::CTTZ, NVT) &&
808 if (
SDValue Result = TLI.expandCTTZ(
N, DAG)) {
814 unsigned NewOpc =
N->getOpcode();
815 if (NewOpc ==
ISD::CTTZ || NewOpc == ISD::VP_CTTZ) {
822 Op = DAG.getNode(
ISD::OR, dl, NVT,
Op, DAG.getConstant(TopBit, dl, NVT));
826 DAG.getNode(ISD::VP_OR, dl, NVT,
Op, DAG.getConstant(TopBit, dl, NVT),
827 N->getOperand(1),
N->getOperand(2));
828 NewOpc = ISD::VP_CTTZ_ZERO_UNDEF;
831 if (!
N->isVPOpcode())
832 return DAG.getNode(NewOpc, dl, NVT,
Op);
833 return DAG.getNode(NewOpc, dl, NVT,
Op,
N->getOperand(1),
N->getOperand(2));
836SDValue DAGTypeLegalizer::PromoteIntRes_VP_CttzElements(
SDNode *
N) {
838 EVT NewVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
839 return DAG.getNode(
N->getOpcode(),
DL, NewVT,
N->ops());
842SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_VECTOR_ELT(
SDNode *
N) {
844 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
851 if (TLI.getTypeAction(*DAG.getContext(), Op0.
getValueType())
857 EVT SVT =
In.getValueType().getScalarType();
860 return DAG.getAnyExtOrTrunc(Ext, dl, NVT);
868 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
870 TLI.getPreferredFPToIntOpcode(
N->getOpcode(),
N->getValueType(0), NVT);
874 if (
N->isStrictFPOpcode()) {
875 Res = DAG.
getNode(NewOpc, dl, {NVT, MVT::Other},
876 {
N->getOperand(0),
N->getOperand(1)});
880 }
else if (NewOpc == ISD::VP_FP_TO_SINT || NewOpc == ISD::VP_FP_TO_UINT) {
881 Res = DAG.
getNode(NewOpc, dl, NVT, {
N->getOperand(0),
N->getOperand(1),
884 Res = DAG.
getNode(NewOpc, dl, NVT,
N->getOperand(0));
896 N->getOpcode() == ISD::VP_FP_TO_UINT)
900 DAG.getValueType(
N->getValueType(0).getScalarType()));
903SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_XINT_SAT(
SDNode *
N) {
905 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
907 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0),
911SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_FP16_BF16(
SDNode *
N) {
912 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
915 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
918SDValue DAGTypeLegalizer::PromoteIntRes_STRICT_FP_TO_FP16_BF16(
SDNode *
N) {
919 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
922 SDValue Res = DAG.
getNode(
N->getOpcode(), dl, DAG.getVTList(NVT, MVT::Other),
923 N->getOperand(0),
N->getOperand(1));
929 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
931 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
935 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
939 DAG.
getNode(
N->getOpcode(), dl, {NVT, MVT::Other},
N->getOperand(0));
948 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
951 if (getTypeAction(
N->getOperand(0).getValueType())
953 SDValue Res = GetPromotedInteger(
N->getOperand(0));
962 DAG.getValueType(
N->getOperand(0).getValueType()));
964 return DAG.getZeroExtendInReg(Res, dl,
N->getOperand(0).getValueType());
971 if (
N->getNumOperands() != 1) {
972 assert(
N->getNumOperands() == 3 &&
"Unexpected number of operands!");
973 assert(
N->isVPOpcode() &&
"Expected VP opcode");
974 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0),
975 N->getOperand(1),
N->getOperand(2));
977 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
982 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
986 SDValue Res = DAG.getExtLoad(ExtType, dl, NVT,
N->getChain(),
N->getBasePtr(),
987 N->getMemoryVT(),
N->getMemOperand());
996 assert(!
N->isIndexed() &&
"Indexed vp_load during type legalization!");
997 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1000 :
N->getExtensionType();
1003 DAG.getExtLoadVP(ExtType, dl, NVT,
N->getChain(),
N->getBasePtr(),
1004 N->getMask(),
N->getVectorLength(),
N->getMemoryVT(),
1005 N->getMemOperand(),
N->isExpandingLoad());
1013 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1014 SDValue ExtPassThru = GetPromotedInteger(
N->getPassThru());
1021 SDValue Res = DAG.getMaskedLoad(NVT, dl,
N->getChain(),
N->getBasePtr(),
1022 N->getOffset(),
N->getMask(), ExtPassThru,
1023 N->getMemoryVT(),
N->getMemOperand(),
1024 N->getAddressingMode(), ExtType,
1025 N->isExpandingLoad());
1033 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1034 SDValue ExtPassThru = GetPromotedInteger(
N->getPassThru());
1036 "Gather result type and the passThru argument type should be the same");
1043 SDValue Ops[] = {
N->getChain(), ExtPassThru,
N->getMask(),
N->getBasePtr(),
1044 N->getIndex(),
N->getScale() };
1045 SDValue Res = DAG.getMaskedGather(DAG.getVTList(NVT, MVT::Other),
1046 N->getMemoryVT(), dl,
Ops,
1047 N->getMemOperand(),
N->getIndexType(),
1055SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_COMPRESS(
SDNode *
N) {
1056 SDValue Vec = GetPromotedInteger(
N->getOperand(0));
1057 SDValue Passthru = GetPromotedInteger(
N->getOperand(2));
1059 N->getOperand(1), Passthru);
1066 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(1));
1067 EVT VT =
N->getValueType(0);
1068 EVT SVT = getSetCCResultType(VT);
1069 SDValue Ops[3] = {
N->getOperand(0),
N->getOperand(1) };
1070 unsigned NumOps =
N->getNumOperands();
1073 Ops[2] = PromoteTargetBoolean(
N->getOperand(2), VT);
1081 ReplaceValueWith(
SDValue(
N, 0), Res);
1084 return DAG.getBoolExtOrTrunc(Res.
getValue(1), dl, NVT, VT);
1087template <
class MatchContextClass>
1099 MatchContextClass matcher(DAG, TLI,
N);
1101 unsigned Opcode = matcher.getRootBaseOpcode();
1107 SExtOrZExtPromotedOperands(Op1, Op2);
1113 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
1115 if (TLI.isSExtCheaperThanZExt(OVT, NVT)) {
1116 Op1 = SExtPromotedInteger(Op1);
1117 Op2 = SExtPromotedInteger(Op2);
1118 return matcher.getNode(
ISD::UADDSAT, dl, NVT, Op1, Op2);
1121 Op1 = ZExtPromotedInteger(Op1);
1122 Op2 = ZExtPromotedInteger(Op2);
1125 SDValue SatMax = DAG.getConstant(MaxVal, dl, NVT);
1127 return matcher.getNode(
ISD::UMIN, dl, NVT,
Add, SatMax);
1134 Op1 = GetPromotedInteger(Op1);
1135 Op2 = ZExtPromotedInteger(Op2);
1137 Op1 = SExtPromotedInteger(Op1);
1138 Op2 = SExtPromotedInteger(Op2);
1145 if (IsShift || matcher.isOperationLegal(Opcode, PromotedType)) {
1158 "addition, subtraction or left shift");
1161 unsigned SHLAmount = NewBits - OldBits;
1163 DAG.getShiftAmountConstant(SHLAmount, PromotedType, dl);
1168 SDValue Result = matcher.getNode(Opcode, dl, PromotedType, Op1, Op2);
1169 return matcher.getNode(ShiftOp, dl, PromotedType, Result, ShiftAmount);
1175 SDValue SatMin = DAG.getConstant(MinVal, dl, PromotedType);
1176 SDValue SatMax = DAG.getConstant(MaxVal, dl, PromotedType);
1177 SDValue Result = matcher.getNode(AddOp, dl, PromotedType, Op1, Op2);
1178 Result = matcher.getNode(
ISD::SMIN, dl, PromotedType, Result, SatMax);
1179 Result = matcher.getNode(
ISD::SMAX, dl, PromotedType, Result, SatMin);
1186 SDValue Op1Promoted, Op2Promoted;
1192 Op1Promoted = SExtPromotedInteger(
N->getOperand(0));
1193 Op2Promoted = SExtPromotedInteger(
N->getOperand(1));
1195 Op1Promoted = ZExtPromotedInteger(
N->getOperand(0));
1196 Op2Promoted = ZExtPromotedInteger(
N->getOperand(1));
1198 EVT OldType =
N->getOperand(0).getValueType();
1210 DAG.getShiftAmountConstant(DiffSize, PromotedType, dl));
1211 SDValue Result = DAG.getNode(
N->getOpcode(), dl, PromotedType, Op1Promoted,
1212 Op2Promoted,
N->getOperand(2));
1214 return DAG.getNode(ShiftOp, dl, PromotedType, Result,
1215 DAG.getShiftAmountConstant(DiffSize, PromotedType, dl));
1217 return DAG.getNode(
N->getOpcode(), dl, PromotedType, Op1Promoted, Op2Promoted,
1222 unsigned SatW,
bool Signed,
1225 EVT VT = V.getValueType();
1252 EVT VT =
LHS.getValueType();
1270 assert(Res &&
"Expanding DIVFIX with wide type failed?");
1276 "Tried to saturate to more than the original type?");
1285 SDValue Op1Promoted, Op2Promoted;
1291 Op1Promoted = SExtPromotedInteger(
N->getOperand(0));
1292 Op2Promoted = SExtPromotedInteger(
N->getOperand(1));
1294 Op1Promoted = ZExtPromotedInteger(
N->getOperand(0));
1295 Op2Promoted = ZExtPromotedInteger(
N->getOperand(1));
1298 unsigned Scale =
N->getConstantOperandVal(2);
1302 if (TLI.isTypeLegal(PromotedType)) {
1304 TLI.getFixedPointOperationAction(
N->getOpcode(), PromotedType, Scale);
1307 N->getValueType(0).getScalarSizeInBits();
1311 DAG.getShiftAmountConstant(Diff, PromotedType, dl));
1312 SDValue Res = DAG.
getNode(
N->getOpcode(), dl, PromotedType, Op1Promoted,
1313 Op2Promoted,
N->getOperand(2));
1316 DAG.getShiftAmountConstant(Diff, PromotedType, dl));
1322 if (
SDValue Res = TLI.expandFixedPointDiv(
N->getOpcode(), dl, Op1Promoted,
1323 Op2Promoted, Scale, DAG)) {
1326 N->getValueType(0).getScalarSizeInBits(),
1334 N->getValueType(0).getScalarSizeInBits());
1337SDValue DAGTypeLegalizer::PromoteIntRes_SADDSUBO(
SDNode *
N,
unsigned ResNo) {
1339 return PromoteIntRes_Overflow(
N);
1343 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1344 SDValue RHS = SExtPromotedInteger(
N->getOperand(1));
1345 EVT OVT =
N->getOperand(0).getValueType();
1346 EVT NVT =
LHS.getValueType();
1356 DAG.getValueType(OVT));
1358 Ofl = DAG.getSetCC(dl,
N->getValueType(1), Ofl, Res,
ISD::SETNE);
1361 ReplaceValueWith(
SDValue(
N, 1), Ofl);
1367 EVT PromotedResultTy =
1368 TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1369 return DAG.
getNode(
N->getOpcode(), SDLoc(
N), PromotedResultTy,
1370 N->getOperand(0),
N->getOperand(1));
1376 SDValue LHS = GetPromotedInteger(
N->getOperand(1));
1377 SDValue RHS = GetPromotedInteger(
N->getOperand(2));
1379 unsigned Opcode =
N->getOpcode();
1380 if (Opcode == ISD::VP_SELECT || Opcode == ISD::VP_MERGE)
1381 return DAG.getNode(Opcode, SDLoc(
N),
LHS.getValueType(), Mask,
LHS,
RHS,
1383 return DAG.getNode(Opcode, SDLoc(
N),
LHS.getValueType(), Mask,
LHS,
RHS);
1387 SDValue LHS = GetPromotedInteger(
N->getOperand(2));
1388 SDValue RHS = GetPromotedInteger(
N->getOperand(3));
1390 LHS.getValueType(),
N->getOperand(0),
1391 N->getOperand(1),
LHS,
RHS,
N->getOperand(4));
1396 EVT InVT =
N->getOperand(OpNo).getValueType();
1397 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1399 EVT SVT = getSetCCResultType(InVT);
1406 InVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT);
1407 SVT = getSetCCResultType(InVT);
1415 assert(SVT.
isVector() ==
N->getOperand(OpNo).getValueType().isVector() &&
1416 "Vector compare must return a vector result!");
1420 if (
N->isStrictFPOpcode()) {
1421 SDVTList VTs = DAG.getVTList({SVT, MVT::Other});
1422 SDValue Opers[] = {
N->getOperand(0),
N->getOperand(1),
1423 N->getOperand(2),
N->getOperand(3)};
1424 SetCC = DAG.
getNode(
N->getOpcode(), dl, VTs, Opers,
N->getFlags());
1429 SetCC = DAG.
getNode(
N->getOpcode(), dl, SVT,
N->getOperand(0),
1430 N->getOperand(1),
N->getOperand(2),
N->getFlags());
1433 return DAG.getSExtOrTrunc(SetCC, dl, NVT);
1440 EVT NResVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1445 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(1));
1446 EVT VT =
N->getValueType(0);
1450 DAG.
getNode(
N->getOpcode(), dl, DAG.getVTList(VT, NVT),
N->getOperand(0));
1452 ReplaceValueWith(
SDValue(
N, 0), Res);
1457 SDValue LHS = GetPromotedInteger(
N->getOperand(0));
1459 if (
N->getOpcode() != ISD::VP_SHL) {
1461 RHS = ZExtPromotedInteger(
RHS);
1463 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1469 RHS = VPZExtPromotedInteger(
RHS, Mask, EVL);
1470 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS,
1474SDValue DAGTypeLegalizer::PromoteIntRes_SIGN_EXTEND_INREG(
SDNode *
N) {
1475 SDValue Op = GetPromotedInteger(
N->getOperand(0));
1477 Op.getValueType(),
Op,
N->getOperand(1));
1480SDValue DAGTypeLegalizer::PromoteIntRes_SimpleIntBinOp(
SDNode *
N) {
1484 SDValue LHS = GetPromotedInteger(
N->getOperand(0));
1485 SDValue RHS = GetPromotedInteger(
N->getOperand(1));
1486 if (
N->getNumOperands() == 2)
1487 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1488 assert(
N->getNumOperands() == 4 &&
"Unexpected number of operands!");
1489 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1490 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS,
1491 N->getOperand(2),
N->getOperand(3));
1495 if (
N->getNumOperands() == 2) {
1497 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1498 SDValue RHS = SExtPromotedInteger(
N->getOperand(1));
1499 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1501 assert(
N->getNumOperands() == 4 &&
"Unexpected number of operands!");
1502 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1506 SDValue LHS = VPSExtPromotedInteger(
N->getOperand(0), Mask, EVL);
1507 SDValue RHS = VPSExtPromotedInteger(
N->getOperand(1), Mask, EVL);
1508 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS,
1513 if (
N->getNumOperands() == 2) {
1515 SDValue LHS = ZExtPromotedInteger(
N->getOperand(0));
1516 SDValue RHS = ZExtPromotedInteger(
N->getOperand(1));
1517 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1519 assert(
N->getNumOperands() == 4 &&
"Unexpected number of operands!");
1520 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1524 SDValue LHS = VPZExtPromotedInteger(
N->getOperand(0), Mask, EVL);
1525 SDValue RHS = VPZExtPromotedInteger(
N->getOperand(1), Mask, EVL);
1526 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS,
1536 SExtOrZExtPromotedOperands(
LHS,
RHS);
1538 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
1544 if (
N->getOpcode() != ISD::VP_SRA) {
1546 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1548 RHS = ZExtPromotedInteger(
RHS);
1549 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1555 SDValue LHS = VPSExtPromotedInteger(
N->getOperand(0), Mask, EVL);
1557 RHS = VPZExtPromotedInteger(
RHS, Mask, EVL);
1558 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS,
1564 if (
N->getOpcode() != ISD::VP_SRL) {
1566 SDValue LHS = ZExtPromotedInteger(
N->getOperand(0));
1568 RHS = ZExtPromotedInteger(
RHS);
1569 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1575 SDValue LHS = VPZExtPromotedInteger(
N->getOperand(0), Mask, EVL);
1577 RHS = VPZExtPromotedInteger(
RHS, Mask, EVL);
1578 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS,
1584 SDValue Res = TLI.expandROT(
N,
true , DAG);
1585 ReplaceValueWith(
SDValue(
N, 0), Res);
1590 SDValue Hi = GetPromotedInteger(
N->getOperand(0));
1591 SDValue Lo = GetPromotedInteger(
N->getOperand(1));
1594 Amt = ZExtPromotedInteger(Amt);
1598 EVT OldVT =
N->getOperand(0).getValueType();
1599 EVT VT =
Lo.getValueType();
1600 unsigned Opcode =
N->getOpcode();
1607 DAG.getConstant(OldBits,
DL, AmtVT));
1615 !TLI.isOperationLegalOrCustom(Opcode, VT)) {
1616 SDValue HiShift = DAG.getConstant(OldBits,
DL, VT);
1618 Lo = DAG.getZeroExtendInReg(
Lo,
DL, OldVT);
1627 SDValue ShiftOffset = DAG.getConstant(NewBits - OldBits,
DL, AmtVT);
1635 return DAG.getNode(Opcode,
DL, VT,
Hi,
Lo, Amt);
1639SDValue DAGTypeLegalizer::PromoteIntRes_VPFunnelShift(
SDNode *
N) {
1640 SDValue Hi = GetPromotedInteger(
N->getOperand(0));
1641 SDValue Lo = GetPromotedInteger(
N->getOperand(1));
1646 Amt = VPZExtPromotedInteger(Amt, Mask, EVL);
1650 EVT OldVT =
N->getOperand(0).getValueType();
1651 EVT VT =
Lo.getValueType();
1652 unsigned Opcode =
N->getOpcode();
1653 bool IsFSHR = Opcode == ISD::VP_FSHR;
1658 Amt = DAG.
getNode(ISD::VP_UREM,
DL, AmtVT, Amt,
1659 DAG.getConstant(OldBits,
DL, AmtVT), Mask, EVL);
1667 !TLI.isOperationLegalOrCustom(Opcode, VT)) {
1668 SDValue HiShift = DAG.getConstant(OldBits,
DL, VT);
1669 Hi = DAG.
getNode(ISD::VP_SHL,
DL, VT,
Hi, HiShift, Mask, EVL);
1670 Lo = DAG.getVPZeroExtendInReg(
Lo, Mask, EVL,
DL, OldVT);
1672 Res = DAG.
getNode(IsFSHR ? ISD::VP_SRL : ISD::VP_SHL,
DL, VT, Res, Amt,
1675 Res = DAG.
getNode(ISD::VP_SRL,
DL, VT, Res, HiShift, Mask, EVL);
1680 SDValue ShiftOffset = DAG.getConstant(NewBits - OldBits,
DL, AmtVT);
1681 Lo = DAG.
getNode(ISD::VP_SHL,
DL, VT,
Lo, ShiftOffset, Mask, EVL);
1686 Amt = DAG.
getNode(ISD::VP_ADD,
DL, AmtVT, Amt, ShiftOffset, Mask, EVL);
1688 return DAG.getNode(Opcode,
DL, VT,
Hi,
Lo, Amt, Mask, EVL);
1692 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1704 Res = GetPromotedInteger(InOp);
1711 "Dst and Src must have the same number of elements");
1713 "Promoted vector type must be a power of two");
1716 GetSplitVector(InOp, EOp1, EOp2);
1724 assert(
N->getOpcode() == ISD::VP_TRUNCATE &&
1725 "Expected VP_TRUNCATE opcode");
1726 SDValue MaskLo, MaskHi, EVLLo, EVLHi;
1727 std::tie(MaskLo, MaskHi) = SplitMask(
N->getOperand(1));
1728 std::tie(EVLLo, EVLHi) =
1729 DAG.SplitEVL(
N->getOperand(2),
N->getValueType(0), dl);
1730 EOp1 = DAG.
getNode(ISD::VP_TRUNCATE, dl, HalfNVT, EOp1, MaskLo, EVLLo);
1731 EOp2 = DAG.
getNode(ISD::VP_TRUNCATE, dl, HalfNVT, EOp2, MaskHi, EVLHi);
1738 SDValue WideInOp = GetWidenedVector(InOp);
1743 N->getValueType(0).getScalarType(), NumElem);
1752 SDValue ZeroIdx = DAG.getVectorIdxConstant(0, dl);
1758 if (
N->getOpcode() == ISD::VP_TRUNCATE)
1759 return DAG.getNode(ISD::VP_TRUNCATE, dl, NVT, Res,
N->getOperand(1),
1764SDValue DAGTypeLegalizer::PromoteIntRes_UADDSUBO(
SDNode *
N,
unsigned ResNo) {
1766 return PromoteIntRes_Overflow(
N);
1770 SDValue LHS = ZExtPromotedInteger(
N->getOperand(0));
1771 SDValue RHS = ZExtPromotedInteger(
N->getOperand(1));
1772 EVT OVT =
N->getOperand(0).getValueType();
1773 EVT NVT =
LHS.getValueType();
1782 SDValue Ofl = DAG.getZeroExtendInReg(Res, dl, OVT);
1784 Ofl = DAG.getSetCC(dl,
N->getValueType(1), Ofl, Res,
ISD::SETNE);
1787 ReplaceValueWith(
SDValue(
N, 1), Ofl);
1798 return PromoteIntRes_Overflow(
N);
1810 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1811 SDValue RHS = SExtPromotedInteger(
N->getOperand(1));
1813 EVT ValueVTs[] = {
LHS.getValueType(),
N->getValueType(1)};
1816 SDValue Res = DAG.
getNode(
N->getOpcode(), SDLoc(
N), DAG.getVTList(ValueVTs),
1827 assert(ResNo == 1 &&
"Don't know how to promote other results yet.");
1828 return PromoteIntRes_Overflow(
N);
1832 EVT OVT =
N->getValueType(0);
1833 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
1839 !TLI.isOperationLegalOrCustomOrPromote(
ISD::ABS, NVT) &&
1840 !TLI.isOperationLegal(
ISD::SMAX, NVT)) {
1841 if (
SDValue Res = TLI.expandABS(
N, DAG))
1845 SDValue Op0 = SExtPromotedInteger(
N->getOperand(0));
1849SDValue DAGTypeLegalizer::PromoteIntRes_XMULO(
SDNode *
N,
unsigned ResNo) {
1852 return PromoteIntRes_Overflow(
N);
1856 EVT SmallVT =
LHS.getValueType();
1863 LHS = SExtPromotedInteger(
LHS);
1864 RHS = SExtPromotedInteger(
RHS);
1866 LHS = ZExtPromotedInteger(
LHS);
1867 RHS = ZExtPromotedInteger(
RHS);
1869 SDVTList VTs = DAG.getVTList(
LHS.getValueType(),
N->getValueType(1));
1881 DAG.getShiftAmountConstant(Shift,
Mul.getValueType(),
DL));
1882 Overflow = DAG.getSetCC(
DL,
N->getValueType(1),
Hi,
1883 DAG.getConstant(0,
DL,
Hi.getValueType()),
1888 Mul, DAG.getValueType(SmallVT));
1898 ReplaceValueWith(
SDValue(
N, 1), Overflow);
1903 return DAG.getUNDEF(TLI.getTypeToTransformTo(*DAG.getContext(),
1904 N->getValueType(0)));
1908 EVT VT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1910 const APInt &MulImm =
N->getConstantOperandAPInt(0);
1917 EVT VT =
N->getValueType(0);
1920 MVT RegVT = TLI.getRegisterType(*DAG.getContext(), VT);
1921 unsigned NumRegs = TLI.getNumRegisters(*DAG.getContext(), VT);
1925 for (
unsigned i = 0; i < NumRegs; ++i) {
1926 Parts[i] = DAG.getVAArg(RegVT, dl, Chain,
Ptr,
N->getOperand(2),
1927 N->getConstantOperandVal(3));
1932 if (DAG.getDataLayout().isBigEndian())
1933 std::reverse(Parts.begin(), Parts.end());
1936 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1938 for (
unsigned i = 1; i < NumRegs; ++i) {
1943 TLI.getPointerTy(DAG.getDataLayout())));
1949 ReplaceValueWith(
SDValue(
N, 1), Chain);
1962bool DAGTypeLegalizer::PromoteIntegerOperand(
SDNode *
N,
unsigned OpNo) {
1965 if (CustomLowerNode(
N,
N->getOperand(OpNo).getValueType(),
false)) {
1970 switch (
N->getOpcode()) {
1973 dbgs() <<
"PromoteIntegerOperand Op #" << OpNo <<
": ";
1974 N->dump(&DAG);
dbgs() <<
"\n";
1979 case ISD::ATOMIC_STORE:
1982 case ISD::BITCAST: Res = PromoteIntOp_BITCAST(
N);
break;
1983 case ISD::BR_CC: Res = PromoteIntOp_BR_CC(
N, OpNo);
break;
1984 case ISD::BRCOND: Res = PromoteIntOp_BRCOND(
N, OpNo);
break;
1990 Res = PromoteIntOp_FAKE_USE(
N);
1993 Res = PromoteIntOp_INSERT_VECTOR_ELT(
N, OpNo);
1997 case ISD::EXPERIMENTAL_VP_SPLAT:
1998 Res = PromoteIntOp_ScalarOp(
N);
2001 case ISD::SELECT: Res = PromoteIntOp_SELECT(
N, OpNo);
break;
2004 case ISD::SETCC: Res = PromoteIntOp_SETCC(
N, OpNo);
break;
2006 case ISD::VP_SIGN_EXTEND: Res = PromoteIntOp_VP_SIGN_EXTEND(
N);
break;
2007 case ISD::VP_SINT_TO_FP:
2024 Res = PromoteIntOp_VECTOR_COMPRESS(
N, OpNo);
2026 case ISD::VP_TRUNCATE:
2028 case ISD::BF16_TO_FP:
2029 case ISD::FP16_TO_FP:
2030 case ISD::VP_UINT_TO_FP:
2032 case ISD::STRICT_FP16_TO_FP:
2035 case ISD::VP_ZERO_EXTEND: Res = PromoteIntOp_VP_ZERO_EXTEND(
N);
break;
2043 case ISD::ROTR: Res = PromoteIntOp_Shift(
N);
break;
2046 case ISD::UCMP: Res = PromoteIntOp_CMP(
N);
break;
2049 case ISD::FSHR: Res = PromoteIntOp_FunnelShift(
N);
break;
2066 case ISD::VECREDUCE_ADD:
2067 case ISD::VECREDUCE_MUL:
2068 case ISD::VECREDUCE_AND:
2069 case ISD::VECREDUCE_OR:
2070 case ISD::VECREDUCE_XOR:
2071 case ISD::VECREDUCE_SMAX:
2072 case ISD::VECREDUCE_SMIN:
2073 case ISD::VECREDUCE_UMAX:
2074 case ISD::VECREDUCE_UMIN: Res = PromoteIntOp_VECREDUCE(
N);
break;
2075 case ISD::VP_REDUCE_ADD:
2076 case ISD::VP_REDUCE_MUL:
2077 case ISD::VP_REDUCE_AND:
2078 case ISD::VP_REDUCE_OR:
2079 case ISD::VP_REDUCE_XOR:
2080 case ISD::VP_REDUCE_SMAX:
2081 case ISD::VP_REDUCE_SMIN:
2082 case ISD::VP_REDUCE_UMAX:
2083 case ISD::VP_REDUCE_UMIN:
2084 Res = PromoteIntOp_VP_REDUCE(
N, OpNo);
2087 case ISD::SET_ROUNDING: Res = PromoteIntOp_SET_ROUNDING(
N);
break;
2089 Res = PromoteIntOp_STACKMAP(
N, OpNo);
2091 case ISD::PATCHPOINT:
2092 Res = PromoteIntOp_PATCHPOINT(
N, OpNo);
2095 Res = PromoteIntOp_WRITE_REGISTER(
N, OpNo);
2097 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
2098 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
2099 Res = PromoteIntOp_VP_STRIDED(
N, OpNo);
2101 case ISD::EXPERIMENTAL_VP_SPLICE:
2102 Res = PromoteIntOp_VP_SPLICE(
N, OpNo);
2104 case ISD::EXPERIMENTAL_VECTOR_HISTOGRAM:
2105 Res = PromoteIntOp_VECTOR_HISTOGRAM(
N, OpNo);
2107 case ISD::VECTOR_FIND_LAST_ACTIVE:
2108 Res = PromoteIntOp_VECTOR_FIND_LAST_ACTIVE(
N, OpNo);
2110 case ISD::GET_ACTIVE_LANE_MASK:
2111 Res = PromoteIntOp_GET_ACTIVE_LANE_MASK(
N);
2113 case ISD::PARTIAL_REDUCE_UMLA:
2114 case ISD::PARTIAL_REDUCE_SMLA:
2115 case ISD::PARTIAL_REDUCE_SUMLA:
2116 Res = PromoteIntOp_PARTIAL_REDUCE_MLA(
N);
2121 if (!Res.
getNode())
return false;
2128 const bool IsStrictFp =
N->isStrictFPOpcode();
2130 N->getNumValues() == (IsStrictFp ? 2 : 1) &&
2131 "Invalid operand expansion");
2135 ReplaceValueWith(
SDValue(
N, 0), Res);
2149 if (TLI.isSExtCheaperThanZExt(
LHS.getValueType(), OpL.
getValueType())) {
2153 unsigned OpLEffectiveBits =
2154 DAG.computeKnownBits(OpL).countMaxActiveBits();
2155 unsigned OpREffectiveBits =
2156 DAG.computeKnownBits(OpR).countMaxActiveBits();
2157 if (OpLEffectiveBits <=
LHS.getScalarValueSizeInBits() &&
2158 OpREffectiveBits <=
RHS.getScalarValueSizeInBits()) {
2165 LHS = SExtPromotedInteger(
LHS);
2166 RHS = SExtPromotedInteger(
RHS);
2175 unsigned OpLEffectiveBits = DAG.ComputeMaxSignificantBits(OpL);
2176 unsigned OpREffectiveBits = DAG.ComputeMaxSignificantBits(OpR);
2177 if (OpLEffectiveBits <=
LHS.getScalarValueSizeInBits() &&
2178 OpREffectiveBits <=
RHS.getScalarValueSizeInBits()) {
2185 LHS = ZExtPromotedInteger(
LHS);
2186 RHS = ZExtPromotedInteger(
RHS);
2200 LHS = SExtPromotedInteger(
LHS);
2201 RHS = SExtPromotedInteger(
RHS);
2206 "Unknown integer comparison!");
2208 SExtOrZExtPromotedOperands(
LHS,
RHS);
2212 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2217 SDValue Op1 = GetPromotedInteger(
N->getOperand(1));
2218 return DAG.getAtomic(
N->getOpcode(), SDLoc(
N),
N->getMemoryVT(),
2219 N->getChain(), Op1,
N->getBasePtr(),
N->getMemOperand());
2223 EVT OutVT =
N->getValueType(0);
2226 EVT NInVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT);
2229 switch (getTypeAction(InVT)) {
2233 DAG.getDataLayout().isLittleEndian()) {
2243 if (isTypeLegal(WideVecVT)) {
2244 SDValue Promoted = GetPromotedInteger(InOp);
2245 SDValue Cast = DAG.getNode(ISD::BITCAST, dl, WideVecVT, Promoted);
2247 DAG.getVectorIdxConstant(0, dl));
2260 return CreateStackStoreLoad(InOp, OutVT);
2263SDValue DAGTypeLegalizer::PromoteIntOp_BR_CC(
SDNode *
N,
unsigned OpNo) {
2264 assert(OpNo == 2 &&
"Don't know how to promote this operand!");
2272 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2273 N->getOperand(1),
LHS,
RHS,
N->getOperand(4)),
2277SDValue DAGTypeLegalizer::PromoteIntOp_BRCOND(
SDNode *
N,
unsigned OpNo) {
2278 assert(OpNo == 1 &&
"only know how to promote condition");
2281 SDValue Cond = PromoteTargetBoolean(
N->getOperand(1), MVT::Other);
2284 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
Cond,
2285 N->getOperand(2)), 0);
2290 EVT OVT =
N->getOperand(0).getValueType();
2291 SDValue Lo = ZExtPromotedInteger(
N->getOperand(0));
2292 SDValue Hi = GetPromotedInteger(
N->getOperand(1));
2293 assert(
Lo.getValueType() ==
N->getValueType(0) &&
"Operand over promoted?");
2298 TLI.getPointerTy(DAG.getDataLayout())));
2299 return DAG.getNode(
ISD::OR, dl,
N->getValueType(0),
Lo,
Hi);
2308 assert(!((NumElts & 1) && (!TLI.isTypeLegal(VecVT))) &&
2309 "Legal vector of one illegal element?");
2314 assert(
N->getOperand(0).getValueSizeInBits() >=
2315 N->getValueType(0).getScalarSizeInBits() &&
2316 "Type of inserted value narrower than vector element type!");
2319 for (
unsigned i = 0; i < NumElts; ++i)
2320 NewOps.
push_back(GetPromotedInteger(
N->getOperand(i)));
2322 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2325SDValue DAGTypeLegalizer::PromoteIntOp_INSERT_VECTOR_ELT(
SDNode *
N,
2332 assert(
N->getOperand(1).getValueSizeInBits() >=
2333 N->getValueType(0).getScalarSizeInBits() &&
2334 "Type of inserted value narrower than vector element type!");
2335 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2336 GetPromotedInteger(
N->getOperand(1)),
2341 assert(OpNo == 2 &&
"Different operand and result vector types?");
2344 SDValue Idx = DAG.getZExtOrTrunc(
N->getOperand(2), SDLoc(
N),
2345 TLI.getVectorIdxTy(DAG.getDataLayout()));
2346 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2347 N->getOperand(1), Idx), 0);
2351 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2352 if (
N->getOpcode() == ISD::EXPERIMENTAL_VP_SPLAT)
2354 DAG.UpdateNodeOperands(
N,
Op,
N->getOperand(1),
N->getOperand(2)), 0);
2358 return SDValue(DAG.UpdateNodeOperands(
N,
Op), 0);
2361SDValue DAGTypeLegalizer::PromoteIntOp_SELECT(
SDNode *
N,
unsigned OpNo) {
2362 assert(OpNo == 0 &&
"Only know how to promote the condition!");
2364 EVT OpTy =
N->getOperand(1).getValueType();
2367 if (
SDValue Res = WidenVSELECTMask(
N))
2368 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
N->getValueType(0),
2369 Res,
N->getOperand(1),
N->getOperand(2));
2373 Cond = PromoteTargetBoolean(
Cond, OpVT);
2375 return SDValue(DAG.UpdateNodeOperands(
N,
Cond,
N->getOperand(1),
2376 N->getOperand(2)), 0);
2379SDValue DAGTypeLegalizer::PromoteIntOp_SELECT_CC(
SDNode *
N,
unsigned OpNo) {
2380 assert(OpNo == 0 &&
"Don't know how to promote this operand!");
2388 N->getOperand(3),
N->getOperand(4)), 0);
2391SDValue DAGTypeLegalizer::PromoteIntOp_SETCC(
SDNode *
N,
unsigned OpNo) {
2392 assert(OpNo == 0 &&
"Don't know how to promote this operand!");
2400 return SDValue(DAG.UpdateNodeOperands(
N,
LHS,
RHS,
N->getOperand(2)), 0);
2402 assert(
N->getOpcode() == ISD::VP_SETCC &&
"Expected VP_SETCC opcode");
2405 N->getOperand(3),
N->getOperand(4)),
2410 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2411 ZExtPromotedInteger(
N->getOperand(1))), 0);
2419 LHS = SExtPromotedInteger(
LHS);
2420 RHS = SExtPromotedInteger(
RHS);
2422 SExtOrZExtPromotedOperands(
LHS,
RHS);
2429 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
N->getOperand(1),
2430 ZExtPromotedInteger(
N->getOperand(2))), 0);
2434 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2438 Op, DAG.getValueType(
N->getOperand(0).getValueType()));
2441SDValue DAGTypeLegalizer::PromoteIntOp_VP_SIGN_EXTEND(
SDNode *
N) {
2443 EVT VT =
N->getValueType(0);
2444 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2446 Op = DAG.getNode(ISD::VP_ZERO_EXTEND, dl, VT,
Op,
N->getOperand(1),
2450 SDValue ShAmt = DAG.getShiftAmountConstant(Diff, VT, dl);
2454 return DAG.getNode(ISD::VP_SRA, dl, VT, Shl, ShAmt,
N->getOperand(1),
2459 if (
N->getOpcode() == ISD::VP_SINT_TO_FP)
2460 return SDValue(DAG.UpdateNodeOperands(
N,
2461 SExtPromotedInteger(
N->getOperand(0)),
2462 N->getOperand(1),
N->getOperand(2)),
2464 return SDValue(DAG.UpdateNodeOperands(
N,
2465 SExtPromotedInteger(
N->getOperand(0))), 0);
2468SDValue DAGTypeLegalizer::PromoteIntOp_STRICT_SINT_TO_FP(
SDNode *
N) {
2469 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2470 SExtPromotedInteger(
N->getOperand(1))), 0);
2478 SDValue Val = GetPromotedInteger(
N->getValue());
2481 return DAG.getTruncStore(Ch, dl, Val,
Ptr,
2482 N->getMemoryVT(),
N->getMemOperand());
2488 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2489 assert(!
N->isIndexed() &&
"expecting unindexed vp_store!");
2491 SDValue DataOp = GetPromotedInteger(
N->getValue());
2492 return DAG.getTruncStoreVP(
N->getChain(), SDLoc(
N), DataOp,
N->getBasePtr(),
2493 N->getMask(),
N->getVectorLength(),
2494 N->getMemoryVT(),
N->getMemOperand(),
2495 N->isCompressingStore());
2506 Mask = PromoteTargetBoolean(Mask, DataVT);
2509 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2512 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2513 DataOp = GetPromotedInteger(DataOp);
2515 return DAG.getMaskedStore(
N->getChain(), SDLoc(
N), DataOp,
N->getBasePtr(),
2516 N->getOffset(), Mask,
N->getMemoryVT(),
2517 N->getMemOperand(),
N->getAddressingMode(),
2518 true,
N->isCompressingStore());
2523 assert(OpNo == 3 &&
"Only know how to promote the mask!");
2524 EVT DataVT =
N->getValueType(0);
2525 SDValue Mask = PromoteTargetBoolean(
N->getOperand(OpNo), DataVT);
2527 NewOps[OpNo] =
Mask;
2528 SDNode *Res = DAG.UpdateNodeOperands(
N, NewOps);
2544 EVT DataVT =
N->getValueType(0);
2545 NewOps[OpNo] = PromoteTargetBoolean(
N->getOperand(OpNo), DataVT);
2546 }
else if (OpNo == 4) {
2548 if (
N->isIndexSigned())
2550 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2552 NewOps[OpNo] = ZExtPromotedInteger(
N->getOperand(OpNo));
2554 NewOps[OpNo] = GetPromotedInteger(
N->getOperand(OpNo));
2556 SDNode *Res = DAG.UpdateNodeOperands(
N, NewOps);
2568 bool TruncateStore =
N->isTruncatingStore();
2573 EVT DataVT =
N->getValue().getValueType();
2574 NewOps[OpNo] = PromoteTargetBoolean(
N->getOperand(OpNo), DataVT);
2575 }
else if (OpNo == 4) {
2577 if (
N->isIndexSigned())
2579 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2581 NewOps[OpNo] = ZExtPromotedInteger(
N->getOperand(OpNo));
2583 NewOps[OpNo] = GetPromotedInteger(
N->getOperand(OpNo));
2584 TruncateStore =
true;
2587 return DAG.getMaskedScatter(DAG.getVTList(MVT::Other),
N->getMemoryVT(),
2588 SDLoc(
N), NewOps,
N->getMemOperand(),
2589 N->getIndexType(), TruncateStore);
2594 assert(OpNo == 1 &&
"Can only promote VECTOR_COMPRESS mask.");
2598 SDValue Mask = PromoteTargetBoolean(
N->getOperand(1), VT);
2603 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2604 if (
N->getOpcode() == ISD::VP_TRUNCATE)
2605 return DAG.getNode(ISD::VP_TRUNCATE, SDLoc(
N),
N->getValueType(0),
Op,
2606 N->getOperand(1),
N->getOperand(2));
2611 if (
N->getOpcode() == ISD::VP_UINT_TO_FP)
2612 return SDValue(DAG.UpdateNodeOperands(
N,
2613 ZExtPromotedInteger(
N->getOperand(0)),
2614 N->getOperand(1),
N->getOperand(2)),
2616 return SDValue(DAG.UpdateNodeOperands(
N,
2617 ZExtPromotedInteger(
N->getOperand(0))), 0);
2620SDValue DAGTypeLegalizer::PromoteIntOp_STRICT_UINT_TO_FP(
SDNode *
N) {
2621 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2622 ZExtPromotedInteger(
N->getOperand(1))), 0);
2629 EVT VT =
N->getValueType(0);
2634 if (
N->getFlags().hasNonNeg() &&
Op.getValueType() == VT &&
2635 TLI.isSExtCheaperThanZExt(Src.getValueType(), VT)) {
2636 unsigned OpEffectiveBits = DAG.ComputeMaxSignificantBits(
Op);
2637 if (OpEffectiveBits <= Src.getScalarValueSizeInBits())
2642 return DAG.getZeroExtendInReg(
Op, dl, Src.getValueType());
2645SDValue DAGTypeLegalizer::PromoteIntOp_VP_ZERO_EXTEND(
SDNode *
N) {
2647 EVT VT =
N->getValueType(0);
2648 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2650 Op = DAG.getNode(ISD::VP_ZERO_EXTEND, dl, VT,
Op,
N->getOperand(1),
2652 return DAG.getVPZeroExtendInReg(
Op,
N->getOperand(1),
N->getOperand(2), dl,
2653 N->getOperand(0).getValueType());
2657 SDValue Op2 = ZExtPromotedInteger(
N->getOperand(2));
2659 DAG.UpdateNodeOperands(
N,
N->getOperand(0),
N->getOperand(1), Op2), 0);
2662SDValue DAGTypeLegalizer::PromoteIntOp_FRAMERETURNADDR(
SDNode *
N) {
2664 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
2665 return SDValue(DAG.UpdateNodeOperands(
N,
Op), 0);
2674 unsigned OpOffset = IsStrict ? 1 : 0;
2681 if (LC == RTLIB::UNKNOWN_LIBCALL || !TLI.getLibcallName(LC)) {
2687 if (IsPowI && N->getValueType(0).isVector())
2688 return DAG.UnrollVectorOp(N);
2689 SmallVector<SDValue, 3> NewOps(N->ops());
2690 NewOps[1 + OpOffset] = SExtPromotedInteger(N->getOperand(1 + OpOffset));
2691 return SDValue(DAG.UpdateNodeOperands(N, NewOps), 0);
2701 assert(DAG.getLibInfo().getIntSize() ==
2702 N->getOperand(1 + OpOffset).getValueType().getSizeInBits() &&
2703 "POWI exponent should match with sizeof(int) when doing the libcall.");
2704 TargetLowering::MakeLibCallOptions CallOptions;
2705 CallOptions.setIsSigned(
true);
2706 SDValue Ops[2] = {N->getOperand(0 + OpOffset), N->getOperand(1 + OpOffset)};
2707 std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(
2708 DAG, LC,
N->getValueType(0),
Ops, CallOptions, SDLoc(
N), Chain);
2709 ReplaceValueWith(
SDValue(
N, 0), Tmp.first);
2711 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
2716 switch (
N->getOpcode()) {
2719 case ISD::VECREDUCE_ADD:
2720 case ISD::VECREDUCE_MUL:
2721 case ISD::VECREDUCE_AND:
2722 case ISD::VECREDUCE_OR:
2723 case ISD::VECREDUCE_XOR:
2724 case ISD::VP_REDUCE_ADD:
2725 case ISD::VP_REDUCE_MUL:
2726 case ISD::VP_REDUCE_AND:
2727 case ISD::VP_REDUCE_OR:
2728 case ISD::VP_REDUCE_XOR:
2730 case ISD::VECREDUCE_SMAX:
2731 case ISD::VECREDUCE_SMIN:
2732 case ISD::VP_REDUCE_SMAX:
2733 case ISD::VP_REDUCE_SMIN:
2735 case ISD::VECREDUCE_UMAX:
2736 case ISD::VECREDUCE_UMIN:
2737 case ISD::VP_REDUCE_UMAX:
2738 case ISD::VP_REDUCE_UMIN:
2748 return GetPromotedInteger(V);
2750 return SExtPromotedInteger(V);
2752 return ZExtPromotedInteger(V);
2758 SDValue Op = PromoteIntOpVectorReduction(
N,
N->getOperand(0));
2760 EVT OrigEltVT =
N->getOperand(0).getValueType().getVectorElementType();
2761 EVT InVT =
Op.getValueType();
2763 EVT ResVT =
N->getValueType(0);
2764 unsigned Opcode =
N->getOpcode();
2768 if (Opcode == ISD::VECREDUCE_XOR && OrigEltVT == MVT::i1 &&
2769 !TLI.isOperationLegalOrCustom(ISD::VECREDUCE_XOR, InVT) &&
2770 TLI.isOperationLegalOrCustom(ISD::VECREDUCE_ADD, InVT))
2771 Opcode = ISD::VECREDUCE_ADD;
2775 else if (Opcode == ISD::VECREDUCE_OR && OrigEltVT == MVT::i1 &&
2776 !TLI.isOperationLegalOrCustom(ISD::VECREDUCE_OR, InVT) &&
2777 TLI.isOperationLegalOrCustom(ISD::VECREDUCE_UMAX, InVT)) {
2778 Opcode = ISD::VECREDUCE_UMAX;
2781 switch (TLI.getBooleanContents(InVT)) {
2784 Op = ZExtPromotedInteger(
N->getOperand(0));
2787 Op = SExtPromotedInteger(
N->getOperand(0));
2794 else if (Opcode == ISD::VECREDUCE_AND && OrigEltVT == MVT::i1 &&
2795 !TLI.isOperationLegalOrCustom(ISD::VECREDUCE_AND, InVT) &&
2796 TLI.isOperationLegalOrCustom(ISD::VECREDUCE_UMIN, InVT)) {
2797 Opcode = ISD::VECREDUCE_UMIN;
2800 switch (TLI.getBooleanContents(InVT)) {
2803 Op = ZExtPromotedInteger(
N->getOperand(0));
2806 Op = SExtPromotedInteger(
N->getOperand(0));
2812 return DAG.getNode(Opcode, SDLoc(
N), ResVT,
Op);
2816 SDValue Reduce = DAG.getNode(Opcode, dl, EltVT,
Op);
2820SDValue DAGTypeLegalizer::PromoteIntOp_VP_REDUCE(
SDNode *
N,
unsigned OpNo) {
2827 NewOps[2] = PromoteTargetBoolean(
Op,
N->getOperand(1).getValueType());
2828 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2831 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2833 Op = PromoteIntOpVectorReduction(
N,
Op);
2837 EVT VT =
N->getValueType(0);
2838 EVT EltVT =
Op.getValueType().getScalarType();
2841 return DAG.getNode(
N->getOpcode(), SDLoc(
N), VT, NewOps);
2853 SDValue Op = ZExtPromotedInteger(
N->getOperand(1));
2854 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
Op), 0);
2857SDValue DAGTypeLegalizer::PromoteIntOp_STACKMAP(
SDNode *
N,
unsigned OpNo) {
2860 SDValue Operand =
N->getOperand(OpNo);
2861 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), Operand.
getValueType());
2863 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2866SDValue DAGTypeLegalizer::PromoteIntOp_PATCHPOINT(
SDNode *
N,
unsigned OpNo) {
2870 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), Operand.
getValueType());
2872 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2877 const Function &Fn = DAG.getMachineFunction().getFunction();
2879 "cannot use llvm.write_register with illegal type", Fn,
2881 return N->getOperand(0);
2884SDValue DAGTypeLegalizer::PromoteIntOp_VP_STRIDED(
SDNode *
N,
unsigned OpNo) {
2885 assert((
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_LOAD && OpNo == 3) ||
2886 (
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_STORE && OpNo == 4));
2889 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2891 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2894SDValue DAGTypeLegalizer::PromoteIntOp_VP_SPLICE(
SDNode *
N,
unsigned OpNo) {
2898 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2899 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2902 assert((OpNo == 4 || OpNo == 5) &&
"Unexpected operand for promotion");
2904 NewOps[OpNo] = ZExtPromotedInteger(
N->getOperand(OpNo));
2905 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2908SDValue DAGTypeLegalizer::PromoteIntOp_VECTOR_HISTOGRAM(
SDNode *
N,
2910 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2912 NewOps[1] = GetPromotedInteger(
N->getOperand(1));
2913 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2916SDValue DAGTypeLegalizer::PromoteIntOp_VECTOR_FIND_LAST_ACTIVE(
SDNode *
N,
2919 NewOps[OpNo] = GetPromotedInteger(
N->getOperand(OpNo));
2920 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2923SDValue DAGTypeLegalizer::PromoteIntOp_GET_ACTIVE_LANE_MASK(
SDNode *
N) {
2925 NewOps[0] = ZExtPromotedInteger(
N->getOperand(0));
2926 NewOps[1] = ZExtPromotedInteger(
N->getOperand(1));
2927 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2930SDValue DAGTypeLegalizer::PromoteIntOp_PARTIAL_REDUCE_MLA(
SDNode *
N) {
2932 switch (
N->getOpcode()) {
2933 case ISD::PARTIAL_REDUCE_SMLA:
2934 NewOps[1] = SExtPromotedInteger(
N->getOperand(1));
2935 NewOps[2] = SExtPromotedInteger(
N->getOperand(2));
2937 case ISD::PARTIAL_REDUCE_UMLA:
2938 NewOps[1] = ZExtPromotedInteger(
N->getOperand(1));
2939 NewOps[2] = ZExtPromotedInteger(
N->getOperand(2));
2941 case ISD::PARTIAL_REDUCE_SUMLA:
2942 NewOps[1] = SExtPromotedInteger(
N->getOperand(1));
2943 NewOps[2] = ZExtPromotedInteger(
N->getOperand(2));
2948 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2959void DAGTypeLegalizer::ExpandIntegerResult(
SDNode *
N,
unsigned ResNo) {
2965 if (CustomLowerNode(
N,
N->getValueType(ResNo),
true))
2968 switch (
N->getOpcode()) {
2971 dbgs() <<
"ExpandIntegerResult #" << ResNo <<
": ";
2972 N->dump(&DAG);
dbgs() <<
"\n";
2977 case ISD::ARITH_FENCE: SplitRes_ARITH_FENCE(
N,
Lo,
Hi);
break;
2986 case ISD::BITCAST: ExpandRes_BITCAST(
N,
Lo,
Hi);
break;
2990 case ISD::VAARG: ExpandRes_VAARG(
N,
Lo,
Hi);
break;
3021 case ISD::LLRINT: ExpandIntRes_XROUND_XRINT(
N,
Lo,
Hi);
break;
3024 case ISD::READCYCLECOUNTER:
3025 case ISD::READSTEADYCOUNTER: ExpandIntRes_READCOUNTER(
N,
Lo,
Hi);
break;
3034 case ISD::ATOMIC_LOAD: ExpandIntRes_ATOMIC_LOAD(
N,
Lo,
Hi);
break;
3036 case ISD::ATOMIC_LOAD_ADD:
3037 case ISD::ATOMIC_LOAD_SUB:
3038 case ISD::ATOMIC_LOAD_AND:
3039 case ISD::ATOMIC_LOAD_CLR:
3040 case ISD::ATOMIC_LOAD_OR:
3041 case ISD::ATOMIC_LOAD_XOR:
3042 case ISD::ATOMIC_LOAD_NAND:
3043 case ISD::ATOMIC_LOAD_MIN:
3044 case ISD::ATOMIC_LOAD_MAX:
3045 case ISD::ATOMIC_LOAD_UMIN:
3046 case ISD::ATOMIC_LOAD_UMAX:
3047 case ISD::ATOMIC_SWAP:
3048 case ISD::ATOMIC_CMP_SWAP: {
3049 std::pair<SDValue, SDValue> Tmp = ExpandAtomic(
N);
3050 SplitInteger(Tmp.first,
Lo,
Hi);
3051 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
3054 case ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS: {
3056 SDVTList VTs = DAG.getVTList(
N->getValueType(0), MVT::Other);
3057 SDValue Tmp = DAG.getAtomicCmpSwap(
3058 ISD::ATOMIC_CMP_SWAP, SDLoc(
N), AN->
getMemoryVT(), VTs,
3059 N->getOperand(0),
N->getOperand(1),
N->getOperand(2),
N->getOperand(3),
3068 SplitInteger(Tmp,
Lo,
Hi);
3135 case ISD::VECREDUCE_ADD:
3136 case ISD::VECREDUCE_MUL:
3137 case ISD::VECREDUCE_AND:
3138 case ISD::VECREDUCE_OR:
3139 case ISD::VECREDUCE_XOR:
3140 case ISD::VECREDUCE_SMAX:
3141 case ISD::VECREDUCE_SMIN:
3142 case ISD::VECREDUCE_UMAX:
3143 case ISD::VECREDUCE_UMIN: ExpandIntRes_VECREDUCE(
N,
Lo,
Hi);
break;
3147 ExpandIntRes_Rotate(
N,
Lo,
Hi);
3152 ExpandIntRes_FunnelShift(
N,
Lo,
Hi);
3156 ExpandIntRes_VSCALE(
N,
Lo,
Hi);
3160 ExpandIntRes_READ_REGISTER(
N,
Lo,
Hi);
3170std::pair <SDValue, SDValue> DAGTypeLegalizer::ExpandAtomic(
SDNode *Node) {
3171 unsigned Opc =
Node->getOpcode();
3177 EVT RetVT =
Node->getValueType(0);
3178 TargetLowering::MakeLibCallOptions CallOptions;
3180 if (TLI.getLibcallName(LC)) {
3182 Ops.push_back(
Node->getOperand(1));
3185 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
3186 "Unexpected atomic op or value type!");
3189 return TLI.makeLibCall(DAG, LC, RetVT,
Ops, CallOptions, SDLoc(Node),
3190 Node->getOperand(0));
3195void DAGTypeLegalizer::ExpandShiftByConstant(
SDNode *
N,
const APInt &Amt,
3200 GetExpandedInteger(
N->getOperand(0), InL, InH);
3215 if (Amt.
uge(VTBits)) {
3216 Lo =
Hi = DAG.getConstant(0,
DL, NVT);
3217 }
else if (Amt.
ugt(NVTBits)) {
3218 Lo = DAG.getConstant(0,
DL, NVT);
3220 DAG.getShiftAmountConstant(Amt - NVTBits, NVT,
DL));
3221 }
else if (Amt == NVTBits) {
3222 Lo = DAG.getConstant(0,
DL, NVT);
3226 DAG.getShiftAmountConstant(Amt, NVT,
DL));
3230 DAG.getShiftAmountConstant(Amt, NVT,
DL)),
3232 DAG.getShiftAmountConstant(-Amt + NVTBits, NVT,
DL)));
3238 if (Amt.
uge(VTBits)) {
3239 Lo =
Hi = DAG.getConstant(0,
DL, NVT);
3240 }
else if (Amt.
ugt(NVTBits)) {
3242 DAG.getShiftAmountConstant(Amt - NVTBits, NVT,
DL));
3243 Hi = DAG.getConstant(0,
DL, NVT);
3244 }
else if (Amt == NVTBits) {
3246 Hi = DAG.getConstant(0,
DL, NVT);
3251 DAG.getShiftAmountConstant(Amt, NVT,
DL)),
3253 DAG.getShiftAmountConstant(-Amt + NVTBits, NVT,
DL)));
3255 DAG.getShiftAmountConstant(Amt, NVT,
DL));
3261 if (Amt.
uge(VTBits)) {
3263 DAG.getShiftAmountConstant(NVTBits - 1, NVT,
DL));
3264 }
else if (Amt.
ugt(NVTBits)) {
3266 DAG.getShiftAmountConstant(Amt - NVTBits, NVT,
DL));
3268 DAG.getShiftAmountConstant(NVTBits - 1, NVT,
DL));
3269 }
else if (Amt == NVTBits) {
3272 DAG.getShiftAmountConstant(NVTBits - 1, NVT,
DL));
3277 DAG.getShiftAmountConstant(Amt, NVT,
DL)),
3279 DAG.getShiftAmountConstant(-Amt + NVTBits, NVT,
DL)));
3281 DAG.getShiftAmountConstant(Amt, NVT,
DL));
3289bool DAGTypeLegalizer::
3291 unsigned Opc =
N->getOpcode();
3294 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
3299 "Expanded integer type size not a power of two!");
3303 KnownBits Known = DAG.computeKnownBits(Amt);
3306 if (((Known.
Zero | Known.
One) & HighBitMask) == 0)
3311 GetExpandedInteger(In, InL, InH);
3318 DAG.getConstant(~HighBitMask, dl, ShTy));
3323 Lo = DAG.getConstant(0, dl, NVT);
3324 Hi = DAG.getNode(
ISD::SHL, dl, NVT, InL, Amt);
3327 Hi = DAG.getConstant(0, dl, NVT);
3328 Lo = DAG.getNode(
ISD::SRL, dl, NVT, InH, Amt);
3332 DAG.getConstant(NVTBits - 1, dl, ShTy));
3333 Lo = DAG.getNode(
ISD::SRA, dl, NVT, InH, Amt);
3345 DAG.getConstant(NVTBits - 1, dl, ShTy));
3361 SDValue Sh1 = DAG.getNode(Op2, dl, NVT, InL, DAG.getConstant(1, dl, ShTy));
3363 SDValue Sh2 = DAG.getNode(Op2, dl, NVT, Sh1, Amt2);
3365 Lo = DAG.getNode(
Opc, dl, NVT, InL, Amt);
3366 Hi = DAG.getNode(
ISD::OR, dl, NVT, DAG.getNode(Op1, dl, NVT, InH, Amt),Sh2);
3378bool DAGTypeLegalizer::
3381 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
3385 "Expanded integer type size not a power of two!");
3390 GetExpandedInteger(
N->getOperand(0), InL, InH);
3392 SDValue NVBitsNode = DAG.getConstant(NVTBits, dl, ShTy);
3395 SDValue isShort = DAG.getSetCC(dl, getSetCCResultType(ShTy),
3398 Amt, DAG.getConstant(0, dl, ShTy),
3402 switch (
N->getOpcode()) {
3408 DAG.getNode(
ISD::SHL, dl, NVT, InH, Amt),
3409 DAG.getNode(
ISD::SRL, dl, NVT, InL, AmtLack));
3412 LoL = DAG.getConstant(0, dl, NVT);
3415 Lo = DAG.getSelect(dl, NVT, isShort, LoS, LoL);
3416 Hi = DAG.getSelect(dl, NVT,
isZero, InH,
3417 DAG.getSelect(dl, NVT, isShort, HiS, HiL));
3423 DAG.getNode(
ISD::SRL, dl, NVT, InL, Amt),
3426 DAG.getNode(
ISD::SHL, dl, NVT, InH, AmtLack));
3429 HiL = DAG.getConstant(0, dl, NVT);
3432 Lo = DAG.getSelect(dl, NVT,
isZero, InL,
3433 DAG.getSelect(dl, NVT, isShort, LoS, LoL));
3434 Hi = DAG.getSelect(dl, NVT, isShort, HiS, HiL);
3440 DAG.getNode(
ISD::SRL, dl, NVT, InL, Amt),
3441 DAG.getNode(
ISD::SHL, dl, NVT, InH, AmtLack));
3445 DAG.getConstant(NVTBits - 1, dl, ShTy));
3448 Lo = DAG.getSelect(dl, NVT,
isZero, InL,
3449 DAG.getSelect(dl, NVT, isShort, LoS, LoL));
3450 Hi = DAG.getSelect(dl, NVT, isShort, HiS, HiL);
3475 EVT NewVT = getSetCCResultType(
LHS.getValueType());
3480 Res = DAG.getBoolExtOrTrunc(Res,
DL,
N->getValueType(0), NewVT);
3481 SplitInteger(Res,
Lo,
Hi);
3484void DAGTypeLegalizer::ExpandIntRes_MINMAX(
SDNode *
N,
3493 unsigned NumBits =
N->getValueType(0).getScalarSizeInBits();
3494 unsigned NumHalfBits = NumBits / 2;
3495 if (DAG.ComputeNumSignBits(
LHS) > NumHalfBits &&
3496 DAG.ComputeNumSignBits(
RHS) > NumHalfBits) {
3497 SDValue LHSL, LHSH, RHSL, RHSH;
3498 GetExpandedInteger(
LHS, LHSL, LHSH);
3499 GetExpandedInteger(
RHS, RHSL, RHSH);
3502 Lo = DAG.getNode(
N->getOpcode(),
DL, NVT, LHSL, RHSL);
3504 DAG.getShiftAmountConstant(NumHalfBits - 1, NVT,
DL));
3512 SDValue LHSL, LHSH, RHSL, RHSH;
3513 GetExpandedInteger(
LHS, LHSL, LHSH);
3514 GetExpandedInteger(
RHS, RHSL, RHSH);
3516 EVT CCT = getSetCCResultType(NVT);
3519 DAG.getSetCC(
DL, CCT, LHSH, DAG.getConstant(0,
DL, NVT),
ISD::SETLT);
3521 Lo = DAG.getSelect(
DL, NVT, HiNeg, LHSL, DAG.getAllOnesConstant(
DL, NVT));
3523 Lo = DAG.getSelect(
DL, NVT, HiNeg, DAG.getConstant(0,
DL, NVT), LHSL);
3525 Hi = DAG.getNode(
N->getOpcode(),
DL, NVT, {LHSH, RHSH});
3529 const APInt *RHSVal =
nullptr;
3531 RHSVal = &RHSConst->getAPIntValue();
3538 SDValue LHSL, LHSH, RHSL, RHSH;
3539 GetExpandedInteger(
LHS, LHSL, LHSH);
3540 GetExpandedInteger(
RHS, RHSL, RHSH);
3542 EVT CCT = getSetCCResultType(NVT);
3548 Hi = DAG.getNode(
N->getOpcode(),
DL, NVT, {LHSH, RHSH});
3551 SDValue IsHiLeft = DAG.getSetCC(
DL, CCT, LHSH, RHSH, CondC);
3555 SDValue LoCmp = DAG.getSelect(
DL, NVT, IsHiLeft, LHSL, RHSL);
3558 SDValue LoMinMax = DAG.getNode(LoOpc,
DL, NVT, {LHSL, RHSL});
3560 Lo = DAG.getSelect(
DL, NVT, IsHiEq, LoMinMax, LoCmp);
3567 switch (
N->getOpcode()) {
3594 EVT VT =
N->getValueType(0);
3595 EVT CCT = getSetCCResultType(VT);
3598 SplitInteger(Result,
Lo,
Hi);
3602 SDValue ExpandedCMP = TLI.expandCMP(
N, DAG);
3603 SplitInteger(ExpandedCMP,
Lo,
Hi);
3606void DAGTypeLegalizer::ExpandIntRes_ADDSUB(
SDNode *
N,
3610 SDValue LHSL, LHSH, RHSL, RHSH;
3611 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3612 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3615 SDValue LoOps[2] = { LHSL, RHSL };
3616 SDValue HiOps[3] = { LHSH, RHSH };
3618 bool HasOpCarry = TLI.isOperationLegalOrCustom(
3620 TLI.getTypeToExpandTo(*DAG.getContext(), NVT));
3622 SDVTList VTList = DAG.getVTList(NVT, getSetCCResultType(NVT));
3626 Hi = DAG.computeKnownBits(HiOps[2]).isZero()
3632 Hi = DAG.computeKnownBits(HiOps[2]).isZero()
3645 TLI.isOperationLegalOrCustom(
N->getOpcode() ==
ISD::ADD ?
3647 TLI.getTypeToExpandTo(*DAG.getContext(), NVT));
3650 SDVTList VTList = DAG.getVTList(NVT, MVT::Glue);
3664 TLI.isOperationLegalOrCustom(
N->getOpcode() ==
ISD::ADD ?
3666 TLI.getTypeToExpandTo(*DAG.getContext(), NVT));
3670 EVT OvfVT = getSetCCResultType(NVT);
3671 SDVTList VTList = DAG.getVTList(NVT, OvfVT);
3686 OVF = DAG.
getNode(
ISD::AND, dl, OvfVT, DAG.getConstant(1, dl, OvfVT), OVF);
3689 OVF = DAG.getZExtOrTrunc(OVF, dl, NVT);
3693 OVF = DAG.getSExtOrTrunc(OVF, dl, NVT);
3705 Cmp = DAG.getSetCC(dl, getSetCCResultType(NVT),
Lo,
3709 Cmp = DAG.getSetCC(dl, getSetCCResultType(NVT), LoOps[0],
3712 Cmp = DAG.getSetCC(dl, getSetCCResultType(NVT), LoOps[0],
3715 Cmp = DAG.getSetCC(dl, getSetCCResultType(NVT),
Lo, LoOps[0],
3720 Carry = DAG.getZExtOrTrunc(Cmp, dl, NVT);
3722 Carry = DAG.getSelect(dl, NVT, Cmp, DAG.getConstant(1, dl, NVT),
3723 DAG.getConstant(0, dl, NVT));
3726 Hi = DAG.getNode(
ISD::SUB, dl, NVT, HiOps[0], Carry);
3735 DAG.getSetCC(dl, getSetCCResultType(LoOps[0].
getValueType()),
3740 Borrow = DAG.getZExtOrTrunc(Cmp, dl, NVT);
3742 Borrow = DAG.getSelect(dl, NVT, Cmp, DAG.getConstant(1, dl, NVT),
3743 DAG.getConstant(0, dl, NVT));
3749void DAGTypeLegalizer::ExpandIntRes_ADDSUBC(
SDNode *
N,
3752 SDValue LHSL, LHSH, RHSL, RHSH;
3754 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3755 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3756 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(), MVT::Glue);
3757 SDValue LoOps[2] = { LHSL, RHSL };
3758 SDValue HiOps[3] = { LHSH, RHSH };
3772 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3775void DAGTypeLegalizer::ExpandIntRes_ADDSUBE(
SDNode *
N,
3778 SDValue LHSL, LHSH, RHSL, RHSH;
3780 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3781 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3782 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(), MVT::Glue);
3784 SDValue HiOps[3] = { LHSH, RHSH };
3786 Lo = DAG.
getNode(
N->getOpcode(), dl, VTList, LoOps);
3788 Hi = DAG.
getNode(
N->getOpcode(), dl, VTList, HiOps);
3792 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3795void DAGTypeLegalizer::ExpandIntRes_UADDSUBO(
SDNode *
N,
3803 unsigned CarryOp, NoCarryOp;
3805 switch(
N->getOpcode()) {
3820 bool HasCarryOp = TLI.isOperationLegalOrCustom(
3821 CarryOp, TLI.getTypeToExpandTo(*DAG.getContext(),
LHS.getValueType()));
3825 SDValue LHSL, LHSH, RHSL, RHSH;
3826 GetExpandedInteger(
LHS, LHSL, LHSH);
3827 GetExpandedInteger(
RHS, RHSL, RHSH);
3828 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(),
N->getValueType(1));
3829 SDValue LoOps[2] = { LHSL, RHSL };
3830 SDValue HiOps[3] = { LHSH, RHSH };
3832 Lo = DAG.
getNode(
N->getOpcode(), dl, VTList, LoOps);
3834 Hi = DAG.
getNode(CarryOp, dl, VTList, HiOps);
3841 SplitInteger(Sum,
Lo,
Hi);
3847 Ovf = DAG.getSetCC(dl,
N->getValueType(1),
Or,
3848 DAG.getConstant(0, dl,
Lo.getValueType()),
ISD::SETEQ);
3852 DAG.getSetCC(dl,
N->getValueType(1),
LHS,
3857 Ovf = DAG.getSetCC(dl,
N->getValueType(1), Sum,
LHS,
Cond);
3863 ReplaceValueWith(
SDValue(
N, 1), Ovf);
3869 SDValue LHSL, LHSH, RHSL, RHSH;
3871 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3872 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3873 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(),
N->getValueType(1));
3877 Lo = DAG.
getNode(
N->getOpcode(), dl, VTList, LoOps);
3879 Hi = DAG.
getNode(
N->getOpcode(), dl, VTList, HiOps);
3883 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3886void DAGTypeLegalizer::ExpandIntRes_SADDSUBO_CARRY(
SDNode *
N,
3889 SDValue LHSL, LHSH, RHSL, RHSH;
3891 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3892 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3893 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(),
N->getValueType(1));
3898 Lo = DAG.getNode(CarryOp, dl, VTList, { LHSL, RHSL,
N->
getOperand(2) });
3899 Hi = DAG.getNode(
N->getOpcode(), dl, VTList, { LHSH, RHSH, Lo.getValue(1) });
3903 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3906void DAGTypeLegalizer::ExpandIntRes_ANY_EXTEND(
SDNode *
N,
3908 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
3911 if (
Op.getValueType().bitsLE(NVT)) {
3914 Hi = DAG.getUNDEF(NVT);
3918 assert(getTypeAction(
Op.getValueType()) ==
3920 "Only know how to promote this result!");
3923 "Operand over promoted?");
3925 SplitInteger(Res,
Lo,
Hi);
3929void DAGTypeLegalizer::ExpandIntRes_AssertSext(
SDNode *
N,
3932 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
3933 EVT NVT =
Lo.getValueType();
3938 if (NVTBits < EVTBits) {
3941 EVTBits - NVTBits)));
3946 DAG.getConstant(NVTBits - 1, dl,
3947 TLI.getPointerTy(DAG.getDataLayout())));
3951void DAGTypeLegalizer::ExpandIntRes_AssertZext(
SDNode *
N,
3954 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
3955 EVT NVT =
Lo.getValueType();
3960 if (NVTBits < EVTBits) {
3963 EVTBits - NVTBits)));
3967 Hi = DAG.getConstant(0, dl, NVT);
3971void DAGTypeLegalizer::ExpandIntRes_BITREVERSE(
SDNode *
N,
3974 GetExpandedInteger(
N->getOperand(0),
Hi,
Lo);
3979void DAGTypeLegalizer::ExpandIntRes_BSWAP(
SDNode *
N,
3982 GetExpandedInteger(
N->getOperand(0),
Hi,
Lo);
3991 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
3992 EVT NVT =
Lo.getValueType();
3995 Hi = DAG.getConstant(0, dl, NVT);
3998void DAGTypeLegalizer::ExpandIntRes_Constant(
SDNode *
N,
4000 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
4003 const APInt &Cst =
Constant->getAPIntValue();
4004 bool IsTarget =
Constant->isTargetOpcode();
4005 bool IsOpaque =
Constant->isOpaque();
4007 Lo = DAG.getConstant(Cst.
trunc(NBitWidth), dl, NVT, IsTarget, IsOpaque);
4008 Hi = DAG.getConstant(Cst.
lshr(NBitWidth).
trunc(NBitWidth), dl, NVT, IsTarget,
4016 GetExpandedInteger(N0,
Lo,
Hi);
4017 EVT NVT =
Lo.getValueType();
4023 Hi = DAG.getConstant(0, dl, NVT);
4033 bool HasSubCarry = TLI.isOperationLegalOrCustom(
4038 DAG.getShiftAmountConstant(NVT.
getSizeInBits() - 1, NVT, dl));
4039 SDVTList VTList = DAG.getVTList(NVT, getSetCCResultType(NVT));
4048 EVT VT =
N->getValueType(0);
4050 DAG.getConstant(0, dl, VT), N0);
4052 SplitInteger(Neg, NegLo, NegHi);
4054 SDValue HiIsNeg = DAG.getSetCC(dl, getSetCCResultType(NVT),
Hi,
4056 Lo = DAG.getSelect(dl, NVT, HiIsNeg, NegLo,
Lo);
4057 Hi = DAG.getSelect(dl, NVT, HiIsNeg, NegHi,
Hi);
4060void DAGTypeLegalizer::ExpandIntRes_CTLZ(
SDNode *
N,
4064 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
4065 EVT NVT =
Lo.getValueType();
4067 SDValue HiNotZero = DAG.getSetCC(dl, getSetCCResultType(NVT),
Hi,
4070 SDValue LoLZ = DAG.getNode(
N->getOpcode(), dl, NVT,
Lo);
4073 Lo = DAG.getSelect(dl, NVT, HiNotZero, HiLZ,
4074 DAG.getNode(
ISD::ADD, dl, NVT, LoLZ,
4077 Hi = DAG.getConstant(0, dl, NVT);
4082 SplitInteger(Result,
Lo,
Hi);
4087 EVT VT =
N->getValueType(0);
4091 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
4093 LC = RTLIB::CTPOP_I32;
4094 else if (VT == MVT::i64)
4095 LC = RTLIB::CTPOP_I64;
4096 else if (VT == MVT::i128)
4097 LC = RTLIB::CTPOP_I128;
4098 assert(LC != RTLIB::UNKNOWN_LIBCALL && TLI.getLibcallName(LC) &&
4099 "LibCall explicitly requested, but not available");
4100 TargetLowering::MakeLibCallOptions CallOptions;
4103 SDValue Res = TLI.makeLibCall(DAG, LC, IntVT,
Op, CallOptions,
DL).first;
4104 SplitInteger(DAG.getSExtOrTrunc(Res,
DL, VT),
Lo,
Hi);
4109 GetExpandedInteger(
Op,
Lo,
Hi);
4110 EVT NVT =
Lo.getValueType();
4113 Hi = DAG.getConstant(0,
DL, NVT);
4116void DAGTypeLegalizer::ExpandIntRes_CTTZ(
SDNode *
N,
4120 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
4121 EVT NVT =
Lo.getValueType();
4123 SDValue LoNotZero = DAG.getSetCC(dl, getSetCCResultType(NVT),
Lo,
4129 Lo = DAG.getSelect(dl, NVT, LoNotZero, LoLZ,
4130 DAG.getNode(
ISD::ADD, dl, NVT, HiLZ,
4133 Hi = DAG.getConstant(0, dl, NVT);
4139 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
4146 DAG.getShiftAmountConstant(NBitWidth - 1, NVT, dl));
4150 ReplaceValueWith(
SDValue(
N, 1), Chain);
4158 Chain =
Op.getValue(1);
4167 EVT VT =
N->getValueType(0);
4171 bool IsStrict =
N->isStrictFPOpcode();
4173 SDValue Op =
N->getOperand(IsStrict ? 1 : 0);
4175 Op = GetPromotedFloat(
Op);
4179 Op.getValueType() == MVT::bf16) {
4185 EVT OpVT =
Op.getValueType();
4189 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected fp-to-xint conversion!");
4190 TargetLowering::MakeLibCallOptions CallOptions;
4195 std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(DAG, LC, VT,
Op,
4196 CallOptions, dl, Chain);
4197 SplitInteger(Tmp.first,
Lo,
Hi);
4200 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
4205 SDValue Res = TLI.expandFP_TO_INT_SAT(
N, DAG);
4206 SplitInteger(Res,
Lo,
Hi);
4212 bool IsStrict =
N->isStrictFPOpcode();
4213 SDValue Op =
N->getOperand(IsStrict ? 1 : 0);
4217 "Input type needs to be promoted!");
4219 EVT VT =
Op.getValueType();
4221 if (VT == MVT::f16) {
4227 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
4228 if (
N->getOpcode() == ISD::LROUND ||
4231 LC = RTLIB::LROUND_F32;
4232 else if (VT == MVT::f64)
4233 LC = RTLIB::LROUND_F64;
4234 else if (VT == MVT::f80)
4235 LC = RTLIB::LROUND_F80;
4236 else if (VT == MVT::f128)
4237 LC = RTLIB::LROUND_F128;
4238 else if (VT == MVT::ppcf128)
4239 LC = RTLIB::LROUND_PPCF128;
4240 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected lround input type!");
4241 }
else if (
N->getOpcode() == ISD::LRINT ||
4244 LC = RTLIB::LRINT_F32;
4245 else if (VT == MVT::f64)
4246 LC = RTLIB::LRINT_F64;
4247 else if (VT == MVT::f80)
4248 LC = RTLIB::LRINT_F80;
4249 else if (VT == MVT::f128)
4250 LC = RTLIB::LRINT_F128;
4251 else if (VT == MVT::ppcf128)
4252 LC = RTLIB::LRINT_PPCF128;
4253 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected lrint input type!");
4254 }
else if (
N->getOpcode() == ISD::LLROUND ||
4257 LC = RTLIB::LLROUND_F32;
4258 else if (VT == MVT::f64)
4259 LC = RTLIB::LLROUND_F64;
4260 else if (VT == MVT::f80)
4261 LC = RTLIB::LLROUND_F80;
4262 else if (VT == MVT::f128)
4263 LC = RTLIB::LLROUND_F128;
4264 else if (VT == MVT::ppcf128)
4265 LC = RTLIB::LLROUND_PPCF128;
4266 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected llround input type!");
4267 }
else if (
N->getOpcode() == ISD::LLRINT ||
4270 LC = RTLIB::LLRINT_F32;
4271 else if (VT == MVT::f64)
4272 LC = RTLIB::LLRINT_F64;
4273 else if (VT == MVT::f80)
4274 LC = RTLIB::LLRINT_F80;
4275 else if (VT == MVT::f128)
4276 LC = RTLIB::LLRINT_F128;
4277 else if (VT == MVT::ppcf128)
4278 LC = RTLIB::LLRINT_PPCF128;
4279 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected llrint input type!");
4283 EVT RetVT =
N->getValueType(0);
4285 TargetLowering::MakeLibCallOptions CallOptions;
4287 std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(DAG, LC, RetVT,
4288 Op, CallOptions, dl,
4290 SplitInteger(Tmp.first,
Lo,
Hi);
4292 if (
N->isStrictFPOpcode())
4293 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
4296void DAGTypeLegalizer::ExpandIntRes_LOAD(
LoadSDNode *
N,
4298 assert(!
N->isAtomic() &&
"Should have been a ATOMIC_LOAD?");
4301 ExpandRes_NormalLoad(
N,
Lo,
Hi);
4307 EVT VT =
N->getValueType(0);
4308 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
4313 AAMDNodes AAInfo =
N->getAAInfo();
4318 if (
N->getMemoryVT().bitsLE(NVT)) {
4319 EVT MemVT =
N->getMemoryVT();
4321 Lo = DAG.getExtLoad(ExtType, dl, NVT, Ch,
Ptr,
N->getPointerInfo(), MemVT,
4322 N->getBaseAlign(), MMOFlags, AAInfo);
4330 unsigned LoSize =
Lo.getValueSizeInBits();
4332 DAG.getConstant(LoSize - 1, dl,
4333 TLI.getPointerTy(DAG.getDataLayout())));
4336 Hi = DAG.getConstant(0, dl, NVT);
4340 Hi = DAG.getUNDEF(NVT);
4342 }
else if (DAG.getDataLayout().isLittleEndian()) {
4344 Lo = DAG.getLoad(NVT, dl, Ch,
Ptr,
N->getPointerInfo(),
N->getBaseAlign(),
4347 unsigned ExcessBits =
4354 Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch,
Ptr,
4355 N->getPointerInfo().getWithOffset(IncrementSize), NEVT,
4356 N->getBaseAlign(), MMOFlags, AAInfo);
4365 EVT MemVT =
N->getMemoryVT();
4368 unsigned ExcessBits = (EBytes - IncrementSize)*8;
4371 Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch,
Ptr,
N->getPointerInfo(),
4374 N->getBaseAlign(), MMOFlags, AAInfo);
4380 N->getPointerInfo().getWithOffset(IncrementSize),
4382 N->getBaseAlign(), MMOFlags, AAInfo);
4394 DAG.getConstant(ExcessBits, dl,
4395 TLI.getPointerTy(DAG.getDataLayout()))));
4400 TLI.getPointerTy(DAG.getDataLayout())));
4406 ReplaceValueWith(
SDValue(
N, 1), Ch);
4409void DAGTypeLegalizer::ExpandIntRes_Logical(
SDNode *
N,
4413 GetExpandedInteger(
N->getOperand(0), LL, LH);
4414 GetExpandedInteger(
N->getOperand(1), RL, RH);
4418 Flags.setDisjoint(
N->getFlags().hasDisjoint());
4420 Lo = DAG.getNode(
N->getOpcode(), dl, LL.
getValueType(), LL, RL, Flags);
4421 Hi = DAG.getNode(
N->getOpcode(), dl, LL.
getValueType(), LH, RH, Flags);
4424void DAGTypeLegalizer::ExpandIntRes_MUL(
SDNode *
N,
4426 EVT VT =
N->getValueType(0);
4427 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
4431 GetExpandedInteger(
N->getOperand(0), LL, LH);
4432 GetExpandedInteger(
N->getOperand(1), RL, RH);
4434 if (TLI.expandMUL(
N,
Lo,
Hi, NVT, DAG,
4440 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
4442 LC = RTLIB::MUL_I16;
4443 else if (VT == MVT::i32)
4444 LC = RTLIB::MUL_I32;
4445 else if (VT == MVT::i64)
4446 LC = RTLIB::MUL_I64;
4447 else if (VT == MVT::i128)
4448 LC = RTLIB::MUL_I128;
4450 if (LC == RTLIB::UNKNOWN_LIBCALL || !TLI.getLibcallName(LC)) {
4453 TLI.forceExpandMultiply(DAG, dl,
false,
Lo,
Hi, LL, RL, LH, RH);
4459 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
4460 TargetLowering::MakeLibCallOptions CallOptions;
4462 SplitInteger(TLI.makeLibCall(DAG, LC, VT,
Ops, CallOptions, dl).first,
4469 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
4470 SDVTList VTs = DAG.getVTList(NVT, NVT, MVT::Other);
4471 SDValue R = DAG.getNode(
N->getOpcode(),
DL, VTs,
N->getOperand(0));
4474 ReplaceValueWith(
SDValue(
N, 1),
R.getValue(2));
4479 SplitInteger(Result,
Lo,
Hi);
4485 SplitInteger(Result,
Lo,
Hi);
4491 SplitInteger(Result,
Lo,
Hi);
4502 EVT VT =
N->getValueType(0);
4506 uint64_t Scale =
N->getConstantOperandVal(2);
4518 EVT BoolVT = getSetCCResultType(VT);
4520 Result = DAG.getNode(MulOp, dl, DAG.getVTList(VT, BoolVT),
LHS,
RHS);
4526 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
4527 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
4533 Result = DAG.getSelect(dl, VT, ProdNeg, SatMin, SatMax);
4534 Result = DAG.getSelect(dl, VT, Overflow, Result, Product);
4539 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
4540 Result = DAG.getSelect(dl, VT, Overflow, SatMax, Product);
4543 SplitInteger(Result,
Lo,
Hi);
4549 assert(Scale <= VTSize &&
"Scale can't be larger than the value type size.");
4551 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
4553 GetExpandedInteger(
LHS, LL, LH);
4554 GetExpandedInteger(
RHS, RL, RH);
4558 if (!TLI.expandMUL_LOHI(LoHiOp, VT, dl,
LHS,
RHS, Result, NVT, DAG,
4565 TLI.forceExpandWideMUL(DAG, dl,
Signed,
LHS,
RHS, LoTmp, HiTmp);
4566 SplitInteger(LoTmp, Result[0], Result[1]);
4567 SplitInteger(HiTmp, Result[2], Result[3]);
4569 assert(
Result.size() == 4 &&
"Unexpected number of partlets in the result");
4572 assert((VTSize == NVTSize * 2) &&
"Expected the new value type to be half "
4573 "the size of the current value type");
4594 uint64_t Part0 = Scale / NVTSize;
4595 if (Scale % NVTSize) {
4596 SDValue ShiftAmount = DAG.getShiftAmountConstant(Scale % NVTSize, NVT, dl);
4599 Hi = DAG.getNode(
ISD::FSHR, dl, NVT, Result[Part0 + 2], Result[Part0 + 1],
4611 if (Scale == VTSize)
4630 SDValue NVTZero = DAG.getConstant(0, dl, NVT);
4631 SDValue NVTNeg1 = DAG.getAllOnesConstant(dl, NVT);
4632 EVT BoolNVT = getSetCCResultType(NVT);
4635 if (Scale < NVTSize) {
4638 DAG.getNode(
ISD::SRL, dl, NVT, ResultHL,
4639 DAG.getShiftAmountConstant(Scale, NVT, dl));
4640 SDValue Tmp = DAG.getNode(
ISD::OR, dl, NVT, HLAdjusted, ResultHH);
4641 SatMax = DAG.getSetCC(dl, BoolNVT, Tmp, NVTZero,
ISD::SETNE);
4642 }
else if (Scale == NVTSize) {
4644 SatMax = DAG.getSetCC(dl, BoolNVT, ResultHH, NVTZero,
ISD::SETNE);
4645 }
else if (Scale < VTSize) {
4649 DAG.getShiftAmountConstant(Scale - NVTSize, NVT, dl));
4650 SatMax = DAG.getSetCC(dl, BoolNVT, HLAdjusted, NVTZero,
ISD::SETNE);
4653 "(and saturation can't happen with Scale==VTSize).");
4655 Hi = DAG.getSelect(dl, NVT, SatMax, NVTNeg1,
Hi);
4656 Lo = DAG.getSelect(dl, NVT, SatMax, NVTNeg1,
Lo);
4660 if (Scale < NVTSize) {
4665 unsigned OverflowBits = VTSize - Scale + 1;
4666 assert(OverflowBits <= VTSize && OverflowBits > NVTSize &&
4667 "Extent of overflow bits must start within HL");
4668 SDValue HLHiMask = DAG.getConstant(
4670 SDValue HLLoMask = DAG.getConstant(
4677 DAG.getNode(
ISD::AND, dl, BoolNVT, HHEQ0, HLUGT));
4683 DAG.getNode(
ISD::AND, dl, BoolNVT, HHEQ, HLULT));
4684 }
else if (Scale == NVTSize) {
4690 DAG.getNode(
ISD::AND, dl, BoolNVT, HHEQ0, HLNeg));
4696 DAG.getNode(
ISD::AND, dl, BoolNVT, HHEQ, HLPos));
4697 }
else if (Scale < VTSize) {
4700 unsigned OverflowBits = VTSize - Scale + 1;
4701 SDValue HHHiMask = DAG.getConstant(
4703 SDValue HHLoMask = DAG.getConstant(
4705 SatMax = DAG.getSetCC(dl, BoolNVT, ResultHH, HHLoMask,
ISD::SETGT);
4706 SatMin = DAG.getSetCC(dl, BoolNVT, ResultHH, HHHiMask,
ISD::SETLT);
4713 Hi = DAG.getSelect(dl, NVT, SatMax, DAG.getConstant(MaxHi, dl, NVT),
Hi);
4714 Lo = DAG.getSelect(dl, NVT, SatMax, DAG.getConstant(MaxLo, dl, NVT),
Lo);
4717 Hi = DAG.getSelect(dl, NVT, SatMin, DAG.getConstant(MinHi, dl, NVT),
Hi);
4718 Lo = DAG.getSelect(dl, NVT, SatMin, NVTZero,
Lo);
4725 SDValue Res = TLI.expandFixedPointDiv(
N->getOpcode(), dl,
N->getOperand(0),
4727 N->getConstantOperandVal(2), DAG);
4731 N->getConstantOperandVal(2), TLI, DAG);
4732 SplitInteger(Res,
Lo,
Hi);
4735void DAGTypeLegalizer::ExpandIntRes_SADDSUBO(
SDNode *Node,
4738 "Node has unexpected Opcode");
4748 bool HasCarryOp = TLI.isOperationLegalOrCustom(
4749 CarryOp, TLI.getTypeToExpandTo(*DAG.getContext(),
LHS.getValueType()));
4753 SDValue LHSL, LHSH, RHSL, RHSH;
4754 GetExpandedInteger(
LHS, LHSL, LHSH);
4755 GetExpandedInteger(
RHS, RHSL, RHSH);
4756 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(),
Node->getValueType(1));
4759 Hi = DAG.getNode(CarryOp, dl, VTList, { LHSH, RHSH,
Lo.
getValue(1) });
4768 SplitInteger(Sum,
Lo,
Hi);
4793 EVT VT =
LHS.getValueType();
4796 SignsMatch = DAG.getNOT(dl, SignsMatch, VT);
4800 EVT OType =
Node->getValueType(1);
4801 Ovf = DAG.getSetCC(dl, OType, Ovf, DAG.getConstant(0, dl, VT),
ISD::SETLT);
4805 ReplaceValueWith(
SDValue(Node, 1), Ovf);
4808void DAGTypeLegalizer::ExpandIntRes_SDIV(
SDNode *
N,
4810 EVT VT =
N->getValueType(0);
4812 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
4820 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
4822 LC = RTLIB::SDIV_I16;
4823 else if (VT == MVT::i32)
4824 LC = RTLIB::SDIV_I32;
4825 else if (VT == MVT::i64)
4826 LC = RTLIB::SDIV_I64;
4827 else if (VT == MVT::i128)
4828 LC = RTLIB::SDIV_I128;
4829 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported SDIV!");
4831 TargetLowering::MakeLibCallOptions CallOptions;
4833 SplitInteger(TLI.makeLibCall(DAG, LC, VT,
Ops, CallOptions, dl).first,
Lo,
Hi);
4836void DAGTypeLegalizer::ExpandIntRes_ShiftThroughStack(
SDNode *
N,
SDValue &
Lo,
4839 SDValue Shiftee =
N->getOperand(0);
4846 LoadVT = TLI.getTypeToTransformTo(*DAG.getContext(), LoadVT);
4847 }
while (!TLI.isTypeLegal(LoadVT));
4852 "Shifting unit is not a a power of two!");
4854 const bool IsOneStepShift =
4855 DAG.computeKnownBits(ShAmt).countMinTrailingZeros() >=
4860 if (!IsOneStepShift)
4861 ShAmt = DAG.getFreeze(ShAmt);
4864 assert(VTBitWidth % 8 == 0 &&
"Shifting a not byte multiple value?");
4865 unsigned VTByteWidth = VTBitWidth / 8;
4867 "Shiftee type size is not a power of two!");
4868 unsigned StackSlotByteWidth = 2 * VTByteWidth;
4869 unsigned StackSlotBitWidth = 8 * StackSlotByteWidth;
4874 Align StackAlign = DAG.getReducedAlign(StackSlotVT,
false);
4876 DAG.CreateStackTemporary(StackSlotVT.
getStoreSize(), StackAlign);
4877 EVT PtrTy =
StackPtr.getValueType();
4878 SDValue Ch = DAG.getEntryNode();
4881 DAG.getMachineFunction(),
4887 unsigned WideningOpc =
4889 Init = DAG.
getNode(WideningOpc, dl, StackSlotVT, Shiftee);
4892 SDValue AllZeros = DAG.getConstant(0, dl, VT);
4896 Ch = DAG.getStore(Ch, dl, Init, StackPtr, StackPtrInfo, StackAlign);
4902 Flags.setExact(IsOneStepShift);
4905 DAG.getConstant(
Log2_32(ShiftUnitInBits), dl, ShAmtVT), Flags);
4907 DAG.getNode(
ISD::SHL, dl, ShAmtVT, SrlTmp,
4908 DAG.getConstant(
Log2_32(ShiftUnitInBits), dl, ShAmtVT));
4911 DAG.getNode(
ISD::SRL, dl, ShAmtVT, BitOffset,
4916 DAG.getConstant(VTByteWidth - 1, dl, ShAmtVT));
4923 if (DAG.getDataLayout().isBigEndian())
4924 WillIndexUpwards = !WillIndexUpwards;
4927 if (WillIndexUpwards) {
4930 AdjStackPtr = DAG.getMemBasePlusOffset(
4931 StackPtr, DAG.getConstant(VTByteWidth, dl, PtrTy), dl);
4932 ByteOffset = DAG.getNegative(ByteOffset, dl, ShAmtVT);
4936 ByteOffset = DAG.getSExtOrTrunc(ByteOffset, dl, PtrTy);
4937 AdjStackPtr = DAG.getMemBasePlusOffset(AdjStackPtr, ByteOffset, dl);
4941 DAG.getLoad(VT, dl, Ch, AdjStackPtr,
4946 if (!IsOneStepShift) {
4948 DAG.getNode(
ISD::AND, dl, ShAmtVT, ShAmt,
4949 DAG.getConstant(ShiftUnitInBits - 1, dl, ShAmtVT));
4950 Res = DAG.
getNode(
N->getOpcode(), dl, VT, Res, ShAmtRem);
4954 SplitInteger(Res,
Lo,
Hi);
4957void DAGTypeLegalizer::ExpandIntRes_Shift(
SDNode *
N,
4959 EVT VT =
N->getValueType(0);
4960 unsigned Opc =
N->getOpcode();
4966 return ExpandShiftByConstant(
N, CN->getAPIntValue(),
Lo,
Hi);
4970 if (ExpandShiftWithKnownAmountBit(
N,
Lo,
Hi))
4987 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
4989 const bool LegalOrCustom =
4993 unsigned ExpansionFactor = 1;
4995 for (EVT TmpVT = NVT;;) {
4996 EVT NewTMPVT = TLI.getTypeToTransformTo(*DAG.getContext(), TmpVT);
4997 if (NewTMPVT == TmpVT)
5004 TLI.preferredShiftLegalizationStrategy(DAG,
N, ExpansionFactor);
5007 return ExpandIntRes_ShiftThroughStack(
N,
Lo,
Hi);
5009 if (LegalOrCustom &&
5013 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
5019 SDValue ShiftOp =
N->getOperand(1);
5020 EVT ShiftTy = TLI.getShiftAmountTy(VT, DAG.getDataLayout());
5022 ShiftOp = DAG.getZExtOrTrunc(ShiftOp, dl, ShiftTy);
5025 Lo = DAG.
getNode(PartsOpc, dl, DAG.getVTList(VT, VT),
Ops);
5026 Hi =
Lo.getValue(1);
5031 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
5036 LC = RTLIB::SHL_I16;
5037 else if (VT == MVT::i32)
5038 LC = RTLIB::SHL_I32;
5039 else if (VT == MVT::i64)
5040 LC = RTLIB::SHL_I64;
5041 else if (VT == MVT::i128)
5042 LC = RTLIB::SHL_I128;
5046 LC = RTLIB::SRL_I16;
5047 else if (VT == MVT::i32)
5048 LC = RTLIB::SRL_I32;
5049 else if (VT == MVT::i64)
5050 LC = RTLIB::SRL_I64;
5051 else if (VT == MVT::i128)
5052 LC = RTLIB::SRL_I128;
5057 LC = RTLIB::SRA_I16;
5058 else if (VT == MVT::i32)
5059 LC = RTLIB::SRA_I32;
5060 else if (VT == MVT::i64)
5061 LC = RTLIB::SRA_I64;
5062 else if (VT == MVT::i128)
5063 LC = RTLIB::SRA_I128;
5066 if (LC != RTLIB::UNKNOWN_LIBCALL && TLI.getLibcallName(LC)) {
5069 SDValue ShAmt = DAG.getZExtOrTrunc(
N->getOperand(1), dl, ShAmtTy);
5071 TargetLowering::MakeLibCallOptions CallOptions;
5073 SplitInteger(TLI.makeLibCall(DAG, LC, VT,
Ops, CallOptions, dl).first,
Lo,
Hi);
5077 if (!ExpandShiftWithUnknownAmountBit(
N,
Lo,
Hi))
5081void DAGTypeLegalizer::ExpandIntRes_SIGN_EXTEND(
SDNode *
N,
5083 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
5086 if (
Op.getValueType().bitsLE(NVT)) {
5093 DAG.getConstant(LoSize - 1, dl, TLI.getPointerTy(DAG.getDataLayout())));
5097 assert(getTypeAction(
Op.getValueType()) ==
5099 "Only know how to promote this result!");
5102 "Operand over promoted?");
5104 SplitInteger(Res,
Lo,
Hi);
5112void DAGTypeLegalizer::
5115 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
5118 if (EVT.
bitsLE(
Lo.getValueType())) {
5126 DAG.getConstant(
Hi.getValueSizeInBits() - 1, dl,
5127 TLI.getPointerTy(DAG.getDataLayout())));
5138void DAGTypeLegalizer::ExpandIntRes_SREM(
SDNode *
N,
5140 EVT VT =
N->getValueType(0);
5142 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
5150 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
5152 LC = RTLIB::SREM_I16;
5153 else if (VT == MVT::i32)
5154 LC = RTLIB::SREM_I32;
5155 else if (VT == MVT::i64)
5156 LC = RTLIB::SREM_I64;
5157 else if (VT == MVT::i128)
5158 LC = RTLIB::SREM_I128;
5159 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported SREM!");
5161 TargetLowering::MakeLibCallOptions CallOptions;
5163 SplitInteger(TLI.makeLibCall(DAG, LC, VT,
Ops, CallOptions, dl).first,
Lo,
Hi);
5166void DAGTypeLegalizer::ExpandIntRes_TRUNCATE(
SDNode *
N,
5168 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
5171 Hi = DAG.getNode(
ISD::SRL, dl,
N->getOperand(0).getValueType(),
5174 TLI.getPointerTy(DAG.getDataLayout())));
5178void DAGTypeLegalizer::ExpandIntRes_XMULO(
SDNode *
N,
5180 EVT VT =
N->getValueType(0);
5199 SDValue LHSHigh, LHSLow, RHSHigh, RHSLow;
5200 GetExpandedInteger(
LHS, LHSLow, LHSHigh);
5201 GetExpandedInteger(
RHS, RHSLow, RHSHigh);
5203 EVT BitVT =
N->getValueType(1);
5204 SDVTList VTHalfWithO = DAG.getVTList(HalfVT, BitVT);
5206 SDValue HalfZero = DAG.getConstant(0, dl, HalfVT);
5208 DAG.getSetCC(dl, BitVT, LHSHigh, HalfZero,
ISD::SETNE),
5209 DAG.getSetCC(dl, BitVT, RHSHigh, HalfZero,
ISD::SETNE));
5228 SplitInteger(Three,
Lo,
Hi);
5232 ReplaceValueWith(
SDValue(
N, 1), Overflow);
5237 EVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
5241 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
5243 LC = RTLIB::MULO_I32;
5244 else if (VT == MVT::i64)
5245 LC = RTLIB::MULO_I64;
5246 else if (VT == MVT::i128)
5247 LC = RTLIB::MULO_I128;
5251 if (LC == RTLIB::UNKNOWN_LIBCALL || !TLI.getLibcallName(LC) ||
5252 TLI.getLibcallName(LC) == DAG.getMachineFunction().getName()) {
5255 TLI.forceExpandWideMUL(DAG, dl,
true,
N->getOperand(0),
5256 N->getOperand(1), MulLo, MulHi);
5258 DAG.getNode(
ISD::SRA, dl, VT, MulLo,
5261 DAG.getSetCC(dl,
N->getValueType(1), MulHi, SRA,
ISD::SETNE);
5262 SplitInteger(MulLo,
Lo,
Hi);
5263 ReplaceValueWith(
SDValue(
N, 1), Overflow);
5267 SDValue Temp = DAG.CreateStackTemporary(PtrVT);
5270 DAG.getStore(DAG.getEntryNode(), dl, DAG.getConstant(0, dl, PtrVT), Temp,
5271 MachinePointerInfo());
5275 EVT ArgVT =
Op.getValueType();
5277 TargetLowering::ArgListEntry
Entry(
Op, ArgTy);
5278 Entry.IsSExt =
true;
5279 Entry.IsZExt =
false;
5280 Args.push_back(Entry);
5284 TargetLowering::ArgListEntry
Entry(
5286 Entry.IsSExt =
true;
5287 Entry.IsZExt =
false;
5288 Args.push_back(Entry);
5290 SDValue Func = DAG.getExternalSymbol(TLI.getLibcallName(LC), PtrVT);
5292 TargetLowering::CallLoweringInfo CLI(DAG);
5295 .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Func, std::move(Args))
5298 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
5300 SplitInteger(CallInfo.first,
Lo,
Hi);
5302 DAG.getLoad(PtrVT, dl, CallInfo.second, Temp, MachinePointerInfo());
5303 SDValue Ofl = DAG.getSetCC(dl,
N->getValueType(1), Temp2,
5304 DAG.getConstant(0, dl, PtrVT),
5307 ReplaceValueWith(
SDValue(
N, 1), Ofl);
5310void DAGTypeLegalizer::ExpandIntRes_UDIV(
SDNode *
N,
5312 EVT VT =
N->getValueType(0);
5314 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
5324 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
5326 if (isTypeLegal(NVT)) {
5328 GetExpandedInteger(
N->getOperand(0), InL, InH);
5330 if (TLI.expandDIVREMByConstant(
N, Result, NVT, DAG, InL, InH)) {
5338 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
5340 LC = RTLIB::UDIV_I16;
5341 else if (VT == MVT::i32)
5342 LC = RTLIB::UDIV_I32;
5343 else if (VT == MVT::i64)
5344 LC = RTLIB::UDIV_I64;
5345 else if (VT == MVT::i128)
5346 LC = RTLIB::UDIV_I128;
5347 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported UDIV!");
5349 TargetLowering::MakeLibCallOptions CallOptions;
5350 SplitInteger(TLI.makeLibCall(DAG, LC, VT,
Ops, CallOptions, dl).first,
Lo,
Hi);
5353void DAGTypeLegalizer::ExpandIntRes_UREM(
SDNode *
N,
5355 EVT VT =
N->getValueType(0);
5357 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
5367 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
5369 if (isTypeLegal(NVT)) {
5371 GetExpandedInteger(
N->getOperand(0), InL, InH);
5373 if (TLI.expandDIVREMByConstant(
N, Result, NVT, DAG, InL, InH)) {
5381 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
5383 LC = RTLIB::UREM_I16;
5384 else if (VT == MVT::i32)
5385 LC = RTLIB::UREM_I32;
5386 else if (VT == MVT::i64)
5387 LC = RTLIB::UREM_I64;
5388 else if (VT == MVT::i128)
5389 LC = RTLIB::UREM_I128;
5390 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported UREM!");
5392 TargetLowering::MakeLibCallOptions CallOptions;
5393 SplitInteger(TLI.makeLibCall(DAG, LC, VT,
Ops, CallOptions, dl).first,
Lo,
Hi);
5396void DAGTypeLegalizer::ExpandIntRes_ZERO_EXTEND(
SDNode *
N,
5398 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
5401 if (
Op.getValueType().bitsLE(NVT)) {
5404 Hi = DAG.getConstant(0, dl, NVT);
5408 assert(getTypeAction(
Op.getValueType()) ==
5410 "Only know how to promote this result!");
5413 "Operand over promoted?");
5415 SplitInteger(Res,
Lo,
Hi);
5417 Hi = DAG.getZeroExtendInReg(
Hi, dl,
5423void DAGTypeLegalizer::ExpandIntRes_ATOMIC_LOAD(
SDNode *
N,
5427 SDVTList VTs = DAG.getVTList(VT, MVT::i1, MVT::Other);
5429 SDValue Swap = DAG.getAtomicCmpSwap(
5430 ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS, dl,
5438void DAGTypeLegalizer::ExpandIntRes_VECREDUCE(
SDNode *
N,
5442 SDValue Res = TLI.expandVecReduce(
N, DAG);
5443 SplitInteger(Res,
Lo,
Hi);
5446void DAGTypeLegalizer::ExpandIntRes_Rotate(
SDNode *
N,
5452 N->getOperand(0),
N->getOperand(1));
5453 SplitInteger(Res,
Lo,
Hi);
5460 GetExpandedInteger(
N->getOperand(0), In3, In4);
5461 GetExpandedInteger(
N->getOperand(1), In1, In2);
5465 unsigned Opc =
N->getOpcode();
5468 EVT ShAmtCCVT = getSetCCResultType(ShAmtVT);
5473 DAG.getConstant(HalfVTBits,
DL, ShAmtVT));
5475 DAG.getSetCC(
DL, ShAmtCCVT, AndNode, DAG.getConstant(0,
DL, ShAmtVT),
5479 EVT NewShAmtVT = TLI.getShiftAmountTy(HalfVT, DAG.getDataLayout());
5480 SDValue NewShAmt = DAG.getAnyExtOrTrunc(ShAmt,
DL, NewShAmtVT);
5485 Lo = DAG.getNode(
Opc,
DL, HalfVT, Select2, Select1, NewShAmt);
5486 Hi = DAG.getNode(
Opc,
DL, HalfVT, Select3, Select2, NewShAmt);
5491 EVT VT =
N->getValueType(0);
5498 SDValue VScaleBase = DAG.getVScale(dl, HalfVT, One);
5501 SplitInteger(Res,
Lo,
Hi);
5508 "cannot use llvm.read_register with illegal type", Fn,
N->getDebugLoc()));
5509 ReplaceValueWith(
SDValue(
N, 1),
N->getOperand(0));
5511 std::tie(LoVT, HiVT) = DAG.GetSplitDestVTs(
N->getValueType(0));
5512 Lo = DAG.getPOISON(LoVT);
5513 Hi = DAG.getPOISON(HiVT);
5524bool DAGTypeLegalizer::ExpandIntegerOperand(
SDNode *
N,
unsigned OpNo) {
5528 if (CustomLowerNode(
N,
N->getOperand(OpNo).getValueType(),
false))
5531 switch (
N->getOpcode()) {
5534 dbgs() <<
"ExpandIntegerOperand Op #" << OpNo <<
": ";
5535 N->dump(&DAG);
dbgs() <<
"\n";
5539 case ISD::BITCAST: Res = ExpandOp_BITCAST(
N);
break;
5540 case ISD::BR_CC: Res = ExpandIntOp_BR_CC(
N);
break;
5544 Res = ExpandOp_FAKE_USE(
N);
5548 case ISD::EXPERIMENTAL_VP_SPLAT:
5551 case ISD::SETCC: Res = ExpandIntOp_SETCC(
N);
break;
5564 case ISD::ROTR: Res = ExpandIntOp_Shift(
N);
break;
5569 case ISD::UCMP: Res = ExpandIntOp_CMP(
N);
break;
5571 case ISD::ATOMIC_STORE: Res = ExpandIntOp_ATOMIC_STORE(
N);
break;
5573 Res = ExpandIntOp_STACKMAP(
N, OpNo);
5575 case ISD::PATCHPOINT:
5576 Res = ExpandIntOp_PATCHPOINT(
N, OpNo);
5578 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
5579 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
5580 Res = ExpandIntOp_VP_STRIDED(
N, OpNo);
5583 Res = ExpandIntOp_WRITE_REGISTER(
N, OpNo);
5588 if (!Res.
getNode())
return false;
5596 "Invalid operand expansion");
5598 ReplaceValueWith(
SDValue(
N, 0), Res);
5604void DAGTypeLegalizer::IntegerExpandSetCCOperands(
SDValue &NewLHS,
5608 SDValue LHSLo, LHSHi, RHSLo, RHSHi;
5609 GetExpandedInteger(NewLHS, LHSLo, LHSHi);
5610 GetExpandedInteger(NewRHS, RHSLo, RHSHi);
5623 NewRHS = DAG.getConstant(0, dl, NewLHS.
getValueType());
5630 if ((CCCode ==
ISD::SETLT && CST->isZero()) ||
5631 (CCCode ==
ISD::SETGT && CST->isAllOnes())) {
5662 LoCmp = TLI.SimplifySetCC(getSetCCResultType(LHSLo.
getValueType()), LHSLo,
5663 RHSLo, LowCC,
false, DagCombineInfo, dl);
5665 LoCmp = DAG.getSetCC(dl, getSetCCResultType(LHSLo.
getValueType()), LHSLo,
5669 HiCmp = TLI.SimplifySetCC(getSetCCResultType(LHSHi.
getValueType()), LHSHi,
5670 RHSHi, CCCode,
false, DagCombineInfo, dl);
5674 LHSHi, RHSHi, DAG.getCondCode(CCCode));
5683 if ((EqAllowed && (HiCmpC && HiCmpC->
isZero())) ||
5685 ((HiCmpC && HiCmpC->
isOne()) || (LoCmpC && LoCmpC->
isZero())))) {
5694 if (LHSHi == RHSHi) {
5703 EVT ExpandVT = TLI.getTypeToExpandTo(*DAG.getContext(), HiVT);
5704 bool HasSETCCCARRY = TLI.isOperationLegalOrCustom(
ISD::SETCCCARRY, ExpandVT);
5707 if (HasSETCCCARRY) {
5710 bool FlipOperands =
false;
5727 SDVTList VTList = DAG.getVTList(LoVT, getSetCCResultType(LoVT));
5731 DAG.getCondCode(CCCode));
5737 NewLHS = TLI.SimplifySetCC(getSetCCResultType(HiVT), LHSHi, RHSHi,
ISD::SETEQ,
5738 false, DagCombineInfo, dl);
5741 DAG.getSetCC(dl, getSetCCResultType(HiVT), LHSHi, RHSHi,
ISD::SETEQ);
5742 NewLHS = DAG.getSelect(dl, LoCmp.
getValueType(), NewLHS, LoCmp, HiCmp);
5749 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(
N));
5754 NewRHS = DAG.getConstant(0, SDLoc(
N), NewLHS.
getValueType());
5759 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
5760 DAG.getCondCode(CCCode), NewLHS, NewRHS,
5761 N->getOperand(4)), 0);
5767 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(
N));
5772 NewRHS = DAG.getConstant(0, SDLoc(
N), NewLHS.
getValueType());
5777 return SDValue(DAG.UpdateNodeOperands(
N, NewLHS, NewRHS,
5778 N->getOperand(2),
N->getOperand(3),
5779 DAG.getCondCode(CCCode)), 0);
5785 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(
N));
5790 "Unexpected setcc expansion!");
5796 DAG.UpdateNodeOperands(
N, NewLHS, NewRHS, DAG.getCondCode(CCCode)), 0);
5804 SDLoc dl = SDLoc(
N);
5806 SDValue LHSLo, LHSHi, RHSLo, RHSHi;
5807 GetExpandedInteger(
LHS, LHSLo, LHSHi);
5808 GetExpandedInteger(
RHS, RHSLo, RHSHi);
5821 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
5831 GetExpandedInteger(
N->getOperand(1),
Lo,
Hi);
5832 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
Lo), 0);
5836 return TLI.expandCMP(
N, DAG);
5844 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
5845 return SDValue(DAG.UpdateNodeOperands(
N,
Lo), 0);
5849 bool IsStrict =
N->isStrictFPOpcode();
5853 SDValue Op =
N->getOperand(IsStrict ? 1 : 0);
5854 EVT DstVT =
N->getValueType(0);
5857 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
5858 "Don't know how to expand this XINT_TO_FP!");
5859 TargetLowering::MakeLibCallOptions CallOptions;
5861 std::pair<SDValue, SDValue> Tmp =
5862 TLI.makeLibCall(DAG, LC, DstVT,
Op, CallOptions, SDLoc(
N), Chain);
5867 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
5868 ReplaceValueWith(
SDValue(
N, 0), Tmp.first);
5873 assert(!
N->isAtomic() &&
"Should have been a ATOMIC_STORE?");
5876 return ExpandOp_NormalStore(
N, OpNo);
5879 assert(OpNo == 1 &&
"Can only expand the stored value so far");
5881 EVT VT =
N->getOperand(1).getValueType();
5882 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
5886 AAMDNodes AAInfo =
N->getAAInfo();
5892 if (
N->getMemoryVT().bitsLE(NVT)) {
5893 GetExpandedInteger(
N->getValue(),
Lo,
Hi);
5894 return DAG.getTruncStore(Ch, dl,
Lo,
Ptr,
N->getPointerInfo(),
5895 N->getMemoryVT(),
N->getBaseAlign(), MMOFlags,
5899 if (DAG.getDataLayout().isLittleEndian()) {
5901 GetExpandedInteger(
N->getValue(),
Lo,
Hi);
5903 Lo = DAG.getStore(Ch, dl,
Lo,
Ptr,
N->getPointerInfo(),
N->getBaseAlign(),
5906 unsigned ExcessBits =
5913 Hi = DAG.getTruncStore(Ch, dl,
Hi,
Ptr,
5914 N->getPointerInfo().getWithOffset(IncrementSize),
5915 NEVT,
N->getBaseAlign(), MMOFlags, AAInfo);
5921 GetExpandedInteger(
N->getValue(),
Lo,
Hi);
5923 EVT ExtVT =
N->getMemoryVT();
5926 unsigned ExcessBits = (EBytes - IncrementSize)*8;
5934 TLI.getPointerTy(DAG.getDataLayout())));
5938 DAG.getConstant(ExcessBits, dl,
5939 TLI.getPointerTy(DAG.getDataLayout()))));
5943 Hi = DAG.getTruncStore(Ch, dl,
Hi,
Ptr,
N->getPointerInfo(), HiVT,
5944 N->getBaseAlign(), MMOFlags, AAInfo);
5949 Lo = DAG.getTruncStore(Ch, dl,
Lo,
Ptr,
5950 N->getPointerInfo().getWithOffset(IncrementSize),
5952 N->getBaseAlign(), MMOFlags, AAInfo);
5958 GetExpandedInteger(
N->getOperand(0), InL, InH);
5967 N->getOperand(0),
N->getOperand(2),
N->getOperand(1),
5972SDValue DAGTypeLegalizer::ExpandIntOp_VP_STRIDED(
SDNode *
N,
unsigned OpNo) {
5973 assert((
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_LOAD && OpNo == 3) ||
5974 (
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_STORE && OpNo == 4));
5978 GetExpandedInteger(NewOps[OpNo], NewOps[OpNo],
Hi);
5980 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
5983SDValue DAGTypeLegalizer::ExpandIntOp_WRITE_REGISTER(
SDNode *
N,
unsigned OpNo) {
5986 "cannot use llvm.write_register with illegal type", Fn,
5989 return N->getOperand(0);
5992SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_SPLICE(
SDNode *
N) {
5995 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
5996 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
6002SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_INTERLEAVE_DEINTERLEAVE(
SDNode *
N) {
6004 unsigned Factor =
N->getNumOperands();
6007 for (
unsigned i = 0; i != Factor; i++)
6008 Ops[i] = GetPromotedInteger(
N->getOperand(i));
6013 for (
unsigned i = 0; i != Factor; i++)
6019SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_SUBVECTOR(
SDNode *
N) {
6021 EVT OutVT =
N->getValueType(0);
6022 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6023 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6027 SDValue BaseIdx =
N->getOperand(1);
6044 DAG.getConstant(
alignDown(IdxVal, NElts), dl,
6048 DAG.getConstant(IdxVal % NElts, dl, BaseIdx.
getValueType()));
6054 SDValue Ops[] = {GetWidenedVector(InOp0), BaseIdx};
6063 SDValue Ops[] = { GetPromotedInteger(InOp0), BaseIdx };
6067 "Promoted operand has an element type greater than result");
6080 InOp0 = GetPromotedInteger(InOp0);
6087 Ops.reserve(OutNumElems);
6088 for (
unsigned i = 0; i != OutNumElems; ++i) {
6093 N->getOperand(0), Index);
6094 SDValue Op = DAG.getAnyExtOrTrunc(Ext, dl, NOutVTElem);
6099 return DAG.getBuildVector(NOutVT, dl,
Ops);
6102SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_SUBVECTOR(
SDNode *
N) {
6103 EVT OutVT =
N->getValueType(0);
6104 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6105 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6117 Vec = GetPromotedInteger(Vec);
6123SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_REVERSE(
SDNode *
N) {
6126 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6132SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_SHUFFLE(
SDNode *
N) {
6134 EVT VT =
N->getValueType(0);
6139 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6140 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
6143 return DAG.getVectorShuffle(OutVT, dl, V0, V1, NewMask);
6147 EVT OutVT =
N->getValueType(0);
6148 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6149 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6150 unsigned NumElems =
N->getNumOperands();
6157 Ops.reserve(NumElems);
6158 for (
unsigned i = 0; i != NumElems; ++i) {
6160 EVT OpVT =
Op.getValueType();
6165 if (OpVT.
bitsLT(NOutVTElem)) {
6171 ExtOpc = NOutExtOpc;
6172 Op = DAG.getNode(ExtOpc, dl, NOutVTElem,
Op);
6177 return DAG.getBuildVector(NOutVT, dl,
Ops);
6184 assert(!
N->getOperand(0).getValueType().isVector() &&
6185 "Input must be a scalar");
6187 EVT OutVT =
N->getValueType(0);
6188 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6189 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6193 if (
N->isVPOpcode())
6194 return DAG.getNode(
N->getOpcode(), dl, NOutVT,
Op,
N->getOperand(1),
6197 return DAG.getNode(
N->getOpcode(), dl, NOutVT,
Op);
6202 EVT OutVT =
N->getValueType(0);
6203 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6205 "Type must be promoted to a scalable vector type");
6206 const APInt &StepVal =
N->getConstantOperandAPInt(0);
6207 return DAG.getStepVector(dl, NOutVT,
6211SDValue DAGTypeLegalizer::PromoteIntRes_CONCAT_VECTORS(
SDNode *
N) {
6214 EVT OutVT =
N->getValueType(0);
6215 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6216 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6218 unsigned NumOperands =
N->getNumOperands();
6223 SDUse *MaxSizedValue = std::max_element(
6225 EVT AVT = A.getValueType().getVectorElementType();
6226 EVT BVT = B.getValueType().getVectorElementType();
6227 return AVT.getScalarSizeInBits() < BVT.getScalarSizeInBits();
6233 for (
unsigned I = 0;
I < NumOperands; ++
I) {
6235 EVT OpVT =
Op.getValueType();
6237 Op = GetPromotedInteger(
Op);
6240 "Unhandled legalization type");
6244 Op = DAG.getAnyExtOrTrunc(
Op, dl,
6251 return DAG.getAnyExtOrTrunc(
6257 unsigned NumElem =
N->getOperand(0).getValueType().getVectorNumElements();
6258 assert(NumElem * NumOperands == NumOutElem &&
6259 "Unexpected number of elements");
6263 for (
unsigned i = 0; i < NumOperands; ++i) {
6266 Op = GetPromotedInteger(
Op);
6267 EVT SclrTy =
Op.getValueType().getVectorElementType();
6268 assert(NumElem ==
Op.getValueType().getVectorNumElements() &&
6269 "Unexpected number of elements");
6271 for (
unsigned j = 0;
j < NumElem; ++
j) {
6273 DAG.getVectorIdxConstant(j, dl));
6274 Ops[i * NumElem +
j] = DAG.getAnyExtOrTrunc(Ext, dl, OutElemTy);
6278 return DAG.getBuildVector(NOutVT, dl,
Ops);
6281SDValue DAGTypeLegalizer::PromoteIntRes_EXTEND_VECTOR_INREG(
SDNode *
N) {
6282 EVT VT =
N->getValueType(0);
6283 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
6284 assert(NVT.
isVector() &&
"This type must be promoted to a vector type");
6292 if (getTypeAction(
N->getOperand(0).getValueType())
6296 switch(
N->getOpcode()) {
6298 Promoted = SExtPromotedInteger(
N->getOperand(0));
6301 Promoted = ZExtPromotedInteger(
N->getOperand(0));
6304 Promoted = GetPromotedInteger(
N->getOperand(0));
6309 return DAG.getNode(
N->getOpcode(), dl, NVT, Promoted);
6313 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
6316SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_FIND_LAST_ACTIVE(
SDNode *
N) {
6317 EVT VT =
N->getValueType(0);
6318 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
6319 return DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, SDLoc(
N), NVT,
N->ops());
6322SDValue DAGTypeLegalizer::PromoteIntRes_GET_ACTIVE_LANE_MASK(
SDNode *
N) {
6323 EVT VT =
N->getValueType(0);
6324 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
6325 return DAG.getNode(ISD::GET_ACTIVE_LANE_MASK, SDLoc(
N), NVT,
N->ops());
6328SDValue DAGTypeLegalizer::PromoteIntRes_PARTIAL_REDUCE_MLA(
SDNode *
N) {
6330 EVT VT =
N->getValueType(0);
6331 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
6332 SDValue ExtAcc = GetPromotedInteger(
N->getOperand(0));
6333 return DAG.getNode(
N->getOpcode(),
DL, NVT, ExtAcc,
N->getOperand(1),
6337SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_VECTOR_ELT(
SDNode *
N) {
6338 EVT OutVT =
N->getValueType(0);
6339 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6340 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6345 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6348 NOutVTElem,
N->getOperand(1));
6350 V0, ConvElem,
N->getOperand(2));
6357 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
6358 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->ops());
6366 SDValue Start = PromoteIntOpVectorReduction(
N,
N->getOperand(0));
6367 return DAG.getNode(
N->getOpcode(),
DL,
Start.getValueType(), Start,
6368 N->getOperand(1),
N->getOperand(2),
N->getOperand(3));
6372 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
6375 assert(
N->getNumValues() == 3 &&
"Expected 3 values for PATCHPOINT");
6376 SDVTList VTList = DAG.getVTList({NVT, MVT::Other, MVT::Glue});
6384 DAG.ReplaceAllUsesOfValuesWith(From, To, 2);
6389SDValue DAGTypeLegalizer::PromoteIntRes_READ_REGISTER(
SDNode *
N) {
6392 "cannot use llvm.read_register with illegal type", Fn,
N->getDebugLoc()));
6394 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
6395 ReplaceValueWith(
SDValue(
N, 1),
N->getOperand(0));
6396 return DAG.getPOISON(NVT);
6399SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_VECTOR_ELT(
SDNode *
N) {
6401 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6402 SDValue V1 = DAG.getZExtOrTrunc(
N->getOperand(1), dl,
6403 TLI.getVectorIdxTy(DAG.getDataLayout()));
6410 return DAG.getAnyExtOrTrunc(Ext, dl,
N->getValueType(0));
6413SDValue DAGTypeLegalizer::PromoteIntOp_INSERT_SUBVECTOR(
SDNode *
N) {
6418 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
6423 V0 = DAG.getAnyExtOrTrunc(V0, dl, PromVT);
6425 return DAG.getAnyExtOrTrunc(Ext, dl,
N->getValueType(0));
6437 TLI.getTypeToTransformTo(*DAG.getContext(), InVT1), V1);
6438 return DAG.getNode(
N->getOpcode(), dl,
N->getValueType(0), V0, VPromoted);
6441SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_SUBVECTOR(
SDNode *
N) {
6443 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6451SDValue DAGTypeLegalizer::PromoteIntOp_CONCAT_VECTORS(
SDNode *
N) {
6454 EVT ResVT =
N->getValueType(0);
6455 unsigned NumElems =
N->getNumOperands();
6458 SDValue ResVec = DAG.getUNDEF(ResVT);
6462 unsigned OpNumElts =
Op.getValueType().getVectorMinNumElements();
6464 DAG.getIntPtrConstant(
OpIdx * OpNumElts, dl));
6476 for (
unsigned VecIdx = 0; VecIdx != NumElems; ++VecIdx) {
6477 SDValue Incoming = GetPromotedInteger(
N->getOperand(VecIdx));
6481 for (
unsigned i=0; i<NumElem; ++i) {
6484 DAG.getVectorIdxConstant(i, dl));
6490 return DAG.getBuildVector(
N->getValueType(0), dl, NewOps);
6493SDValue DAGTypeLegalizer::ExpandIntOp_STACKMAP(
SDNode *
N,
unsigned OpNo) {
6506 for (
unsigned I = 0;
I < OpNo;
I++)
6509 EVT Ty =
Op.getValueType();
6510 SDLoc
DL = SDLoc(
N);
6513 DAG.getTargetConstant(StackMaps::ConstantOp,
DL, MVT::i64));
6521 for (
unsigned I = OpNo + 1;
I <
N->getNumOperands();
I++)
6526 for (
unsigned ResNum = 0; ResNum <
N->getNumValues(); ResNum++)
6532SDValue DAGTypeLegalizer::ExpandIntOp_PATCHPOINT(
SDNode *
N,
unsigned OpNo) {
6545 for (
unsigned I = 0;
I < OpNo;
I++)
6548 EVT Ty =
Op.getValueType();
6549 SDLoc
DL = SDLoc(
N);
6552 DAG.getTargetConstant(StackMaps::ConstantOp,
DL, MVT::i64));
6560 for (
unsigned I = OpNo + 1;
I <
N->getNumOperands();
I++)
6565 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")
static bool isSigned(unsigned int Opcode)
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)
Returns the type of the given value/instruction V.
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 a 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.
@ LOOP_DEPENDENCE_RAW_MASK
@ 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...
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
@ ADD
Simple integer binary arithmetic operators.
@ 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.
@ 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.
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
@ SDIVFIX
RESULT = [US]DIVFIX(LHS, RHS, SCALE) - Perform fixed point division on 2 integers with the same width...
@ 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...
@ 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 ...
@ 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).
@ 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.
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
@ 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) ...
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
@ SMULO
Same for multiplication.
@ 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.
@ 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...
@ 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.
@ 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.
@ 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],...
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
@ 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.
@ VECTOR_SPLICE
VECTOR_SPLICE(VEC1, VEC2, IMM) - Returns a subvector of the same type as VEC1/VEC2 from CONCAT_VECTOR...
@ 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 ...
@ 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.
@ 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
Set rounding mode.
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 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 getFPTOUINT(EVT OpVT, EVT RetVT)
getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
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 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...
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.
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 changeVectorElementType(EVT EltVT) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element type...
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.
MakeLibCallOptions & setTypeListBeforeSoften(ArrayRef< EVT > OpsVT, EVT RetVT)
MakeLibCallOptions & setIsSigned(bool Value=true)