@@ -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+
1605716078SDValue DAGCombiner::visitBUILD_PAIR(SDNode *N) {
1605816079 EVT VT = N->getValueType(0);
1605916080 return CombineConsecutiveLoads(N, VT);
0 commit comments