[llvm] e573ffe - [MemCpyOpt] Check `MDep` aliases to avoid infinite loops (NFC) (#140376)
via llvm-commits
llvm-commits at lists.llvm.org
Tue May 27 05:01:26 PDT 2025
Author: dianqk
Date: 2025-05-27T20:01:22+08:00
New Revision: e573ffe11f39294151c560dc2abdf7dd08821aff
URL: https://github.com/llvm/llvm-project/commit/e573ffe11f39294151c560dc2abdf7dd08821aff
DIFF: https://github.com/llvm/llvm-project/commit/e573ffe11f39294151c560dc2abdf7dd08821aff.diff
LOG: [MemCpyOpt] Check `MDep` aliases to avoid infinite loops (NFC) (#140376)
cc #103218.
Added:
Modified:
llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
index 9c8cd53d56b56..a78e3770384ae 100644
--- a/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
+++ b/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp
@@ -1104,16 +1104,17 @@ bool MemCpyOptPass::performCallSlotOptzn(Instruction *cpyLoad,
bool MemCpyOptPass::processMemCpyMemCpyDependence(MemCpyInst *M,
MemCpyInst *MDep,
BatchAAResults &BAA) {
+ // We can only optimize non-volatile memcpy's.
+ if (MDep->isVolatile())
+ return false;
+
// If dep instruction is reading from our current input, then it is a noop
// transfer and substituting the input won't change this instruction. Just
// ignore the input and let someone else zap MDep. This handles cases like:
// memcpy(a <- a)
// memcpy(b <- a)
- if (M->getSource() == MDep->getSource())
- return false;
-
- // We can only optimize non-volatile memcpy's.
- if (MDep->isVolatile())
+ // This also avoids infinite loops.
+ if (BAA.isMustAlias(MDep->getDest(), MDep->getSource()))
return false;
int64_t MForwardOffset = 0;
@@ -1177,10 +1178,6 @@ bool MemCpyOptPass::processMemCpyMemCpyDependence(MemCpyInst *M,
CopySourceAlign = commonAlignment(*CopySourceAlign, MForwardOffset);
}
- // Avoid infinite loops
- if (BAA.isMustAlias(M->getSource(), CopySource))
- return false;
-
// Verify that the copied-from memory doesn't change in between the two
// transfers. For example, in:
// memcpy(a <- b)
More information about the llvm-commits
mailing list