Skip to content

Commit a304a77

Browse files
committed
[DAGCombiner] Add very basic folds for ADDRSPACECAST
1 parent 1833ddf commit a304a77

File tree

2 files changed

+24
-8
lines changed

2 files changed

+24
-8
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,7 @@ namespace {
488488
SDValue visitTRUNCATE(SDNode *N);
489489
SDValue visitTRUNCATE_USAT_U(SDNode *N);
490490
SDValue visitBITCAST(SDNode *N);
491+
SDValue visitADDRSPACECAST(SDNode *N);
491492
SDValue visitFREEZE(SDNode *N);
492493
SDValue visitBUILD_PAIR(SDNode *N);
493494
SDValue visitFADD(SDNode *N);
@@ -1920,6 +1921,7 @@ SDValue DAGCombiner::visit(SDNode *N) {
19201921
case ISD::TRUNCATE: return visitTRUNCATE(N);
19211922
case ISD::TRUNCATE_USAT_U: return visitTRUNCATE_USAT_U(N);
19221923
case ISD::BITCAST: return visitBITCAST(N);
1924+
case ISD::ADDRSPACECAST: return visitADDRSPACECAST(N);
19231925
case ISD::BUILD_PAIR: return visitBUILD_PAIR(N);
19241926
case ISD::FADD: return visitFADD(N);
19251927
case ISD::STRICT_FADD: return visitSTRICT_FADD(N);
@@ -16054,6 +16056,25 @@ SDValue DAGCombiner::visitBITCAST(SDNode *N) {
1605416056
return SDValue();
1605516057
}
1605616058

16059+
SDValue DAGCombiner::visitADDRSPACECAST(SDNode *N) {
16060+
auto *ASCN1 = cast<AddrSpaceCastSDNode>(N);
16061+
16062+
if (auto *ASCN2 = dyn_cast<AddrSpaceCastSDNode>(ASCN1->getOperand(0))) {
16063+
assert(ASCN2->getDestAddressSpace() == ASCN1->getSrcAddressSpace());
16064+
16065+
// Fold asc[B -> A](asc[A -> B](x)) -> x
16066+
if (ASCN1->getDestAddressSpace() == ASCN2->getSrcAddressSpace())
16067+
return ASCN2->getOperand(0);
16068+
16069+
// Fold asc[B -> C](asc[A -> B](x)) -> asc[A -> C](x)
16070+
return DAG.getAddrSpaceCast(
16071+
SDLoc(N), N->getValueType(0), ASCN2->getOperand(0),
16072+
ASCN2->getSrcAddressSpace(), ASCN1->getDestAddressSpace());
16073+
}
16074+
16075+
return SDValue();
16076+
}
16077+
1605716078
SDValue DAGCombiner::visitBUILD_PAIR(SDNode *N) {
1605816079
EVT VT = N->getValueType(0);
1605916080
return CombineConsecutiveLoads(N, VT);

llvm/test/CodeGen/NVPTX/addrspacecast-folding.ll

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,11 @@ target triple = "nvptx64-unknown-unknown"
77
define ptr @test1(ptr %p) {
88
; CHECK-LABEL: test1(
99
; CHECK: {
10-
; CHECK-NEXT: .reg .b64 %rd<4>;
10+
; CHECK-NEXT: .reg .b64 %rd<2>;
1111
; CHECK-EMPTY:
1212
; CHECK-NEXT: // %bb.0:
1313
; CHECK-NEXT: ld.param.u64 %rd1, [test1_param_0];
14-
; CHECK-NEXT: cvta.to.local.u64 %rd2, %rd1;
15-
; CHECK-NEXT: cvta.local.u64 %rd3, %rd2;
16-
; CHECK-NEXT: st.param.b64 [func_retval0], %rd3;
14+
; CHECK-NEXT: st.param.b64 [func_retval0], %rd1;
1715
; CHECK-NEXT: ret;
1816
%a = addrspacecast ptr %p to ptr addrspace(5)
1917
%b = addrspacecast ptr addrspace(5) %a to ptr
@@ -23,13 +21,10 @@ define ptr @test1(ptr %p) {
2321
define ptr addrspace(1) @test2(ptr addrspace(5) %p) {
2422
; CHECK-LABEL: test2(
2523
; CHECK: {
26-
; CHECK-NEXT: .reg .b64 %rd<4>;
24+
; CHECK-NEXT: .reg .b64 %rd<2>;
2725
; CHECK-EMPTY:
2826
; CHECK-NEXT: // %bb.0:
2927
; CHECK-NEXT: ld.param.u64 %rd1, [test2_param_0];
30-
; CHECK-NEXT: cvta.local.u64 %rd2, %rd1;
31-
; CHECK-NEXT: cvta.to.global.u64 %rd3, %rd2;
32-
; CHECK-NEXT: st.param.b64 [func_retval0], %rd3;
3328
; CHECK-NEXT: ret;
3429
%a = addrspacecast ptr addrspace(5) %p to ptr
3530
%b = addrspacecast ptr %a to ptr addrspace(1)

0 commit comments

Comments
 (0)