================
@@ -2766,6 +2766,33 @@ SDValue DAGCombiner::visitPTRADD(SDNode *N) {
}
}
+ // Transform (ptradd a, b) -> (or disjoint a, b) if it is equivalent and if
+ // that transformation can't block an offset folding at any use of the
ptradd.
+ // This should be done late, after legalization, so that it doesn't block
+ // other ptradd combines that could enable more offset folding.
+ if (LegalOperations && DAG.haveNoCommonBitsSet(N0, N1)) {
+ bool TransformCanBreakAddrMode = false;
+ if (auto *C = dyn_cast<ConstantSDNode>(N1)) {
+ TargetLoweringBase::AddrMode AM;
+ AM.HasBaseReg = true;
+ AM.BaseOffs = C->getSExtValue();
+ TransformCanBreakAddrMode = any_of(N->users(), [&](SDNode *User) {
+ if (auto *LoadStore = dyn_cast<MemSDNode>(User);
+ LoadStore && LoadStore->getBasePtr().getNode() == N) {
+ unsigned AS = LoadStore->getAddressSpace();
+ EVT AccessVT = LoadStore->getMemoryVT();
+ Type *AccessTy = AccessVT.getTypeForEVT(*DAG.getContext());
+ return TLI.isLegalAddressingMode(DAG.getDataLayout(), AM, AccessTy,
+ AS);
+ }
+ return false;
----------------
ritter-x2a wrote:
I found that the functionality that I would want to extract from both already
exists, more generalized, as a separate function, `canFoldInAddressingMode`, so
the PR now uses that instead. `reassociationCanBreakAddressingModePattern`
should probably also use `canFoldInAddressingMode`.
https://github.com/llvm/llvm-project/pull/146075
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits