[llvm] [MemCpyOpt] allow some undef contents overread in processMemCpyMemCpyDependence (PR #143745)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 12 01:46:11 PDT 2025
================
@@ -1129,14 +1132,28 @@ bool MemCpyOptPass::processMemCpyMemCpyDependence(MemCpyInst *M,
MForwardOffset = *Offset;
}
- // The length of the memcpy's must be the same, or the preceding one
- // must be larger than the following one.
- if (MForwardOffset != 0 || MDep->getLength() != M->getLength()) {
+ Value *CopyLength = M->getLength();
+
+ // The length of the memcpy's must be the same, or the preceding one must be
+ // larger than the following one, or the contents of the overread must be
+ // undefined bytes of a defined size.
+ if (MForwardOffset != 0 || MDep->getLength() != CopyLength) {
auto *MDepLen = dyn_cast<ConstantInt>(MDep->getLength());
- auto *MLen = dyn_cast<ConstantInt>(M->getLength());
- if (!MDepLen || !MLen ||
- MDepLen->getZExtValue() < MLen->getZExtValue() + MForwardOffset)
- return false;
+ auto *MLen = dyn_cast<ConstantInt>(CopyLength);
+ if (!MDepLen || !MLen)
+ return false; // This could be converted to a runtime test (%CopyLength =
+ // min(max(0, MDepLen - MForwardOffset), MLen)), but it is
+ // unclear if that is useful
----------------
nikic wrote:
Please do not comment at the end of line, move this above the if.
https://github.com/llvm/llvm-project/pull/143745
More information about the llvm-commits
mailing list