diff --git a/src/coreclr/jit/lower.h b/src/coreclr/jit/lower.h index 63174ccec9ff11..4e2de370165fe4 100644 --- a/src/coreclr/jit/lower.h +++ b/src/coreclr/jit/lower.h @@ -317,7 +317,7 @@ class Lowering final : public Phase GenTree* LowerSignedDivOrMod(GenTree* node); void LowerBlockStore(GenTreeBlk* blkNode); void LowerBlockStoreCommon(GenTreeBlk* blkNode); - void ContainBlockStoreAddress(GenTreeBlk* blkNode, unsigned size, GenTree* addr); + void ContainBlockStoreAddress(GenTreeBlk* blkNode, unsigned size, GenTree* addr, GenTree* addrParent); void LowerPutArgStkOrSplit(GenTreePutArgStk* putArgNode); #ifdef TARGET_XARCH void LowerPutArgStk(GenTreePutArgStk* putArgStk); diff --git a/src/coreclr/jit/lowerarmarch.cpp b/src/coreclr/jit/lowerarmarch.cpp index 0ac3ea9d47c286..31b03274018892 100644 --- a/src/coreclr/jit/lowerarmarch.cpp +++ b/src/coreclr/jit/lowerarmarch.cpp @@ -566,7 +566,7 @@ void Lowering::LowerBlockStore(GenTreeBlk* blkNode) src->AsIntCon()->SetIconValue(fill); - ContainBlockStoreAddress(blkNode, size, dstAddr); + ContainBlockStoreAddress(blkNode, size, dstAddr, nullptr); } else { @@ -637,10 +637,10 @@ void Lowering::LowerBlockStore(GenTreeBlk* blkNode) if (src->OperIs(GT_IND)) { - ContainBlockStoreAddress(blkNode, size, src->AsIndir()->Addr()); + ContainBlockStoreAddress(blkNode, size, src->AsIndir()->Addr(), src->AsIndir()); } - ContainBlockStoreAddress(blkNode, size, dstAddr); + ContainBlockStoreAddress(blkNode, size, dstAddr, nullptr); } else { @@ -658,8 +658,9 @@ void Lowering::LowerBlockStore(GenTreeBlk* blkNode) // blkNode - the block store node // size - the block size // addr - the address node to try to contain +// addrParent - the parent of addr, in case this is checking containment of the source address. // -void Lowering::ContainBlockStoreAddress(GenTreeBlk* blkNode, unsigned size, GenTree* addr) +void Lowering::ContainBlockStoreAddress(GenTreeBlk* blkNode, unsigned size, GenTree* addr, GenTree* addrParent) { assert(blkNode->OperIs(GT_STORE_BLK) && (blkNode->gtBlkOpKind == GenTreeBlk::BlkOpKindUnroll)); assert(size < INT32_MAX); @@ -692,7 +693,7 @@ void Lowering::ContainBlockStoreAddress(GenTreeBlk* blkNode, unsigned size, GenT } #endif // !TARGET_ARM - if (!IsSafeToContainMem(blkNode, addr)) + if (!IsSafeToContainMem(blkNode, addrParent, addr)) { return; } diff --git a/src/coreclr/jit/lowerloongarch64.cpp b/src/coreclr/jit/lowerloongarch64.cpp index f2dbb3ce42cc29..68002d1771e03a 100644 --- a/src/coreclr/jit/lowerloongarch64.cpp +++ b/src/coreclr/jit/lowerloongarch64.cpp @@ -252,7 +252,7 @@ void Lowering::LowerBlockStore(GenTreeBlk* blkNode) } src->AsIntCon()->SetIconValue(fill); - ContainBlockStoreAddress(blkNode, size, dstAddr); + ContainBlockStoreAddress(blkNode, size, dstAddr, nullptr); } else { @@ -307,10 +307,10 @@ void Lowering::LowerBlockStore(GenTreeBlk* blkNode) if (src->OperIs(GT_IND)) { - ContainBlockStoreAddress(blkNode, size, src->AsIndir()->Addr()); + ContainBlockStoreAddress(blkNode, size, src->AsIndir()->Addr(), src->AsIndir()); } - ContainBlockStoreAddress(blkNode, size, dstAddr); + ContainBlockStoreAddress(blkNode, size, dstAddr, nullptr); } else { @@ -328,8 +328,10 @@ void Lowering::LowerBlockStore(GenTreeBlk* blkNode) // blkNode - the block store node // size - the block size // addr - the address node to try to contain +// addrParent - the parent of addr, in case this is checking containment of the source address. // -void Lowering::ContainBlockStoreAddress(GenTreeBlk* blkNode, unsigned size, GenTree* addr) +void Lowering::ContainBlockStoreAddress(GenTreeBlk* blkNode, unsigned size, GenTree* addr, GenTree* addrParent) + { assert(blkNode->OperIs(GT_STORE_BLK) && (blkNode->gtBlkOpKind == GenTreeBlk::BlkOpKindUnroll)); assert(size < INT32_MAX); @@ -354,7 +356,7 @@ void Lowering::ContainBlockStoreAddress(GenTreeBlk* blkNode, unsigned size, GenT return; } - if (!IsSafeToContainMem(blkNode, addr)) + if (!IsSafeToContainMem(blkNode, addrParent, addr)) { return; } diff --git a/src/coreclr/jit/lowerxarch.cpp b/src/coreclr/jit/lowerxarch.cpp index 9fa8c0bf1c26bf..095cf91f61514a 100644 --- a/src/coreclr/jit/lowerxarch.cpp +++ b/src/coreclr/jit/lowerxarch.cpp @@ -373,7 +373,7 @@ void Lowering::LowerBlockStore(GenTreeBlk* blkNode) src->AsIntCon()->SetIconValue(fill); - ContainBlockStoreAddress(blkNode, size, dstAddr); + ContainBlockStoreAddress(blkNode, size, dstAddr, nullptr); } } else @@ -478,10 +478,10 @@ void Lowering::LowerBlockStore(GenTreeBlk* blkNode) if (src->OperIs(GT_IND)) { - ContainBlockStoreAddress(blkNode, size, src->AsIndir()->Addr()); + ContainBlockStoreAddress(blkNode, size, src->AsIndir()->Addr(), src->AsIndir()); } - ContainBlockStoreAddress(blkNode, size, dstAddr); + ContainBlockStoreAddress(blkNode, size, dstAddr, nullptr); } else { @@ -504,8 +504,9 @@ void Lowering::LowerBlockStore(GenTreeBlk* blkNode) // blkNode - the block store node // size - the block size // addr - the address node to try to contain +// addrParent - the parent of addr, in case this is checking containment of the source address. // -void Lowering::ContainBlockStoreAddress(GenTreeBlk* blkNode, unsigned size, GenTree* addr) +void Lowering::ContainBlockStoreAddress(GenTreeBlk* blkNode, unsigned size, GenTree* addr, GenTree* addrParent) { assert(blkNode->OperIs(GT_STORE_BLK) && (blkNode->gtBlkOpKind == GenTreeBlk::BlkOpKindUnroll)); assert(size < INT32_MAX); @@ -536,7 +537,7 @@ void Lowering::ContainBlockStoreAddress(GenTreeBlk* blkNode, unsigned size, GenT // Note that the parentNode is always the block node, even if we're dealing with the source address. // The source address is not directly used by the block node but by an IND node and that IND node is // always contained. - if (!IsSafeToContainMem(blkNode, addrMode)) + if (!IsSafeToContainMem(blkNode, addrParent, addrMode)) { return; }