Revert "[GVN][NFC] Remove redundant check"
authorksyx <18738953+ksyx@users.noreply.github.com>
Mon, 15 Nov 2021 14:03:15 +0000 (09:03 -0500)
committerksyx <18738953+ksyx@users.noreply.github.com>
Mon, 15 Nov 2021 14:14:13 +0000 (09:14 -0500)
This reverts commit c35e8185d8c170c20e28956e0c9f3c1be895fefb.

mstorsjo reported in the revision thread that one VNCoercion assertion
is violated and seemly in relate to this commit. As per "If a test case
that demonstrates a problem is reported in the commit thread, please
revert and investigate offline", this commit is reverted.

llvm/lib/Transforms/Utils/VNCoercion.cpp

index 9984b83..dbe3cc9 100644 (file)
@@ -204,6 +204,18 @@ static int analyzeLoadFromClobberingWrite(Type *LoadTy, Value *LoadPtr,
       StoreOffset + StoreSize < LoadOffset + LoadSize)
     return -1;
 
+  // If the load and store are to the exact same address, they should have been
+  // a must alias.  AA must have gotten confused.
+  // FIXME: Study to see if/when this happens.  One case is forwarding a memset
+  // to a load from the base of the memset.
+
+  // If the load and store don't overlap at all, the store doesn't provide
+  // anything to the load.  In this case, they really don't alias at all, AA
+  // must have gotten confused.  The if statement above ensure the condition
+  // that StoreOffset <= LoadOffset.
+  if (StoreOffset + int64_t(StoreSize) <= LoadOffset)
+    return -1;
+
   // Okay, we can do this transformation.  Return the number of bytes into the
   // store that the load is.
   return LoadOffset - StoreOffset;