[llvm] [LoopIdiom] Use SCEV for deciding memmove validity (PR #211274)

John Brawn via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 28 08:55:44 PDT 2026


================
@@ -1290,43 +1290,44 @@ bool LoopIdiomRecognize::processLoopStoreOfLoopLoad(StoreInst *SI,
 namespace {
 class MemmoveVerifier {
 public:
-  explicit MemmoveVerifier(const Value &LoadBasePtr, const Value &StoreBasePtr,
-                           const DataLayout &DL)
-      : DL(DL), BP1(llvm::GetPointerBaseWithConstantOffset(
-                    LoadBasePtr.stripPointerCasts(), LoadOff, DL)),
-        BP2(llvm::GetPointerBaseWithConstantOffset(
-            StoreBasePtr.stripPointerCasts(), StoreOff, DL)),
-        IsSameObject(BP1 == BP2) {}
+  explicit MemmoveVerifier(const SCEV &LoadStart, const SCEV &StoreStart,
+                           const DataLayout &DL, ScalarEvolution &SE)
+      : DL(DL),
+        Off(dyn_cast<SCEVConstant>(SE.getMinusSCEV(&StoreStart, &LoadStart))),
+        BasePtr(dyn_cast<SCEVUnknown>(SE.getPointerBase(&StoreStart))),
+        IsSameObject(Off != nullptr) {}
----------------
john-brawn-arm wrote:

Yes, it's used in LoopIdiomRecognize::processLoopStoreOfLoopLoad when dealing with a loop that contains a memcpy.

https://github.com/llvm/llvm-project/pull/211274


More information about the llvm-commits mailing list