[llvm] 6b8b43e - [CaptureTracking] Do not check domination

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Sun May 16 01:50:47 PDT 2021


Author: Nikita Popov
Date: 2021-05-16T10:49:36+02:00
New Revision: 6b8b43e7af3074124e3c9e429e1fb08165799be4

URL: https://github.com/llvm/llvm-project/commit/6b8b43e7af3074124e3c9e429e1fb08165799be4
DIFF: https://github.com/llvm/llvm-project/commit/6b8b43e7af3074124e3c9e429e1fb08165799be4.diff

LOG: [CaptureTracking] Do not check domination

For the CapturesBefore tracker, it is sufficient to check that
I can not reach BeforeHere. This does not necessarily require
that BeforeHere dominates I, it can also occur if the capture
happens on an entirely disjoint path.

This change was previously accepted in D90688, but had to be
reverted due to large compile-time impact in some cases: It
increases the number of reachability queries that are performed.

After recent changes, the compile-time impact is largely mitigated,
so I'm reapplying this patch. The remaining compile-time impact
is largely proportional to changes in code-size.

Added: 
    

Modified: 
    llvm/lib/Analysis/CaptureTracking.cpp
    llvm/test/Transforms/MemCpyOpt/callslot.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/CaptureTracking.cpp b/llvm/lib/Analysis/CaptureTracking.cpp
index e14f6f25dc18..25815fc57463 100644
--- a/llvm/lib/Analysis/CaptureTracking.cpp
+++ b/llvm/lib/Analysis/CaptureTracking.cpp
@@ -143,14 +143,8 @@ namespace {
         return !isPotentiallyReachableFromMany(Worklist, BB, nullptr, DT);
       }
 
-      // If the value is defined in the same basic block as use and BeforeHere,
-      // there is no need to explore the use if BeforeHere dominates use.
       // Check whether there is a path from I to BeforeHere.
-      if (DT->dominates(BeforeHere, I) &&
-          !isPotentiallyReachable(I, BeforeHere, nullptr, DT))
-        return true;
-
-      return false;
+      return !isPotentiallyReachable(I, BeforeHere, nullptr, DT);
     }
 
     bool captured(const Use *U) override {

diff  --git a/llvm/test/Transforms/MemCpyOpt/callslot.ll b/llvm/test/Transforms/MemCpyOpt/callslot.ll
index 037a95ec5176..b9eab2ef8778 100644
--- a/llvm/test/Transforms/MemCpyOpt/callslot.ll
+++ b/llvm/test/Transforms/MemCpyOpt/callslot.ll
@@ -252,8 +252,8 @@ define void @capture_nopath_call(i1 %cond) {
 ; CHECK-NEXT:    call void @accept_ptr(i8* [[DEST_I8]])
 ; CHECK-NEXT:    ret void
 ; CHECK:       nocaptures:
-; CHECK-NEXT:    call void @accept_ptr(i8* [[SRC_I8]]) #[[ATTR3]]
-; CHECK-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[DEST_I8]], i8* [[SRC_I8]], i64 16, i1 false)
+; CHECK-NEXT:    [[DEST1:%.*]] = bitcast [16 x i8]* [[DEST]] to i8*
+; CHECK-NEXT:    call void @accept_ptr(i8* [[DEST1]]) #[[ATTR3]]
 ; CHECK-NEXT:    ret void
 ;
   %dest = alloca [16 x i8]


        


More information about the llvm-commits mailing list