Skip to content

Commit 022c9c9

Browse files
[NVPTX] Lower invalid ISD::ADDRSPACECAST (#125607)
Avoid [crashing](https://godbolt.org/z/8T58vcM68) when lowering `addrspacecast ptr addrspace(<non-zero>) %ptr to ptr addrspace(<non-zero>)`.
1 parent ab0006d commit 022c9c9

File tree

3 files changed

+32
-5
lines changed

3 files changed

+32
-5
lines changed

llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -989,6 +989,8 @@ NVPTXTargetLowering::NVPTXTargetLowering(const NVPTXTargetMachine &TM,
989989
setOperationAction(ISD::FLOG2, {MVT::v2f16, MVT::v2bf16}, Expand);
990990
}
991991

992+
setOperationAction(ISD::ADDRSPACECAST, {MVT::i32, MVT::i64}, Custom);
993+
992994
// No FPOW or FREM in PTX.
993995

994996
// Now deduce the information based on the above mentioned
@@ -2642,6 +2644,8 @@ NVPTXTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
26422644
return SDValue();
26432645
case ISD::FRAMEADDR:
26442646
return SDValue();
2647+
case ISD::ADDRSPACECAST:
2648+
return LowerADDRSPACECAST(Op, DAG);
26452649
case ISD::GlobalAddress:
26462650
return LowerGlobalAddress(Op, DAG);
26472651
case ISD::INTRINSIC_W_CHAIN:
@@ -2757,6 +2761,17 @@ unsigned NVPTXTargetLowering::getJumpTableEncoding() const {
27572761
return MachineJumpTableInfo::EK_Inline;
27582762
}
27592763

2764+
SDValue NVPTXTargetLowering::LowerADDRSPACECAST(SDValue Op,
2765+
SelectionDAG &DAG) const {
2766+
AddrSpaceCastSDNode *N = cast<AddrSpaceCastSDNode>(Op.getNode());
2767+
unsigned SrcAS = N->getSrcAddressSpace();
2768+
unsigned DestAS = N->getDestAddressSpace();
2769+
if (SrcAS != llvm::ADDRESS_SPACE_GENERIC &&
2770+
DestAS != llvm::ADDRESS_SPACE_GENERIC)
2771+
return DAG.getUNDEF(Op.getValueType());
2772+
return Op;
2773+
}
2774+
27602775
// This function is almost a copy of SelectionDAG::expandVAArg().
27612776
// The only diff is that this one produces loads from local address space.
27622777
SDValue NVPTXTargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG) const {

llvm/lib/Target/NVPTX/NVPTXISelLowering.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ class NVPTXTargetLowering : public TargetLowering {
264264
const NVPTXSubtarget &STI; // cache the subtarget here
265265
SDValue getParamSymbol(SelectionDAG &DAG, int idx, EVT) const;
266266

267+
SDValue LowerADDRSPACECAST(SDValue Op, SelectionDAG &DAG) const;
267268
SDValue LowerBITCAST(SDValue Op, SelectionDAG &DAG) const;
268269

269270
SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;

llvm/test/CodeGen/NVPTX/addrspacecast.ll

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
; RUN: llc -O0 < %s -mtriple=nvptx -mcpu=sm_20 | FileCheck %s -check-prefixes=ALL,CLS32,G32
2-
; RUN: llc -O0 < %s -mtriple=nvptx64 -mcpu=sm_20 | FileCheck %s -check-prefixes=ALL,NOPTRCONV,CLS64,G64
3-
; RUN: llc -O0 < %s -mtriple=nvptx64 -mcpu=sm_20 --nvptx-short-ptr| FileCheck %s -check-prefixes=ALL,PTRCONV,CLS64,G64
1+
; RUN: llc -O0 < %s -mtriple=nvptx -mcpu=sm_20 | FileCheck %s -check-prefixes=ALL,CLS32
2+
; RUN: llc -O0 < %s -mtriple=nvptx64 -mcpu=sm_20 | FileCheck %s -check-prefixes=ALL,NOPTRCONV,CLS64
3+
; RUN: llc -O0 < %s -mtriple=nvptx64 -mcpu=sm_20 --nvptx-short-ptr | FileCheck %s -check-prefixes=ALL,PTRCONV,CLS64
44
; RUN: %if ptxas && !ptxas-12.0 %{ llc -O0 < %s -mtriple=nvptx -mcpu=sm_20 | %ptxas-verify %}
55
; RUN: %if ptxas %{ llc -O0 < %s -mtriple=nvptx64 -mcpu=sm_20 | %ptxas-verify %}
66
; RUN: %if ptxas %{ llc -O0 < %s -mtriple=nvptx64 -mcpu=sm_20 --nvptx-short-ptr | %ptxas-verify %}
77

88
; ALL-LABEL: conv1
99
define i32 @conv1(ptr addrspace(1) %ptr) {
10-
; G32: cvta.global.u32
10+
; CLS32: cvta.global.u32
1111
; ALL-NOT: cvt.u64.u32
12-
; G64: cvta.global.u64
12+
; CLS64: cvta.global.u64
1313
; ALL: ld.u32
1414
%genptr = addrspacecast ptr addrspace(1) %ptr to ptr
1515
%val = load i32, ptr %genptr
@@ -99,6 +99,17 @@ define i32 @conv8(ptr %ptr) {
9999
ret i32 %val
100100
}
101101

102+
; ALL-LABEL: conv9
103+
define i32 @conv9(ptr addrspace(1) %ptr) {
104+
; CLS32: // implicit-def: %[[ADDR:r[0-9]+]]
105+
; PTRCONV: // implicit-def: %[[ADDR:r[0-9]+]]
106+
; NOPTRCONV: // implicit-def: %[[ADDR:rd[0-9]+]]
107+
; ALL: ld.shared.u32 %r{{[0-9]+}}, [%[[ADDR]]]
108+
%specptr = addrspacecast ptr addrspace(1) %ptr to ptr addrspace(3)
109+
%val = load i32, ptr addrspace(3) %specptr
110+
ret i32 %val
111+
}
112+
102113
; Check that we support addrspacecast when splitting the vector
103114
; result (<2 x ptr> => 2 x <1 x ptr>).
104115
; This also checks that scalarization works for addrspacecast

0 commit comments

Comments
 (0)