@@ -1389,26 +1389,6 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1389
1389
return DAG.getConstant (I, dl, MVT::i32 );
1390
1390
};
1391
1391
1392
- // Variadic arguments.
1393
- //
1394
- // Normally, for each argument, we declare a param scalar or a param
1395
- // byte array in the .param space, and store the argument value to that
1396
- // param scalar or array starting at offset 0.
1397
- //
1398
- // In the case of the first variadic argument, we declare a vararg byte array
1399
- // with size 0. The exact size of this array isn't known at this point, so
1400
- // it'll be patched later. All the variadic arguments will be stored to this
1401
- // array at a certain offset (which gets tracked by 'VAOffset'). The offset is
1402
- // initially set to 0, so it can be used for non-variadic arguments (which use
1403
- // 0 offset) to simplify the code.
1404
- //
1405
- // After all vararg is processed, 'VAOffset' holds the size of the
1406
- // vararg byte array.
1407
-
1408
- SDValue VADeclareParam = SDValue (); // vararg byte array
1409
- const unsigned FirstVAArg = CLI.NumFixedArgs ; // position of first variadic
1410
- unsigned VAOffset = 0 ; // current offset in the param array
1411
-
1412
1392
const unsigned UniqueCallSite = GlobalUniqueCallSite++;
1413
1393
const SDValue CallChain = CLI.Chain ;
1414
1394
const SDValue StartChain =
@@ -1417,7 +1397,7 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1417
1397
1418
1398
SmallVector<SDValue, 16 > CallPrereqs{StartChain};
1419
1399
1420
- const auto DeclareScalarParam = [&](SDValue Symbol, unsigned Size) {
1400
+ const auto MakeDeclareScalarParam = [&](SDValue Symbol, unsigned Size) {
1421
1401
// PTX ABI requires integral types to be at least 32 bits in size. FP16 is
1422
1402
// loaded/stored using i16, so it's handled here as well.
1423
1403
const unsigned SizeBits = promoteScalarArgumentSize (Size * 8 );
@@ -1429,8 +1409,8 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1429
1409
return Declare;
1430
1410
};
1431
1411
1432
- const auto DeclareArrayParam = [&](SDValue Symbol, Align Align,
1433
- unsigned Size) {
1412
+ const auto MakeDeclareArrayParam = [&](SDValue Symbol, Align Align,
1413
+ unsigned Size) {
1434
1414
SDValue Declare = DAG.getNode (
1435
1415
NVPTXISD::DeclareArrayParam, dl, {MVT::Other, MVT::Glue},
1436
1416
{StartChain, Symbol, GetI32 (Align.value ()), GetI32 (Size), DeclareGlue});
@@ -1439,6 +1419,33 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1439
1419
return Declare;
1440
1420
};
1441
1421
1422
+ // Variadic arguments.
1423
+ //
1424
+ // Normally, for each argument, we declare a param scalar or a param
1425
+ // byte array in the .param space, and store the argument value to that
1426
+ // param scalar or array starting at offset 0.
1427
+ //
1428
+ // In the case of the first variadic argument, we declare a vararg byte array
1429
+ // with size 0. The exact size of this array isn't known at this point, so
1430
+ // it'll be patched later. All the variadic arguments will be stored to this
1431
+ // array at a certain offset (which gets tracked by 'VAOffset'). The offset is
1432
+ // initially set to 0, so it can be used for non-variadic arguments (which use
1433
+ // 0 offset) to simplify the code.
1434
+ //
1435
+ // After all vararg is processed, 'VAOffset' holds the size of the
1436
+ // vararg byte array.
1437
+ assert ((CLI.IsVarArg || CLI.Args .size () == CLI.NumFixedArgs ) &&
1438
+ " Non-VarArg function with extra arguments" );
1439
+
1440
+ const unsigned FirstVAArg = CLI.NumFixedArgs ; // position of first variadic
1441
+ unsigned VAOffset = 0 ; // current offset in the param array
1442
+
1443
+ const SDValue VADeclareParam =
1444
+ CLI.Args .size () > FirstVAArg
1445
+ ? MakeDeclareArrayParam (getCallParamSymbol (DAG, FirstVAArg, MVT::i32 ),
1446
+ Align (STI.getMaxRequiredAlignment ()), 0 )
1447
+ : SDValue ();
1448
+
1442
1449
// Args.size() and Outs.size() need not match.
1443
1450
// Outs.size() will be larger
1444
1451
// * if there is an aggregate argument with multiple fields (each field
@@ -1499,21 +1506,17 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1499
1506
" type size mismatch" );
1500
1507
1501
1508
const SDValue ArgDeclare = [&]() {
1502
- if (IsVAArg) {
1503
- if (ArgI == FirstVAArg)
1504
- VADeclareParam = DeclareArrayParam (
1505
- ParamSymbol, Align (STI.getMaxRequiredAlignment ()), 0 );
1509
+ if (IsVAArg)
1506
1510
return VADeclareParam;
1507
- }
1508
1511
1509
1512
if (IsByVal || shouldPassAsArray (Arg.Ty ))
1510
- return DeclareArrayParam (ParamSymbol, ArgAlign, TypeSize);
1513
+ return MakeDeclareArrayParam (ParamSymbol, ArgAlign, TypeSize);
1511
1514
1512
1515
assert (ArgOuts.size () == 1 && " We must pass only one value as non-array" );
1513
1516
assert ((ArgOuts[0 ].VT .isInteger () || ArgOuts[0 ].VT .isFloatingPoint ()) &&
1514
1517
" Only int and float types are supported as non-array arguments" );
1515
1518
1516
- return DeclareScalarParam (ParamSymbol, TypeSize);
1519
+ return MakeDeclareScalarParam (ParamSymbol, TypeSize);
1517
1520
}();
1518
1521
1519
1522
// PTX Interoperability Guide 3.3(A): [Integer] Values shorter
@@ -1573,7 +1576,7 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1573
1576
if (NumElts == 1 ) {
1574
1577
Val = GetStoredValue (J, EltVT, CurrentAlign);
1575
1578
} else {
1576
- SmallVector<SDValue, 6 > StoreVals;
1579
+ SmallVector<SDValue, 8 > StoreVals;
1577
1580
for (const unsigned K : llvm::seq (NumElts)) {
1578
1581
SDValue ValJ = GetStoredValue (J + K, EltVT, CurrentAlign);
1579
1582
if (ValJ.getValueType ().isVector ())
@@ -1614,9 +1617,9 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1614
1617
const unsigned ResultSize = DL.getTypeAllocSize (RetTy);
1615
1618
if (shouldPassAsArray (RetTy)) {
1616
1619
const Align RetAlign = getArgumentAlignment (CB, RetTy, 0 , DL);
1617
- DeclareArrayParam (RetSymbol, RetAlign, ResultSize);
1620
+ MakeDeclareArrayParam (RetSymbol, RetAlign, ResultSize);
1618
1621
} else {
1619
- DeclareScalarParam (RetSymbol, ResultSize);
1622
+ MakeDeclareScalarParam (RetSymbol, ResultSize);
1620
1623
}
1621
1624
}
1622
1625
@@ -1740,17 +1743,16 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1740
1743
1741
1744
LoadChains.push_back (R.getValue (1 ));
1742
1745
1743
- if (NumElts == 1 ) {
1746
+ if (NumElts == 1 )
1744
1747
ProxyRegOps.push_back (R);
1745
- } else {
1748
+ else
1746
1749
for (const unsigned J : llvm::seq (NumElts)) {
1747
1750
SDValue Elt = DAG.getNode (
1748
1751
LoadVT.isVector () ? ISD::EXTRACT_SUBVECTOR
1749
1752
: ISD::EXTRACT_VECTOR_ELT,
1750
1753
dl, LoadVT, R, DAG.getVectorIdxConstant (J * PackingAmt, dl));
1751
1754
ProxyRegOps.push_back (Elt);
1752
1755
}
1753
- }
1754
1756
I += NumElts;
1755
1757
}
1756
1758
}
@@ -5770,7 +5772,7 @@ static SDValue sinkProxyReg(SDValue R, SDValue Chain,
5770
5772
{Chain, R});
5771
5773
}
5772
5774
case ISD::BUILD_VECTOR: {
5773
- if (DCI.isAfterLegalizeDAG ())
5775
+ if (DCI.isBeforeLegalize ())
5774
5776
return SDValue ();
5775
5777
5776
5778
SmallVector<SDValue, 16 > Ops;
@@ -5782,6 +5784,15 @@ static SDValue sinkProxyReg(SDValue R, SDValue Chain,
5782
5784
}
5783
5785
return DCI.DAG .getNode (ISD::BUILD_VECTOR, SDLoc (R), R.getValueType (), Ops);
5784
5786
}
5787
+ case ISD::EXTRACT_VECTOR_ELT: {
5788
+ if (DCI.isBeforeLegalize ())
5789
+ return SDValue ();
5790
+
5791
+ if (SDValue V = sinkProxyReg (R.getOperand (0 ), Chain, DCI))
5792
+ return DCI.DAG .getNode (ISD::EXTRACT_VECTOR_ELT, SDLoc (R), R.getValueType (),
5793
+ V, R.getOperand (1 ));
5794
+ return SDValue ();
5795
+ }
5785
5796
default :
5786
5797
return SDValue ();
5787
5798
}
0 commit comments