@@ -488,6 +488,7 @@ namespace {
488
488
SDValue visitTRUNCATE(SDNode *N);
489
489
SDValue visitTRUNCATE_USAT_U(SDNode *N);
490
490
SDValue visitBITCAST(SDNode *N);
491
+ SDValue visitADDRSPACECAST(SDNode *N);
491
492
SDValue visitFREEZE(SDNode *N);
492
493
SDValue visitBUILD_PAIR(SDNode *N);
493
494
SDValue visitFADD(SDNode *N);
@@ -1920,6 +1921,7 @@ SDValue DAGCombiner::visit(SDNode *N) {
1920
1921
case ISD::TRUNCATE: return visitTRUNCATE(N);
1921
1922
case ISD::TRUNCATE_USAT_U: return visitTRUNCATE_USAT_U(N);
1922
1923
case ISD::BITCAST: return visitBITCAST(N);
1924
+ case ISD::ADDRSPACECAST: return visitADDRSPACECAST(N);
1923
1925
case ISD::BUILD_PAIR: return visitBUILD_PAIR(N);
1924
1926
case ISD::FADD: return visitFADD(N);
1925
1927
case ISD::STRICT_FADD: return visitSTRICT_FADD(N);
@@ -16054,6 +16056,25 @@ SDValue DAGCombiner::visitBITCAST(SDNode *N) {
16054
16056
return SDValue();
16055
16057
}
16056
16058
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
+
16057
16078
SDValue DAGCombiner::visitBUILD_PAIR(SDNode *N) {
16058
16079
EVT VT = N->getValueType(0);
16059
16080
return CombineConsecutiveLoads(N, VT);
0 commit comments