[llvm] [JumpThreading] Invalidate LVI after `combineMetadataForCSE`. (PR #65219)

via llvm-commits llvm-commits at lists.llvm.org
Sun Sep 3 04:00:05 PDT 2023


https://github.com/DianQK updated https://github.com/llvm/llvm-project/pull/65219:

>From 543fd1854da4ee918c50e9ac87e49cf4df4534a9 Mon Sep 17 00:00:00 2001
From: DianQK <dianqk at dianqk.net>
Date: Sun, 3 Sep 2023 12:18:57 +0800
Subject: [PATCH 1/2] [JumpThreading][NFC] Pre-commit for invalid LVI.

---
 .../JumpThreading/invalidate-lvi.ll           | 53 +++++++++++++++++++
 1 file changed, 53 insertions(+)
 create mode 100644 llvm/test/Transforms/JumpThreading/invalidate-lvi.ll

diff --git a/llvm/test/Transforms/JumpThreading/invalidate-lvi.ll b/llvm/test/Transforms/JumpThreading/invalidate-lvi.ll
new file mode 100644
index 00000000000000..9c5cbfac62d9fb
--- /dev/null
+++ b/llvm/test/Transforms/JumpThreading/invalidate-lvi.ll
@@ -0,0 +1,53 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
+; RUN: opt -S -passes=jump-threading < %s | FileCheck %s
+
+declare void @set_value(ptr)
+
+declare void @bar()
+
+define void @foo(i1 %0) {
+; CHECK-LABEL: define void @foo(
+; CHECK-SAME: i1 [[TMP0:%.*]]) {
+; CHECK-NEXT:  start:
+; CHECK-NEXT:    [[V:%.*]] = alloca i64, align 8
+; CHECK-NEXT:    call void @set_value(ptr [[V]])
+; CHECK-NEXT:    [[L1:%.*]] = load i64, ptr [[V]], align 8
+; CHECK-NEXT:    br i1 [[TMP0]], label [[BB0:%.*]], label [[BB4:%.*]]
+; CHECK:       bb0:
+; CHECK-NEXT:    [[C1:%.*]] = icmp eq i64 [[L1]], 0
+; CHECK-NEXT:    br i1 [[C1]], label [[BB1:%.*]], label [[BB4]]
+; CHECK:       bb1:
+; CHECK-NEXT:    store i64 0, ptr [[V]], align 8
+; CHECK-NEXT:    br label [[BB4]]
+; CHECK:       bb4:
+; CHECK-NEXT:    [[L2:%.*]] = phi i64 [ 0, [[BB1]] ], [ [[L1]], [[BB0]] ], [ [[L1]], [[START:%.*]] ]
+; CHECK-NEXT:    ret void
+;
+start:
+  %v = alloca i64, align 8
+  call void @set_value(ptr %v)
+  %l1 = load i64, ptr %v, align 8, !range !0
+  br i1 %0, label %bb0, label %bb2
+
+bb0:                                              ; preds = %start
+  %c1 = icmp eq i64 %l1, 0
+  br i1 %c1, label %bb1, label %bb2
+
+bb1:                                              ; preds = %bb0
+  store i64 0, ptr %v, align 8
+  br label %bb2
+
+bb2:                                              ; preds = %bb1, %bb0, %start
+  %l2 = load i64, ptr %v, align 8
+  %1 = icmp eq i64 %l2, 2
+  br i1 %1, label %bb3, label %bb4
+
+bb3:                                              ; preds = %bb2
+  call void @bar()
+  ret void
+
+bb4:                                              ; preds = %bb2
+  ret void
+}
+
+!0 = !{i64 0, i64 2}

>From a202e26749f48e891696eb4108b0bb0341bf28d1 Mon Sep 17 00:00:00 2001
From: DianQK <dianqk at dianqk.net>
Date: Sun, 3 Sep 2023 12:23:33 +0800
Subject: [PATCH 2/2] [JumpThreading] Invalidate LVI after
 `combineMetadataForCSE`.

---
 llvm/include/llvm/Analysis/LazyValueInfo.h    |  3 ++
 llvm/lib/Analysis/LazyValueInfo.cpp           | 35 +++++++++++++------
 llvm/lib/Transforms/Scalar/JumpThreading.cpp  |  2 ++
 .../JumpThreading/invalidate-lvi.ll           | 16 ++++++---
 4 files changed, 41 insertions(+), 15 deletions(-)

diff --git a/llvm/include/llvm/Analysis/LazyValueInfo.h b/llvm/include/llvm/Analysis/LazyValueInfo.h
index b109b7f7e65ae7..7b2bfdac75a8fa 100644
--- a/llvm/include/llvm/Analysis/LazyValueInfo.h
+++ b/llvm/include/llvm/Analysis/LazyValueInfo.h
@@ -115,6 +115,9 @@ class LazyValueInfo {
   /// PredBB to OldSucc to be from PredBB to NewSucc instead.
   void threadEdge(BasicBlock *PredBB, BasicBlock *OldSucc, BasicBlock *NewSucc);
 
+  /// Remove information related to this value from the cache.
+  void forgetValue(Value *V);
+
   /// Inform the analysis cache that we have erased a block.
   void eraseBlock(BasicBlock *BB);
 
diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp
index 33651783cb1777..a4ca00db000ee4 100644
--- a/llvm/lib/Analysis/LazyValueInfo.cpp
+++ b/llvm/lib/Analysis/LazyValueInfo.cpp
@@ -245,6 +245,9 @@ namespace {
       ValueHandles.clear();
     }
 
+    /// Remove information related to this value from the cache.
+    void forgetValue(Value *V);
+
     /// Inform the cache that a given value has been deleted.
     void eraseValue(Value *V);
 
@@ -259,17 +262,20 @@ namespace {
   };
 }
 
-void LazyValueInfoCache::eraseValue(Value *V) {
-  for (auto &Pair : BlockCache) {
-    Pair.second->LatticeElements.erase(V);
-    Pair.second->OverDefined.erase(V);
-    if (Pair.second->NonNullPointers)
-      Pair.second->NonNullPointers->erase(V);
-  }
+void LazyValueInfoCache::forgetValue(Value *V) {
+    for (auto &Pair : BlockCache) {
+      Pair.second->LatticeElements.erase(V);
+      Pair.second->OverDefined.erase(V);
+      if (Pair.second->NonNullPointers)
+        Pair.second->NonNullPointers->erase(V);
+    }
+}
 
-  auto HandleIt = ValueHandles.find_as(V);
-  if (HandleIt != ValueHandles.end())
-    ValueHandles.erase(HandleIt);
+void LazyValueInfoCache::eraseValue(Value *V) {
+    forgetValue(V);
+    auto HandleIt = ValueHandles.find_as(V);
+    if (HandleIt != ValueHandles.end())
+      ValueHandles.erase(HandleIt);
 }
 
 void LVIValueHandle::deleted() {
@@ -465,6 +471,10 @@ class LazyValueInfoImpl {
     F.print(OS, &Writer);
   }
 
+  /// This is part of the update interface to remove information related to this
+  /// value from the cache.
+  void forgetValue(Value *V) { TheCache.forgetValue(V); }
+
   /// This is part of the update interface to inform the cache
   /// that a block has been deleted.
   void eraseBlock(BasicBlock *BB) {
@@ -1969,6 +1979,11 @@ void LazyValueInfo::threadEdge(BasicBlock *PredBB, BasicBlock *OldSucc,
   }
 }
 
+void LazyValueInfo::forgetValue(Value *V) {
+  if (PImpl)
+    getImpl(PImpl, AC, nullptr).forgetValue(V);
+}
+
 void LazyValueInfo::eraseBlock(BasicBlock *BB) {
   if (PImpl) {
     getImpl(PImpl, AC, BB->getModule()).eraseBlock(BB);
diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
index 180e6b4c823880..83d56b56fc801b 100644
--- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp
+++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
@@ -1269,6 +1269,7 @@ bool JumpThreadingPass::simplifyPartiallyRedundantLoad(LoadInst *LoadI) {
     if (IsLoadCSE) {
       LoadInst *NLoadI = cast<LoadInst>(AvailableVal);
       combineMetadataForCSE(NLoadI, LoadI, false);
+      LVI->forgetValue(NLoadI);
     };
 
     // If the returned value is the load itself, replace with poison. This can
@@ -1461,6 +1462,7 @@ bool JumpThreadingPass::simplifyPartiallyRedundantLoad(LoadInst *LoadI) {
 
   for (LoadInst *PredLoadI : CSELoads) {
     combineMetadataForCSE(PredLoadI, LoadI, true);
+    LVI->forgetValue(PredLoadI);
   }
 
   LoadI->replaceAllUsesWith(PN);
diff --git a/llvm/test/Transforms/JumpThreading/invalidate-lvi.ll b/llvm/test/Transforms/JumpThreading/invalidate-lvi.ll
index 9c5cbfac62d9fb..27191d6f54c2d8 100644
--- a/llvm/test/Transforms/JumpThreading/invalidate-lvi.ll
+++ b/llvm/test/Transforms/JumpThreading/invalidate-lvi.ll
@@ -12,15 +12,21 @@ define void @foo(i1 %0) {
 ; CHECK-NEXT:    [[V:%.*]] = alloca i64, align 8
 ; CHECK-NEXT:    call void @set_value(ptr [[V]])
 ; CHECK-NEXT:    [[L1:%.*]] = load i64, ptr [[V]], align 8
-; CHECK-NEXT:    br i1 [[TMP0]], label [[BB0:%.*]], label [[BB4:%.*]]
+; CHECK-NEXT:    br i1 [[TMP0]], label [[BB0:%.*]], label [[BB2:%.*]]
 ; CHECK:       bb0:
 ; CHECK-NEXT:    [[C1:%.*]] = icmp eq i64 [[L1]], 0
-; CHECK-NEXT:    br i1 [[C1]], label [[BB1:%.*]], label [[BB4]]
-; CHECK:       bb1:
+; CHECK-NEXT:    br i1 [[C1]], label [[BB2_THREAD:%.*]], label [[BB2]]
+; CHECK:       bb2.thread:
 ; CHECK-NEXT:    store i64 0, ptr [[V]], align 8
-; CHECK-NEXT:    br label [[BB4]]
+; CHECK-NEXT:    br label [[BB4:%.*]]
+; CHECK:       bb2:
+; CHECK-NEXT:    [[L2:%.*]] = phi i64 [ [[L1]], [[BB0]] ], [ [[L1]], [[START:%.*]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i64 [[L2]], 2
+; CHECK-NEXT:    br i1 [[TMP1]], label [[BB3:%.*]], label [[BB4]]
+; CHECK:       bb3:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    ret void
 ; CHECK:       bb4:
-; CHECK-NEXT:    [[L2:%.*]] = phi i64 [ 0, [[BB1]] ], [ [[L1]], [[BB0]] ], [ [[L1]], [[START:%.*]] ]
 ; CHECK-NEXT:    ret void
 ;
 start:



More information about the llvm-commits mailing list