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;
86 case ISD::MLOAD: Res = PromoteIntRes_MLOAD(cast<MaskedLoadSDNode>(
N));
88 case ISD::MGATHER: Res = PromoteIntRes_MGATHER(cast<MaskedGatherSDNode>(
N));
91 Res = PromoteIntRes_VECTOR_COMPRESS(
N);
97 Res = PromoteIntRes_Select(
N);
102 case ISD::SETCC: Res = PromoteIntRes_SETCC(
N);
break;
104 case ISD::SMAX: Res = PromoteIntRes_SExtIntBinOp(
N);
break;
106 case ISD::UMAX: Res = PromoteIntRes_UMINUMAX(
N);
break;
109 case ISD::VP_SHL: Res = PromoteIntRes_SHL(
N);
break;
111 Res = PromoteIntRes_SIGN_EXTEND_INREG(
N);
break;
113 case ISD::VP_SRA: Res = PromoteIntRes_SRA(
N);
break;
115 case ISD::VP_SRL: Res = PromoteIntRes_SRL(
N);
break;
116 case ISD::VP_TRUNCATE:
118 case ISD::UNDEF: Res = PromoteIntRes_UNDEF(
N);
break;
119 case ISD::VAARG: Res = PromoteIntRes_VAARG(
N);
break;
123 Res = PromoteIntRes_EXTRACT_SUBVECTOR(
N);
break;
125 Res = PromoteIntRes_INSERT_SUBVECTOR(
N);
break;
127 Res = PromoteIntRes_VECTOR_REVERSE(
N);
break;
129 Res = PromoteIntRes_VECTOR_SHUFFLE(
N);
break;
131 Res = PromoteIntRes_VECTOR_SPLICE(
N);
break;
134 Res = PromoteIntRes_VECTOR_INTERLEAVE_DEINTERLEAVE(
N);
137 Res = PromoteIntRes_INSERT_VECTOR_ELT(
N);
break;
139 Res = PromoteIntRes_BUILD_VECTOR(
N);
143 case ISD::EXPERIMENTAL_VP_SPLAT:
144 Res = PromoteIntRes_ScalarOp(
N);
148 Res = PromoteIntRes_CONCAT_VECTORS(
N);
break;
153 Res = PromoteIntRes_EXTEND_VECTOR_INREG(
N);
break;
156 case ISD::VP_SIGN_EXTEND:
158 case ISD::VP_ZERO_EXTEND:
161 case ISD::VP_FP_TO_SINT:
162 case ISD::VP_FP_TO_UINT:
170 Res = PromoteIntRes_FP_TO_XINT_SAT(
N);
break;
174 Res = PromoteIntRes_FP_TO_FP16_BF16(
N);
178 Res = PromoteIntRes_STRICT_FP_TO_FP16_BF16(
N);
193 case ISD::VP_MUL: Res = PromoteIntRes_SimpleIntBinOp(
N);
break;
203 case ISD::VP_SREM: Res = PromoteIntRes_SExtIntBinOp(
N);
break;
213 case ISD::VP_UREM: Res = PromoteIntRes_ZExtIntBinOp(
N);
break;
216 case ISD::SSUBO: Res = PromoteIntRes_SADDSUBO(
N, ResNo);
break;
218 case ISD::USUBO: Res = PromoteIntRes_UADDSUBO(
N, ResNo);
break;
220 case ISD::UMULO: Res = PromoteIntRes_XMULO(
N, ResNo);
break;
236 Res = PromoteIntRes_ADDSUBSHLSAT<EmptyMatchContext>(
N);
238 case ISD::VP_SADDSAT:
239 case ISD::VP_UADDSAT:
240 case ISD::VP_SSUBSAT:
241 case ISD::VP_USUBSAT:
242 Res = PromoteIntRes_ADDSUBSHLSAT<VPMatchContext>(
N);
247 Res = PromoteIntRes_CMP(
N);
260 case ISD::ABS: Res = PromoteIntRes_ABS(
N);
break;
263 Res = PromoteIntRes_Atomic0(cast<AtomicSDNode>(
N));
break;
277 Res = PromoteIntRes_Atomic1(cast<AtomicSDNode>(
N));
break;
281 Res = PromoteIntRes_AtomicCmpSwap(cast<AtomicSDNode>(
N), ResNo);
293 Res = PromoteIntRes_VECREDUCE(
N);
296 case ISD::VP_REDUCE_ADD:
297 case ISD::VP_REDUCE_MUL:
298 case ISD::VP_REDUCE_AND:
299 case ISD::VP_REDUCE_OR:
300 case ISD::VP_REDUCE_XOR:
301 case ISD::VP_REDUCE_SMAX:
302 case ISD::VP_REDUCE_SMIN:
303 case ISD::VP_REDUCE_UMAX:
304 case ISD::VP_REDUCE_UMIN:
305 Res = PromoteIntRes_VP_REDUCE(
N);
309 Res = PromoteIntRes_FREEZE(
N);
314 Res = PromoteIntRes_Rotate(
N);
319 Res = PromoteIntRes_FunnelShift(
N);
324 Res = PromoteIntRes_VPFunnelShift(
N);
328 Res = PromoteIntRes_IS_FPCLASS(
N);
331 Res = PromoteIntRes_FFREXP(
N);
336 Res = PromoteIntRes_XRINT(
N);
340 Res = PromoteIntRes_PATCHPOINT(
N);
346 SetPromotedInteger(
SDValue(
N, ResNo), Res);
351 SDValue Op = DisintegrateMERGE_VALUES(
N, ResNo);
352 return GetPromotedInteger(
Op);
357 SDValue Op = SExtPromotedInteger(
N->getOperand(0));
359 Op.getValueType(),
Op,
N->getOperand(1));
364 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
366 Op.getValueType(),
Op,
N->getOperand(1));
372 N->getMemoryVT(), ResVT,
373 N->getChain(),
N->getBasePtr(),
392 cast<AtomicSDNode>(Res)->setExtensionType(ETy);
402 SDValue Op2 = GetPromotedInteger(
N->getOperand(2));
405 N->getChain(),
N->getBasePtr(),
406 Op2,
N->getMemOperand());
417 EVT SVT = getSetCCResultType(
N->getOperand(2).getValueType());
428 N->getChain(),
N->getBasePtr(),
N->getOperand(2),
N->getOperand(3),
438 SDValue Op3 = GetPromotedInteger(
N->getOperand(3));
441 Op2 = SExtPromotedInteger(Op2);
444 Op2 = ZExtPromotedInteger(Op2);
447 Op2 = GetPromotedInteger(Op2);
456 N->getOpcode(),
SDLoc(
N),
N->getMemoryVT(), VTs,
N->getChain(),
457 N->getBasePtr(), Op2, Op3,
N->getMemOperand());
459 for (
unsigned i = 1, NumResults =
N->getNumValues(); i < NumResults; ++i)
468 EVT OutVT =
N->getValueType(0);
472 switch (getTypeAction(InVT)) {
499 BitConvertToInteger(GetScalarizedVector(InOp)));
508 GetSplitVector(
N->getOperand(0),
Lo,
Hi);
509 Lo = BitConvertToInteger(
Lo);
510 Hi = BitConvertToInteger(
Hi);
518 JoinIntegers(
Lo,
Hi));
552 if (isTypeLegal(WideOutVT)) {
553 InOp = DAG.
getBitcast(WideOutVT, GetWidenedVector(InOp));
563 CreateStackStoreLoad(InOp, OutVT));
567 SDValue V = GetPromotedInteger(
N->getOperand(0));
569 V.getValueType(), V);
573 SDValue Op = GetPromotedInteger(
N->getOperand(0));
574 EVT OVT =
N->getValueType(0);
575 EVT NVT =
Op.getValueType();
595 return DAG.
getNode(ISD::VP_SRL, dl, NVT,
596 DAG.
getNode(ISD::VP_BSWAP, dl, NVT,
Op, Mask, EVL), ShAmt,
601 SDValue Op = GetPromotedInteger(
N->getOperand(0));
602 EVT OVT =
N->getValueType(0);
603 EVT NVT =
Op.getValueType();
623 return DAG.
getNode(ISD::VP_SRL, dl, NVT,
624 DAG.
getNode(ISD::VP_BITREVERSE, dl, NVT,
Op, Mask, EVL),
633 N->getValueType(0)), JoinIntegers(
N->getOperand(0),
638 EVT VT =
N->getValueType(0);
647 assert(isa<ConstantSDNode>(Result) &&
"Didn't constant fold ext?");
652 EVT OVT =
N->getValueType(0);
668 unsigned CtlzOpcode =
N->getOpcode();
669 if (CtlzOpcode ==
ISD::CTLZ || CtlzOpcode == ISD::VP_CTLZ) {
674 if (!
N->isVPOpcode()) {
676 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
684 SDValue Op = VPZExtPromotedInteger(
N->getOperand(0), Mask, EVL);
685 return DAG.
getNode(ISD::VP_SUB, dl, NVT,
686 DAG.
getNode(
N->getOpcode(), dl, NVT,
Op, Mask, EVL),
687 ExtractLeadingBits, Mask, EVL);
690 CtlzOpcode == ISD::VP_CTLZ_ZERO_UNDEF) {
692 SDValue Op = GetPromotedInteger(
N->getOperand(0));
697 if (!
N->isVPOpcode()) {
699 return DAG.
getNode(CtlzOpcode, dl, NVT,
Op);
704 Op = DAG.
getNode(ISD::VP_SHL, dl, NVT,
Op, ShiftConst, Mask, EVL);
705 return DAG.
getNode(CtlzOpcode, dl, NVT,
Op, Mask, EVL);
711 EVT OVT =
N->getValueType(0);
728 if (!
N->isVPOpcode()) {
729 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
735 SDValue Op = VPZExtPromotedInteger(
N->getOperand(0), Mask, EVL);
741 SDValue Op = GetPromotedInteger(
N->getOperand(0));
742 EVT OVT =
N->getValueType(0);
743 EVT NVT =
Op.getValueType();
761 unsigned NewOpc =
N->getOpcode();
762 if (NewOpc ==
ISD::CTTZ || NewOpc == ISD::VP_CTTZ) {
774 N->getOperand(1),
N->getOperand(2));
775 NewOpc = ISD::VP_CTTZ_ZERO_UNDEF;
778 if (!
N->isVPOpcode())
780 return DAG.
getNode(NewOpc, dl, NVT,
Op,
N->getOperand(1),
N->getOperand(2));
783SDValue DAGTypeLegalizer::PromoteIntRes_VP_CttzElements(
SDNode *
N) {
786 return DAG.
getNode(
N->getOpcode(),
DL, NewVT,
N->ops());
789SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_VECTOR_ELT(
SDNode *
N) {
804 EVT SVT =
In.getValueType().getScalarType();
816 unsigned NewOpc =
N->getOpcode();
833 if (
N->getOpcode() == ISD::VP_FP_TO_UINT &&
836 NewOpc = ISD::VP_FP_TO_SINT;
839 if (
N->isStrictFPOpcode()) {
840 Res = DAG.
getNode(NewOpc, dl, {NVT, MVT::Other},
841 {
N->getOperand(0),
N->getOperand(1)});
845 }
else if (NewOpc == ISD::VP_FP_TO_SINT || NewOpc == ISD::VP_FP_TO_UINT) {
846 Res = DAG.
getNode(NewOpc, dl, NVT, {
N->getOperand(0),
N->getOperand(1),
849 Res = DAG.
getNode(NewOpc, dl, NVT,
N->getOperand(0));
861 N->getOpcode() == ISD::VP_FP_TO_UINT)
868SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_XINT_SAT(
SDNode *
N) {
872 return DAG.
getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0),
876SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_FP16_BF16(
SDNode *
N) {
880 return DAG.
getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
883SDValue DAGTypeLegalizer::PromoteIntRes_STRICT_FP_TO_FP16_BF16(
SDNode *
N) {
888 N->getOperand(0),
N->getOperand(1));
896 return DAG.
getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
904 DAG.
getNode(
N->getOpcode(), dl, {NVT, MVT::Other},
N->getOperand(0));
916 if (getTypeAction(
N->getOperand(0).getValueType())
918 SDValue Res = GetPromotedInteger(
N->getOperand(0));
936 if (
N->getNumOperands() != 1) {
937 assert(
N->getNumOperands() == 3 &&
"Unexpected number of operands!");
938 assert(
N->isVPOpcode() &&
"Expected VP opcode");
939 return DAG.
getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0),
940 N->getOperand(1),
N->getOperand(2));
942 return DAG.
getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
952 N->getMemoryVT(),
N->getMemOperand());
962 SDValue ExtPassThru = GetPromotedInteger(
N->getPassThru());
970 N->getOffset(),
N->getMask(), ExtPassThru,
971 N->getMemoryVT(),
N->getMemOperand(),
972 N->getAddressingMode(), ExtType,
973 N->isExpandingLoad());
982 SDValue ExtPassThru = GetPromotedInteger(
N->getPassThru());
984 "Gather result type and the passThru argument type should be the same");
991 SDValue Ops[] = {
N->getChain(), ExtPassThru,
N->getMask(),
N->getBasePtr(),
992 N->getIndex(),
N->getScale() };
994 N->getMemoryVT(), dl, Ops,
995 N->getMemOperand(),
N->getIndexType(),
1003SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_COMPRESS(
SDNode *
N) {
1004 SDValue Vec = GetPromotedInteger(
N->getOperand(0));
1005 SDValue Passthru = GetPromotedInteger(
N->getOperand(2));
1007 N->getOperand(1), Passthru);
1015 EVT VT =
N->getValueType(0);
1016 EVT SVT = getSetCCResultType(VT);
1017 SDValue Ops[3] = {
N->getOperand(0),
N->getOperand(1) };
1018 unsigned NumOps =
N->getNumOperands();
1019 assert(NumOps <= 3 &&
"Too many operands");
1021 Ops[2] = PromoteTargetBoolean(
N->getOperand(2), VT);
1029 ReplaceValueWith(
SDValue(
N, 0), Res);
1035template <
class MatchContextClass>
1047 MatchContextClass matcher(DAG, TLI,
N);
1049 unsigned Opcode = matcher.getRootBaseOpcode();
1055 SExtOrZExtPromotedOperands(Op1, Op2);
1064 Op1 = SExtPromotedInteger(Op1);
1065 Op2 = SExtPromotedInteger(Op2);
1066 return matcher.getNode(
ISD::UADDSAT, dl, NVT, Op1, Op2);
1069 Op1 = ZExtPromotedInteger(Op1);
1070 Op2 = ZExtPromotedInteger(Op2);
1075 return matcher.getNode(
ISD::UMIN, dl, NVT,
Add, SatMax);
1082 Op1 = GetPromotedInteger(Op1);
1083 Op2 = ZExtPromotedInteger(Op2);
1085 Op1 = SExtPromotedInteger(Op1);
1086 Op2 = SExtPromotedInteger(Op2);
1093 if (IsShift || matcher.isOperationLegal(Opcode, PromotedType)) {
1106 "addition, subtraction or left shift");
1109 unsigned SHLAmount = NewBits - OldBits;
1116 SDValue Result = matcher.getNode(Opcode, dl, PromotedType, Op1, Op2);
1117 return matcher.getNode(ShiftOp, dl, PromotedType, Result, ShiftAmount);
1125 SDValue Result = matcher.getNode(AddOp, dl, PromotedType, Op1, Op2);
1126 Result = matcher.getNode(
ISD::SMIN, dl, PromotedType, Result, SatMax);
1127 Result = matcher.getNode(
ISD::SMAX, dl, PromotedType, Result, SatMin);
1134 SDValue Op1Promoted, Op2Promoted;
1140 Op1Promoted = SExtPromotedInteger(
N->getOperand(0));
1141 Op2Promoted = SExtPromotedInteger(
N->getOperand(1));
1143 Op1Promoted = ZExtPromotedInteger(
N->getOperand(0));
1144 Op2Promoted = ZExtPromotedInteger(
N->getOperand(1));
1146 EVT OldType =
N->getOperand(0).getValueType();
1160 Op2Promoted,
N->getOperand(2));
1162 return DAG.
getNode(ShiftOp, dl, PromotedType, Result,
1165 return DAG.
getNode(
N->getOpcode(), dl, PromotedType, Op1Promoted, Op2Promoted,
1170 unsigned SatW,
bool Signed,
1173 EVT VT = V.getValueType();
1200 EVT VT =
LHS.getValueType();
1218 assert(Res &&
"Expanding DIVFIX with wide type failed?");
1224 "Tried to saturate to more than the original type?");
1233 SDValue Op1Promoted, Op2Promoted;
1239 Op1Promoted = SExtPromotedInteger(
N->getOperand(0));
1240 Op2Promoted = SExtPromotedInteger(
N->getOperand(1));
1242 Op1Promoted = ZExtPromotedInteger(
N->getOperand(0));
1243 Op2Promoted = ZExtPromotedInteger(
N->getOperand(1));
1246 unsigned Scale =
N->getConstantOperandVal(2);
1255 N->getValueType(0).getScalarSizeInBits();
1260 SDValue Res = DAG.
getNode(
N->getOpcode(), dl, PromotedType, Op1Promoted,
1261 Op2Promoted,
N->getOperand(2));
1271 Op2Promoted, Scale, DAG)) {
1274 N->getValueType(0).getScalarSizeInBits(),
1282 N->getValueType(0).getScalarSizeInBits());
1285SDValue DAGTypeLegalizer::PromoteIntRes_SADDSUBO(
SDNode *
N,
unsigned ResNo) {
1287 return PromoteIntRes_Overflow(
N);
1291 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1292 SDValue RHS = SExtPromotedInteger(
N->getOperand(1));
1293 EVT OVT =
N->getOperand(0).getValueType();
1294 EVT NVT =
LHS.getValueType();
1309 ReplaceValueWith(
SDValue(
N, 1), Ofl);
1315 EVT PromotedResultTy =
1318 N->getOperand(0),
N->getOperand(1));
1324 SDValue LHS = GetPromotedInteger(
N->getOperand(1));
1325 SDValue RHS = GetPromotedInteger(
N->getOperand(2));
1327 unsigned Opcode =
N->getOpcode();
1328 if (Opcode == ISD::VP_SELECT || Opcode == ISD::VP_MERGE)
1335 SDValue LHS = GetPromotedInteger(
N->getOperand(2));
1336 SDValue RHS = GetPromotedInteger(
N->getOperand(3));
1338 LHS.getValueType(),
N->getOperand(0),
1339 N->getOperand(1), LHS, RHS,
N->getOperand(4));
1343 unsigned OpNo =
N->isStrictFPOpcode() ? 1 : 0;
1344 EVT InVT =
N->getOperand(OpNo).getValueType();
1347 EVT SVT = getSetCCResultType(InVT);
1355 SVT = getSetCCResultType(InVT);
1363 assert(SVT.
isVector() ==
N->getOperand(OpNo).getValueType().isVector() &&
1364 "Vector compare must return a vector result!");
1368 if (
N->isStrictFPOpcode()) {
1370 SDValue Opers[] = {
N->getOperand(0),
N->getOperand(1),
1371 N->getOperand(2),
N->getOperand(3)};
1372 SetCC = DAG.
getNode(
N->getOpcode(), dl, VTs, Opers,
N->getFlags());
1377 SetCC = DAG.
getNode(
N->getOpcode(), dl, SVT,
N->getOperand(0),
1378 N->getOperand(1),
N->getOperand(2),
N->getFlags());
1394 EVT VT =
N->getValueType(0);
1400 ReplaceValueWith(
SDValue(
N, 0), Res);
1405 SDValue LHS = GetPromotedInteger(
N->getOperand(0));
1407 if (
N->getOpcode() != ISD::VP_SHL) {
1409 RHS = ZExtPromotedInteger(RHS);
1417 RHS = VPZExtPromotedInteger(RHS, Mask, EVL);
1422SDValue DAGTypeLegalizer::PromoteIntRes_SIGN_EXTEND_INREG(
SDNode *
N) {
1423 SDValue Op = GetPromotedInteger(
N->getOperand(0));
1425 Op.getValueType(),
Op,
N->getOperand(1));
1428SDValue DAGTypeLegalizer::PromoteIntRes_SimpleIntBinOp(
SDNode *
N) {
1432 SDValue LHS = GetPromotedInteger(
N->getOperand(0));
1433 SDValue RHS = GetPromotedInteger(
N->getOperand(1));
1434 if (
N->getNumOperands() == 2)
1436 assert(
N->getNumOperands() == 4 &&
"Unexpected number of operands!");
1437 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1439 N->getOperand(2),
N->getOperand(3));
1443 if (
N->getNumOperands() == 2) {
1445 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1446 SDValue RHS = SExtPromotedInteger(
N->getOperand(1));
1449 assert(
N->getNumOperands() == 4 &&
"Unexpected number of operands!");
1450 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1454 SDValue LHS = VPSExtPromotedInteger(
N->getOperand(0), Mask, EVL);
1455 SDValue RHS = VPSExtPromotedInteger(
N->getOperand(1), Mask, EVL);
1461 if (
N->getNumOperands() == 2) {
1463 SDValue LHS = ZExtPromotedInteger(
N->getOperand(0));
1464 SDValue RHS = ZExtPromotedInteger(
N->getOperand(1));
1467 assert(
N->getNumOperands() == 4 &&
"Unexpected number of operands!");
1468 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1472 SDValue LHS = VPZExtPromotedInteger(
N->getOperand(0), Mask, EVL);
1473 SDValue RHS = VPZExtPromotedInteger(
N->getOperand(1), Mask, EVL);
1484 SExtOrZExtPromotedOperands(LHS, RHS);
1487 LHS.getValueType(), LHS, RHS);
1492 if (
N->getOpcode() != ISD::VP_SRA) {
1494 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1496 RHS = ZExtPromotedInteger(RHS);
1503 SDValue LHS = VPSExtPromotedInteger(
N->getOperand(0), Mask, EVL);
1505 RHS = VPZExtPromotedInteger(RHS, Mask, EVL);
1512 if (
N->getOpcode() != ISD::VP_SRL) {
1514 SDValue LHS = ZExtPromotedInteger(
N->getOperand(0));
1516 RHS = ZExtPromotedInteger(RHS);
1523 SDValue LHS = VPZExtPromotedInteger(
N->getOperand(0), Mask, EVL);
1525 RHS = VPZExtPromotedInteger(RHS, Mask, EVL);
1533 ReplaceValueWith(
SDValue(
N, 0), Res);
1538 SDValue Hi = GetPromotedInteger(
N->getOperand(0));
1539 SDValue Lo = GetPromotedInteger(
N->getOperand(1));
1542 Amt = ZExtPromotedInteger(Amt);
1546 EVT OldVT =
N->getOperand(0).getValueType();
1547 EVT VT =
Lo.getValueType();
1548 unsigned Opcode =
N->getOpcode();
1562 if (NewBits >= (2 * OldBits) && !isa<ConstantSDNode>(Amt) &&
1587SDValue DAGTypeLegalizer::PromoteIntRes_VPFunnelShift(
SDNode *
N) {
1588 SDValue Hi = GetPromotedInteger(
N->getOperand(0));
1589 SDValue Lo = GetPromotedInteger(
N->getOperand(1));
1594 Amt = VPZExtPromotedInteger(Amt, Mask, EVL);
1598 EVT OldVT =
N->getOperand(0).getValueType();
1599 EVT VT =
Lo.getValueType();
1600 unsigned Opcode =
N->getOpcode();
1601 bool IsFSHR = Opcode == ISD::VP_FSHR;
1606 Amt = DAG.
getNode(ISD::VP_UREM,
DL, AmtVT, Amt,
1614 if (NewBits >= (2 * OldBits) && !isa<ConstantSDNode>(Amt) &&
1617 Hi = DAG.
getNode(ISD::VP_SHL,
DL, VT,
Hi, HiShift, Mask, EVL);
1620 Res = DAG.
getNode(IsFSHR ? ISD::VP_SRL : ISD::VP_SHL,
DL, VT, Res, Amt,
1623 Res = DAG.
getNode(ISD::VP_SRL,
DL, VT, Res, HiShift, Mask, EVL);
1629 Lo = DAG.
getNode(ISD::VP_SHL,
DL, VT,
Lo, ShiftOffset, Mask, EVL);
1634 Amt = DAG.
getNode(ISD::VP_ADD,
DL, AmtVT, Amt, ShiftOffset, Mask, EVL);
1652 Res = GetPromotedInteger(InOp);
1659 "Dst and Src must have the same number of elements");
1661 "Promoted vector type must be a power of two");
1664 GetSplitVector(InOp, EOp1, EOp2);
1672 assert(
N->getOpcode() == ISD::VP_TRUNCATE &&
1673 "Expected VP_TRUNCATE opcode");
1674 SDValue MaskLo, MaskHi, EVLLo, EVLHi;
1675 std::tie(MaskLo, MaskHi) = SplitMask(
N->getOperand(1));
1676 std::tie(EVLLo, EVLHi) =
1677 DAG.
SplitEVL(
N->getOperand(2),
N->getValueType(0), dl);
1678 EOp1 = DAG.
getNode(ISD::VP_TRUNCATE, dl, HalfNVT, EOp1, MaskLo, EVLLo);
1679 EOp2 = DAG.
getNode(ISD::VP_TRUNCATE, dl, HalfNVT, EOp2, MaskHi, EVLHi);
1686 SDValue WideInOp = GetWidenedVector(InOp);
1691 N->getValueType(0).getScalarType(), NumElem);
1706 if (
N->getOpcode() == ISD::VP_TRUNCATE)
1707 return DAG.
getNode(ISD::VP_TRUNCATE, dl, NVT, Res,
N->getOperand(1),
1712SDValue DAGTypeLegalizer::PromoteIntRes_UADDSUBO(
SDNode *
N,
unsigned ResNo) {
1714 return PromoteIntRes_Overflow(
N);
1718 SDValue LHS = ZExtPromotedInteger(
N->getOperand(0));
1719 SDValue RHS = ZExtPromotedInteger(
N->getOperand(1));
1720 EVT OVT =
N->getOperand(0).getValueType();
1721 EVT NVT =
LHS.getValueType();
1735 ReplaceValueWith(
SDValue(
N, 1), Ofl);
1746 return PromoteIntRes_Overflow(
N);
1758 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1759 SDValue RHS = SExtPromotedInteger(
N->getOperand(1));
1761 EVT ValueVTs[] = {
LHS.getValueType(),
N->getValueType(1)};
1765 LHS, RHS,
N->getOperand(2));
1775 assert(ResNo == 1 &&
"Don't know how to promote other results yet.");
1776 return PromoteIntRes_Overflow(
N);
1780 EVT OVT =
N->getValueType(0);
1793 SDValue Op0 = SExtPromotedInteger(
N->getOperand(0));
1797SDValue DAGTypeLegalizer::PromoteIntRes_XMULO(
SDNode *
N,
unsigned ResNo) {
1800 return PromoteIntRes_Overflow(
N);
1804 EVT SmallVT =
LHS.getValueType();
1811 LHS = SExtPromotedInteger(LHS);
1812 RHS = SExtPromotedInteger(RHS);
1814 LHS = ZExtPromotedInteger(LHS);
1815 RHS = ZExtPromotedInteger(RHS);
1846 ReplaceValueWith(
SDValue(
N, 1), Overflow);
1852 N->getValueType(0)));
1858 const APInt &MulImm =
N->getConstantOperandAPInt(0);
1865 EVT VT =
N->getValueType(0);
1873 for (
unsigned i = 0; i < NumRegs; ++i) {
1874 Parts[i] = DAG.
getVAArg(RegVT, dl, Chain,
Ptr,
N->getOperand(2),
1875 N->getConstantOperandVal(3));
1881 std::reverse(Parts.begin(), Parts.end());
1886 for (
unsigned i = 1; i < NumRegs; ++i) {
1897 ReplaceValueWith(
SDValue(
N, 1), Chain);
1910bool DAGTypeLegalizer::PromoteIntegerOperand(
SDNode *
N,
unsigned OpNo) {
1913 if (CustomLowerNode(
N,
N->getOperand(OpNo).getValueType(),
false)) {
1918 switch (
N->getOpcode()) {
1921 dbgs() <<
"PromoteIntegerOperand Op #" << OpNo <<
": ";
1922 N->dump(&DAG);
dbgs() <<
"\n";
1928 Res = PromoteIntOp_ATOMIC_STORE(cast<AtomicSDNode>(
N));
1931 case ISD::BR_CC: Res = PromoteIntOp_BR_CC(
N, OpNo);
break;
1932 case ISD::BRCOND: Res = PromoteIntOp_BRCOND(
N, OpNo);
break;
1938 Res = PromoteIntOp_INSERT_VECTOR_ELT(
N, OpNo);
1942 case ISD::EXPERIMENTAL_VP_SPLAT:
1943 Res = PromoteIntOp_ScalarOp(
N);
1946 case ISD::SELECT: Res = PromoteIntOp_SELECT(
N, OpNo);
break;
1949 case ISD::SETCC: Res = PromoteIntOp_SETCC(
N, OpNo);
break;
1951 case ISD::VP_SIGN_EXTEND: Res = PromoteIntOp_VP_SIGN_EXTEND(
N);
break;
1952 case ISD::VP_SINT_TO_FP:
1955 case ISD::STORE: Res = PromoteIntOp_STORE(cast<StoreSDNode>(
N),
1957 case ISD::MSTORE: Res = PromoteIntOp_MSTORE(cast<MaskedStoreSDNode>(
N),
1959 case ISD::MLOAD: Res = PromoteIntOp_MLOAD(cast<MaskedLoadSDNode>(
N),
1961 case ISD::MGATHER: Res = PromoteIntOp_MGATHER(cast<MaskedGatherSDNode>(
N),
1963 case ISD::MSCATTER: Res = PromoteIntOp_MSCATTER(cast<MaskedScatterSDNode>(
N),
1966 Res = PromoteIntOp_VECTOR_COMPRESS(
N, OpNo);
1968 case ISD::VP_TRUNCATE:
1972 case ISD::VP_UINT_TO_FP:
1977 case ISD::VP_ZERO_EXTEND: Res = PromoteIntOp_VP_ZERO_EXTEND(
N);
break;
1985 case ISD::ROTR: Res = PromoteIntOp_Shift(
N);
break;
1988 case ISD::UCMP: Res = PromoteIntOp_CMP(
N);
break;
1991 case ISD::FSHR: Res = PromoteIntOp_FunnelShift(
N);
break;
2017 case ISD::VP_REDUCE_ADD:
2018 case ISD::VP_REDUCE_MUL:
2019 case ISD::VP_REDUCE_AND:
2020 case ISD::VP_REDUCE_OR:
2021 case ISD::VP_REDUCE_XOR:
2022 case ISD::VP_REDUCE_SMAX:
2023 case ISD::VP_REDUCE_SMIN:
2024 case ISD::VP_REDUCE_UMAX:
2025 case ISD::VP_REDUCE_UMIN:
2026 Res = PromoteIntOp_VP_REDUCE(
N, OpNo);
2031 Res = PromoteIntOp_STACKMAP(
N, OpNo);
2034 Res = PromoteIntOp_PATCHPOINT(
N, OpNo);
2036 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
2037 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
2038 Res = PromoteIntOp_VP_STRIDED(
N, OpNo);
2040 case ISD::EXPERIMENTAL_VP_SPLICE:
2041 Res = PromoteIntOp_VP_SPLICE(
N, OpNo);
2046 if (!Res.
getNode())
return false;
2053 const bool IsStrictFp =
N->isStrictFPOpcode();
2055 N->getNumValues() == (IsStrictFp ? 2 : 1) &&
2056 "Invalid operand expansion");
2060 ReplaceValueWith(
SDValue(
N, 0), Res);
2070void DAGTypeLegalizer::SExtOrZExtPromotedOperands(
SDValue &LHS,
SDValue &RHS) {
2071 SDValue OpL = GetPromotedInteger(LHS);
2072 SDValue OpR = GetPromotedInteger(RHS);
2078 unsigned OpLEffectiveBits =
2080 unsigned OpREffectiveBits =
2082 if (OpLEffectiveBits <=
LHS.getScalarValueSizeInBits() &&
2083 OpREffectiveBits <=
RHS.getScalarValueSizeInBits()) {
2090 LHS = SExtPromotedInteger(LHS);
2091 RHS = SExtPromotedInteger(RHS);
2102 if (OpLEffectiveBits <=
LHS.getScalarValueSizeInBits() &&
2103 OpREffectiveBits <=
RHS.getScalarValueSizeInBits()) {
2110 LHS = ZExtPromotedInteger(LHS);
2111 RHS = ZExtPromotedInteger(RHS);
2116void DAGTypeLegalizer::PromoteSetCCOperands(
SDValue &LHS,
SDValue &RHS,
2125 LHS = SExtPromotedInteger(LHS);
2126 RHS = SExtPromotedInteger(RHS);
2131 "Unknown integer comparison!");
2133 SExtOrZExtPromotedOperands(LHS, RHS);
2137 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2142 SDValue Op1 = GetPromotedInteger(
N->getOperand(1));
2144 N->getChain(), Op1,
N->getBasePtr(),
N->getMemOperand());
2150 return CreateStackStoreLoad(
N->getOperand(0),
N->getValueType(0));
2153SDValue DAGTypeLegalizer::PromoteIntOp_BR_CC(
SDNode *
N,
unsigned OpNo) {
2154 assert(OpNo == 2 &&
"Don't know how to promote this operand!");
2158 PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(
N->getOperand(1))->get());
2163 N->getOperand(1), LHS, RHS,
N->getOperand(4)),
2167SDValue DAGTypeLegalizer::PromoteIntOp_BRCOND(
SDNode *
N,
unsigned OpNo) {
2168 assert(OpNo == 1 &&
"only know how to promote condition");
2171 SDValue Cond = PromoteTargetBoolean(
N->getOperand(1), MVT::Other);
2175 N->getOperand(2)), 0);
2180 EVT OVT =
N->getOperand(0).getValueType();
2181 SDValue Lo = ZExtPromotedInteger(
N->getOperand(0));
2182 SDValue Hi = GetPromotedInteger(
N->getOperand(1));
2183 assert(
Lo.getValueType() ==
N->getValueType(0) &&
"Operand over promoted?");
2196 EVT VecVT =
N->getValueType(0);
2199 "Legal vector of one illegal element?");
2204 assert(
N->getOperand(0).getValueSizeInBits() >=
2205 N->getValueType(0).getScalarSizeInBits() &&
2206 "Type of inserted value narrower than vector element type!");
2209 for (
unsigned i = 0; i < NumElts; ++i)
2210 NewOps.
push_back(GetPromotedInteger(
N->getOperand(i)));
2215SDValue DAGTypeLegalizer::PromoteIntOp_INSERT_VECTOR_ELT(
SDNode *
N,
2222 assert(
N->getOperand(1).getValueSizeInBits() >=
2223 N->getValueType(0).getScalarSizeInBits() &&
2224 "Type of inserted value narrower than vector element type!");
2226 GetPromotedInteger(
N->getOperand(1)),
2231 assert(OpNo == 2 &&
"Different operand and result vector types?");
2237 N->getOperand(1),
Idx), 0);
2241 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2242 if (
N->getOpcode() == ISD::EXPERIMENTAL_VP_SPLAT)
2251SDValue DAGTypeLegalizer::PromoteIntOp_SELECT(
SDNode *
N,
unsigned OpNo) {
2252 assert(OpNo == 0 &&
"Only know how to promote the condition!");
2254 EVT OpTy =
N->getOperand(1).getValueType();
2257 if (
SDValue Res = WidenVSELECTMask(
N))
2259 Res,
N->getOperand(1),
N->getOperand(2));
2263 Cond = PromoteTargetBoolean(
Cond, OpVT);
2266 N->getOperand(2)), 0);
2269SDValue DAGTypeLegalizer::PromoteIntOp_SELECT_CC(
SDNode *
N,
unsigned OpNo) {
2270 assert(OpNo == 0 &&
"Don't know how to promote this operand!");
2274 PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(
N->getOperand(4))->get());
2278 N->getOperand(3),
N->getOperand(4)), 0);
2281SDValue DAGTypeLegalizer::PromoteIntOp_SETCC(
SDNode *
N,
unsigned OpNo) {
2282 assert(OpNo == 0 &&
"Don't know how to promote this operand!");
2286 PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(
N->getOperand(2))->get());
2292 assert(
N->getOpcode() == ISD::VP_SETCC &&
"Expected VP_SETCC opcode");
2295 N->getOperand(3),
N->getOperand(4)),
2301 ZExtPromotedInteger(
N->getOperand(1))), 0);
2309 LHS = SExtPromotedInteger(LHS);
2310 RHS = SExtPromotedInteger(RHS);
2312 SExtOrZExtPromotedOperands(LHS, RHS);
2320 ZExtPromotedInteger(
N->getOperand(2))), 0);
2324 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2331SDValue DAGTypeLegalizer::PromoteIntOp_VP_SIGN_EXTEND(
SDNode *
N) {
2333 EVT VT =
N->getValueType(0);
2334 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2336 Op = DAG.
getNode(ISD::VP_ZERO_EXTEND, dl, VT,
Op,
N->getOperand(1),
2344 return DAG.
getNode(ISD::VP_SRA, dl, VT, Shl, ShAmt,
N->getOperand(1),
2349 if (
N->getOpcode() == ISD::VP_SINT_TO_FP)
2351 SExtPromotedInteger(
N->getOperand(0)),
2352 N->getOperand(1),
N->getOperand(2)),
2355 SExtPromotedInteger(
N->getOperand(0))), 0);
2358SDValue DAGTypeLegalizer::PromoteIntOp_STRICT_SINT_TO_FP(
SDNode *
N) {
2360 SExtPromotedInteger(
N->getOperand(1))), 0);
2368 SDValue Val = GetPromotedInteger(
N->getValue());
2372 N->getMemoryVT(),
N->getMemOperand());
2383 Mask = PromoteTargetBoolean(Mask, DataVT);
2389 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2390 DataOp = GetPromotedInteger(DataOp);
2393 N->getOffset(), Mask,
N->getMemoryVT(),
2394 N->getMemOperand(),
N->getAddressingMode(),
2395 true,
N->isCompressingStore());
2400 assert(OpNo == 3 &&
"Only know how to promote the mask!");
2401 EVT DataVT =
N->getValueType(0);
2402 SDValue Mask = PromoteTargetBoolean(
N->getOperand(OpNo), DataVT);
2404 NewOps[OpNo] =
Mask;
2421 EVT DataVT =
N->getValueType(0);
2422 NewOps[OpNo] = PromoteTargetBoolean(
N->getOperand(OpNo), DataVT);
2423 }
else if (OpNo == 4) {
2425 if (
N->isIndexSigned())
2427 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2429 NewOps[OpNo] = ZExtPromotedInteger(
N->getOperand(OpNo));
2431 NewOps[OpNo] = GetPromotedInteger(
N->getOperand(OpNo));
2445 bool TruncateStore =
N->isTruncatingStore();
2450 EVT DataVT =
N->getValue().getValueType();
2451 NewOps[OpNo] = PromoteTargetBoolean(
N->getOperand(OpNo), DataVT);
2452 }
else if (OpNo == 4) {
2454 if (
N->isIndexSigned())
2456 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2458 NewOps[OpNo] = ZExtPromotedInteger(
N->getOperand(OpNo));
2460 NewOps[OpNo] = GetPromotedInteger(
N->getOperand(OpNo));
2461 TruncateStore =
true;
2465 SDLoc(
N), NewOps,
N->getMemOperand(),
2466 N->getIndexType(), TruncateStore);
2471 assert(OpNo == 1 &&
"Can only promote VECTOR_COMPRESS mask.");
2474 SDValue Passthru =
N->getOperand(2);
2475 SDValue Mask = PromoteTargetBoolean(
N->getOperand(1), VT);
2480 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2481 if (
N->getOpcode() == ISD::VP_TRUNCATE)
2483 N->getOperand(1),
N->getOperand(2));
2488 if (
N->getOpcode() == ISD::VP_UINT_TO_FP)
2490 ZExtPromotedInteger(
N->getOperand(0)),
2491 N->getOperand(1),
N->getOperand(2)),
2494 ZExtPromotedInteger(
N->getOperand(0))), 0);
2497SDValue DAGTypeLegalizer::PromoteIntOp_STRICT_UINT_TO_FP(
SDNode *
N) {
2499 ZExtPromotedInteger(
N->getOperand(1))), 0);
2504 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2509SDValue DAGTypeLegalizer::PromoteIntOp_VP_ZERO_EXTEND(
SDNode *
N) {
2511 EVT VT =
N->getValueType(0);
2512 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2514 Op = DAG.
getNode(ISD::VP_ZERO_EXTEND, dl, VT,
Op,
N->getOperand(1),
2517 N->getOperand(0).getValueType());
2521 SDValue Op2 = ZExtPromotedInteger(
N->getOperand(2));
2526SDValue DAGTypeLegalizer::PromoteIntOp_FRAMERETURNADDR(
SDNode *
N) {
2528 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
2533 bool IsStrict =
N->isStrictFPOpcode();
2545 SDValue Op = SExtPromotedInteger(
N->getOperand(1));
2555 unsigned OpOffset = IsStrict ? 1 : 0;
2558 N->getOperand(1 + OpOffset).getValueType().getSizeInBits() &&
2559 "POWI exponent should match with sizeof(int) when doing the libcall.");
2562 SDValue Ops[2] = {
N->getOperand(0 + OpOffset),
N->getOperand(1 + OpOffset)};
2563 std::pair<SDValue, SDValue> Tmp = TLI.
makeLibCall(
2564 DAG, LC,
N->getValueType(0), Ops, CallOptions,
SDLoc(
N), Chain);
2565 ReplaceValueWith(
SDValue(
N, 0), Tmp.first);
2567 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
2572 switch (
N->getOpcode()) {
2580 case ISD::VP_REDUCE_ADD:
2581 case ISD::VP_REDUCE_MUL:
2582 case ISD::VP_REDUCE_AND:
2583 case ISD::VP_REDUCE_OR:
2584 case ISD::VP_REDUCE_XOR:
2588 case ISD::VP_REDUCE_SMAX:
2589 case ISD::VP_REDUCE_SMIN:
2593 case ISD::VP_REDUCE_UMAX:
2594 case ISD::VP_REDUCE_UMIN:
2604 return GetPromotedInteger(V);
2606 return SExtPromotedInteger(V);
2608 return ZExtPromotedInteger(V);
2614 SDValue Op = PromoteIntOpVectorReduction(
N,
N->getOperand(0));
2616 EVT OrigEltVT =
N->getOperand(0).getValueType().getVectorElementType();
2617 EVT InVT =
Op.getValueType();
2619 EVT ResVT =
N->getValueType(0);
2620 unsigned Opcode =
N->getOpcode();
2640 Op = ZExtPromotedInteger(
N->getOperand(0));
2643 Op = SExtPromotedInteger(
N->getOperand(0));
2659 Op = ZExtPromotedInteger(
N->getOperand(0));
2662 Op = SExtPromotedInteger(
N->getOperand(0));
2676SDValue DAGTypeLegalizer::PromoteIntOp_VP_REDUCE(
SDNode *
N,
unsigned OpNo) {
2683 NewOps[2] = PromoteTargetBoolean(
Op,
N->getOperand(1).getValueType());
2687 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2689 Op = PromoteIntOpVectorReduction(
N,
Op);
2693 EVT VT =
N->getValueType(0);
2694 EVT EltVT =
Op.getValueType().getScalarType();
2709 SDValue Op = ZExtPromotedInteger(
N->getOperand(1));
2713SDValue DAGTypeLegalizer::PromoteIntOp_STACKMAP(
SDNode *
N,
unsigned OpNo) {
2716 SDValue Operand =
N->getOperand(OpNo);
2722SDValue DAGTypeLegalizer::PromoteIntOp_PATCHPOINT(
SDNode *
N,
unsigned OpNo) {
2725 SDValue Operand =
N->getOperand(OpNo);
2731SDValue DAGTypeLegalizer::PromoteIntOp_VP_STRIDED(
SDNode *
N,
unsigned OpNo) {
2732 assert((
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_LOAD && OpNo == 3) ||
2733 (
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_STORE && OpNo == 4));
2736 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2741SDValue DAGTypeLegalizer::PromoteIntOp_VP_SPLICE(
SDNode *
N,
unsigned OpNo) {
2745 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2749 assert((OpNo == 4 || OpNo == 5) &&
"Unexpected operand for promotion");
2751 NewOps[OpNo] = ZExtPromotedInteger(
N->getOperand(OpNo));
2763void DAGTypeLegalizer::ExpandIntegerResult(
SDNode *
N,
unsigned ResNo) {
2769 if (CustomLowerNode(
N,
N->getValueType(ResNo),
true))
2772 switch (
N->getOpcode()) {
2775 dbgs() <<
"ExpandIntegerResult #" << ResNo <<
": ";
2776 N->dump(&DAG);
dbgs() <<
"\n";
2824 case ISD::LOAD: ExpandIntRes_LOAD(cast<LoadSDNode>(
N),
Lo,
Hi);
break;
2851 std::pair<SDValue, SDValue> Tmp = ExpandAtomic(
N);
2852 SplitInteger(Tmp.first,
Lo,
Hi);
2853 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
2861 N->getOperand(0),
N->getOperand(1),
N->getOperand(2),
N->getOperand(3),
2870 SplitInteger(Tmp,
Lo,
Hi);
2949 ExpandIntRes_Rotate(
N,
Lo,
Hi);
2954 ExpandIntRes_FunnelShift(
N,
Lo,
Hi);
2958 ExpandIntRes_VSCALE(
N,
Lo,
Hi);
2968std::pair <SDValue, SDValue> DAGTypeLegalizer::ExpandAtomic(
SDNode *
Node) {
2969 unsigned Opc =
Node->getOpcode();
2975 EVT RetVT =
Node->getValueType(0);
2983 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
2984 "Unexpected atomic op or value type!");
2988 Node->getOperand(0));
2993void DAGTypeLegalizer::ExpandShiftByConstant(
SDNode *
N,
const APInt &Amt,
2998 GetExpandedInteger(
N->getOperand(0), InL, InH);
3009 unsigned VTBits =
N->getValueType(0).getSizeInBits();
3013 if (Amt.
uge(VTBits)) {
3015 }
else if (Amt.
ugt(NVTBits)) {
3019 }
else if (Amt == NVTBits) {
3036 if (Amt.
uge(VTBits)) {
3038 }
else if (Amt.
ugt(NVTBits)) {
3042 }
else if (Amt == NVTBits) {
3059 if (Amt.
uge(VTBits)) {
3062 }
else if (Amt.
ugt(NVTBits)) {
3067 }
else if (Amt == NVTBits) {
3087bool DAGTypeLegalizer::
3089 unsigned Opc =
N->getOpcode();
3097 "Expanded integer type size not a power of two!");
3104 if (((Known.
Zero | Known.
One) & HighBitMask) == 0)
3109 GetExpandedInteger(In, InL, InH);
3163 Lo = DAG.
getNode(Opc, dl, NVT, InL, Amt);
3176bool DAGTypeLegalizer::
3183 "Expanded integer type size not a power of two!");
3188 GetExpandedInteger(
N->getOperand(0), InL, InH);
3200 switch (
N->getOpcode()) {
3215 DAG.
getSelect(dl, NVT, isShort, HiS, HiL));
3231 DAG.
getSelect(dl, NVT, isShort, LoS, LoL));
3247 DAG.
getSelect(dl, NVT, isShort, LoS, LoL));
3268void DAGTypeLegalizer::ExpandIntRes_MINMAX(
SDNode *
N,
3277 unsigned NumBits =
N->getValueType(0).getScalarSizeInBits();
3278 unsigned NumHalfBits = NumBits / 2;
3281 SDValue LHSL, LHSH, RHSL, RHSH;
3282 GetExpandedInteger(LHS, LHSL, LHSH);
3283 GetExpandedInteger(RHS, RHSL, RHSH);
3296 SDValue LHSL, LHSH, RHSL, RHSH;
3297 GetExpandedInteger(LHS, LHSL, LHSH);
3298 GetExpandedInteger(RHS, RHSL, RHSH);
3300 EVT CCT = getSetCCResultType(NVT);
3309 Hi = DAG.
getNode(
N->getOpcode(),
DL, NVT, {LHSH, RHSH});
3313 const APInt *RHSVal =
nullptr;
3314 if (
auto *RHSConst = dyn_cast<ConstantSDNode>(RHS))
3315 RHSVal = &RHSConst->getAPIntValue();
3322 SDValue LHSL, LHSH, RHSL, RHSH;
3323 GetExpandedInteger(LHS, LHSL, LHSH);
3324 GetExpandedInteger(RHS, RHSL, RHSH);
3326 EVT CCT = getSetCCResultType(NVT);
3332 Hi = DAG.
getNode(
N->getOpcode(),
DL, NVT, {LHSH, RHSH});
3351 switch (
N->getOpcode()) {
3378 EVT VT =
N->getValueType(0);
3379 EVT CCT = getSetCCResultType(VT);
3382 SplitInteger(Result,
Lo,
Hi);
3387 SplitInteger(ExpandedCMP,
Lo,
Hi);
3390void DAGTypeLegalizer::ExpandIntRes_ADDSUB(
SDNode *
N,
3394 SDValue LHSL, LHSH, RHSL, RHSH;
3395 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3396 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3399 SDValue LoOps[2] = { LHSL, RHSL };
3400 SDValue HiOps[3] = { LHSH, RHSH };
3409 HiOps[2] =
Lo.getValue(1);
3415 HiOps[2] =
Lo.getValue(1);
3437 HiOps[2] =
Lo.getValue(1);
3441 HiOps[2] =
Lo.getValue(1);
3454 EVT OvfVT = getSetCCResultType(NVT);
3494 Cmp = DAG.
getSetCC(dl, getSetCCResultType(NVT), LoOps[0],
3497 Cmp = DAG.
getSetCC(dl, getSetCCResultType(NVT), LoOps[0],
3500 Cmp = DAG.
getSetCC(dl, getSetCCResultType(NVT),
Lo, LoOps[0],
3518 DAG.
getSetCC(dl, getSetCCResultType(LoOps[0].getValueType()),
3532void DAGTypeLegalizer::ExpandIntRes_ADDSUBC(
SDNode *
N,
3535 SDValue LHSL, LHSH, RHSL, RHSH;
3537 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3538 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3540 SDValue LoOps[2] = { LHSL, RHSL };
3541 SDValue HiOps[3] = { LHSH, RHSH };
3545 HiOps[2] =
Lo.getValue(1);
3549 HiOps[2] =
Lo.getValue(1);
3555 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3558void DAGTypeLegalizer::ExpandIntRes_ADDSUBE(
SDNode *
N,
3561 SDValue LHSL, LHSH, RHSL, RHSH;
3563 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3564 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3566 SDValue LoOps[3] = { LHSL, RHSL,
N->getOperand(2) };
3567 SDValue HiOps[3] = { LHSH, RHSH };
3569 Lo = DAG.
getNode(
N->getOpcode(), dl, VTList, LoOps);
3570 HiOps[2] =
Lo.getValue(1);
3571 Hi = DAG.
getNode(
N->getOpcode(), dl, VTList, HiOps);
3575 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3578void DAGTypeLegalizer::ExpandIntRes_UADDSUBO(
SDNode *
N,
3586 unsigned CarryOp, NoCarryOp;
3588 switch(
N->getOpcode()) {
3608 SDValue LHSL, LHSH, RHSL, RHSH;
3609 GetExpandedInteger(LHS, LHSL, LHSH);
3610 GetExpandedInteger(RHS, RHSL, RHSH);
3612 SDValue LoOps[2] = { LHSL, RHSL };
3613 SDValue HiOps[3] = { LHSH, RHSH };
3615 Lo = DAG.
getNode(
N->getOpcode(), dl, VTList, LoOps);
3616 HiOps[2] =
Lo.getValue(1);
3617 Hi = DAG.
getNode(CarryOp, dl, VTList, HiOps);
3619 Ovf =
Hi.getValue(1);
3624 SplitInteger(Sum,
Lo,
Hi);
3635 DAG.
getSetCC(dl,
N->getValueType(1), LHS,
3646 ReplaceValueWith(
SDValue(
N, 1), Ovf);
3652 SDValue LHSL, LHSH, RHSL, RHSH;
3654 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3655 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3657 SDValue LoOps[3] = { LHSL, RHSL,
N->getOperand(2) };
3660 Lo = DAG.
getNode(
N->getOpcode(), dl, VTList, LoOps);
3661 HiOps[2] =
Lo.getValue(1);
3662 Hi = DAG.
getNode(
N->getOpcode(), dl, VTList, HiOps);
3666 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3669void DAGTypeLegalizer::ExpandIntRes_SADDSUBO_CARRY(
SDNode *
N,
3672 SDValue LHSL, LHSH, RHSL, RHSH;
3674 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3675 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3681 Lo = DAG.
getNode(CarryOp, dl, VTList, { LHSL, RHSL,
N->getOperand(2) });
3682 Hi = DAG.
getNode(
N->getOpcode(), dl, VTList, { LHSH, RHSH, Lo.getValue(1) });
3686 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3689void DAGTypeLegalizer::ExpandIntRes_ANY_EXTEND(
SDNode *
N,
3694 if (
Op.getValueType().bitsLE(NVT)) {
3701 assert(getTypeAction(
Op.getValueType()) ==
3703 "Only know how to promote this result!");
3706 "Operand over promoted?");
3708 SplitInteger(Res,
Lo,
Hi);
3712void DAGTypeLegalizer::ExpandIntRes_AssertSext(
SDNode *
N,
3715 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
3716 EVT NVT =
Lo.getValueType();
3717 EVT EVT = cast<VTSDNode>(
N->getOperand(1))->getVT();
3721 if (NVTBits < EVTBits) {
3724 EVTBits - NVTBits)));
3734void DAGTypeLegalizer::ExpandIntRes_AssertZext(
SDNode *
N,
3737 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
3738 EVT NVT =
Lo.getValueType();
3739 EVT EVT = cast<VTSDNode>(
N->getOperand(1))->getVT();
3743 if (NVTBits < EVTBits) {
3746 EVTBits - NVTBits)));
3754void DAGTypeLegalizer::ExpandIntRes_BITREVERSE(
SDNode *
N,
3757 GetExpandedInteger(
N->getOperand(0),
Hi,
Lo);
3762void DAGTypeLegalizer::ExpandIntRes_BSWAP(
SDNode *
N,
3765 GetExpandedInteger(
N->getOperand(0),
Hi,
Lo);
3774 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
3775 EVT NVT =
Lo.getValueType();
3781void DAGTypeLegalizer::ExpandIntRes_Constant(
SDNode *
N,
3785 auto Constant = cast<ConstantSDNode>(
N);
3787 bool IsTarget =
Constant->isTargetOpcode();
3788 bool IsOpaque =
Constant->isOpaque();
3799 GetExpandedInteger(N0,
Lo,
Hi);
3800 EVT NVT =
Lo.getValueType();
3831 EVT VT =
N->getValueType(0);
3835 SplitInteger(Neg, NegLo, NegHi);
3843void DAGTypeLegalizer::ExpandIntRes_CTLZ(
SDNode *
N,
3847 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
3848 EVT NVT =
Lo.getValueType();
3865 SplitInteger(Result,
Lo,
Hi);
3868void DAGTypeLegalizer::ExpandIntRes_CTPOP(
SDNode *
N,
3872 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
3873 EVT NVT =
Lo.getValueType();
3879void DAGTypeLegalizer::ExpandIntRes_CTTZ(
SDNode *
N,
3883 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
3884 EVT NVT =
Lo.getValueType();
3913 ReplaceValueWith(
SDValue(
N, 1), Chain);
3921 Chain =
Op.getValue(1);
3930 EVT VT =
N->getValueType(0);
3934 bool IsStrict =
N->isStrictFPOpcode();
3936 SDValue Op =
N->getOperand(IsStrict ? 1 : 0);
3938 Op = GetPromotedFloat(
Op);
3941 EVT OFPVT =
Op.getValueType();
3943 Op = GetSoftPromotedHalf(
Op);
3947 SplitInteger(
Op,
Lo,
Hi);
3951 if (
Op.getValueType() == MVT::bf16) {
3958 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected fp-to-xint conversion!");
3961 std::pair<SDValue, SDValue> Tmp = TLI.
makeLibCall(DAG, LC, VT,
Op,
3962 CallOptions, dl, Chain);
3963 SplitInteger(Tmp.first,
Lo,
Hi);
3966 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
3972 SplitInteger(Res,
Lo,
Hi);
3978 bool IsStrict =
N->isStrictFPOpcode();
3979 SDValue Op =
N->getOperand(IsStrict ? 1 : 0);
3983 "Input type needs to be promoted!");
3985 EVT VT =
Op.getValueType();
3987 if (VT == MVT::f16) {
3997 LC = RTLIB::LROUND_F32;
3998 else if (VT == MVT::f64)
3999 LC = RTLIB::LROUND_F64;
4000 else if (VT == MVT::f80)
4001 LC = RTLIB::LROUND_F80;
4002 else if (VT == MVT::f128)
4003 LC = RTLIB::LROUND_F128;
4004 else if (VT == MVT::ppcf128)
4005 LC = RTLIB::LROUND_PPCF128;
4006 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected lround input type!");
4010 LC = RTLIB::LRINT_F32;
4011 else if (VT == MVT::f64)
4012 LC = RTLIB::LRINT_F64;
4013 else if (VT == MVT::f80)
4014 LC = RTLIB::LRINT_F80;
4015 else if (VT == MVT::f128)
4016 LC = RTLIB::LRINT_F128;
4017 else if (VT == MVT::ppcf128)
4018 LC = RTLIB::LRINT_PPCF128;
4019 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected lrint input type!");
4023 LC = RTLIB::LLROUND_F32;
4024 else if (VT == MVT::f64)
4025 LC = RTLIB::LLROUND_F64;
4026 else if (VT == MVT::f80)
4027 LC = RTLIB::LLROUND_F80;
4028 else if (VT == MVT::f128)
4029 LC = RTLIB::LLROUND_F128;
4030 else if (VT == MVT::ppcf128)
4031 LC = RTLIB::LLROUND_PPCF128;
4032 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected llround input type!");
4036 LC = RTLIB::LLRINT_F32;
4037 else if (VT == MVT::f64)
4038 LC = RTLIB::LLRINT_F64;
4039 else if (VT == MVT::f80)
4040 LC = RTLIB::LLRINT_F80;
4041 else if (VT == MVT::f128)
4042 LC = RTLIB::LLRINT_F128;
4043 else if (VT == MVT::ppcf128)
4044 LC = RTLIB::LLRINT_PPCF128;
4045 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected llrint input type!");
4049 EVT RetVT =
N->getValueType(0);
4053 std::pair<SDValue, SDValue> Tmp = TLI.
makeLibCall(DAG, LC, RetVT,
4054 Op, CallOptions, dl,
4056 SplitInteger(Tmp.first,
Lo,
Hi);
4058 if (
N->isStrictFPOpcode())
4059 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
4062void DAGTypeLegalizer::ExpandIntRes_LOAD(
LoadSDNode *
N,
4064 assert(!
N->isAtomic() &&
"Should have been a ATOMIC_LOAD?");
4067 ExpandRes_NormalLoad(
N,
Lo,
Hi);
4073 EVT VT =
N->getValueType(0);
4084 if (
N->getMemoryVT().bitsLE(NVT)) {
4085 EVT MemVT =
N->getMemoryVT();
4088 N->getOriginalAlign(), MMOFlags, AAInfo);
4091 Ch =
Lo.getValue(1);
4096 unsigned LoSize =
Lo.getValueSizeInBits();
4111 N->getOriginalAlign(), MMOFlags, AAInfo);
4113 unsigned ExcessBits =
4121 N->getPointerInfo().getWithOffset(IncrementSize), NEVT,
4122 N->getOriginalAlign(), MMOFlags, AAInfo);
4131 EVT MemVT =
N->getMemoryVT();
4134 unsigned ExcessBits = (EBytes - IncrementSize)*8;
4140 N->getOriginalAlign(), MMOFlags, AAInfo);
4146 N->getPointerInfo().getWithOffset(IncrementSize),
4148 N->getOriginalAlign(), MMOFlags, AAInfo);
4172 ReplaceValueWith(
SDValue(
N, 1), Ch);
4175void DAGTypeLegalizer::ExpandIntRes_Logical(
SDNode *
N,
4179 GetExpandedInteger(
N->getOperand(0), LL, LH);
4180 GetExpandedInteger(
N->getOperand(1), RL, RH);
4185void DAGTypeLegalizer::ExpandIntRes_MUL(
SDNode *
N,
4187 EVT VT =
N->getValueType(0);
4192 GetExpandedInteger(
N->getOperand(0), LL, LH);
4193 GetExpandedInteger(
N->getOperand(1), RL, RH);
4203 LC = RTLIB::MUL_I16;
4204 else if (VT == MVT::i32)
4205 LC = RTLIB::MUL_I32;
4206 else if (VT == MVT::i64)
4207 LC = RTLIB::MUL_I64;
4208 else if (VT == MVT::i128)
4209 LC = RTLIB::MUL_I128;
4221 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
4224 SplitInteger(TLI.
makeLibCall(DAG, LC, VT, Ops, CallOptions, dl).first,
4236 ReplaceValueWith(
SDValue(
N, 1),
R.getValue(2));
4241 SplitInteger(Result,
Lo,
Hi);
4247 SplitInteger(Result,
Lo,
Hi);
4253 SplitInteger(Result,
Lo,
Hi);
4264 EVT VT =
N->getValueType(0);
4268 uint64_t Scale =
N->getConstantOperandVal(2);
4280 EVT BoolVT = getSetCCResultType(VT);
4305 SplitInteger(Result,
Lo,
Hi);
4311 assert(Scale <= VTSize &&
"Scale can't be larger than the value type size.");
4315 GetExpandedInteger(LHS, LL, LH);
4316 GetExpandedInteger(RHS, RL, RH);
4320 if (!TLI.
expandMUL_LOHI(LoHiOp, VT, dl, LHS, RHS, Result, NVT, DAG,
4328 SplitInteger(LoTmp, Result[0], Result[1]);
4329 SplitInteger(HiTmp, Result[2], Result[3]);
4331 assert(
Result.size() == 4 &&
"Unexpected number of partlets in the result");
4334 assert((VTSize == NVTSize * 2) &&
"Expected the new value type to be half "
4335 "the size of the current value type");
4357 if (Scale % NVTSize) {
4373 if (Scale == VTSize)
4394 EVT BoolNVT = getSetCCResultType(NVT);
4397 if (Scale < NVTSize) {
4404 }
else if (Scale == NVTSize) {
4407 }
else if (Scale < VTSize) {
4415 "(and saturation can't happen with Scale==VTSize).");
4422 if (Scale < NVTSize) {
4427 unsigned OverflowBits = VTSize - Scale + 1;
4428 assert(OverflowBits <= VTSize && OverflowBits > NVTSize &&
4429 "Extent of overflow bits must start within HL");
4446 }
else if (Scale == NVTSize) {
4459 }
else if (Scale < VTSize) {
4462 unsigned OverflowBits = VTSize - Scale + 1;
4489 N->getConstantOperandVal(2), DAG);
4493 N->getConstantOperandVal(2), TLI, DAG);
4494 SplitInteger(Res,
Lo,
Hi);
4497void DAGTypeLegalizer::ExpandIntRes_SADDSUBO(
SDNode *
Node,
4500 "Node has unexpected Opcode");
4515 SDValue LHSL, LHSH, RHSL, RHSH;
4516 GetExpandedInteger(LHS, LHSL, LHSH);
4517 GetExpandedInteger(RHS, RHSL, RHSH);
4521 Hi = DAG.
getNode(CarryOp, dl, VTList, { LHSH, RHSH,
Lo.getValue(1) });
4523 Ovf =
Hi.getValue(1);
4530 SplitInteger(Sum,
Lo,
Hi);
4555 EVT VT =
LHS.getValueType();
4558 SignsMatch = DAG.
getNOT(dl, SignsMatch, VT);
4562 EVT OType =
Node->getValueType(1);
4570void DAGTypeLegalizer::ExpandIntRes_SDIV(
SDNode *
N,
4572 EVT VT =
N->getValueType(0);
4574 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
4584 LC = RTLIB::SDIV_I16;
4585 else if (VT == MVT::i32)
4586 LC = RTLIB::SDIV_I32;
4587 else if (VT == MVT::i64)
4588 LC = RTLIB::SDIV_I64;
4589 else if (VT == MVT::i128)
4590 LC = RTLIB::SDIV_I128;
4591 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported SDIV!");
4595 SplitInteger(TLI.
makeLibCall(DAG, LC, VT, Ops, CallOptions, dl).first,
Lo,
Hi);
4598void DAGTypeLegalizer::ExpandIntRes_ShiftThroughStack(
SDNode *
N,
SDValue &
Lo,
4601 SDValue Shiftee =
N->getOperand(0);
4608 bool ShiftByByteMultiple =
4613 if (!ShiftByByteMultiple)
4617 assert(VTBitWidth % 8 == 0 &&
"Shifting a not byte multiple value?");
4618 unsigned VTByteWidth = VTBitWidth / 8;
4620 "Shiftee type size is not a power of two!");
4621 unsigned StackSlotByteWidth = 2 * VTByteWidth;
4622 unsigned StackSlotBitWidth = 8 * StackSlotByteWidth;
4628 Align StackSlotAlignment(1);
4636 cast<FrameIndexSDNode>(
StackPtr.getNode())->getIndex());
4641 unsigned WideningOpc =
4643 Init = DAG.
getNode(WideningOpc, dl, StackSlotVT, Shiftee);
4650 Ch = DAG.
getStore(Ch, dl,
Init, StackPtr, StackPtrInfo, StackSlotAlignment);
4656 if (ShiftByByteMultiple)
4657 Flags.setExact(
true);
4669 bool WillIndexUpwards =
N->getOpcode() !=
ISD::SHL;
4671 WillIndexUpwards = !WillIndexUpwards;
4674 if (WillIndexUpwards) {
4678 StackPtr, DAG.
getConstant(VTByteWidth, dl, PtrTy), dl);
4679 ByteOffset = DAG.
getNegative(ByteOffset, dl, ShAmtVT);
4688 VT, dl, Ch, AdjStackPtr,
4693 if (!ShiftByByteMultiple) {
4696 Res = DAG.
getNode(
N->getOpcode(), dl, VT, Res, ShAmtRem);
4700 SplitInteger(Res,
Lo,
Hi);
4703void DAGTypeLegalizer::ExpandIntRes_Shift(
SDNode *
N,
4705 EVT VT =
N->getValueType(0);
4706 unsigned Opc =
N->getOpcode();
4712 return ExpandShiftByConstant(
N, CN->getAPIntValue(),
Lo,
Hi);
4716 if (ExpandShiftWithKnownAmountBit(
N,
Lo,
Hi))
4735 const bool LegalOrCustom =
4739 unsigned ExpansionFactor = 1;
4741 for (
EVT TmpVT = NVT;;) {
4743 if (NewTMPVT == TmpVT)
4753 return ExpandIntRes_ShiftThroughStack(
N,
Lo,
Hi);
4755 if (LegalOrCustom &&
4759 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
4765 SDValue ShiftOp =
N->getOperand(1);
4770 SDValue Ops[] = { LHSL, LHSH, ShiftOp };
4772 Hi =
Lo.getValue(1);
4782 LC = RTLIB::SHL_I16;
4783 else if (VT == MVT::i32)
4784 LC = RTLIB::SHL_I32;
4785 else if (VT == MVT::i64)
4786 LC = RTLIB::SHL_I64;
4787 else if (VT == MVT::i128)
4788 LC = RTLIB::SHL_I128;
4792 LC = RTLIB::SRL_I16;
4793 else if (VT == MVT::i32)
4794 LC = RTLIB::SRL_I32;
4795 else if (VT == MVT::i64)
4796 LC = RTLIB::SRL_I64;
4797 else if (VT == MVT::i128)
4798 LC = RTLIB::SRL_I128;
4803 LC = RTLIB::SRA_I16;
4804 else if (VT == MVT::i32)
4805 LC = RTLIB::SRA_I32;
4806 else if (VT == MVT::i64)
4807 LC = RTLIB::SRA_I64;
4808 else if (VT == MVT::i128)
4809 LC = RTLIB::SRA_I128;
4816 SDValue Ops[2] = {
N->getOperand(0), ShAmt};
4819 SplitInteger(TLI.
makeLibCall(DAG, LC, VT, Ops, CallOptions, dl).first,
Lo,
Hi);
4823 if (!ExpandShiftWithUnknownAmountBit(
N,
Lo,
Hi))
4827void DAGTypeLegalizer::ExpandIntRes_SIGN_EXTEND(
SDNode *
N,
4832 if (
Op.getValueType().bitsLE(NVT)) {
4843 assert(getTypeAction(
Op.getValueType()) ==
4845 "Only know how to promote this result!");
4848 "Operand over promoted?");
4850 SplitInteger(Res,
Lo,
Hi);
4858void DAGTypeLegalizer::
4861 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
4862 EVT EVT = cast<VTSDNode>(
N->getOperand(1))->getVT();
4884void DAGTypeLegalizer::ExpandIntRes_SREM(
SDNode *
N,
4886 EVT VT =
N->getValueType(0);
4888 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
4898 LC = RTLIB::SREM_I16;
4899 else if (VT == MVT::i32)
4900 LC = RTLIB::SREM_I32;
4901 else if (VT == MVT::i64)
4902 LC = RTLIB::SREM_I64;
4903 else if (VT == MVT::i128)
4904 LC = RTLIB::SREM_I128;
4905 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported SREM!");
4909 SplitInteger(TLI.
makeLibCall(DAG, LC, VT, Ops, CallOptions, dl).first,
Lo,
Hi);
4912void DAGTypeLegalizer::ExpandIntRes_TRUNCATE(
SDNode *
N,
4924void DAGTypeLegalizer::ExpandIntRes_XMULO(
SDNode *
N,
4926 EVT VT =
N->getValueType(0);
4945 SDValue LHSHigh, LHSLow, RHSHigh, RHSLow;
4946 GetExpandedInteger(LHS, LHSLow, LHSHigh);
4947 GetExpandedInteger(RHS, RHSLow, RHSHigh);
4949 EVT BitVT =
N->getValueType(1);
4974 SplitInteger(Three,
Lo,
Hi);
4978 ReplaceValueWith(
SDValue(
N, 1), Overflow);
4989 LC = RTLIB::MULO_I32;
4990 else if (VT == MVT::i64)
4991 LC = RTLIB::MULO_I64;
4992 else if (VT == MVT::i128)
4993 LC = RTLIB::MULO_I128;
5006 SplitInteger(
Mul, MulLo, MulHi);
5012 SplitInteger(MulLo,
Lo,
Hi);
5013 ReplaceValueWith(
SDValue(
N, 1), Overflow);
5026 EVT ArgVT =
Op.getValueType();
5030 Entry.IsSExt =
true;
5031 Entry.IsZExt =
false;
5032 Args.push_back(Entry);
5038 Entry.IsSExt =
true;
5039 Entry.IsZExt =
false;
5040 Args.push_back(Entry);
5059 ReplaceValueWith(
SDValue(
N, 1), Ofl);
5062void DAGTypeLegalizer::ExpandIntRes_UDIV(
SDNode *
N,
5064 EVT VT =
N->getValueType(0);
5066 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
5075 if (isa<ConstantSDNode>(
N->getOperand(1))) {
5078 if (isTypeLegal(NVT)) {
5080 GetExpandedInteger(
N->getOperand(0), InL, InH);
5092 LC = RTLIB::UDIV_I16;
5093 else if (VT == MVT::i32)
5094 LC = RTLIB::UDIV_I32;
5095 else if (VT == MVT::i64)
5096 LC = RTLIB::UDIV_I64;
5097 else if (VT == MVT::i128)
5098 LC = RTLIB::UDIV_I128;
5099 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported UDIV!");
5102 SplitInteger(TLI.
makeLibCall(DAG, LC, VT, Ops, CallOptions, dl).first,
Lo,
Hi);
5105void DAGTypeLegalizer::ExpandIntRes_UREM(
SDNode *
N,
5107 EVT VT =
N->getValueType(0);
5109 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
5118 if (isa<ConstantSDNode>(
N->getOperand(1))) {
5121 if (isTypeLegal(NVT)) {
5123 GetExpandedInteger(
N->getOperand(0), InL, InH);
5135 LC = RTLIB::UREM_I16;
5136 else if (VT == MVT::i32)
5137 LC = RTLIB::UREM_I32;
5138 else if (VT == MVT::i64)
5139 LC = RTLIB::UREM_I64;
5140 else if (VT == MVT::i128)
5141 LC = RTLIB::UREM_I128;
5142 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported UREM!");
5145 SplitInteger(TLI.
makeLibCall(DAG, LC, VT, Ops, CallOptions, dl).first,
Lo,
Hi);
5148void DAGTypeLegalizer::ExpandIntRes_ZERO_EXTEND(
SDNode *
N,
5153 if (
Op.getValueType().bitsLE(NVT)) {
5160 assert(getTypeAction(
Op.getValueType()) ==
5162 "Only know how to promote this result!");
5165 "Operand over promoted?");
5167 SplitInteger(Res,
Lo,
Hi);
5175void DAGTypeLegalizer::ExpandIntRes_ATOMIC_LOAD(
SDNode *
N,
5178 EVT VT = cast<AtomicSDNode>(
N)->getMemoryVT();
5183 cast<AtomicSDNode>(
N)->getMemoryVT(), VTs,
N->getOperand(0),
5184 N->getOperand(1), Zero, Zero, cast<AtomicSDNode>(
N)->getMemOperand());
5190void DAGTypeLegalizer::ExpandIntRes_VECREDUCE(
SDNode *
N,
5195 SplitInteger(Res,
Lo,
Hi);
5198void DAGTypeLegalizer::ExpandIntRes_Rotate(
SDNode *
N,
5204 N->getOperand(0),
N->getOperand(1));
5205 SplitInteger(Res,
Lo,
Hi);
5212 GetExpandedInteger(
N->getOperand(0), In3, In4);
5213 GetExpandedInteger(
N->getOperand(1), In1, In2);
5217 unsigned Opc =
N->getOpcode();
5220 EVT ShAmtCCVT = getSetCCResultType(ShAmtVT);
5237 Lo = DAG.
getNode(Opc,
DL, HalfVT, Select2, Select1, NewShAmt);
5238 Hi = DAG.
getNode(Opc,
DL, HalfVT, Select3, Select2, NewShAmt);
5243 EVT VT =
N->getValueType(0);
5253 SplitInteger(Res,
Lo,
Hi);
5264bool DAGTypeLegalizer::ExpandIntegerOperand(
SDNode *
N,
unsigned OpNo) {
5268 if (CustomLowerNode(
N,
N->getOperand(OpNo).getValueType(),
false))
5271 switch (
N->getOpcode()) {
5274 dbgs() <<
"ExpandIntegerOperand Op #" << OpNo <<
": ";
5275 N->dump(&DAG);
dbgs() <<
"\n";
5280 case ISD::BR_CC: Res = ExpandIntOp_BR_CC(
N);
break;
5285 case ISD::EXPERIMENTAL_VP_SPLAT:
5288 case ISD::SETCC: Res = ExpandIntOp_SETCC(
N);
break;
5294 case ISD::STORE: Res = ExpandIntOp_STORE(cast<StoreSDNode>(
N), OpNo);
break;
5301 case ISD::ROTR: Res = ExpandIntOp_Shift(
N);
break;
5306 case ISD::UCMP: Res = ExpandIntOp_CMP(
N);
break;
5310 Res = ExpandIntOp_STACKMAP(
N, OpNo);
5313 Res = ExpandIntOp_PATCHPOINT(
N, OpNo);
5315 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
5316 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
5317 Res = ExpandIntOp_VP_STRIDED(
N, OpNo);
5322 if (!Res.
getNode())
return false;
5330 "Invalid operand expansion");
5332 ReplaceValueWith(
SDValue(
N, 0), Res);
5338void DAGTypeLegalizer::IntegerExpandSetCCOperands(
SDValue &NewLHS,
5342 SDValue LHSLo, LHSHi, RHSLo, RHSHi;
5343 GetExpandedInteger(NewLHS, LHSLo, LHSHi);
5344 GetExpandedInteger(NewRHS, RHSLo, RHSHi);
5364 if ((CCCode ==
ISD::SETLT && CST->isZero()) ||
5365 (CCCode ==
ISD::SETGT && CST->isAllOnes())) {
5397 RHSLo, LowCC,
false, DagCombineInfo, dl);
5404 RHSHi, CCCode,
false, DagCombineInfo, dl);
5417 if ((EqAllowed && (HiCmpC && HiCmpC->
isZero())) ||
5419 ((HiCmpC && HiCmpC->
isOne()) || (LoCmpC && LoCmpC->
isZero())))) {
5428 if (LHSHi == RHSHi) {
5441 if (HasSETCCCARRY) {
5444 bool FlipOperands =
false;
5472 false, DagCombineInfo, dl);
5481 SDValue NewLHS =
N->getOperand(2), NewRHS =
N->getOperand(3);
5482 ISD::CondCode CCCode = cast<CondCodeSDNode>(
N->getOperand(1))->get();
5483 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode,
SDLoc(
N));
5495 N->getOperand(4)), 0);
5499 SDValue NewLHS =
N->getOperand(0), NewRHS =
N->getOperand(1);
5500 ISD::CondCode CCCode = cast<CondCodeSDNode>(
N->getOperand(4))->get();
5501 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode,
SDLoc(
N));
5512 N->getOperand(2),
N->getOperand(3),
5517 SDValue NewLHS =
N->getOperand(0), NewRHS =
N->getOperand(1);
5518 ISD::CondCode CCCode = cast<CondCodeSDNode>(
N->getOperand(2))->get();
5519 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode,
SDLoc(
N));
5524 "Unexpected setcc expansion!");
5540 SDValue LHSLo, LHSHi, RHSLo, RHSHi;
5541 GetExpandedInteger(LHS, LHSLo, LHSHi);
5542 GetExpandedInteger(RHS, RHSLo, RHSHi);
5555 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
5565 GetExpandedInteger(
N->getOperand(1),
Lo,
Hi);
5578 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
5583 bool IsStrict =
N->isStrictFPOpcode();
5587 SDValue Op =
N->getOperand(IsStrict ? 1 : 0);
5588 EVT DstVT =
N->getValueType(0);
5591 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
5592 "Don't know how to expand this XINT_TO_FP!");
5595 std::pair<SDValue, SDValue> Tmp =
5601 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
5602 ReplaceValueWith(
SDValue(
N, 0), Tmp.first);
5607 assert(!
N->isAtomic() &&
"Should have been a ATOMIC_STORE?");
5610 return ExpandOp_NormalStore(
N, OpNo);
5613 assert(OpNo == 1 &&
"Can only expand the stored value so far");
5615 EVT VT =
N->getOperand(1).getValueType();
5626 if (
N->getMemoryVT().bitsLE(NVT)) {
5627 GetExpandedInteger(
N->getValue(),
Lo,
Hi);
5629 N->getMemoryVT(),
N->getOriginalAlign(), MMOFlags,
5635 GetExpandedInteger(
N->getValue(),
Lo,
Hi);
5638 N->getOriginalAlign(), MMOFlags, AAInfo);
5640 unsigned ExcessBits =
5648 N->getPointerInfo().getWithOffset(IncrementSize),
5649 NEVT,
N->getOriginalAlign(), MMOFlags, AAInfo);
5655 GetExpandedInteger(
N->getValue(),
Lo,
Hi);
5657 EVT ExtVT =
N->getMemoryVT();
5660 unsigned ExcessBits = (EBytes - IncrementSize)*8;
5678 N->getOriginalAlign(), MMOFlags, AAInfo);
5684 N->getPointerInfo().getWithOffset(IncrementSize),
5686 N->getOriginalAlign(), MMOFlags, AAInfo);
5692 GetExpandedInteger(
N->getOperand(0), InL, InH);
5701 N->getOperand(0),
N->getOperand(2),
N->getOperand(1),
5702 cast<AtomicSDNode>(
N)->getMemOperand());
5706SDValue DAGTypeLegalizer::ExpandIntOp_VP_STRIDED(
SDNode *
N,
unsigned OpNo) {
5707 assert((
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_LOAD && OpNo == 3) ||
5708 (
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_STORE && OpNo == 4));
5712 GetExpandedInteger(NewOps[OpNo], NewOps[OpNo],
Hi);
5717SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_SPLICE(
SDNode *
N) {
5720 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
5721 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
5727SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_INTERLEAVE_DEINTERLEAVE(
SDNode *
N) {
5730 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
5731 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
5740SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_SUBVECTOR(
SDNode *
N) {
5742 EVT OutVT =
N->getValueType(0);
5744 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
5748 SDValue BaseIdx =
N->getOperand(1);
5775 SDValue Ops[] = {GetWidenedVector(InOp0), BaseIdx};
5784 SDValue Ops[] = { GetPromotedInteger(InOp0), BaseIdx };
5788 "Promoted operand has an element type greater than result");
5801 InOp0 = GetPromotedInteger(InOp0);
5809 for (
unsigned i = 0; i != OutNumElems; ++i) {
5814 N->getOperand(0),
Index);
5823SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_SUBVECTOR(
SDNode *
N) {
5824 EVT OutVT =
N->getValueType(0);
5826 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
5838 Vec = GetPromotedInteger(Vec);
5844SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_REVERSE(
SDNode *
N) {
5847 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
5853SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_SHUFFLE(
SDNode *
N) {
5855 EVT VT =
N->getValueType(0);
5860 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
5861 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
5868 EVT OutVT =
N->getValueType(0);
5870 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
5871 unsigned NumElems =
N->getNumOperands();
5879 for (
unsigned i = 0; i != NumElems; ++i) {
5881 EVT OpVT =
Op.getValueType();
5886 if (OpVT.
bitsLT(NOutVTElem)) {
5892 ExtOpc = NOutExtOpc;
5905 assert(!
N->getOperand(0).getValueType().isVector() &&
5906 "Input must be a scalar");
5908 EVT OutVT =
N->getValueType(0);
5910 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
5914 if (
N->isVPOpcode())
5915 return DAG.
getNode(
N->getOpcode(), dl, NOutVT,
Op,
N->getOperand(1),
5918 return DAG.
getNode(
N->getOpcode(), dl, NOutVT,
Op);
5923 EVT OutVT =
N->getValueType(0);
5926 "Type must be promoted to a scalable vector type");
5927 const APInt &StepVal =
N->getConstantOperandAPInt(0);
5932SDValue DAGTypeLegalizer::PromoteIntRes_CONCAT_VECTORS(
SDNode *
N) {
5935 EVT OutVT =
N->getValueType(0);
5937 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
5939 unsigned NumOperands =
N->getNumOperands();
5944 SDUse *MaxSizedValue = std::max_element(
5946 EVT AVT = A.getValueType().getVectorElementType();
5947 EVT BVT = B.getValueType().getVectorElementType();
5948 return AVT.getScalarSizeInBits() < BVT.getScalarSizeInBits();
5954 for (
unsigned I = 0;
I < NumOperands; ++
I) {
5956 EVT OpVT =
Op.getValueType();
5958 Op = GetPromotedInteger(
Op);
5961 "Unhandled legalization type");
5978 unsigned NumElem =
N->getOperand(0).getValueType().getVectorNumElements();
5979 assert(NumElem * NumOperands == NumOutElem &&
5980 "Unexpected number of elements");
5984 for (
unsigned i = 0; i < NumOperands; ++i) {
5987 Op = GetPromotedInteger(
Op);
5988 EVT SclrTy =
Op.getValueType().getVectorElementType();
5989 assert(NumElem ==
Op.getValueType().getVectorNumElements() &&
5990 "Unexpected number of elements");
5992 for (
unsigned j = 0;
j < NumElem; ++
j) {
6002SDValue DAGTypeLegalizer::PromoteIntRes_EXTEND_VECTOR_INREG(
SDNode *
N) {
6003 EVT VT =
N->getValueType(0);
6005 assert(NVT.
isVector() &&
"This type must be promoted to a vector type");
6013 if (getTypeAction(
N->getOperand(0).getValueType())
6017 switch(
N->getOpcode()) {
6019 Promoted = SExtPromotedInteger(
N->getOperand(0));
6022 Promoted = ZExtPromotedInteger(
N->getOperand(0));
6025 Promoted = GetPromotedInteger(
N->getOperand(0));
6030 return DAG.
getNode(
N->getOpcode(), dl, NVT, Promoted);
6034 return DAG.
getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
6037SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_VECTOR_ELT(
SDNode *
N) {
6038 EVT OutVT =
N->getValueType(0);
6040 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6045 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6048 NOutVTElem,
N->getOperand(1));
6050 V0, ConvElem,
N->getOperand(2));
6058 return DAG.
getNode(
N->getOpcode(), dl, NVT,
N->ops());
6066 SDValue Start = PromoteIntOpVectorReduction(
N,
N->getOperand(0));
6067 return DAG.
getNode(
N->getOpcode(),
DL, Start.getValueType(), Start,
6068 N->getOperand(1),
N->getOperand(2),
N->getOperand(3));
6075 assert(
N->getNumValues() == 3 &&
"Expected 3 values for PATCHPOINT");
6089SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_VECTOR_ELT(
SDNode *
N) {
6091 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6103SDValue DAGTypeLegalizer::PromoteIntOp_INSERT_SUBVECTOR(
SDNode *
N) {
6108 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
6118SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_SUBVECTOR(
SDNode *
N) {
6120 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6123 N->getValueType(0).getVectorNumElements());
6128SDValue DAGTypeLegalizer::PromoteIntOp_CONCAT_VECTORS(
SDNode *
N) {
6131 EVT ResVT =
N->getValueType(0);
6132 unsigned NumElems =
N->getNumOperands();
6137 for (
unsigned OpIdx = 0; OpIdx < NumElems; ++OpIdx) {
6139 unsigned OpNumElts =
Op.getValueType().getVectorMinNumElements();
6147 EVT RetSclrTy =
N->getValueType(0).getVectorElementType();
6153 for (
unsigned VecIdx = 0; VecIdx != NumElems; ++VecIdx) {
6155 EVT SclrTy =
Incoming->getValueType(0).getVectorElementType();
6156 unsigned NumElem =
Incoming->getValueType(0).getVectorNumElements();
6158 for (
unsigned i=0; i<NumElem; ++i) {
6170SDValue DAGTypeLegalizer::ExpandIntOp_STACKMAP(
SDNode *
N,
unsigned OpNo) {
6183 for (
unsigned I = 0;
I < OpNo;
I++)
6186 EVT Ty =
Op.getValueType();
6198 for (
unsigned I = OpNo + 1;
I <
N->getNumOperands();
I++)
6203 for (
unsigned ResNum = 0; ResNum <
N->getNumValues(); ResNum++)
6209SDValue DAGTypeLegalizer::ExpandIntOp_PATCHPOINT(
SDNode *
N,
unsigned OpNo) {
6222 for (
unsigned I = 0;
I < OpNo;
I++)
6225 EVT Ty =
Op.getValueType();
6237 for (
unsigned I = OpNo + 1;
I <
N->getNumOperands();
I++)
6242 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())
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...
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 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 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 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.
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, ptr, val) 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.
@ 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...
@ 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 ...
@ 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...
ManagedStatic< cl::opt< FnT >, OptCreatorT > Action
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.
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
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 & setSExt(bool Value=true)