[PATCH] D81726: [MemDep] Also remove load instructions from NonLocalDesCache.

Florian Hahn via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 12 03:12:36 PDT 2020


fhahn created this revision.
fhahn added reviewers: efriedma, hfinkel, asbirlea.
Herald added subscribers: bmahjour, hiraditya.
Herald added a project: LLVM.

Currently load instructions are added to the cache for invariant pointer
group dependencies, but only pointer values are removed currently. That
leads to dangling AssertingVHs in the test case below, where we delete a
load from an invariant pointer group. We should also remove the entries
from the cache.

Fixes PR46054.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D81726

Files:
  llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
  llvm/test/Transforms/GVN/pr46054-md-nonlocaldefcache-cleanup.ll


Index: llvm/test/Transforms/GVN/pr46054-md-nonlocaldefcache-cleanup.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/GVN/pr46054-md-nonlocaldefcache-cleanup.ll
@@ -0,0 +1,44 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -gvn -S %s | FileCheck %s
+
+; Test for PR46054. Make sure we correctly invalidate MemoryDependenceAnalysis,
+; after removing a nonlocaldef.
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+define void @test(double* %data) {
+; CHECK-LABEL: @test(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[LUC:%.*]] = tail call noalias nonnull i64* @data()
+; CHECK-NEXT:    store i64 1, i64* [[LUC]], align 8, !invariant.group !0
+; CHECK-NEXT:    call void @fn(i64 1)
+; CHECK-NEXT:    br i1 true, label [[A:%.*]], label [[ENTRY_B_CRIT_EDGE:%.*]]
+; CHECK:       entry.B_crit_edge:
+; CHECK-NEXT:    br label [[B:%.*]]
+; CHECK:       A:
+; CHECK-NEXT:    br label [[B]]
+; CHECK:       B:
+; CHECK-NEXT:    call void @fn(i64 1)
+; CHECK-NEXT:    ret void
+;
+entry:
+  %luc = tail call noalias nonnull i64* @data()
+  store i64 1, i64* %luc, !invariant.group !0
+  %QQ = load i64, i64* %luc, !invariant.group !0
+  call void @fn(i64 %QQ)
+  br i1 true, label %A, label %B
+
+A:                                                ; preds = %loop
+  br label %B
+
+B:                                                ; preds = %A, %loop
+  %QQ.1 = load i64, i64* %luc, !invariant.group !0
+  call void @fn(i64 %QQ.1)
+  ret void
+}
+
+declare void @fn(i64)
+
+declare noalias i64* @data()
+
+!0 = distinct !{}
Index: llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
===================================================================
--- llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
+++ llvm/lib/Analysis/MemoryDependenceAnalysis.cpp
@@ -1518,17 +1518,27 @@
     LocalDeps.erase(LocalDepEntry);
   }
 
-  // If we have any cached pointer dependencies on this instruction, remove
+  // If we have any cached dependencies on this instruction, remove
   // them.  If the instruction has non-pointer type, then it can't be a pointer
   // base.
 
-  // Remove it from both the load info and the store info.  The instruction
-  // can't be in either of these maps if it is non-pointer.
+  // Remove it from both the load info and the store info. If the instruction is
+  // a pointer remove it from both maps.
   if (RemInst->getType()->isPointerTy()) {
     RemoveCachedNonLocalPointerDependencies(ValueIsLoadPair(RemInst, false));
     RemoveCachedNonLocalPointerDependencies(ValueIsLoadPair(RemInst, true));
   }
 
+  // Otherwise, if the instructions is in the map directly, it must be a load.
+  auto toRemoveIt = NonLocalDefsCache.find(RemInst);
+  if (toRemoveIt != NonLocalDefsCache.end()) {
+    assert(isa<LoadInst>(RemInst) &&
+           "only load instructions should be added directly");
+    const Instruction *DepV = toRemoveIt->second.getResult().getInst();
+    ReverseNonLocalDefsCache.find(DepV)->second.erase(RemInst);
+    NonLocalDefsCache.erase(toRemoveIt);
+  }
+
   // Loop over all of the things that depend on the instruction we're removing.
   SmallVector<std::pair<Instruction *, Instruction *>, 8> ReverseDepsToAdd;
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D81726.270345.patch
Type: text/x-patch
Size: 3267 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200612/86ce17d1/attachment.bin>


More information about the llvm-commits mailing list