@@ -1415,6 +1415,23 @@ bool SITargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info,
1415
1415
}
1416
1416
}
1417
1417
1418
+ void SITargetLowering::CollectTargetIntrinsicOperands(
1419
+ const CallInst &I, SmallVectorImpl<SDValue> &Ops, SelectionDAG &DAG) const {
1420
+ switch (cast<IntrinsicInst>(I).getIntrinsicID()) {
1421
+ case Intrinsic::amdgcn_addrspacecast_nonnull: {
1422
+ // The DAG's ValueType loses the addrspaces.
1423
+ // Add them as 2 extra Constant operands "from" and "to".
1424
+ unsigned SrcAS = I.getOperand(0)->getType()->getPointerAddressSpace();
1425
+ unsigned DstAS = I.getType()->getPointerAddressSpace();
1426
+ Ops.push_back(DAG.getTargetConstant(SrcAS, SDLoc(), MVT::i32));
1427
+ Ops.push_back(DAG.getTargetConstant(DstAS, SDLoc(), MVT::i32));
1428
+ break;
1429
+ }
1430
+ default:
1431
+ break;
1432
+ }
1433
+ }
1434
+
1418
1435
bool SITargetLowering::getAddrModeArguments(IntrinsicInst *II,
1419
1436
SmallVectorImpl<Value*> &Ops,
1420
1437
Type *&AccessTy) const {
@@ -6635,24 +6652,36 @@ static bool isKnownNonNull(SDValue Val, SelectionDAG &DAG,
6635
6652
SDValue SITargetLowering::lowerADDRSPACECAST(SDValue Op,
6636
6653
SelectionDAG &DAG) const {
6637
6654
SDLoc SL(Op);
6638
- const AddrSpaceCastSDNode *ASC = cast<AddrSpaceCastSDNode>(Op);
6639
-
6640
- SDValue Src = ASC->getOperand(0);
6641
- SDValue FlatNullPtr = DAG.getConstant(0, SL, MVT::i64);
6642
- unsigned SrcAS = ASC->getSrcAddressSpace();
6643
6655
6644
6656
const AMDGPUTargetMachine &TM =
6645
6657
static_cast<const AMDGPUTargetMachine &>(getTargetMachine());
6646
6658
6659
+ unsigned DestAS, SrcAS;
6660
+ SDValue Src;
6661
+ bool IsNonNull = false;
6662
+ if (const auto *ASC = dyn_cast<AddrSpaceCastSDNode>(Op)) {
6663
+ SrcAS = ASC->getSrcAddressSpace();
6664
+ Src = ASC->getOperand(0);
6665
+ DestAS = ASC->getDestAddressSpace();
6666
+ } else {
6667
+ assert(Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN &&
6668
+ Op.getConstantOperandVal(0) ==
6669
+ Intrinsic::amdgcn_addrspacecast_nonnull);
6670
+ Src = Op->getOperand(1);
6671
+ SrcAS = Op->getConstantOperandVal(2);
6672
+ DestAS = Op->getConstantOperandVal(3);
6673
+ IsNonNull = true;
6674
+ }
6675
+
6676
+ SDValue FlatNullPtr = DAG.getConstant(0, SL, MVT::i64);
6677
+
6647
6678
// flat -> local/private
6648
6679
if (SrcAS == AMDGPUAS::FLAT_ADDRESS) {
6649
- unsigned DestAS = ASC->getDestAddressSpace();
6650
-
6651
6680
if (DestAS == AMDGPUAS::LOCAL_ADDRESS ||
6652
6681
DestAS == AMDGPUAS::PRIVATE_ADDRESS) {
6653
6682
SDValue Ptr = DAG.getNode(ISD::TRUNCATE, SL, MVT::i32, Src);
6654
6683
6655
- if (isKnownNonNull(Src , DAG, TM, SrcAS))
6684
+ if (IsNonNull || isKnownNonNull(Op , DAG, TM, SrcAS))
6656
6685
return Ptr;
6657
6686
6658
6687
unsigned NullVal = TM.getNullPointerValue(DestAS);
@@ -6665,16 +6694,16 @@ SDValue SITargetLowering::lowerADDRSPACECAST(SDValue Op,
6665
6694
}
6666
6695
6667
6696
// local/private -> flat
6668
- if (ASC->getDestAddressSpace() == AMDGPUAS::FLAT_ADDRESS) {
6697
+ if (DestAS == AMDGPUAS::FLAT_ADDRESS) {
6669
6698
if (SrcAS == AMDGPUAS::LOCAL_ADDRESS ||
6670
6699
SrcAS == AMDGPUAS::PRIVATE_ADDRESS) {
6671
6700
6672
- SDValue Aperture = getSegmentAperture(ASC->getSrcAddressSpace() , SL, DAG);
6701
+ SDValue Aperture = getSegmentAperture(SrcAS , SL, DAG);
6673
6702
SDValue CvtPtr =
6674
6703
DAG.getNode(ISD::BUILD_VECTOR, SL, MVT::v2i32, Src, Aperture);
6675
6704
CvtPtr = DAG.getNode(ISD::BITCAST, SL, MVT::i64, CvtPtr);
6676
6705
6677
- if (isKnownNonNull(Src , DAG, TM, SrcAS))
6706
+ if (IsNonNull || isKnownNonNull(Op , DAG, TM, SrcAS))
6678
6707
return CvtPtr;
6679
6708
6680
6709
unsigned NullVal = TM.getNullPointerValue(SrcAS);
@@ -6697,7 +6726,7 @@ SDValue SITargetLowering::lowerADDRSPACECAST(SDValue Op,
6697
6726
return DAG.getNode(ISD::BITCAST, SL, MVT::i64, Vec);
6698
6727
}
6699
6728
6700
- if (ASC->getDestAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS_32BIT &&
6729
+ if (DestAS == AMDGPUAS::CONSTANT_ADDRESS_32BIT &&
6701
6730
Src.getValueType() == MVT::i64)
6702
6731
return DAG.getNode(ISD::TRUNCATE, SL, MVT::i32, Src);
6703
6732
@@ -6708,7 +6737,7 @@ SDValue SITargetLowering::lowerADDRSPACECAST(SDValue Op,
6708
6737
MF.getFunction(), "invalid addrspacecast", SL.getDebugLoc());
6709
6738
DAG.getContext()->diagnose(InvalidAddrSpaceCast);
6710
6739
6711
- return DAG.getUNDEF(ASC ->getValueType(0));
6740
+ return DAG.getUNDEF(Op ->getValueType(0));
6712
6741
}
6713
6742
6714
6743
// This lowers an INSERT_SUBVECTOR by extracting the individual elements from
@@ -8325,6 +8354,8 @@ SDValue SITargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
8325
8354
Op.getOperand(3), Op.getOperand(4), Op.getOperand(5),
8326
8355
IndexKeyi32, Op.getOperand(7)});
8327
8356
}
8357
+ case Intrinsic::amdgcn_addrspacecast_nonnull:
8358
+ return lowerADDRSPACECAST(Op, DAG);
8328
8359
default:
8329
8360
if (const AMDGPU::ImageDimIntrinsicInfo *ImageDimIntr =
8330
8361
AMDGPU::getImageDimIntrinsicInfo(IntrinsicID))
0 commit comments