Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 19 additions & 2 deletions llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2715,6 +2715,12 @@ SDValue DAGCombiner::visitPTRADD(SDNode *N) {
(N->getFlags() & N0->getFlags()) & SDNodeFlags::NoUnsignedWrap;
SDValue Add = DAG.getNode(ISD::ADD, DL, IntVT, {Y, Z}, Flags);
AddToWorklist(Add.getNode());
// We can't set InBounds even if both original ptradds were InBounds and
// NUW: SDAG usually represents pointers as integers, therefore, the
// matched pattern behaves as if it had implicit casts:
// (ptradd inbounds (inttoptr (ptrtoint (ptradd inbounds x, y))), z)
// The outer inbounds ptradd might therefore rely on a provenance that x
// does not have.
return DAG.getMemBasePlusOffset(X, Add, DL, Flags);
}
}
Expand All @@ -2740,6 +2746,12 @@ SDValue DAGCombiner::visitPTRADD(SDNode *N) {
// that.
SDNodeFlags Flags =
(N->getFlags() & N0->getFlags()) & SDNodeFlags::NoUnsignedWrap;
// We can't set InBounds even if both original ptradds were InBounds and
// NUW: SDAG usually represents pointers as integers, therefore, the
// matched pattern behaves as if it had implicit casts:
// (ptradd inbounds (inttoptr (ptrtoint (ptradd inbounds GA, v))), c)
// The outer inbounds ptradd might therefore rely on a provenance that
// GA does not have.
SDValue Inner = DAG.getMemBasePlusOffset(GAValue, N1, DL, Flags);
AddToWorklist(Inner.getNode());
return DAG.getMemBasePlusOffset(Inner, N0.getOperand(1), DL, Flags);
Expand All @@ -2763,8 +2775,13 @@ SDValue DAGCombiner::visitPTRADD(SDNode *N) {
bool ZIsConstant = DAG.isConstantIntBuildVectorOrConstantInt(Z);

// If both additions in the original were NUW, reassociation preserves that.
SDNodeFlags ReassocFlags =
(N->getFlags() & N1->getFlags()) & SDNodeFlags::NoUnsignedWrap;
SDNodeFlags CommonFlags = N->getFlags() & N1->getFlags();
SDNodeFlags ReassocFlags = CommonFlags & SDNodeFlags::NoUnsignedWrap;
if (CommonFlags.hasNoUnsignedWrap()) {
// If both operations are NUW and the PTRADD is inbounds, the offests are
// both non-negative, so the reassociated PTRADDs are also inbounds.
ReassocFlags |= N->getFlags() & SDNodeFlags::InBounds;
}

if (ZIsConstant != YIsConstant) {
if (YIsConstant)
Expand Down
Loading