@@ -1364,26 +1364,6 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1364
1364
return DAG.getConstant (I, dl, MVT::i32 );
1365
1365
};
1366
1366
1367
- // Variadic arguments.
1368
- //
1369
- // Normally, for each argument, we declare a param scalar or a param
1370
- // byte array in the .param space, and store the argument value to that
1371
- // param scalar or array starting at offset 0.
1372
- //
1373
- // In the case of the first variadic argument, we declare a vararg byte array
1374
- // with size 0. The exact size of this array isn't known at this point, so
1375
- // it'll be patched later. All the variadic arguments will be stored to this
1376
- // array at a certain offset (which gets tracked by 'VAOffset'). The offset is
1377
- // initially set to 0, so it can be used for non-variadic arguments (which use
1378
- // 0 offset) to simplify the code.
1379
- //
1380
- // After all vararg is processed, 'VAOffset' holds the size of the
1381
- // vararg byte array.
1382
-
1383
- SDValue VADeclareParam = SDValue (); // vararg byte array
1384
- const unsigned FirstVAArg = CLI.NumFixedArgs ; // position of first variadic
1385
- unsigned VAOffset = 0 ; // current offset in the param array
1386
-
1387
1367
const unsigned UniqueCallSite = GlobalUniqueCallSite++;
1388
1368
const SDValue CallChain = CLI.Chain ;
1389
1369
const SDValue StartChain =
@@ -1392,7 +1372,7 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1392
1372
1393
1373
SmallVector<SDValue, 16 > CallPrereqs{StartChain};
1394
1374
1395
- const auto DeclareScalarParam = [&](SDValue Symbol, unsigned Size) {
1375
+ const auto MakeDeclareScalarParam = [&](SDValue Symbol, unsigned Size) {
1396
1376
// PTX ABI requires integral types to be at least 32 bits in size. FP16 is
1397
1377
// loaded/stored using i16, so it's handled here as well.
1398
1378
const unsigned SizeBits = promoteScalarArgumentSize (Size * 8 );
@@ -1404,8 +1384,8 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1404
1384
return Declare;
1405
1385
};
1406
1386
1407
- const auto DeclareArrayParam = [&](SDValue Symbol, Align Align,
1408
- unsigned Size) {
1387
+ const auto MakeDeclareArrayParam = [&](SDValue Symbol, Align Align,
1388
+ unsigned Size) {
1409
1389
SDValue Declare = DAG.getNode (
1410
1390
NVPTXISD::DeclareArrayParam, dl, {MVT::Other, MVT::Glue},
1411
1391
{StartChain, Symbol, GetI32 (Align.value ()), GetI32 (Size), DeclareGlue});
@@ -1414,6 +1394,33 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1414
1394
return Declare;
1415
1395
};
1416
1396
1397
+ // Variadic arguments.
1398
+ //
1399
+ // Normally, for each argument, we declare a param scalar or a param
1400
+ // byte array in the .param space, and store the argument value to that
1401
+ // param scalar or array starting at offset 0.
1402
+ //
1403
+ // In the case of the first variadic argument, we declare a vararg byte array
1404
+ // with size 0. The exact size of this array isn't known at this point, so
1405
+ // it'll be patched later. All the variadic arguments will be stored to this
1406
+ // array at a certain offset (which gets tracked by 'VAOffset'). The offset is
1407
+ // initially set to 0, so it can be used for non-variadic arguments (which use
1408
+ // 0 offset) to simplify the code.
1409
+ //
1410
+ // After all vararg is processed, 'VAOffset' holds the size of the
1411
+ // vararg byte array.
1412
+ assert ((CLI.IsVarArg || CLI.Args .size () == CLI.NumFixedArgs ) &&
1413
+ " Non-VarArg function with extra arguments" );
1414
+
1415
+ const unsigned FirstVAArg = CLI.NumFixedArgs ; // position of first variadic
1416
+ unsigned VAOffset = 0 ; // current offset in the param array
1417
+
1418
+ const SDValue VADeclareParam =
1419
+ CLI.Args .size () > FirstVAArg
1420
+ ? MakeDeclareArrayParam (getCallParamSymbol (DAG, FirstVAArg, MVT::i32 ),
1421
+ Align (STI.getMaxRequiredAlignment ()), 0 )
1422
+ : SDValue ();
1423
+
1417
1424
// Args.size() and Outs.size() need not match.
1418
1425
// Outs.size() will be larger
1419
1426
// * if there is an aggregate argument with multiple fields (each field
@@ -1474,21 +1481,17 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1474
1481
" type size mismatch" );
1475
1482
1476
1483
const SDValue ArgDeclare = [&]() {
1477
- if (IsVAArg) {
1478
- if (ArgI == FirstVAArg)
1479
- VADeclareParam = DeclareArrayParam (
1480
- ParamSymbol, Align (STI.getMaxRequiredAlignment ()), 0 );
1484
+ if (IsVAArg)
1481
1485
return VADeclareParam;
1482
- }
1483
1486
1484
1487
if (IsByVal || shouldPassAsArray (Arg.Ty ))
1485
- return DeclareArrayParam (ParamSymbol, ArgAlign, TypeSize);
1488
+ return MakeDeclareArrayParam (ParamSymbol, ArgAlign, TypeSize);
1486
1489
1487
1490
assert (ArgOuts.size () == 1 && " We must pass only one value as non-array" );
1488
1491
assert ((ArgOuts[0 ].VT .isInteger () || ArgOuts[0 ].VT .isFloatingPoint ()) &&
1489
1492
" Only int and float types are supported as non-array arguments" );
1490
1493
1491
- return DeclareScalarParam (ParamSymbol, TypeSize);
1494
+ return MakeDeclareScalarParam (ParamSymbol, TypeSize);
1492
1495
}();
1493
1496
1494
1497
// PTX Interoperability Guide 3.3(A): [Integer] Values shorter
@@ -1548,7 +1551,7 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1548
1551
if (NumElts == 1 ) {
1549
1552
Val = GetStoredValue (J, EltVT, CurrentAlign);
1550
1553
} else {
1551
- SmallVector<SDValue, 6 > StoreVals;
1554
+ SmallVector<SDValue, 8 > StoreVals;
1552
1555
for (const unsigned K : llvm::seq (NumElts)) {
1553
1556
SDValue ValJ = GetStoredValue (J + K, EltVT, CurrentAlign);
1554
1557
if (ValJ.getValueType ().isVector ())
@@ -1589,9 +1592,9 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1589
1592
const unsigned ResultSize = DL.getTypeAllocSize (RetTy);
1590
1593
if (shouldPassAsArray (RetTy)) {
1591
1594
const Align RetAlign = getArgumentAlignment (CB, RetTy, 0 , DL);
1592
- DeclareArrayParam (RetSymbol, RetAlign, ResultSize);
1595
+ MakeDeclareArrayParam (RetSymbol, RetAlign, ResultSize);
1593
1596
} else {
1594
- DeclareScalarParam (RetSymbol, ResultSize);
1597
+ MakeDeclareScalarParam (RetSymbol, ResultSize);
1595
1598
}
1596
1599
}
1597
1600
@@ -1715,17 +1718,16 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1715
1718
1716
1719
LoadChains.push_back (R.getValue (1 ));
1717
1720
1718
- if (NumElts == 1 ) {
1721
+ if (NumElts == 1 )
1719
1722
ProxyRegOps.push_back (R);
1720
- } else {
1723
+ else
1721
1724
for (const unsigned J : llvm::seq (NumElts)) {
1722
1725
SDValue Elt = DAG.getNode (
1723
1726
LoadVT.isVector () ? ISD::EXTRACT_SUBVECTOR
1724
1727
: ISD::EXTRACT_VECTOR_ELT,
1725
1728
dl, LoadVT, R, DAG.getVectorIdxConstant (J * PackingAmt, dl));
1726
1729
ProxyRegOps.push_back (Elt);
1727
1730
}
1728
- }
1729
1731
I += NumElts;
1730
1732
}
1731
1733
}
@@ -5578,7 +5580,7 @@ static SDValue sinkProxyReg(SDValue R, SDValue Chain,
5578
5580
{Chain, R});
5579
5581
}
5580
5582
case ISD::BUILD_VECTOR: {
5581
- if (DCI.isAfterLegalizeDAG ())
5583
+ if (DCI.isBeforeLegalize ())
5582
5584
return SDValue ();
5583
5585
5584
5586
SmallVector<SDValue, 16 > Ops;
@@ -5590,6 +5592,15 @@ static SDValue sinkProxyReg(SDValue R, SDValue Chain,
5590
5592
}
5591
5593
return DCI.DAG .getNode (ISD::BUILD_VECTOR, SDLoc (R), R.getValueType (), Ops);
5592
5594
}
5595
+ case ISD::EXTRACT_VECTOR_ELT: {
5596
+ if (DCI.isBeforeLegalize ())
5597
+ return SDValue ();
5598
+
5599
+ if (SDValue V = sinkProxyReg (R.getOperand (0 ), Chain, DCI))
5600
+ return DCI.DAG .getNode (ISD::EXTRACT_VECTOR_ELT, SDLoc (R), R.getValueType (),
5601
+ V, R.getOperand (1 ));
5602
+ return SDValue ();
5603
+ }
5593
5604
default :
5594
5605
return SDValue ();
5595
5606
}
0 commit comments