31#define DEBUG_TYPE "legalize-types"
41void DAGTypeLegalizer::PromoteIntegerResult(
SDNode *
N,
unsigned ResNo) {
46 if (CustomLowerNode(
N,
N->getValueType(ResNo),
true)) {
51 switch (
N->getOpcode()) {
54 dbgs() <<
"PromoteIntegerResult #" << ResNo <<
": ";
55 N->dump(&DAG);
dbgs() <<
"\n";
62 case ISD::VP_BITREVERSE:
65 case ISD::BSWAP: Res = PromoteIntRes_BSWAP(
N);
break;
68 case ISD::VP_CTLZ_ZERO_UNDEF:
71 case ISD::CTLZ: Res = PromoteIntRes_CTLZ(
N);
break;
74 case ISD::CTPOP: Res = PromoteIntRes_CTPOP_PARITY(
N);
break;
75 case ISD::VP_CTTZ_ZERO_UNDEF:
78 case ISD::CTTZ: Res = PromoteIntRes_CTTZ(
N);
break;
79 case ISD::VP_CTTZ_ELTS_ZERO_UNDEF:
80 case ISD::VP_CTTZ_ELTS:
81 Res = PromoteIntRes_VP_CttzElements(
N);
84 Res = PromoteIntRes_EXTRACT_VECTOR_ELT(
N);
break;
85 case ISD::LOAD: Res = PromoteIntRes_LOAD(cast<LoadSDNode>(
N));
break;
87 Res = PromoteIntRes_VP_LOAD(cast<VPLoadSDNode>(
N));
89 case ISD::MLOAD: Res = PromoteIntRes_MLOAD(cast<MaskedLoadSDNode>(
N));
91 case ISD::MGATHER: Res = PromoteIntRes_MGATHER(cast<MaskedGatherSDNode>(
N));
94 Res = PromoteIntRes_VECTOR_COMPRESS(
N);
100 Res = PromoteIntRes_Select(
N);
105 case ISD::SETCC: Res = PromoteIntRes_SETCC(
N);
break;
107 case ISD::SMAX: Res = PromoteIntRes_SExtIntBinOp(
N);
break;
109 case ISD::UMAX: Res = PromoteIntRes_UMINUMAX(
N);
break;
112 case ISD::VP_SHL: Res = PromoteIntRes_SHL(
N);
break;
114 Res = PromoteIntRes_SIGN_EXTEND_INREG(
N);
break;
116 case ISD::VP_SRA: Res = PromoteIntRes_SRA(
N);
break;
118 case ISD::VP_SRL: Res = PromoteIntRes_SRL(
N);
break;
119 case ISD::VP_TRUNCATE:
121 case ISD::UNDEF: Res = PromoteIntRes_UNDEF(
N);
break;
122 case ISD::VAARG: Res = PromoteIntRes_VAARG(
N);
break;
126 Res = PromoteIntRes_EXTRACT_SUBVECTOR(
N);
break;
128 Res = PromoteIntRes_INSERT_SUBVECTOR(
N);
break;
130 Res = PromoteIntRes_VECTOR_REVERSE(
N);
break;
132 Res = PromoteIntRes_VECTOR_SHUFFLE(
N);
break;
134 Res = PromoteIntRes_VECTOR_SPLICE(
N);
break;
137 Res = PromoteIntRes_VECTOR_INTERLEAVE_DEINTERLEAVE(
N);
140 Res = PromoteIntRes_INSERT_VECTOR_ELT(
N);
break;
142 Res = PromoteIntRes_BUILD_VECTOR(
N);
146 case ISD::EXPERIMENTAL_VP_SPLAT:
147 Res = PromoteIntRes_ScalarOp(
N);
151 Res = PromoteIntRes_CONCAT_VECTORS(
N);
break;
156 Res = PromoteIntRes_EXTEND_VECTOR_INREG(
N);
break;
159 Res = PromoteIntRes_VECTOR_FIND_LAST_ACTIVE(
N);
163 case ISD::VP_SIGN_EXTEND:
165 case ISD::VP_ZERO_EXTEND:
168 case ISD::VP_FP_TO_SINT:
169 case ISD::VP_FP_TO_UINT:
177 Res = PromoteIntRes_FP_TO_XINT_SAT(
N);
break;
181 Res = PromoteIntRes_FP_TO_FP16_BF16(
N);
185 Res = PromoteIntRes_STRICT_FP_TO_FP16_BF16(
N);
200 case ISD::VP_MUL: Res = PromoteIntRes_SimpleIntBinOp(
N);
break;
210 case ISD::VP_SREM: Res = PromoteIntRes_SExtIntBinOp(
N);
break;
220 case ISD::VP_UREM: Res = PromoteIntRes_ZExtIntBinOp(
N);
break;
223 case ISD::SSUBO: Res = PromoteIntRes_SADDSUBO(
N, ResNo);
break;
225 case ISD::USUBO: Res = PromoteIntRes_UADDSUBO(
N, ResNo);
break;
227 case ISD::UMULO: Res = PromoteIntRes_XMULO(
N, ResNo);
break;
243 Res = PromoteIntRes_ADDSUBSHLSAT<EmptyMatchContext>(
N);
245 case ISD::VP_SADDSAT:
246 case ISD::VP_UADDSAT:
247 case ISD::VP_SSUBSAT:
248 case ISD::VP_USUBSAT:
249 Res = PromoteIntRes_ADDSUBSHLSAT<VPMatchContext>(
N);
254 Res = PromoteIntRes_CMP(
N);
267 case ISD::ABS: Res = PromoteIntRes_ABS(
N);
break;
270 Res = PromoteIntRes_Atomic0(cast<AtomicSDNode>(
N));
break;
284 Res = PromoteIntRes_Atomic1(cast<AtomicSDNode>(
N));
break;
288 Res = PromoteIntRes_AtomicCmpSwap(cast<AtomicSDNode>(
N), ResNo);
300 Res = PromoteIntRes_VECREDUCE(
N);
303 case ISD::VP_REDUCE_ADD:
304 case ISD::VP_REDUCE_MUL:
305 case ISD::VP_REDUCE_AND:
306 case ISD::VP_REDUCE_OR:
307 case ISD::VP_REDUCE_XOR:
308 case ISD::VP_REDUCE_SMAX:
309 case ISD::VP_REDUCE_SMIN:
310 case ISD::VP_REDUCE_UMAX:
311 case ISD::VP_REDUCE_UMIN:
312 Res = PromoteIntRes_VP_REDUCE(
N);
316 Res = PromoteIntRes_FREEZE(
N);
321 Res = PromoteIntRes_Rotate(
N);
326 Res = PromoteIntRes_FunnelShift(
N);
331 Res = PromoteIntRes_VPFunnelShift(
N);
335 Res = PromoteIntRes_IS_FPCLASS(
N);
338 Res = PromoteIntRes_FFREXP(
N);
343 Res = PromoteIntRes_XRINT(
N);
347 Res = PromoteIntRes_PATCHPOINT(
N);
353 SetPromotedInteger(
SDValue(
N, ResNo), Res);
358 SDValue Op = DisintegrateMERGE_VALUES(
N, ResNo);
359 return GetPromotedInteger(
Op);
364 SDValue Op = SExtPromotedInteger(
N->getOperand(0));
366 Op.getValueType(),
Op,
N->getOperand(1));
371 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
373 Op.getValueType(),
Op,
N->getOperand(1));
379 N->getMemoryVT(), ResVT,
380 N->getChain(),
N->getBasePtr(),
399 cast<AtomicSDNode>(Res)->setExtensionType(ETy);
409 SDValue Op2 = GetPromotedInteger(
N->getOperand(2));
412 N->getChain(),
N->getBasePtr(),
413 Op2,
N->getMemOperand());
424 EVT SVT = getSetCCResultType(
N->getOperand(2).getValueType());
435 N->getChain(),
N->getBasePtr(),
N->getOperand(2),
N->getOperand(3),
445 SDValue Op3 = GetPromotedInteger(
N->getOperand(3));
448 Op2 = SExtPromotedInteger(Op2);
451 Op2 = ZExtPromotedInteger(Op2);
454 Op2 = GetPromotedInteger(Op2);
463 N->getOpcode(),
SDLoc(
N),
N->getMemoryVT(), VTs,
N->getChain(),
464 N->getBasePtr(), Op2, Op3,
N->getMemOperand());
466 for (
unsigned i = 1, NumResults =
N->getNumValues(); i < NumResults; ++i)
475 EVT OutVT =
N->getValueType(0);
479 switch (getTypeAction(InVT)) {
506 BitConvertToInteger(GetScalarizedVector(InOp)));
515 GetSplitVector(
N->getOperand(0),
Lo,
Hi);
516 Lo = BitConvertToInteger(
Lo);
517 Hi = BitConvertToInteger(
Hi);
525 JoinIntegers(
Lo,
Hi));
559 if (isTypeLegal(WideOutVT)) {
560 InOp = DAG.
getBitcast(WideOutVT, GetWidenedVector(InOp));
570 CreateStackStoreLoad(InOp, OutVT));
574 SDValue V = GetPromotedInteger(
N->getOperand(0));
576 V.getValueType(), V);
580 SDValue Op = GetPromotedInteger(
N->getOperand(0));
581 EVT OVT =
N->getValueType(0);
582 EVT NVT =
Op.getValueType();
602 return DAG.
getNode(ISD::VP_SRL, dl, NVT,
603 DAG.
getNode(ISD::VP_BSWAP, dl, NVT,
Op, Mask, EVL), ShAmt,
608 SDValue Op = GetPromotedInteger(
N->getOperand(0));
609 EVT OVT =
N->getValueType(0);
610 EVT NVT =
Op.getValueType();
630 return DAG.
getNode(ISD::VP_SRL, dl, NVT,
631 DAG.
getNode(ISD::VP_BITREVERSE, dl, NVT,
Op, Mask, EVL),
640 N->getValueType(0)), JoinIntegers(
N->getOperand(0),
645 EVT VT =
N->getValueType(0);
654 assert(isa<ConstantSDNode>(Result) &&
"Didn't constant fold ext?");
659 EVT OVT =
N->getValueType(0);
675 unsigned CtlzOpcode =
N->getOpcode();
676 if (CtlzOpcode ==
ISD::CTLZ || CtlzOpcode == ISD::VP_CTLZ) {
681 if (!
N->isVPOpcode()) {
683 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
691 SDValue Op = VPZExtPromotedInteger(
N->getOperand(0), Mask, EVL);
692 return DAG.
getNode(ISD::VP_SUB, dl, NVT,
693 DAG.
getNode(
N->getOpcode(), dl, NVT,
Op, Mask, EVL),
694 ExtractLeadingBits, Mask, EVL);
697 CtlzOpcode == ISD::VP_CTLZ_ZERO_UNDEF) {
699 SDValue Op = GetPromotedInteger(
N->getOperand(0));
704 if (!
N->isVPOpcode()) {
706 return DAG.
getNode(CtlzOpcode, dl, NVT,
Op);
711 Op = DAG.
getNode(ISD::VP_SHL, dl, NVT,
Op, ShiftConst, Mask, EVL);
712 return DAG.
getNode(CtlzOpcode, dl, NVT,
Op, Mask, EVL);
718 EVT OVT =
N->getValueType(0);
735 if (!
N->isVPOpcode()) {
736 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
742 SDValue Op = VPZExtPromotedInteger(
N->getOperand(0), Mask, EVL);
748 SDValue Op = GetPromotedInteger(
N->getOperand(0));
749 EVT OVT =
N->getValueType(0);
750 EVT NVT =
Op.getValueType();
768 unsigned NewOpc =
N->getOpcode();
769 if (NewOpc ==
ISD::CTTZ || NewOpc == ISD::VP_CTTZ) {
781 N->getOperand(1),
N->getOperand(2));
782 NewOpc = ISD::VP_CTTZ_ZERO_UNDEF;
785 if (!
N->isVPOpcode())
787 return DAG.
getNode(NewOpc, dl, NVT,
Op,
N->getOperand(1),
N->getOperand(2));
790SDValue DAGTypeLegalizer::PromoteIntRes_VP_CttzElements(
SDNode *
N) {
793 return DAG.
getNode(
N->getOpcode(),
DL, NewVT,
N->ops());
796SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_VECTOR_ELT(
SDNode *
N) {
811 EVT SVT =
In.getValueType().getScalarType();
823 unsigned NewOpc =
N->getOpcode();
840 if (
N->getOpcode() == ISD::VP_FP_TO_UINT &&
843 NewOpc = ISD::VP_FP_TO_SINT;
846 if (
N->isStrictFPOpcode()) {
847 Res = DAG.
getNode(NewOpc, dl, {NVT, MVT::Other},
848 {
N->getOperand(0),
N->getOperand(1)});
852 }
else if (NewOpc == ISD::VP_FP_TO_SINT || NewOpc == ISD::VP_FP_TO_UINT) {
853 Res = DAG.
getNode(NewOpc, dl, NVT, {
N->getOperand(0),
N->getOperand(1),
856 Res = DAG.
getNode(NewOpc, dl, NVT,
N->getOperand(0));
868 N->getOpcode() == ISD::VP_FP_TO_UINT)
875SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_XINT_SAT(
SDNode *
N) {
879 return DAG.
getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0),
883SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_FP16_BF16(
SDNode *
N) {
887 return DAG.
getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
890SDValue DAGTypeLegalizer::PromoteIntRes_STRICT_FP_TO_FP16_BF16(
SDNode *
N) {
895 N->getOperand(0),
N->getOperand(1));
903 return DAG.
getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
911 DAG.
getNode(
N->getOpcode(), dl, {NVT, MVT::Other},
N->getOperand(0));
923 if (getTypeAction(
N->getOperand(0).getValueType())
925 SDValue Res = GetPromotedInteger(
N->getOperand(0));
943 if (
N->getNumOperands() != 1) {
944 assert(
N->getNumOperands() == 3 &&
"Unexpected number of operands!");
945 assert(
N->isVPOpcode() &&
"Expected VP opcode");
946 return DAG.
getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0),
947 N->getOperand(1),
N->getOperand(2));
949 return DAG.
getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
959 N->getMemoryVT(),
N->getMemOperand());
968 assert(!
N->isIndexed() &&
"Indexed vp_load during type legalization!");
972 :
N->getExtensionType();
975 DAG.
getLoadVP(
N->getAddressingMode(), ExtType, NVT, dl,
N->getChain(),
976 N->getBasePtr(),
N->getOffset(),
N->getMask(),
977 N->getVectorLength(),
N->getMemoryVT(),
N->getMemOperand());
986 SDValue ExtPassThru = GetPromotedInteger(
N->getPassThru());
994 N->getOffset(),
N->getMask(), ExtPassThru,
995 N->getMemoryVT(),
N->getMemOperand(),
996 N->getAddressingMode(), ExtType,
997 N->isExpandingLoad());
1006 SDValue ExtPassThru = GetPromotedInteger(
N->getPassThru());
1008 "Gather result type and the passThru argument type should be the same");
1015 SDValue Ops[] = {
N->getChain(), ExtPassThru,
N->getMask(),
N->getBasePtr(),
1016 N->getIndex(),
N->getScale() };
1018 N->getMemoryVT(), dl, Ops,
1019 N->getMemOperand(),
N->getIndexType(),
1027SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_COMPRESS(
SDNode *
N) {
1028 SDValue Vec = GetPromotedInteger(
N->getOperand(0));
1029 SDValue Passthru = GetPromotedInteger(
N->getOperand(2));
1031 N->getOperand(1), Passthru);
1039 EVT VT =
N->getValueType(0);
1040 EVT SVT = getSetCCResultType(VT);
1041 SDValue Ops[3] = {
N->getOperand(0),
N->getOperand(1) };
1042 unsigned NumOps =
N->getNumOperands();
1043 assert(NumOps <= 3 &&
"Too many operands");
1045 Ops[2] = PromoteTargetBoolean(
N->getOperand(2), VT);
1053 ReplaceValueWith(
SDValue(
N, 0), Res);
1059template <
class MatchContextClass>
1071 MatchContextClass matcher(DAG, TLI,
N);
1073 unsigned Opcode = matcher.getRootBaseOpcode();
1079 SExtOrZExtPromotedOperands(Op1, Op2);
1088 Op1 = SExtPromotedInteger(Op1);
1089 Op2 = SExtPromotedInteger(Op2);
1090 return matcher.getNode(
ISD::UADDSAT, dl, NVT, Op1, Op2);
1093 Op1 = ZExtPromotedInteger(Op1);
1094 Op2 = ZExtPromotedInteger(Op2);
1099 return matcher.getNode(
ISD::UMIN, dl, NVT,
Add, SatMax);
1106 Op1 = GetPromotedInteger(Op1);
1107 Op2 = ZExtPromotedInteger(Op2);
1109 Op1 = SExtPromotedInteger(Op1);
1110 Op2 = SExtPromotedInteger(Op2);
1117 if (IsShift || matcher.isOperationLegal(Opcode, PromotedType)) {
1130 "addition, subtraction or left shift");
1133 unsigned SHLAmount = NewBits - OldBits;
1140 SDValue Result = matcher.getNode(Opcode, dl, PromotedType, Op1, Op2);
1141 return matcher.getNode(ShiftOp, dl, PromotedType, Result, ShiftAmount);
1149 SDValue Result = matcher.getNode(AddOp, dl, PromotedType, Op1, Op2);
1150 Result = matcher.getNode(
ISD::SMIN, dl, PromotedType, Result, SatMax);
1151 Result = matcher.getNode(
ISD::SMAX, dl, PromotedType, Result, SatMin);
1158 SDValue Op1Promoted, Op2Promoted;
1164 Op1Promoted = SExtPromotedInteger(
N->getOperand(0));
1165 Op2Promoted = SExtPromotedInteger(
N->getOperand(1));
1167 Op1Promoted = ZExtPromotedInteger(
N->getOperand(0));
1168 Op2Promoted = ZExtPromotedInteger(
N->getOperand(1));
1170 EVT OldType =
N->getOperand(0).getValueType();
1184 Op2Promoted,
N->getOperand(2));
1186 return DAG.
getNode(ShiftOp, dl, PromotedType, Result,
1189 return DAG.
getNode(
N->getOpcode(), dl, PromotedType, Op1Promoted, Op2Promoted,
1194 unsigned SatW,
bool Signed,
1197 EVT VT = V.getValueType();
1224 EVT VT =
LHS.getValueType();
1242 assert(Res &&
"Expanding DIVFIX with wide type failed?");
1248 "Tried to saturate to more than the original type?");
1257 SDValue Op1Promoted, Op2Promoted;
1263 Op1Promoted = SExtPromotedInteger(
N->getOperand(0));
1264 Op2Promoted = SExtPromotedInteger(
N->getOperand(1));
1266 Op1Promoted = ZExtPromotedInteger(
N->getOperand(0));
1267 Op2Promoted = ZExtPromotedInteger(
N->getOperand(1));
1270 unsigned Scale =
N->getConstantOperandVal(2);
1279 N->getValueType(0).getScalarSizeInBits();
1284 SDValue Res = DAG.
getNode(
N->getOpcode(), dl, PromotedType, Op1Promoted,
1285 Op2Promoted,
N->getOperand(2));
1295 Op2Promoted, Scale, DAG)) {
1298 N->getValueType(0).getScalarSizeInBits(),
1306 N->getValueType(0).getScalarSizeInBits());
1309SDValue DAGTypeLegalizer::PromoteIntRes_SADDSUBO(
SDNode *
N,
unsigned ResNo) {
1311 return PromoteIntRes_Overflow(
N);
1315 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1316 SDValue RHS = SExtPromotedInteger(
N->getOperand(1));
1317 EVT OVT =
N->getOperand(0).getValueType();
1318 EVT NVT =
LHS.getValueType();
1333 ReplaceValueWith(
SDValue(
N, 1), Ofl);
1339 EVT PromotedResultTy =
1342 N->getOperand(0),
N->getOperand(1));
1348 SDValue LHS = GetPromotedInteger(
N->getOperand(1));
1349 SDValue RHS = GetPromotedInteger(
N->getOperand(2));
1351 unsigned Opcode =
N->getOpcode();
1352 if (Opcode == ISD::VP_SELECT || Opcode == ISD::VP_MERGE)
1359 SDValue LHS = GetPromotedInteger(
N->getOperand(2));
1360 SDValue RHS = GetPromotedInteger(
N->getOperand(3));
1362 LHS.getValueType(),
N->getOperand(0),
1363 N->getOperand(1), LHS, RHS,
N->getOperand(4));
1367 unsigned OpNo =
N->isStrictFPOpcode() ? 1 : 0;
1368 EVT InVT =
N->getOperand(OpNo).getValueType();
1371 EVT SVT = getSetCCResultType(InVT);
1379 SVT = getSetCCResultType(InVT);
1387 assert(SVT.
isVector() ==
N->getOperand(OpNo).getValueType().isVector() &&
1388 "Vector compare must return a vector result!");
1392 if (
N->isStrictFPOpcode()) {
1394 SDValue Opers[] = {
N->getOperand(0),
N->getOperand(1),
1395 N->getOperand(2),
N->getOperand(3)};
1396 SetCC = DAG.
getNode(
N->getOpcode(), dl, VTs, Opers,
N->getFlags());
1401 SetCC = DAG.
getNode(
N->getOpcode(), dl, SVT,
N->getOperand(0),
1402 N->getOperand(1),
N->getOperand(2),
N->getFlags());
1418 EVT VT =
N->getValueType(0);
1424 ReplaceValueWith(
SDValue(
N, 0), Res);
1429 SDValue LHS = GetPromotedInteger(
N->getOperand(0));
1431 if (
N->getOpcode() != ISD::VP_SHL) {
1433 RHS = ZExtPromotedInteger(RHS);
1441 RHS = VPZExtPromotedInteger(RHS, Mask, EVL);
1446SDValue DAGTypeLegalizer::PromoteIntRes_SIGN_EXTEND_INREG(
SDNode *
N) {
1447 SDValue Op = GetPromotedInteger(
N->getOperand(0));
1449 Op.getValueType(),
Op,
N->getOperand(1));
1452SDValue DAGTypeLegalizer::PromoteIntRes_SimpleIntBinOp(
SDNode *
N) {
1456 SDValue LHS = GetPromotedInteger(
N->getOperand(0));
1457 SDValue RHS = GetPromotedInteger(
N->getOperand(1));
1458 if (
N->getNumOperands() == 2)
1460 assert(
N->getNumOperands() == 4 &&
"Unexpected number of operands!");
1461 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1463 N->getOperand(2),
N->getOperand(3));
1467 if (
N->getNumOperands() == 2) {
1469 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1470 SDValue RHS = SExtPromotedInteger(
N->getOperand(1));
1473 assert(
N->getNumOperands() == 4 &&
"Unexpected number of operands!");
1474 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1478 SDValue LHS = VPSExtPromotedInteger(
N->getOperand(0), Mask, EVL);
1479 SDValue RHS = VPSExtPromotedInteger(
N->getOperand(1), Mask, EVL);
1485 if (
N->getNumOperands() == 2) {
1487 SDValue LHS = ZExtPromotedInteger(
N->getOperand(0));
1488 SDValue RHS = ZExtPromotedInteger(
N->getOperand(1));
1491 assert(
N->getNumOperands() == 4 &&
"Unexpected number of operands!");
1492 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1496 SDValue LHS = VPZExtPromotedInteger(
N->getOperand(0), Mask, EVL);
1497 SDValue RHS = VPZExtPromotedInteger(
N->getOperand(1), Mask, EVL);
1508 SExtOrZExtPromotedOperands(LHS, RHS);
1511 LHS.getValueType(), LHS, RHS);
1516 if (
N->getOpcode() != ISD::VP_SRA) {
1518 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1520 RHS = ZExtPromotedInteger(RHS);
1527 SDValue LHS = VPSExtPromotedInteger(
N->getOperand(0), Mask, EVL);
1529 RHS = VPZExtPromotedInteger(RHS, Mask, EVL);
1536 if (
N->getOpcode() != ISD::VP_SRL) {
1538 SDValue LHS = ZExtPromotedInteger(
N->getOperand(0));
1540 RHS = ZExtPromotedInteger(RHS);
1547 SDValue LHS = VPZExtPromotedInteger(
N->getOperand(0), Mask, EVL);
1549 RHS = VPZExtPromotedInteger(RHS, Mask, EVL);
1557 ReplaceValueWith(
SDValue(
N, 0), Res);
1562 SDValue Hi = GetPromotedInteger(
N->getOperand(0));
1563 SDValue Lo = GetPromotedInteger(
N->getOperand(1));
1566 Amt = ZExtPromotedInteger(Amt);
1570 EVT OldVT =
N->getOperand(0).getValueType();
1571 EVT VT =
Lo.getValueType();
1572 unsigned Opcode =
N->getOpcode();
1586 if (NewBits >= (2 * OldBits) && !isa<ConstantSDNode>(Amt) &&
1611SDValue DAGTypeLegalizer::PromoteIntRes_VPFunnelShift(
SDNode *
N) {
1612 SDValue Hi = GetPromotedInteger(
N->getOperand(0));
1613 SDValue Lo = GetPromotedInteger(
N->getOperand(1));
1618 Amt = VPZExtPromotedInteger(Amt, Mask, EVL);
1622 EVT OldVT =
N->getOperand(0).getValueType();
1623 EVT VT =
Lo.getValueType();
1624 unsigned Opcode =
N->getOpcode();
1625 bool IsFSHR = Opcode == ISD::VP_FSHR;
1630 Amt = DAG.
getNode(ISD::VP_UREM,
DL, AmtVT, Amt,
1638 if (NewBits >= (2 * OldBits) && !isa<ConstantSDNode>(Amt) &&
1641 Hi = DAG.
getNode(ISD::VP_SHL,
DL, VT,
Hi, HiShift, Mask, EVL);
1644 Res = DAG.
getNode(IsFSHR ? ISD::VP_SRL : ISD::VP_SHL,
DL, VT, Res, Amt,
1647 Res = DAG.
getNode(ISD::VP_SRL,
DL, VT, Res, HiShift, Mask, EVL);
1653 Lo = DAG.
getNode(ISD::VP_SHL,
DL, VT,
Lo, ShiftOffset, Mask, EVL);
1658 Amt = DAG.
getNode(ISD::VP_ADD,
DL, AmtVT, Amt, ShiftOffset, Mask, EVL);
1676 Res = GetPromotedInteger(InOp);
1683 "Dst and Src must have the same number of elements");
1685 "Promoted vector type must be a power of two");
1688 GetSplitVector(InOp, EOp1, EOp2);
1696 assert(
N->getOpcode() == ISD::VP_TRUNCATE &&
1697 "Expected VP_TRUNCATE opcode");
1698 SDValue MaskLo, MaskHi, EVLLo, EVLHi;
1699 std::tie(MaskLo, MaskHi) = SplitMask(
N->getOperand(1));
1700 std::tie(EVLLo, EVLHi) =
1701 DAG.
SplitEVL(
N->getOperand(2),
N->getValueType(0), dl);
1702 EOp1 = DAG.
getNode(ISD::VP_TRUNCATE, dl, HalfNVT, EOp1, MaskLo, EVLLo);
1703 EOp2 = DAG.
getNode(ISD::VP_TRUNCATE, dl, HalfNVT, EOp2, MaskHi, EVLHi);
1710 SDValue WideInOp = GetWidenedVector(InOp);
1715 N->getValueType(0).getScalarType(), NumElem);
1730 if (
N->getOpcode() == ISD::VP_TRUNCATE)
1731 return DAG.
getNode(ISD::VP_TRUNCATE, dl, NVT, Res,
N->getOperand(1),
1736SDValue DAGTypeLegalizer::PromoteIntRes_UADDSUBO(
SDNode *
N,
unsigned ResNo) {
1738 return PromoteIntRes_Overflow(
N);
1742 SDValue LHS = ZExtPromotedInteger(
N->getOperand(0));
1743 SDValue RHS = ZExtPromotedInteger(
N->getOperand(1));
1744 EVT OVT =
N->getOperand(0).getValueType();
1745 EVT NVT =
LHS.getValueType();
1759 ReplaceValueWith(
SDValue(
N, 1), Ofl);
1770 return PromoteIntRes_Overflow(
N);
1782 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1783 SDValue RHS = SExtPromotedInteger(
N->getOperand(1));
1785 EVT ValueVTs[] = {
LHS.getValueType(),
N->getValueType(1)};
1789 LHS, RHS,
N->getOperand(2));
1799 assert(ResNo == 1 &&
"Don't know how to promote other results yet.");
1800 return PromoteIntRes_Overflow(
N);
1804 EVT OVT =
N->getValueType(0);
1817 SDValue Op0 = SExtPromotedInteger(
N->getOperand(0));
1821SDValue DAGTypeLegalizer::PromoteIntRes_XMULO(
SDNode *
N,
unsigned ResNo) {
1824 return PromoteIntRes_Overflow(
N);
1828 EVT SmallVT =
LHS.getValueType();
1835 LHS = SExtPromotedInteger(LHS);
1836 RHS = SExtPromotedInteger(RHS);
1838 LHS = ZExtPromotedInteger(LHS);
1839 RHS = ZExtPromotedInteger(RHS);
1870 ReplaceValueWith(
SDValue(
N, 1), Overflow);
1876 N->getValueType(0)));
1882 const APInt &MulImm =
N->getConstantOperandAPInt(0);
1889 EVT VT =
N->getValueType(0);
1897 for (
unsigned i = 0; i < NumRegs; ++i) {
1898 Parts[i] = DAG.
getVAArg(RegVT, dl, Chain,
Ptr,
N->getOperand(2),
1899 N->getConstantOperandVal(3));
1905 std::reverse(Parts.begin(), Parts.end());
1910 for (
unsigned i = 1; i < NumRegs; ++i) {
1921 ReplaceValueWith(
SDValue(
N, 1), Chain);
1934bool DAGTypeLegalizer::PromoteIntegerOperand(
SDNode *
N,
unsigned OpNo) {
1937 if (CustomLowerNode(
N,
N->getOperand(OpNo).getValueType(),
false)) {
1942 switch (
N->getOpcode()) {
1945 dbgs() <<
"PromoteIntegerOperand Op #" << OpNo <<
": ";
1946 N->dump(&DAG);
dbgs() <<
"\n";
1952 Res = PromoteIntOp_ATOMIC_STORE(cast<AtomicSDNode>(
N));
1955 case ISD::BR_CC: Res = PromoteIntOp_BR_CC(
N, OpNo);
break;
1956 case ISD::BRCOND: Res = PromoteIntOp_BRCOND(
N, OpNo);
break;
1962 Res = PromoteIntOp_FAKE_USE(
N);
1965 Res = PromoteIntOp_INSERT_VECTOR_ELT(
N, OpNo);
1969 case ISD::EXPERIMENTAL_VP_SPLAT:
1970 Res = PromoteIntOp_ScalarOp(
N);
1973 case ISD::SELECT: Res = PromoteIntOp_SELECT(
N, OpNo);
break;
1976 case ISD::SETCC: Res = PromoteIntOp_SETCC(
N, OpNo);
break;
1978 case ISD::VP_SIGN_EXTEND: Res = PromoteIntOp_VP_SIGN_EXTEND(
N);
break;
1979 case ISD::VP_SINT_TO_FP:
1982 case ISD::STORE: Res = PromoteIntOp_STORE(cast<StoreSDNode>(
N),
1985 Res = PromoteIntOp_VP_STORE(cast<VPStoreSDNode>(
N), OpNo);
1987 case ISD::MSTORE: Res = PromoteIntOp_MSTORE(cast<MaskedStoreSDNode>(
N),
1989 case ISD::MLOAD: Res = PromoteIntOp_MLOAD(cast<MaskedLoadSDNode>(
N),
1991 case ISD::MGATHER: Res = PromoteIntOp_MGATHER(cast<MaskedGatherSDNode>(
N),
1993 case ISD::MSCATTER: Res = PromoteIntOp_MSCATTER(cast<MaskedScatterSDNode>(
N),
1996 Res = PromoteIntOp_VECTOR_COMPRESS(
N, OpNo);
1998 case ISD::VP_TRUNCATE:
2002 case ISD::VP_UINT_TO_FP:
2007 case ISD::VP_ZERO_EXTEND: Res = PromoteIntOp_VP_ZERO_EXTEND(
N);
break;
2015 case ISD::ROTR: Res = PromoteIntOp_Shift(
N);
break;
2018 case ISD::UCMP: Res = PromoteIntOp_CMP(
N);
break;
2021 case ISD::FSHR: Res = PromoteIntOp_FunnelShift(
N);
break;
2047 case ISD::VP_REDUCE_ADD:
2048 case ISD::VP_REDUCE_MUL:
2049 case ISD::VP_REDUCE_AND:
2050 case ISD::VP_REDUCE_OR:
2051 case ISD::VP_REDUCE_XOR:
2052 case ISD::VP_REDUCE_SMAX:
2053 case ISD::VP_REDUCE_SMIN:
2054 case ISD::VP_REDUCE_UMAX:
2055 case ISD::VP_REDUCE_UMIN:
2056 Res = PromoteIntOp_VP_REDUCE(
N, OpNo);
2061 Res = PromoteIntOp_STACKMAP(
N, OpNo);
2064 Res = PromoteIntOp_PATCHPOINT(
N, OpNo);
2066 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
2067 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
2068 Res = PromoteIntOp_VP_STRIDED(
N, OpNo);
2070 case ISD::EXPERIMENTAL_VP_SPLICE:
2071 Res = PromoteIntOp_VP_SPLICE(
N, OpNo);
2074 Res = PromoteIntOp_VECTOR_HISTOGRAM(
N, OpNo);
2077 Res = PromoteIntOp_VECTOR_FIND_LAST_ACTIVE(
N, OpNo);
2082 if (!Res.
getNode())
return false;
2089 const bool IsStrictFp =
N->isStrictFPOpcode();
2091 N->getNumValues() == (IsStrictFp ? 2 : 1) &&
2092 "Invalid operand expansion");
2096 ReplaceValueWith(
SDValue(
N, 0), Res);
2106void DAGTypeLegalizer::SExtOrZExtPromotedOperands(
SDValue &LHS,
SDValue &RHS) {
2107 SDValue OpL = GetPromotedInteger(LHS);
2108 SDValue OpR = GetPromotedInteger(RHS);
2114 unsigned OpLEffectiveBits =
2116 unsigned OpREffectiveBits =
2118 if (OpLEffectiveBits <=
LHS.getScalarValueSizeInBits() &&
2119 OpREffectiveBits <=
RHS.getScalarValueSizeInBits()) {
2126 LHS = SExtPromotedInteger(LHS);
2127 RHS = SExtPromotedInteger(RHS);
2138 if (OpLEffectiveBits <=
LHS.getScalarValueSizeInBits() &&
2139 OpREffectiveBits <=
RHS.getScalarValueSizeInBits()) {
2146 LHS = ZExtPromotedInteger(LHS);
2147 RHS = ZExtPromotedInteger(RHS);
2152void DAGTypeLegalizer::PromoteSetCCOperands(
SDValue &LHS,
SDValue &RHS,
2161 LHS = SExtPromotedInteger(LHS);
2162 RHS = SExtPromotedInteger(RHS);
2167 "Unknown integer comparison!");
2169 SExtOrZExtPromotedOperands(LHS, RHS);
2173 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2178 SDValue Op1 = GetPromotedInteger(
N->getOperand(1));
2180 N->getChain(), Op1,
N->getBasePtr(),
N->getMemOperand());
2186 return CreateStackStoreLoad(
N->getOperand(0),
N->getValueType(0));
2189SDValue DAGTypeLegalizer::PromoteIntOp_BR_CC(
SDNode *
N,
unsigned OpNo) {
2190 assert(OpNo == 2 &&
"Don't know how to promote this operand!");
2194 PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(
N->getOperand(1))->get());
2199 N->getOperand(1), LHS, RHS,
N->getOperand(4)),
2203SDValue DAGTypeLegalizer::PromoteIntOp_BRCOND(
SDNode *
N,
unsigned OpNo) {
2204 assert(OpNo == 1 &&
"only know how to promote condition");
2207 SDValue Cond = PromoteTargetBoolean(
N->getOperand(1), MVT::Other);
2211 N->getOperand(2)), 0);
2216 EVT OVT =
N->getOperand(0).getValueType();
2217 SDValue Lo = ZExtPromotedInteger(
N->getOperand(0));
2218 SDValue Hi = GetPromotedInteger(
N->getOperand(1));
2219 assert(
Lo.getValueType() ==
N->getValueType(0) &&
"Operand over promoted?");
2232 EVT VecVT =
N->getValueType(0);
2235 "Legal vector of one illegal element?");
2240 assert(
N->getOperand(0).getValueSizeInBits() >=
2241 N->getValueType(0).getScalarSizeInBits() &&
2242 "Type of inserted value narrower than vector element type!");
2245 for (
unsigned i = 0; i < NumElts; ++i)
2246 NewOps.
push_back(GetPromotedInteger(
N->getOperand(i)));
2251SDValue DAGTypeLegalizer::PromoteIntOp_INSERT_VECTOR_ELT(
SDNode *
N,
2258 assert(
N->getOperand(1).getValueSizeInBits() >=
2259 N->getValueType(0).getScalarSizeInBits() &&
2260 "Type of inserted value narrower than vector element type!");
2262 GetPromotedInteger(
N->getOperand(1)),
2267 assert(OpNo == 2 &&
"Different operand and result vector types?");
2273 N->getOperand(1),
Idx), 0);
2277 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2278 if (
N->getOpcode() == ISD::EXPERIMENTAL_VP_SPLAT)
2287SDValue DAGTypeLegalizer::PromoteIntOp_SELECT(
SDNode *
N,
unsigned OpNo) {
2288 assert(OpNo == 0 &&
"Only know how to promote the condition!");
2290 EVT OpTy =
N->getOperand(1).getValueType();
2293 if (
SDValue Res = WidenVSELECTMask(
N))
2295 Res,
N->getOperand(1),
N->getOperand(2));
2299 Cond = PromoteTargetBoolean(
Cond, OpVT);
2302 N->getOperand(2)), 0);
2305SDValue DAGTypeLegalizer::PromoteIntOp_SELECT_CC(
SDNode *
N,
unsigned OpNo) {
2306 assert(OpNo == 0 &&
"Don't know how to promote this operand!");
2310 PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(
N->getOperand(4))->get());
2314 N->getOperand(3),
N->getOperand(4)), 0);
2317SDValue DAGTypeLegalizer::PromoteIntOp_SETCC(
SDNode *
N,
unsigned OpNo) {
2318 assert(OpNo == 0 &&
"Don't know how to promote this operand!");
2322 PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(
N->getOperand(2))->get());
2328 assert(
N->getOpcode() == ISD::VP_SETCC &&
"Expected VP_SETCC opcode");
2331 N->getOperand(3),
N->getOperand(4)),
2337 ZExtPromotedInteger(
N->getOperand(1))), 0);
2345 LHS = SExtPromotedInteger(LHS);
2346 RHS = SExtPromotedInteger(RHS);
2348 SExtOrZExtPromotedOperands(LHS, RHS);
2356 ZExtPromotedInteger(
N->getOperand(2))), 0);
2360 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2367SDValue DAGTypeLegalizer::PromoteIntOp_VP_SIGN_EXTEND(
SDNode *
N) {
2369 EVT VT =
N->getValueType(0);
2370 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2372 Op = DAG.
getNode(ISD::VP_ZERO_EXTEND, dl, VT,
Op,
N->getOperand(1),
2380 return DAG.
getNode(ISD::VP_SRA, dl, VT, Shl, ShAmt,
N->getOperand(1),
2385 if (
N->getOpcode() == ISD::VP_SINT_TO_FP)
2387 SExtPromotedInteger(
N->getOperand(0)),
2388 N->getOperand(1),
N->getOperand(2)),
2391 SExtPromotedInteger(
N->getOperand(0))), 0);
2394SDValue DAGTypeLegalizer::PromoteIntOp_STRICT_SINT_TO_FP(
SDNode *
N) {
2396 SExtPromotedInteger(
N->getOperand(1))), 0);
2404 SDValue Val = GetPromotedInteger(
N->getValue());
2408 N->getMemoryVT(),
N->getMemOperand());
2414 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2415 assert(!
N->isIndexed() &&
"expecting unindexed vp_store!");
2417 SDValue DataOp = GetPromotedInteger(
N->getValue());
2419 N->getMask(),
N->getVectorLength(),
2420 N->getMemoryVT(),
N->getMemOperand(),
2421 N->isCompressingStore());
2432 Mask = PromoteTargetBoolean(Mask, DataVT);
2438 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2439 DataOp = GetPromotedInteger(DataOp);
2442 N->getOffset(), Mask,
N->getMemoryVT(),
2443 N->getMemOperand(),
N->getAddressingMode(),
2444 true,
N->isCompressingStore());
2449 assert(OpNo == 3 &&
"Only know how to promote the mask!");
2450 EVT DataVT =
N->getValueType(0);
2451 SDValue Mask = PromoteTargetBoolean(
N->getOperand(OpNo), DataVT);
2453 NewOps[OpNo] =
Mask;
2470 EVT DataVT =
N->getValueType(0);
2471 NewOps[OpNo] = PromoteTargetBoolean(
N->getOperand(OpNo), DataVT);
2472 }
else if (OpNo == 4) {
2474 if (
N->isIndexSigned())
2476 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2478 NewOps[OpNo] = ZExtPromotedInteger(
N->getOperand(OpNo));
2480 NewOps[OpNo] = GetPromotedInteger(
N->getOperand(OpNo));
2494 bool TruncateStore =
N->isTruncatingStore();
2499 EVT DataVT =
N->getValue().getValueType();
2500 NewOps[OpNo] = PromoteTargetBoolean(
N->getOperand(OpNo), DataVT);
2501 }
else if (OpNo == 4) {
2503 if (
N->isIndexSigned())
2505 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2507 NewOps[OpNo] = ZExtPromotedInteger(
N->getOperand(OpNo));
2509 NewOps[OpNo] = GetPromotedInteger(
N->getOperand(OpNo));
2510 TruncateStore =
true;
2514 SDLoc(
N), NewOps,
N->getMemOperand(),
2515 N->getIndexType(), TruncateStore);
2520 assert(OpNo == 1 &&
"Can only promote VECTOR_COMPRESS mask.");
2523 SDValue Passthru =
N->getOperand(2);
2524 SDValue Mask = PromoteTargetBoolean(
N->getOperand(1), VT);
2529 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2530 if (
N->getOpcode() == ISD::VP_TRUNCATE)
2532 N->getOperand(1),
N->getOperand(2));
2537 if (
N->getOpcode() == ISD::VP_UINT_TO_FP)
2539 ZExtPromotedInteger(
N->getOperand(0)),
2540 N->getOperand(1),
N->getOperand(2)),
2543 ZExtPromotedInteger(
N->getOperand(0))), 0);
2546SDValue DAGTypeLegalizer::PromoteIntOp_STRICT_UINT_TO_FP(
SDNode *
N) {
2548 ZExtPromotedInteger(
N->getOperand(1))), 0);
2553 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2558SDValue DAGTypeLegalizer::PromoteIntOp_VP_ZERO_EXTEND(
SDNode *
N) {
2560 EVT VT =
N->getValueType(0);
2561 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2563 Op = DAG.
getNode(ISD::VP_ZERO_EXTEND, dl, VT,
Op,
N->getOperand(1),
2566 N->getOperand(0).getValueType());
2570 SDValue Op2 = ZExtPromotedInteger(
N->getOperand(2));
2575SDValue DAGTypeLegalizer::PromoteIntOp_FRAMERETURNADDR(
SDNode *
N) {
2577 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
2582 bool IsStrict =
N->isStrictFPOpcode();
2587 unsigned OpOffset = IsStrict ? 1 : 0;
2600 if (IsPowI &&
N->getValueType(0).isVector())
2603 NewOps[1 + OpOffset] = SExtPromotedInteger(
N->getOperand(1 + OpOffset));
2615 N->getOperand(1 + OpOffset).getValueType().getSizeInBits() &&
2616 "POWI exponent should match with sizeof(int) when doing the libcall.");
2619 SDValue Ops[2] = {
N->getOperand(0 + OpOffset),
N->getOperand(1 + OpOffset)};
2620 std::pair<SDValue, SDValue> Tmp = TLI.
makeLibCall(
2621 DAG, LC,
N->getValueType(0), Ops, CallOptions,
SDLoc(
N), Chain);
2622 ReplaceValueWith(
SDValue(
N, 0), Tmp.first);
2624 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
2629 switch (
N->getOpcode()) {
2637 case ISD::VP_REDUCE_ADD:
2638 case ISD::VP_REDUCE_MUL:
2639 case ISD::VP_REDUCE_AND:
2640 case ISD::VP_REDUCE_OR:
2641 case ISD::VP_REDUCE_XOR:
2645 case ISD::VP_REDUCE_SMAX:
2646 case ISD::VP_REDUCE_SMIN:
2650 case ISD::VP_REDUCE_UMAX:
2651 case ISD::VP_REDUCE_UMIN:
2661 return GetPromotedInteger(V);
2663 return SExtPromotedInteger(V);
2665 return ZExtPromotedInteger(V);
2671 SDValue Op = PromoteIntOpVectorReduction(
N,
N->getOperand(0));
2673 EVT OrigEltVT =
N->getOperand(0).getValueType().getVectorElementType();
2674 EVT InVT =
Op.getValueType();
2676 EVT ResVT =
N->getValueType(0);
2677 unsigned Opcode =
N->getOpcode();
2697 Op = ZExtPromotedInteger(
N->getOperand(0));
2700 Op = SExtPromotedInteger(
N->getOperand(0));
2716 Op = ZExtPromotedInteger(
N->getOperand(0));
2719 Op = SExtPromotedInteger(
N->getOperand(0));
2733SDValue DAGTypeLegalizer::PromoteIntOp_VP_REDUCE(
SDNode *
N,
unsigned OpNo) {
2740 NewOps[2] = PromoteTargetBoolean(
Op,
N->getOperand(1).getValueType());
2744 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2746 Op = PromoteIntOpVectorReduction(
N,
Op);
2750 EVT VT =
N->getValueType(0);
2751 EVT EltVT =
Op.getValueType().getScalarType();
2766 SDValue Op = ZExtPromotedInteger(
N->getOperand(1));
2770SDValue DAGTypeLegalizer::PromoteIntOp_STACKMAP(
SDNode *
N,
unsigned OpNo) {
2773 SDValue Operand =
N->getOperand(OpNo);
2779SDValue DAGTypeLegalizer::PromoteIntOp_PATCHPOINT(
SDNode *
N,
unsigned OpNo) {
2782 SDValue Operand =
N->getOperand(OpNo);
2788SDValue DAGTypeLegalizer::PromoteIntOp_VP_STRIDED(
SDNode *
N,
unsigned OpNo) {
2789 assert((
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_LOAD && OpNo == 3) ||
2790 (
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_STORE && OpNo == 4));
2793 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2798SDValue DAGTypeLegalizer::PromoteIntOp_VP_SPLICE(
SDNode *
N,
unsigned OpNo) {
2802 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2806 assert((OpNo == 4 || OpNo == 5) &&
"Unexpected operand for promotion");
2808 NewOps[OpNo] = ZExtPromotedInteger(
N->getOperand(OpNo));
2812SDValue DAGTypeLegalizer::PromoteIntOp_VECTOR_HISTOGRAM(
SDNode *
N,
2814 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2816 NewOps[1] = GetPromotedInteger(
N->getOperand(1));
2820SDValue DAGTypeLegalizer::PromoteIntOp_VECTOR_FIND_LAST_ACTIVE(
SDNode *
N,
2823 NewOps[OpNo] = GetPromotedInteger(
N->getOperand(OpNo));
2835void DAGTypeLegalizer::ExpandIntegerResult(
SDNode *
N,
unsigned ResNo) {
2841 if (CustomLowerNode(
N,
N->getValueType(ResNo),
true))
2844 switch (
N->getOpcode()) {
2847 dbgs() <<
"ExpandIntegerResult #" << ResNo <<
": ";
2848 N->dump(&DAG);
dbgs() <<
"\n";
2897 case ISD::LOAD: ExpandIntRes_LOAD(cast<LoadSDNode>(
N),
Lo,
Hi);
break;
2924 std::pair<SDValue, SDValue> Tmp = ExpandAtomic(
N);
2925 SplitInteger(Tmp.first,
Lo,
Hi);
2926 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
2934 N->getOperand(0),
N->getOperand(1),
N->getOperand(2),
N->getOperand(3),
2943 SplitInteger(Tmp,
Lo,
Hi);
3022 ExpandIntRes_Rotate(
N,
Lo,
Hi);
3027 ExpandIntRes_FunnelShift(
N,
Lo,
Hi);
3031 ExpandIntRes_VSCALE(
N,
Lo,
Hi);
3041std::pair <SDValue, SDValue> DAGTypeLegalizer::ExpandAtomic(
SDNode *
Node) {
3042 unsigned Opc =
Node->getOpcode();
3048 EVT RetVT =
Node->getValueType(0);
3056 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
3057 "Unexpected atomic op or value type!");
3061 Node->getOperand(0));
3066void DAGTypeLegalizer::ExpandShiftByConstant(
SDNode *
N,
const APInt &Amt,
3071 GetExpandedInteger(
N->getOperand(0), InL, InH);
3082 unsigned VTBits =
N->getValueType(0).getSizeInBits();
3086 if (Amt.
uge(VTBits)) {
3088 }
else if (Amt.
ugt(NVTBits)) {
3092 }
else if (Amt == NVTBits) {
3109 if (Amt.
uge(VTBits)) {
3111 }
else if (Amt.
ugt(NVTBits)) {
3115 }
else if (Amt == NVTBits) {
3132 if (Amt.
uge(VTBits)) {
3135 }
else if (Amt.
ugt(NVTBits)) {
3140 }
else if (Amt == NVTBits) {
3160bool DAGTypeLegalizer::
3162 unsigned Opc =
N->getOpcode();
3170 "Expanded integer type size not a power of two!");
3177 if (((Known.
Zero | Known.
One) & HighBitMask) == 0)
3182 GetExpandedInteger(In, InL, InH);
3236 Lo = DAG.
getNode(Opc, dl, NVT, InL, Amt);
3249bool DAGTypeLegalizer::
3256 "Expanded integer type size not a power of two!");
3261 GetExpandedInteger(
N->getOperand(0), InL, InH);
3273 switch (
N->getOpcode()) {
3288 DAG.
getSelect(dl, NVT, isShort, HiS, HiL));
3304 DAG.
getSelect(dl, NVT, isShort, LoS, LoL));
3320 DAG.
getSelect(dl, NVT, isShort, LoS, LoL));
3346 EVT NewVT = getSetCCResultType(
LHS.getValueType());
3352 SplitInteger(Res,
Lo,
Hi);
3355void DAGTypeLegalizer::ExpandIntRes_MINMAX(
SDNode *
N,
3364 unsigned NumBits =
N->getValueType(0).getScalarSizeInBits();
3365 unsigned NumHalfBits = NumBits / 2;
3368 SDValue LHSL, LHSH, RHSL, RHSH;
3369 GetExpandedInteger(LHS, LHSL, LHSH);
3370 GetExpandedInteger(RHS, RHSL, RHSH);
3383 SDValue LHSL, LHSH, RHSL, RHSH;
3384 GetExpandedInteger(LHS, LHSL, LHSH);
3385 GetExpandedInteger(RHS, RHSL, RHSH);
3387 EVT CCT = getSetCCResultType(NVT);
3396 Hi = DAG.
getNode(
N->getOpcode(),
DL, NVT, {LHSH, RHSH});
3400 const APInt *RHSVal =
nullptr;
3401 if (
auto *RHSConst = dyn_cast<ConstantSDNode>(RHS))
3402 RHSVal = &RHSConst->getAPIntValue();
3409 SDValue LHSL, LHSH, RHSL, RHSH;
3410 GetExpandedInteger(LHS, LHSL, LHSH);
3411 GetExpandedInteger(RHS, RHSL, RHSH);
3413 EVT CCT = getSetCCResultType(NVT);
3419 Hi = DAG.
getNode(
N->getOpcode(),
DL, NVT, {LHSH, RHSH});
3438 switch (
N->getOpcode()) {
3465 EVT VT =
N->getValueType(0);
3466 EVT CCT = getSetCCResultType(VT);
3469 SplitInteger(Result,
Lo,
Hi);
3474 SplitInteger(ExpandedCMP,
Lo,
Hi);
3477void DAGTypeLegalizer::ExpandIntRes_ADDSUB(
SDNode *
N,
3481 SDValue LHSL, LHSH, RHSL, RHSH;
3482 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3483 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3486 SDValue LoOps[2] = { LHSL, RHSL };
3487 SDValue HiOps[3] = { LHSH, RHSH };
3496 HiOps[2] =
Lo.getValue(1);
3502 HiOps[2] =
Lo.getValue(1);
3524 HiOps[2] =
Lo.getValue(1);
3528 HiOps[2] =
Lo.getValue(1);
3541 EVT OvfVT = getSetCCResultType(NVT);
3580 Cmp = DAG.
getSetCC(dl, getSetCCResultType(NVT), LoOps[0],
3583 Cmp = DAG.
getSetCC(dl, getSetCCResultType(NVT), LoOps[0],
3586 Cmp = DAG.
getSetCC(dl, getSetCCResultType(NVT),
Lo, LoOps[0],
3620void DAGTypeLegalizer::ExpandIntRes_ADDSUBC(
SDNode *
N,
3623 SDValue LHSL, LHSH, RHSL, RHSH;
3625 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3626 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3628 SDValue LoOps[2] = { LHSL, RHSL };
3629 SDValue HiOps[3] = { LHSH, RHSH };
3633 HiOps[2] =
Lo.getValue(1);
3637 HiOps[2] =
Lo.getValue(1);
3643 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3646void DAGTypeLegalizer::ExpandIntRes_ADDSUBE(
SDNode *
N,
3649 SDValue LHSL, LHSH, RHSL, RHSH;
3651 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3652 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3654 SDValue LoOps[3] = { LHSL, RHSL,
N->getOperand(2) };
3655 SDValue HiOps[3] = { LHSH, RHSH };
3657 Lo = DAG.
getNode(
N->getOpcode(), dl, VTList, LoOps);
3658 HiOps[2] =
Lo.getValue(1);
3659 Hi = DAG.
getNode(
N->getOpcode(), dl, VTList, HiOps);
3663 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3666void DAGTypeLegalizer::ExpandIntRes_UADDSUBO(
SDNode *
N,
3674 unsigned CarryOp, NoCarryOp;
3676 switch(
N->getOpcode()) {
3696 SDValue LHSL, LHSH, RHSL, RHSH;
3697 GetExpandedInteger(LHS, LHSL, LHSH);
3698 GetExpandedInteger(RHS, RHSL, RHSH);
3700 SDValue LoOps[2] = { LHSL, RHSL };
3701 SDValue HiOps[3] = { LHSH, RHSH };
3703 Lo = DAG.
getNode(
N->getOpcode(), dl, VTList, LoOps);
3704 HiOps[2] =
Lo.getValue(1);
3705 Hi = DAG.
getNode(CarryOp, dl, VTList, HiOps);
3707 Ovf =
Hi.getValue(1);
3712 SplitInteger(Sum,
Lo,
Hi);
3723 DAG.
getSetCC(dl,
N->getValueType(1), LHS,
3734 ReplaceValueWith(
SDValue(
N, 1), Ovf);
3740 SDValue LHSL, LHSH, RHSL, RHSH;
3742 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3743 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3745 SDValue LoOps[3] = { LHSL, RHSL,
N->getOperand(2) };
3748 Lo = DAG.
getNode(
N->getOpcode(), dl, VTList, LoOps);
3749 HiOps[2] =
Lo.getValue(1);
3750 Hi = DAG.
getNode(
N->getOpcode(), dl, VTList, HiOps);
3754 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3757void DAGTypeLegalizer::ExpandIntRes_SADDSUBO_CARRY(
SDNode *
N,
3760 SDValue LHSL, LHSH, RHSL, RHSH;
3762 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3763 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3769 Lo = DAG.
getNode(CarryOp, dl, VTList, { LHSL, RHSL,
N->getOperand(2) });
3770 Hi = DAG.
getNode(
N->getOpcode(), dl, VTList, { LHSH, RHSH, Lo.getValue(1) });
3774 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3777void DAGTypeLegalizer::ExpandIntRes_ANY_EXTEND(
SDNode *
N,
3782 if (
Op.getValueType().bitsLE(NVT)) {
3789 assert(getTypeAction(
Op.getValueType()) ==
3791 "Only know how to promote this result!");
3794 "Operand over promoted?");
3796 SplitInteger(Res,
Lo,
Hi);
3800void DAGTypeLegalizer::ExpandIntRes_AssertSext(
SDNode *
N,
3803 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
3804 EVT NVT =
Lo.getValueType();
3805 EVT EVT = cast<VTSDNode>(
N->getOperand(1))->getVT();
3809 if (NVTBits < EVTBits) {
3812 EVTBits - NVTBits)));
3822void DAGTypeLegalizer::ExpandIntRes_AssertZext(
SDNode *
N,
3825 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
3826 EVT NVT =
Lo.getValueType();
3827 EVT EVT = cast<VTSDNode>(
N->getOperand(1))->getVT();
3831 if (NVTBits < EVTBits) {
3834 EVTBits - NVTBits)));
3842void DAGTypeLegalizer::ExpandIntRes_BITREVERSE(
SDNode *
N,
3845 GetExpandedInteger(
N->getOperand(0),
Hi,
Lo);
3850void DAGTypeLegalizer::ExpandIntRes_BSWAP(
SDNode *
N,
3853 GetExpandedInteger(
N->getOperand(0),
Hi,
Lo);
3862 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
3863 EVT NVT =
Lo.getValueType();
3869void DAGTypeLegalizer::ExpandIntRes_Constant(
SDNode *
N,
3873 auto Constant = cast<ConstantSDNode>(
N);
3875 bool IsTarget =
Constant->isTargetOpcode();
3876 bool IsOpaque =
Constant->isOpaque();
3887 GetExpandedInteger(N0,
Lo,
Hi);
3888 EVT NVT =
Lo.getValueType();
3919 EVT VT =
N->getValueType(0);
3923 SplitInteger(Neg, NegLo, NegHi);
3931void DAGTypeLegalizer::ExpandIntRes_CTLZ(
SDNode *
N,
3935 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
3936 EVT NVT =
Lo.getValueType();
3953 SplitInteger(Result,
Lo,
Hi);
3956void DAGTypeLegalizer::ExpandIntRes_CTPOP(
SDNode *
N,
3960 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
3961 EVT NVT =
Lo.getValueType();
3967void DAGTypeLegalizer::ExpandIntRes_CTTZ(
SDNode *
N,
3971 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
3972 EVT NVT =
Lo.getValueType();
4001 ReplaceValueWith(
SDValue(
N, 1), Chain);
4009 Chain =
Op.getValue(1);
4018 EVT VT =
N->getValueType(0);
4022 bool IsStrict =
N->isStrictFPOpcode();
4024 SDValue Op =
N->getOperand(IsStrict ? 1 : 0);
4026 Op = GetPromotedFloat(
Op);
4030 Op.getValueType() == MVT::bf16) {
4036 EVT OpVT =
Op.getValueType();
4040 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected fp-to-xint conversion!");
4046 std::pair<SDValue, SDValue> Tmp = TLI.
makeLibCall(DAG, LC, VT,
Op,
4047 CallOptions, dl, Chain);
4048 SplitInteger(Tmp.first,
Lo,
Hi);
4051 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
4057 SplitInteger(Res,
Lo,
Hi);
4063 bool IsStrict =
N->isStrictFPOpcode();
4064 SDValue Op =
N->getOperand(IsStrict ? 1 : 0);
4068 "Input type needs to be promoted!");
4070 EVT VT =
Op.getValueType();
4072 if (VT == MVT::f16) {
4082 LC = RTLIB::LROUND_F32;
4083 else if (VT == MVT::f64)
4084 LC = RTLIB::LROUND_F64;
4085 else if (VT == MVT::f80)
4086 LC = RTLIB::LROUND_F80;
4087 else if (VT == MVT::f128)
4088 LC = RTLIB::LROUND_F128;
4089 else if (VT == MVT::ppcf128)
4090 LC = RTLIB::LROUND_PPCF128;
4091 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected lround input type!");
4095 LC = RTLIB::LRINT_F32;
4096 else if (VT == MVT::f64)
4097 LC = RTLIB::LRINT_F64;
4098 else if (VT == MVT::f80)
4099 LC = RTLIB::LRINT_F80;
4100 else if (VT == MVT::f128)
4101 LC = RTLIB::LRINT_F128;
4102 else if (VT == MVT::ppcf128)
4103 LC = RTLIB::LRINT_PPCF128;
4104 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected lrint input type!");
4108 LC = RTLIB::LLROUND_F32;
4109 else if (VT == MVT::f64)
4110 LC = RTLIB::LLROUND_F64;
4111 else if (VT == MVT::f80)
4112 LC = RTLIB::LLROUND_F80;
4113 else if (VT == MVT::f128)
4114 LC = RTLIB::LLROUND_F128;
4115 else if (VT == MVT::ppcf128)
4116 LC = RTLIB::LLROUND_PPCF128;
4117 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected llround input type!");
4121 LC = RTLIB::LLRINT_F32;
4122 else if (VT == MVT::f64)
4123 LC = RTLIB::LLRINT_F64;
4124 else if (VT == MVT::f80)
4125 LC = RTLIB::LLRINT_F80;
4126 else if (VT == MVT::f128)
4127 LC = RTLIB::LLRINT_F128;
4128 else if (VT == MVT::ppcf128)
4129 LC = RTLIB::LLRINT_PPCF128;
4130 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected llrint input type!");
4134 EVT RetVT =
N->getValueType(0);
4138 std::pair<SDValue, SDValue> Tmp = TLI.
makeLibCall(DAG, LC, RetVT,
4139 Op, CallOptions, dl,
4141 SplitInteger(Tmp.first,
Lo,
Hi);
4143 if (
N->isStrictFPOpcode())
4144 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
4147void DAGTypeLegalizer::ExpandIntRes_LOAD(
LoadSDNode *
N,
4149 assert(!
N->isAtomic() &&
"Should have been a ATOMIC_LOAD?");
4152 ExpandRes_NormalLoad(
N,
Lo,
Hi);
4158 EVT VT =
N->getValueType(0);
4169 if (
N->getMemoryVT().bitsLE(NVT)) {
4170 EVT MemVT =
N->getMemoryVT();
4173 N->getOriginalAlign(), MMOFlags, AAInfo);
4176 Ch =
Lo.getValue(1);
4181 unsigned LoSize =
Lo.getValueSizeInBits();
4196 N->getOriginalAlign(), MMOFlags, AAInfo);
4198 unsigned ExcessBits =
4206 N->getPointerInfo().getWithOffset(IncrementSize), NEVT,
4207 N->getOriginalAlign(), MMOFlags, AAInfo);
4216 EVT MemVT =
N->getMemoryVT();
4219 unsigned ExcessBits = (EBytes - IncrementSize)*8;
4225 N->getOriginalAlign(), MMOFlags, AAInfo);
4231 N->getPointerInfo().getWithOffset(IncrementSize),
4233 N->getOriginalAlign(), MMOFlags, AAInfo);
4257 ReplaceValueWith(
SDValue(
N, 1), Ch);
4260void DAGTypeLegalizer::ExpandIntRes_Logical(
SDNode *
N,
4264 GetExpandedInteger(
N->getOperand(0), LL, LH);
4265 GetExpandedInteger(
N->getOperand(1), RL, RH);
4270void DAGTypeLegalizer::ExpandIntRes_MUL(
SDNode *
N,
4272 EVT VT =
N->getValueType(0);
4277 GetExpandedInteger(
N->getOperand(0), LL, LH);
4278 GetExpandedInteger(
N->getOperand(1), RL, RH);
4288 LC = RTLIB::MUL_I16;
4289 else if (VT == MVT::i32)
4290 LC = RTLIB::MUL_I32;
4291 else if (VT == MVT::i64)
4292 LC = RTLIB::MUL_I64;
4293 else if (VT == MVT::i128)
4294 LC = RTLIB::MUL_I128;
4306 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
4309 SplitInteger(TLI.
makeLibCall(DAG, LC, VT, Ops, CallOptions, dl).first,
4321 ReplaceValueWith(
SDValue(
N, 1),
R.getValue(2));
4326 SplitInteger(Result,
Lo,
Hi);
4332 SplitInteger(Result,
Lo,
Hi);
4338 SplitInteger(Result,
Lo,
Hi);
4349 EVT VT =
N->getValueType(0);
4353 uint64_t Scale =
N->getConstantOperandVal(2);
4365 EVT BoolVT = getSetCCResultType(VT);
4390 SplitInteger(Result,
Lo,
Hi);
4396 assert(Scale <= VTSize &&
"Scale can't be larger than the value type size.");
4400 GetExpandedInteger(LHS, LL, LH);
4401 GetExpandedInteger(RHS, RL, RH);
4405 if (!TLI.
expandMUL_LOHI(LoHiOp, VT, dl, LHS, RHS, Result, NVT, DAG,
4413 SplitInteger(LoTmp, Result[0], Result[1]);
4414 SplitInteger(HiTmp, Result[2], Result[3]);
4416 assert(
Result.size() == 4 &&
"Unexpected number of partlets in the result");
4419 assert((VTSize == NVTSize * 2) &&
"Expected the new value type to be half "
4420 "the size of the current value type");
4442 if (Scale % NVTSize) {
4458 if (Scale == VTSize)
4479 EVT BoolNVT = getSetCCResultType(NVT);
4482 if (Scale < NVTSize) {
4489 }
else if (Scale == NVTSize) {
4492 }
else if (Scale < VTSize) {
4500 "(and saturation can't happen with Scale==VTSize).");
4507 if (Scale < NVTSize) {
4512 unsigned OverflowBits = VTSize - Scale + 1;
4513 assert(OverflowBits <= VTSize && OverflowBits > NVTSize &&
4514 "Extent of overflow bits must start within HL");
4531 }
else if (Scale == NVTSize) {
4544 }
else if (Scale < VTSize) {
4547 unsigned OverflowBits = VTSize - Scale + 1;
4574 N->getConstantOperandVal(2), DAG);
4578 N->getConstantOperandVal(2), TLI, DAG);
4579 SplitInteger(Res,
Lo,
Hi);
4582void DAGTypeLegalizer::ExpandIntRes_SADDSUBO(
SDNode *
Node,
4585 "Node has unexpected Opcode");
4600 SDValue LHSL, LHSH, RHSL, RHSH;
4601 GetExpandedInteger(LHS, LHSL, LHSH);
4602 GetExpandedInteger(RHS, RHSL, RHSH);
4606 Hi = DAG.
getNode(CarryOp, dl, VTList, { LHSH, RHSH,
Lo.getValue(1) });
4608 Ovf =
Hi.getValue(1);
4615 SplitInteger(Sum,
Lo,
Hi);
4640 EVT VT =
LHS.getValueType();
4643 SignsMatch = DAG.
getNOT(dl, SignsMatch, VT);
4647 EVT OType =
Node->getValueType(1);
4655void DAGTypeLegalizer::ExpandIntRes_SDIV(
SDNode *
N,
4657 EVT VT =
N->getValueType(0);
4659 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
4669 LC = RTLIB::SDIV_I16;
4670 else if (VT == MVT::i32)
4671 LC = RTLIB::SDIV_I32;
4672 else if (VT == MVT::i64)
4673 LC = RTLIB::SDIV_I64;
4674 else if (VT == MVT::i128)
4675 LC = RTLIB::SDIV_I128;
4676 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported SDIV!");
4680 SplitInteger(TLI.
makeLibCall(DAG, LC, VT, Ops, CallOptions, dl).first,
Lo,
Hi);
4683void DAGTypeLegalizer::ExpandIntRes_ShiftThroughStack(
SDNode *
N,
SDValue &
Lo,
4686 SDValue Shiftee =
N->getOperand(0);
4699 "Shifting unit is not a a power of two!");
4701 const bool IsOneStepShift =
4707 if (!IsOneStepShift)
4711 assert(VTBitWidth % 8 == 0 &&
"Shifting a not byte multiple value?");
4712 unsigned VTByteWidth = VTBitWidth / 8;
4714 "Shiftee type size is not a power of two!");
4715 unsigned StackSlotByteWidth = 2 * VTByteWidth;
4716 unsigned StackSlotBitWidth = 8 * StackSlotByteWidth;
4729 cast<FrameIndexSDNode>(
StackPtr.getNode())->getIndex());
4734 unsigned WideningOpc =
4736 Init = DAG.
getNode(WideningOpc, dl, StackSlotVT, Shiftee);
4743 Ch = DAG.
getStore(Ch, dl,
Init, StackPtr, StackPtrInfo, StackAlign);
4749 Flags.setExact(IsOneStepShift);
4769 bool WillIndexUpwards =
N->getOpcode() !=
ISD::SHL;
4771 WillIndexUpwards = !WillIndexUpwards;
4774 if (WillIndexUpwards) {
4778 StackPtr, DAG.
getConstant(VTByteWidth, dl, PtrTy), dl);
4779 ByteOffset = DAG.
getNegative(ByteOffset, dl, ShAmtVT);
4788 DAG.
getLoad(VT, dl, Ch, AdjStackPtr,
4793 if (!IsOneStepShift) {
4796 DAG.
getConstant(ShiftUnitInBits - 1, dl, ShAmtVT));
4797 Res = DAG.
getNode(
N->getOpcode(), dl, VT, Res, ShAmtRem);
4801 SplitInteger(Res,
Lo,
Hi);
4804void DAGTypeLegalizer::ExpandIntRes_Shift(
SDNode *
N,
4806 EVT VT =
N->getValueType(0);
4807 unsigned Opc =
N->getOpcode();
4813 return ExpandShiftByConstant(
N, CN->getAPIntValue(),
Lo,
Hi);
4817 if (ExpandShiftWithKnownAmountBit(
N,
Lo,
Hi))
4836 const bool LegalOrCustom =
4840 unsigned ExpansionFactor = 1;
4842 for (
EVT TmpVT = NVT;;) {
4844 if (NewTMPVT == TmpVT)
4854 return ExpandIntRes_ShiftThroughStack(
N,
Lo,
Hi);
4856 if (LegalOrCustom &&
4860 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
4866 SDValue ShiftOp =
N->getOperand(1);
4871 SDValue Ops[] = { LHSL, LHSH, ShiftOp };
4873 Hi =
Lo.getValue(1);
4883 LC = RTLIB::SHL_I16;
4884 else if (VT == MVT::i32)
4885 LC = RTLIB::SHL_I32;
4886 else if (VT == MVT::i64)
4887 LC = RTLIB::SHL_I64;
4888 else if (VT == MVT::i128)
4889 LC = RTLIB::SHL_I128;
4893 LC = RTLIB::SRL_I16;
4894 else if (VT == MVT::i32)
4895 LC = RTLIB::SRL_I32;
4896 else if (VT == MVT::i64)
4897 LC = RTLIB::SRL_I64;
4898 else if (VT == MVT::i128)
4899 LC = RTLIB::SRL_I128;
4904 LC = RTLIB::SRA_I16;
4905 else if (VT == MVT::i32)
4906 LC = RTLIB::SRA_I32;
4907 else if (VT == MVT::i64)
4908 LC = RTLIB::SRA_I64;
4909 else if (VT == MVT::i128)
4910 LC = RTLIB::SRA_I128;
4917 SDValue Ops[2] = {
N->getOperand(0), ShAmt};
4920 SplitInteger(TLI.
makeLibCall(DAG, LC, VT, Ops, CallOptions, dl).first,
Lo,
Hi);
4924 if (!ExpandShiftWithUnknownAmountBit(
N,
Lo,
Hi))
4928void DAGTypeLegalizer::ExpandIntRes_SIGN_EXTEND(
SDNode *
N,
4933 if (
Op.getValueType().bitsLE(NVT)) {
4944 assert(getTypeAction(
Op.getValueType()) ==
4946 "Only know how to promote this result!");
4949 "Operand over promoted?");
4951 SplitInteger(Res,
Lo,
Hi);
4959void DAGTypeLegalizer::
4962 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
4963 EVT EVT = cast<VTSDNode>(
N->getOperand(1))->getVT();
4985void DAGTypeLegalizer::ExpandIntRes_SREM(
SDNode *
N,
4987 EVT VT =
N->getValueType(0);
4989 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
4999 LC = RTLIB::SREM_I16;
5000 else if (VT == MVT::i32)
5001 LC = RTLIB::SREM_I32;
5002 else if (VT == MVT::i64)
5003 LC = RTLIB::SREM_I64;
5004 else if (VT == MVT::i128)
5005 LC = RTLIB::SREM_I128;
5006 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported SREM!");
5010 SplitInteger(TLI.
makeLibCall(DAG, LC, VT, Ops, CallOptions, dl).first,
Lo,
Hi);
5013void DAGTypeLegalizer::ExpandIntRes_TRUNCATE(
SDNode *
N,
5025void DAGTypeLegalizer::ExpandIntRes_XMULO(
SDNode *
N,
5027 EVT VT =
N->getValueType(0);
5046 SDValue LHSHigh, LHSLow, RHSHigh, RHSLow;
5047 GetExpandedInteger(LHS, LHSLow, LHSHigh);
5048 GetExpandedInteger(RHS, RHSLow, RHSHigh);
5050 EVT BitVT =
N->getValueType(1);
5075 SplitInteger(Three,
Lo,
Hi);
5079 ReplaceValueWith(
SDValue(
N, 1), Overflow);
5090 LC = RTLIB::MULO_I32;
5091 else if (VT == MVT::i64)
5092 LC = RTLIB::MULO_I64;
5093 else if (VT == MVT::i128)
5094 LC = RTLIB::MULO_I128;
5103 N->getOperand(1), MulLo, MulHi);
5109 SplitInteger(MulLo,
Lo,
Hi);
5110 ReplaceValueWith(
SDValue(
N, 1), Overflow);
5123 EVT ArgVT =
Op.getValueType();
5127 Entry.IsSExt =
true;
5128 Entry.IsZExt =
false;
5129 Args.push_back(Entry);
5135 Entry.IsSExt =
true;
5136 Entry.IsZExt =
false;
5137 Args.push_back(Entry);
5156 ReplaceValueWith(
SDValue(
N, 1), Ofl);
5159void DAGTypeLegalizer::ExpandIntRes_UDIV(
SDNode *
N,
5161 EVT VT =
N->getValueType(0);
5163 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
5172 if (isa<ConstantSDNode>(
N->getOperand(1))) {
5175 if (isTypeLegal(NVT)) {
5177 GetExpandedInteger(
N->getOperand(0), InL, InH);
5189 LC = RTLIB::UDIV_I16;
5190 else if (VT == MVT::i32)
5191 LC = RTLIB::UDIV_I32;
5192 else if (VT == MVT::i64)
5193 LC = RTLIB::UDIV_I64;
5194 else if (VT == MVT::i128)
5195 LC = RTLIB::UDIV_I128;
5196 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported UDIV!");
5199 SplitInteger(TLI.
makeLibCall(DAG, LC, VT, Ops, CallOptions, dl).first,
Lo,
Hi);
5202void DAGTypeLegalizer::ExpandIntRes_UREM(
SDNode *
N,
5204 EVT VT =
N->getValueType(0);
5206 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
5215 if (isa<ConstantSDNode>(
N->getOperand(1))) {
5218 if (isTypeLegal(NVT)) {
5220 GetExpandedInteger(
N->getOperand(0), InL, InH);
5232 LC = RTLIB::UREM_I16;
5233 else if (VT == MVT::i32)
5234 LC = RTLIB::UREM_I32;
5235 else if (VT == MVT::i64)
5236 LC = RTLIB::UREM_I64;
5237 else if (VT == MVT::i128)
5238 LC = RTLIB::UREM_I128;
5239 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported UREM!");
5242 SplitInteger(TLI.
makeLibCall(DAG, LC, VT, Ops, CallOptions, dl).first,
Lo,
Hi);
5245void DAGTypeLegalizer::ExpandIntRes_ZERO_EXTEND(
SDNode *
N,
5250 if (
Op.getValueType().bitsLE(NVT)) {
5257 assert(getTypeAction(
Op.getValueType()) ==
5259 "Only know how to promote this result!");
5262 "Operand over promoted?");
5264 SplitInteger(Res,
Lo,
Hi);
5272void DAGTypeLegalizer::ExpandIntRes_ATOMIC_LOAD(
SDNode *
N,
5275 EVT VT = cast<AtomicSDNode>(
N)->getMemoryVT();
5280 cast<AtomicSDNode>(
N)->getMemoryVT(), VTs,
N->getOperand(0),
5281 N->getOperand(1), Zero, Zero, cast<AtomicSDNode>(
N)->getMemOperand());
5287void DAGTypeLegalizer::ExpandIntRes_VECREDUCE(
SDNode *
N,
5292 SplitInteger(Res,
Lo,
Hi);
5295void DAGTypeLegalizer::ExpandIntRes_Rotate(
SDNode *
N,
5301 N->getOperand(0),
N->getOperand(1));
5302 SplitInteger(Res,
Lo,
Hi);
5309 GetExpandedInteger(
N->getOperand(0), In3, In4);
5310 GetExpandedInteger(
N->getOperand(1), In1, In2);
5314 unsigned Opc =
N->getOpcode();
5317 EVT ShAmtCCVT = getSetCCResultType(ShAmtVT);
5334 Lo = DAG.
getNode(Opc,
DL, HalfVT, Select2, Select1, NewShAmt);
5335 Hi = DAG.
getNode(Opc,
DL, HalfVT, Select3, Select2, NewShAmt);
5340 EVT VT =
N->getValueType(0);
5350 SplitInteger(Res,
Lo,
Hi);
5361bool DAGTypeLegalizer::ExpandIntegerOperand(
SDNode *
N,
unsigned OpNo) {
5365 if (CustomLowerNode(
N,
N->getOperand(OpNo).getValueType(),
false))
5368 switch (
N->getOpcode()) {
5371 dbgs() <<
"ExpandIntegerOperand Op #" << OpNo <<
": ";
5372 N->dump(&DAG);
dbgs() <<
"\n";
5377 case ISD::BR_CC: Res = ExpandIntOp_BR_CC(
N);
break;
5381 Res = ExpandOp_FAKE_USE(
N);
5385 case ISD::EXPERIMENTAL_VP_SPLAT:
5388 case ISD::SETCC: Res = ExpandIntOp_SETCC(
N);
break;
5394 case ISD::STORE: Res = ExpandIntOp_STORE(cast<StoreSDNode>(
N), OpNo);
break;
5401 case ISD::ROTR: Res = ExpandIntOp_Shift(
N);
break;
5406 case ISD::UCMP: Res = ExpandIntOp_CMP(
N);
break;
5410 Res = ExpandIntOp_STACKMAP(
N, OpNo);
5413 Res = ExpandIntOp_PATCHPOINT(
N, OpNo);
5415 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
5416 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
5417 Res = ExpandIntOp_VP_STRIDED(
N, OpNo);
5422 if (!Res.
getNode())
return false;
5430 "Invalid operand expansion");
5432 ReplaceValueWith(
SDValue(
N, 0), Res);
5438void DAGTypeLegalizer::IntegerExpandSetCCOperands(
SDValue &NewLHS,
5442 SDValue LHSLo, LHSHi, RHSLo, RHSHi;
5443 GetExpandedInteger(NewLHS, LHSLo, LHSHi);
5444 GetExpandedInteger(NewRHS, RHSLo, RHSHi);
5464 if ((CCCode ==
ISD::SETLT && CST->isZero()) ||
5465 (CCCode ==
ISD::SETGT && CST->isAllOnes())) {
5497 RHSLo, LowCC,
false, DagCombineInfo, dl);
5504 RHSHi, CCCode,
false, DagCombineInfo, dl);
5517 if ((EqAllowed && (HiCmpC && HiCmpC->
isZero())) ||
5519 ((HiCmpC && HiCmpC->
isOne()) || (LoCmpC && LoCmpC->
isZero())))) {
5528 if (LHSHi == RHSHi) {
5541 if (HasSETCCCARRY) {
5544 bool FlipOperands =
false;
5572 false, DagCombineInfo, dl);
5581 SDValue NewLHS =
N->getOperand(2), NewRHS =
N->getOperand(3);
5582 ISD::CondCode CCCode = cast<CondCodeSDNode>(
N->getOperand(1))->get();
5583 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode,
SDLoc(
N));
5595 N->getOperand(4)), 0);
5599 SDValue NewLHS =
N->getOperand(0), NewRHS =
N->getOperand(1);
5600 ISD::CondCode CCCode = cast<CondCodeSDNode>(
N->getOperand(4))->get();
5601 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode,
SDLoc(
N));
5612 N->getOperand(2),
N->getOperand(3),
5617 SDValue NewLHS =
N->getOperand(0), NewRHS =
N->getOperand(1);
5618 ISD::CondCode CCCode = cast<CondCodeSDNode>(
N->getOperand(2))->get();
5619 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode,
SDLoc(
N));
5624 "Unexpected setcc expansion!");
5640 SDValue LHSLo, LHSHi, RHSLo, RHSHi;
5641 GetExpandedInteger(LHS, LHSLo, LHSHi);
5642 GetExpandedInteger(RHS, RHSLo, RHSHi);
5655 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
5665 GetExpandedInteger(
N->getOperand(1),
Lo,
Hi);
5678 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
5683 bool IsStrict =
N->isStrictFPOpcode();
5687 SDValue Op =
N->getOperand(IsStrict ? 1 : 0);
5688 EVT DstVT =
N->getValueType(0);
5691 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
5692 "Don't know how to expand this XINT_TO_FP!");
5695 std::pair<SDValue, SDValue> Tmp =
5701 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
5702 ReplaceValueWith(
SDValue(
N, 0), Tmp.first);
5707 assert(!
N->isAtomic() &&
"Should have been a ATOMIC_STORE?");
5710 return ExpandOp_NormalStore(
N, OpNo);
5713 assert(OpNo == 1 &&
"Can only expand the stored value so far");
5715 EVT VT =
N->getOperand(1).getValueType();
5726 if (
N->getMemoryVT().bitsLE(NVT)) {
5727 GetExpandedInteger(
N->getValue(),
Lo,
Hi);
5729 N->getMemoryVT(),
N->getOriginalAlign(), MMOFlags,
5735 GetExpandedInteger(
N->getValue(),
Lo,
Hi);
5738 N->getOriginalAlign(), MMOFlags, AAInfo);
5740 unsigned ExcessBits =
5748 N->getPointerInfo().getWithOffset(IncrementSize),
5749 NEVT,
N->getOriginalAlign(), MMOFlags, AAInfo);
5755 GetExpandedInteger(
N->getValue(),
Lo,
Hi);
5757 EVT ExtVT =
N->getMemoryVT();
5760 unsigned ExcessBits = (EBytes - IncrementSize)*8;
5778 N->getOriginalAlign(), MMOFlags, AAInfo);
5784 N->getPointerInfo().getWithOffset(IncrementSize),
5786 N->getOriginalAlign(), MMOFlags, AAInfo);
5792 GetExpandedInteger(
N->getOperand(0), InL, InH);
5801 N->getOperand(0),
N->getOperand(2),
N->getOperand(1),
5802 cast<AtomicSDNode>(
N)->getMemOperand());
5806SDValue DAGTypeLegalizer::ExpandIntOp_VP_STRIDED(
SDNode *
N,
unsigned OpNo) {
5807 assert((
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_LOAD && OpNo == 3) ||
5808 (
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_STORE && OpNo == 4));
5812 GetExpandedInteger(NewOps[OpNo], NewOps[OpNo],
Hi);
5817SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_SPLICE(
SDNode *
N) {
5820 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
5821 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
5827SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_INTERLEAVE_DEINTERLEAVE(
SDNode *
N) {
5830 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
5831 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
5840SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_SUBVECTOR(
SDNode *
N) {
5842 EVT OutVT =
N->getValueType(0);
5844 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
5848 SDValue BaseIdx =
N->getOperand(1);
5875 SDValue Ops[] = {GetWidenedVector(InOp0), BaseIdx};
5884 SDValue Ops[] = { GetPromotedInteger(InOp0), BaseIdx };
5888 "Promoted operand has an element type greater than result");
5901 InOp0 = GetPromotedInteger(InOp0);
5909 for (
unsigned i = 0; i != OutNumElems; ++i) {
5914 N->getOperand(0), Index);
5923SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_SUBVECTOR(
SDNode *
N) {
5924 EVT OutVT =
N->getValueType(0);
5926 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
5938 Vec = GetPromotedInteger(Vec);
5944SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_REVERSE(
SDNode *
N) {
5947 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
5953SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_SHUFFLE(
SDNode *
N) {
5955 EVT VT =
N->getValueType(0);
5960 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
5961 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
5968 EVT OutVT =
N->getValueType(0);
5970 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
5971 unsigned NumElems =
N->getNumOperands();
5979 for (
unsigned i = 0; i != NumElems; ++i) {
5981 EVT OpVT =
Op.getValueType();
5986 if (OpVT.
bitsLT(NOutVTElem)) {
5992 ExtOpc = NOutExtOpc;
6005 assert(!
N->getOperand(0).getValueType().isVector() &&
6006 "Input must be a scalar");
6008 EVT OutVT =
N->getValueType(0);
6010 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6014 if (
N->isVPOpcode())
6015 return DAG.
getNode(
N->getOpcode(), dl, NOutVT,
Op,
N->getOperand(1),
6018 return DAG.
getNode(
N->getOpcode(), dl, NOutVT,
Op);
6023 EVT OutVT =
N->getValueType(0);
6026 "Type must be promoted to a scalable vector type");
6027 const APInt &StepVal =
N->getConstantOperandAPInt(0);
6032SDValue DAGTypeLegalizer::PromoteIntRes_CONCAT_VECTORS(
SDNode *
N) {
6035 EVT OutVT =
N->getValueType(0);
6037 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6039 unsigned NumOperands =
N->getNumOperands();
6044 SDUse *MaxSizedValue = std::max_element(
6046 EVT AVT = A.getValueType().getVectorElementType();
6047 EVT BVT = B.getValueType().getVectorElementType();
6048 return AVT.getScalarSizeInBits() < BVT.getScalarSizeInBits();
6054 for (
unsigned I = 0;
I < NumOperands; ++
I) {
6056 EVT OpVT =
Op.getValueType();
6058 Op = GetPromotedInteger(
Op);
6061 "Unhandled legalization type");
6078 unsigned NumElem =
N->getOperand(0).getValueType().getVectorNumElements();
6079 assert(NumElem * NumOperands == NumOutElem &&
6080 "Unexpected number of elements");
6084 for (
unsigned i = 0; i < NumOperands; ++i) {
6087 Op = GetPromotedInteger(
Op);
6088 EVT SclrTy =
Op.getValueType().getVectorElementType();
6089 assert(NumElem ==
Op.getValueType().getVectorNumElements() &&
6090 "Unexpected number of elements");
6092 for (
unsigned j = 0;
j < NumElem; ++
j) {
6102SDValue DAGTypeLegalizer::PromoteIntRes_EXTEND_VECTOR_INREG(
SDNode *
N) {
6103 EVT VT =
N->getValueType(0);
6105 assert(NVT.
isVector() &&
"This type must be promoted to a vector type");
6113 if (getTypeAction(
N->getOperand(0).getValueType())
6117 switch(
N->getOpcode()) {
6119 Promoted = SExtPromotedInteger(
N->getOperand(0));
6122 Promoted = ZExtPromotedInteger(
N->getOperand(0));
6125 Promoted = GetPromotedInteger(
N->getOperand(0));
6130 return DAG.
getNode(
N->getOpcode(), dl, NVT, Promoted);
6134 return DAG.
getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
6137SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_FIND_LAST_ACTIVE(
SDNode *
N) {
6138 EVT VT =
N->getValueType(0);
6143SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_VECTOR_ELT(
SDNode *
N) {
6144 EVT OutVT =
N->getValueType(0);
6146 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6151 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6154 NOutVTElem,
N->getOperand(1));
6156 V0, ConvElem,
N->getOperand(2));
6164 return DAG.
getNode(
N->getOpcode(), dl, NVT,
N->ops());
6172 SDValue Start = PromoteIntOpVectorReduction(
N,
N->getOperand(0));
6173 return DAG.
getNode(
N->getOpcode(),
DL, Start.getValueType(), Start,
6174 N->getOperand(1),
N->getOperand(2),
N->getOperand(3));
6181 assert(
N->getNumValues() == 3 &&
"Expected 3 values for PATCHPOINT");
6195SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_VECTOR_ELT(
SDNode *
N) {
6197 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6209SDValue DAGTypeLegalizer::PromoteIntOp_INSERT_SUBVECTOR(
SDNode *
N) {
6214 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
6234 return DAG.
getNode(
N->getOpcode(), dl,
N->getValueType(0), V0, VPromoted);
6237SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_SUBVECTOR(
SDNode *
N) {
6239 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6242 N->getValueType(0).getVectorNumElements());
6247SDValue DAGTypeLegalizer::PromoteIntOp_CONCAT_VECTORS(
SDNode *
N) {
6250 EVT ResVT =
N->getValueType(0);
6251 unsigned NumElems =
N->getNumOperands();
6256 for (
unsigned OpIdx = 0; OpIdx < NumElems; ++OpIdx) {
6258 unsigned OpNumElts =
Op.getValueType().getVectorMinNumElements();
6266 EVT RetSclrTy =
N->getValueType(0).getVectorElementType();
6272 for (
unsigned VecIdx = 0; VecIdx != NumElems; ++VecIdx) {
6274 EVT SclrTy =
Incoming->getValueType(0).getVectorElementType();
6275 unsigned NumElem =
Incoming->getValueType(0).getVectorNumElements();
6277 for (
unsigned i=0; i<NumElem; ++i) {
6289SDValue DAGTypeLegalizer::ExpandIntOp_STACKMAP(
SDNode *
N,
unsigned OpNo) {
6302 for (
unsigned I = 0;
I < OpNo;
I++)
6305 EVT Ty =
Op.getValueType();
6317 for (
unsigned I = OpNo + 1;
I <
N->getNumOperands();
I++)
6322 for (
unsigned ResNum = 0; ResNum <
N->getNumValues(); ResNum++)
6328SDValue DAGTypeLegalizer::ExpandIntOp_PATCHPOINT(
SDNode *
N,
unsigned OpNo) {
6341 for (
unsigned I = 0;
I < OpNo;
I++)
6344 EVT Ty =
Op.getValueType();
6356 for (
unsigned I = OpNo + 1;
I <
N->getNumOperands();
I++)
6361 for (
unsigned ResNum = 0; ResNum <
N->getNumValues(); ResNum++)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
BlockVerifier::State From
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
static bool isSigned(unsigned int Opcode)
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)
const SmallVectorImpl< MachineOperand > & Cond
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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.
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
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 - Represent a constant reference to an array (0 or more elements consecutively in memory),...
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
This is an important base class in LLVM.
@ NewNode
This is a new node, not before seen, that was created in the process of legalizing some other node.
This class represents an Operation in the Expression.
bool isLittleEndian() const
Layout endianness...
This class is used to represent ISD::LOAD nodes.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
static MVT getVectorVT(MVT VT, unsigned NumElements)
MVT getVectorElementType() const
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
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.
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Represents a use of a SDNode.
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...
Align getReducedAlign(EVT VT, bool UseABI)
In most cases this function returns the ABI alignment for a given type, except for illegal vector typ...
SDValue getVPZeroExtendInReg(SDValue Op, SDValue Mask, SDValue EVL, const SDLoc &DL, EVT VT)
Return the expression required to zero extend the Op value assuming it was the smaller SrcTy value.
SDValue getExtLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
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 ...
unsigned ComputeMaxSignificantBits(SDValue Op, unsigned Depth=0) const
Get the upper bound on bit size for this Value Op as a signed integer.
SDValue getMaskedGather(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, ISD::LoadExtType ExtTy)
SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
SDValue getAllOnesConstant(const SDLoc &DL, EVT VT, bool IsTarget=false, bool IsOpaque=false)
SDValue getVScale(const SDLoc &DL, EVT VT, APInt MulImm, bool ConstantFold=true)
Return a node that represents the runtime scaling 'MulImm * RuntimeVL'.
SDValue getFreeze(SDValue V)
Return a freeze using the SDLoc of the value operand.
SDValue getAtomicCmpSwap(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDVTList VTs, SDValue Chain, SDValue Ptr, SDValue Cmp, SDValue Swp, MachineMemOperand *MMO)
Gets a node for an atomic cmpxchg op.
void ReplaceAllUsesOfValuesWith(const SDValue *From, const SDValue *To, unsigned Num)
Like ReplaceAllUsesOfValueWith, but for multiple values at once.
SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Chain=SDValue(), bool IsSignaling=false)
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
SDValue UnrollVectorOp(SDNode *N, unsigned ResNE=0)
Utility function used by legalize and lowering to "unroll" a vector operation by splitting out the sc...
SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr)
Loads are not normal binary operators: their result type is not determined by their operands,...
SDValue getStepVector(const SDLoc &DL, EVT ResVT, const APInt &StepVal)
Returns a vector of type ResVT whose elements contain the linear sequence <0, Step,...
SDValue getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT, SDValue Chain, SDValue Ptr, SDValue Val, MachineMemOperand *MMO)
Gets a node for an atomic op, produces result (if relevant) and chain and takes 2 operands.
SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a bitwise NOT operation as (XOR Val, -1).
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
SDValue getSelect(const SDLoc &DL, EVT VT, SDValue Cond, SDValue LHS, SDValue RHS, SDNodeFlags Flags=SDNodeFlags())
Helper function to make it easier to build Select's if you just have operands and don't want to check...
SDValue getNegative(SDValue Val, const SDLoc &DL, EVT VT)
Create negative operation as (SUB 0, Val).
SDValue getZeroExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to zero extend the Op value assuming it was the smaller SrcTy value.
const DataLayout & getDataLayout() const
SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
SDValue getVAArg(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue SV, unsigned Align)
VAArg produces a result and token chain, and takes a pointer and a source value as input.
SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const AAMDNodes &AAInfo=AAMDNodes())
Helper function to build ISD::STORE nodes.
SDValue getSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either sign-extending or trunca...
SDValue getBoolExtOrTrunc(SDValue Op, const SDLoc &SL, EVT VT, EVT OpVT)
Convert Op, which must be of integer type, to the integer type VT, by using an extension appropriate ...
SDValue getMaskedStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Base, SDValue Offset, SDValue Mask, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, bool IsTruncating=false, bool IsCompressing=false)
SDValue getExternalSymbol(const char *Sym, EVT VT)
std::pair< SDValue, SDValue > SplitEVL(SDValue N, EVT VecVT, const SDLoc &DL)
Split the explicit vector length parameter of a VP operation.
SDValue getAnyExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either any-extending or truncat...
SDValue getLoadVP(ISD::MemIndexedMode AM, ISD::LoadExtType ExtType, EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, SDValue Offset, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT MemVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, const MDNode *Ranges=nullptr, bool IsExpanding=false)
SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
SDValue getValueType(EVT)
SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
SDValue getTruncStoreVP(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Mask, SDValue EVL, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags, const AAMDNodes &AAInfo, bool IsCompressing=false)
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
const TargetLibraryInfo & getLibInfo() const
unsigned ComputeNumSignBits(SDValue Op, unsigned Depth=0) const
Return the number of times the sign bit of the register is replicated into the other bits.
SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
MachineFunction & getMachineFunction() const
KnownBits computeKnownBits(SDValue Op, unsigned Depth=0) const
Determine which bits of Op are known to be either zero or one and return them in Known.
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...
SDValue getCondCode(ISD::CondCode Cond)
SDValue getObjectPtrOffset(const SDLoc &SL, SDValue Ptr, TypeSize Offset)
Create an add instruction with appropriate flags when used for addressing some offset of an object.
LLVMContext * getContext() const
SDValue CreateStackTemporary(TypeSize Bytes, Align Alignment)
Create a stack temporary based on the size in bytes and the alignment.
SDNode * UpdateNodeOperands(SDNode *N, SDValue Op)
Mutate the specified node in-place to have the specified operands.
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
SDValue getMaskedLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Base, SDValue Offset, SDValue Mask, SDValue Src0, EVT MemVT, MachineMemOperand *MMO, ISD::MemIndexedMode AM, ISD::LoadExtType, bool IsExpanding=false)
SDValue getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1, SDValue N2, ArrayRef< int > Mask)
Return an ISD::VECTOR_SHUFFLE node.
SDValue getMaskedScatter(SDVTList VTs, EVT MemVT, const SDLoc &dl, ArrayRef< SDValue > Ops, MachineMemOperand *MMO, ISD::MemIndexType IndexType, bool IsTruncating=false)
This SDNode is used to implement the code generator support for the llvm IR shufflevector instruction...
ArrayRef< int > getMask() const
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class is used to represent ISD::STORE nodes.
unsigned getIntSize() const
Get size of a C-level int or unsigned int, in bits.
LegalizeAction
This enum indicates whether operations are valid for a target, and if not, what action should be used...
CallingConv::ID getLibcallCallingConv(RTLIB::Libcall Call) const
Get the CallingConv that should be used for the specified libcall.
ShiftLegalizationStrategy
Return the preferred strategy to legalize tihs SHIFT instruction, with ExpansionFactor being the recu...
EVT getTypeToExpandTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
virtual bool isSExtCheaperThanZExt(EVT FromTy, EVT ToTy) const
Return true if sign-extension from FromTy to ToTy is cheaper than zero-extension.
virtual MVT getVectorIdxTy(const DataLayout &DL) const
Returns the type to be used for the index operand of: ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT...
@ TypeScalarizeScalableVector
virtual unsigned getNumRegisters(LLVMContext &Context, EVT VT, std::optional< MVT > RegisterVT=std::nullopt) const
Return the number of registers that this ValueType will eventually require.
LegalizeAction getFixedPointOperationAction(unsigned Op, EVT VT, unsigned Scale) const
Some fixed point operations may be natively supported by the target but only for specific scales.
virtual ISD::NodeType getExtendForAtomicOps() const
Returns how the platform's atomic operations are extended (ZERO_EXTEND, SIGN_EXTEND,...
EVT getShiftAmountTy(EVT LHSTy, const DataLayout &DL) const
Returns the type for the shift amount of a shift opcode.
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
BooleanContent getBooleanContents(bool isVec, bool isFloat) const
For targets without i1 registers, this gives the nature of the high-bits of boolean values held in ty...
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
bool isOperationLegal(unsigned Op, EVT VT) const
Return true if the specified operation is legal on this target.
virtual ISD::NodeType getExtendForAtomicCmpSwapArg() const
Returns how the platform's atomic compare and swap expects its comparison value to be extended (ZERO_...
BooleanContent
Enum that describes how the target represents true/false values.
@ ZeroOrOneBooleanContent
@ UndefinedBooleanContent
@ ZeroOrNegativeOneBooleanContent
virtual ShiftLegalizationStrategy preferredShiftLegalizationStrategy(SelectionDAG &DAG, SDNode *N, unsigned ExpansionFactor) const
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
const char * getLibcallName(RTLIB::Libcall Call) const
Get the libcall routine name for the specified libcall.
std::vector< ArgListEntry > ArgListTy
MVT getRegisterType(MVT VT) const
Return the type of registers that this ValueType will eventually require.
LegalizeAction getOperationAction(unsigned Op, EVT VT) const
Return how this operation should be treated: either it is legal, needs to be promoted to a larger siz...
bool isOperationLegalOrCustomOrPromote(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
static ISD::NodeType getExtendForContent(BooleanContent Content)
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
SDValue expandAddSubSat(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US][ADD|SUB]SAT.
bool expandMUL(SDNode *N, SDValue &Lo, SDValue &Hi, EVT HiLoVT, SelectionDAG &DAG, MulExpansionKind Kind, SDValue LL=SDValue(), SDValue LH=SDValue(), SDValue RL=SDValue(), SDValue RH=SDValue()) const
Expand a MUL into two nodes.
std::pair< SDValue, SDValue > makeLibCall(SelectionDAG &DAG, RTLIB::Libcall LC, EVT RetVT, ArrayRef< SDValue > Ops, MakeLibCallOptions CallOptions, const SDLoc &dl, SDValue Chain=SDValue()) const
Returns a pair of (return value, chain).
SDValue expandCTLZ(SDNode *N, SelectionDAG &DAG) const
Expand CTLZ/CTLZ_ZERO_UNDEF nodes.
SDValue expandBITREVERSE(SDNode *N, SelectionDAG &DAG) const
Expand BITREVERSE nodes.
SDValue expandCTTZ(SDNode *N, SelectionDAG &DAG) const
Expand CTTZ/CTTZ_ZERO_UNDEF nodes.
SDValue expandABD(SDNode *N, SelectionDAG &DAG) const
Expand ABDS/ABDU nodes.
SDValue expandShlSat(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US]SHLSAT.
SDValue expandFP_TO_INT_SAT(SDNode *N, SelectionDAG &DAG) const
Expand FP_TO_[US]INT_SAT into FP_TO_[US]INT and selects or min/max.
SDValue expandABS(SDNode *N, SelectionDAG &DAG, bool IsNegative=false) const
Expand ABS nodes.
SDValue expandVecReduce(SDNode *Node, SelectionDAG &DAG) const
Expand a VECREDUCE_* into an explicit calculation.
SDValue expandCTPOP(SDNode *N, SelectionDAG &DAG) const
Expand CTPOP nodes.
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
SDValue expandBSWAP(SDNode *N, SelectionDAG &DAG) const
Expand BSWAP nodes.
bool expandDIVREMByConstant(SDNode *N, SmallVectorImpl< SDValue > &Result, EVT HiLoVT, SelectionDAG &DAG, SDValue LL=SDValue(), SDValue LH=SDValue()) const
Attempt to expand an n-bit div/rem/divrem by constant using a n/2-bit urem by constant and other arit...
void forceExpandWideMUL(SelectionDAG &DAG, const SDLoc &dl, bool Signed, EVT WideVT, const SDValue LL, const SDValue LH, const SDValue RL, const SDValue RH, SDValue &Lo, SDValue &Hi) const
forceExpandWideMUL - Unconditionally expand a MUL into either a libcall or brute force via a wide mul...
SDValue SimplifySetCC(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond, bool foldBooleans, DAGCombinerInfo &DCI, const SDLoc &dl) const
Try to simplify a setcc built with the specified operands and cc.
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].
SDValue expandROT(SDNode *N, bool AllowVectorOps, SelectionDAG &DAG) const
Expand rotations.
SDValue expandCMP(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US]CMP.
bool expandMUL_LOHI(unsigned Opcode, EVT VT, const SDLoc &dl, SDValue LHS, SDValue RHS, SmallVectorImpl< SDValue > &Result, EVT HiLoVT, SelectionDAG &DAG, MulExpansionKind Kind, SDValue LL=SDValue(), SDValue LH=SDValue(), SDValue RL=SDValue(), SDValue RH=SDValue()) const
Expand a MUL or [US]MUL_LOHI of n-bit values into two or four nodes, respectively,...
SDValue expandAVG(SDNode *N, SelectionDAG &DAG) const
Expand vector/scalar AVGCEILS/AVGCEILU/AVGFLOORS/AVGFLOORU nodes.
static constexpr TypeSize getFixed(ScalarTy ExactSize)
The instances of the Type class are immutable: once they are created, they are never changed.
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 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.
@ MLOAD
Masked load and store - consecutive vector load and store operations with additional mask operand tha...
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
@ BSWAP
Byte Swap and Counting operators.
@ SMULFIX
RESULT = [US]MULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication on 2 integers with the same...
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
@ ADD
Simple integer binary arithmetic operators.
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ SMULFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
@ VECTOR_FIND_LAST_ACTIVE
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
@ SDIVREM
SDIVREM/UDIVREM - Divide two integers and produce both a quotient and remainder result.
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
@ FAKE_USE
FAKE_USE represents a use of the operand but does not do anything.
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ SDIVFIX
RESULT = [US]DIVFIX(LHS, RHS, SCALE) - Perform fixed point division on 2 integers with the same width...
@ SET_ROUNDING
Set rounding mode.
@ SIGN_EXTEND
Conversion operators.
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
@ READSTEADYCOUNTER
READSTEADYCOUNTER - This corresponds to the readfixedcounter intrinsic.
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
@ SETCCCARRY
Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, but op #2 is a boolean indicating ...
@ BR_CC
BR_CC - Conditional branch.
@ SSUBO
Same for subtraction.
@ VECTOR_INTERLEAVE
VECTOR_INTERLEAVE(VEC1, VEC2) - Returns two vectors with all input and output vectors having the same...
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
@ UNDEF
UNDEF - An undefined node.
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ GET_ROUNDING
Returns current rounding mode: -1 Undefined 0 Round to 0 1 Round to nearest, ties to even 2 Round to ...
@ SHL
Shift and rotation operations.
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
@ 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...
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
@ STRICT_SINT_TO_FP
STRICT_[US]INT_TO_FP - Convert a signed or unsigned integer to a floating point value.
@ MGATHER
Masked gather and scatter - load and store operations for a vector of random addresses with additiona...
@ BF16_TO_FP
BF16_TO_FP, FP_TO_BF16 - These operators are used to perform promotions and truncation for bfloat16.
@ FRAMEADDR
FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and llvm.returnaddress on the DAG.
@ STRICT_FP_TO_SINT
STRICT_FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
@ READCYCLECOUNTER
READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic.
@ STRICT_FP_EXTEND
X = STRICT_FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
@ AND
Bitwise operators - logical and, logical or, logical xor.
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
@ 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...
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
@ EXPERIMENTAL_VECTOR_HISTOGRAM
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
@ VAARG
VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, and the alignment.
@ BRCOND
BRCOND - Conditional branch.
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
@ VECTOR_DEINTERLEAVE
VECTOR_DEINTERLEAVE(VEC1, VEC2) - Returns two vectors with all input and output vectors having the sa...
@ 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,...
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...
Libcall getPOWI(EVT RetVT)
getPOWI - Return the POWI_* value for the given types, or UNKNOWN_LIBCALL if there is none.
Libcall getSINTTOFP(EVT OpVT, EVT RetVT)
getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
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.
Libcall getLDEXP(EVT RetVT)
getLDEXP - Return the LDEXP_* value for the given types, or UNKNOWN_LIBCALL if there is none.
Libcall getUINTTOFP(EVT OpVT, EVT RetVT)
getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
Libcall
RTLIB::Libcall enum - This enum defines all of the runtime library calls the backend can emit.
Libcall getFPTOUINT(EVT OpVT, EVT RetVT)
getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
Libcall getFPTOSINT(EVT OpVT, EVT RetVT)
getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
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< FuncNode * > Func
This is an optimization pass for GlobalISel generic memory operations.
bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
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.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
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
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.
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.
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
This struct is a compact representation of a valid (non-zero power of two) alignment.
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.
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
Incoming for lane maks phi as machine instruction, incoming register Reg and incoming block Block are...
bool isZero() const
Returns true if value is all zero.
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
unsigned countMaxActiveBits() const
Returns the maximum number of bits needed to represent all possible unsigned values with these known ...
This class contains a discriminated union of information about pointers in memory operands,...
static MachinePointerInfo getUnknownStack(MachineFunction &MF)
Stack memory without other information.
static MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
These are IR-level optimization flags that may be propagated to SDNodes.
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
This structure contains all information that is necessary for lowering calls.
This structure is used to pass arguments to makeLibCall function.
MakeLibCallOptions & setIsSigned(bool Value=true)
MakeLibCallOptions & setTypeListBeforeSoften(ArrayRef< EVT > OpsVT, EVT RetVT, bool Value=true)