[llvm-commits] [llvm] r61080 - in /llvm/trunk: lib/Analysis/MemoryDependenceAnalysis.cpp test/Transforms/GVN/2008-12-15-CacheVisited.ll

Chris Lattner sabre at nondot.org
Mon Dec 15 23:10:10 PST 2008


Author: lattner
Date: Tue Dec 16 01:10:09 2008
New Revision: 61080

URL: http://llvm.org/viewvc/llvm-project?rev=61080&view=rev
Log:
fix PR3217: fully cached queries need to be verified against the 
visited set before they are used.  If used, their blocks need to be
added to the visited set so that subsequent queries don't use conflicting
pointer values in the cache result blocks.

Added:
    llvm/trunk/test/Transforms/GVN/2008-12-15-CacheVisited.ll
Modified:
    llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp

Modified: llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp?rev=61080&r1=61079&r2=61080&view=diff

==============================================================================
--- llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Tue Dec 16 01:10:09 2008
@@ -601,10 +601,30 @@
   // If we have valid cached information for exactly the block we are
   // investigating, just return it with no recomputation.
   if (CacheInfo->first == BBSkipFirstBlockPair(StartBB, SkipFirstBlock)) {
+    // We have a fully cached result for this query then we can just return the
+    // cached results and populate the visited set.  However, we have to verify
+    // that we don't already have conflicting results for these blocks.  Check
+    // to ensure that if a block in the results set is in the visited set that
+    // it was for the same pointer query.
+    if (!Visited.empty()) {
+      for (NonLocalDepInfo::iterator I = Cache->begin(), E = Cache->end();
+           I != E; ++I) {
+        DenseMap<BasicBlock*, Value*>::iterator VI = Visited.find(I->first);
+        if (VI == Visited.end() || VI->second == Pointer) continue;
+        
+        // We have a pointer mismatch in a block.  Just return clobber, saying
+        // that something was clobbered in this result.  We could also do a
+        // non-fully cached query, but there is little point in doing this.
+        return true;
+      }
+    }
+    
     for (NonLocalDepInfo::iterator I = Cache->begin(), E = Cache->end();
-         I != E; ++I)
+         I != E; ++I) {
+      Visited.insert(std::make_pair(I->first, Pointer));
       if (!I->second.isNonLocal())
         Result.push_back(*I);
+    }
     ++NumCacheCompleteNonLocalPtr;
     return false;
   }

Added: llvm/trunk/test/Transforms/GVN/2008-12-15-CacheVisited.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/2008-12-15-CacheVisited.ll?rev=61080&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/GVN/2008-12-15-CacheVisited.ll (added)
+++ llvm/trunk/test/Transforms/GVN/2008-12-15-CacheVisited.ll Tue Dec 16 01:10:09 2008
@@ -0,0 +1,28 @@
+; RUN: llvm-as < %s | opt -gvn | llvm-dis
+; Cached results must be added to and verified against the visited sets.
+; PR3217
+
+define fastcc void @gen_field_die(i32* %decl) nounwind {
+entry:
+	br i1 false, label %bb203, label %bb202
+
+bb202:		; preds = %entry
+	unreachable
+
+bb203:		; preds = %entry
+	%tmp = getelementptr i32* %decl, i32 1		; <i32*> [#uses=1]
+	%tmp1 = load i32* %tmp, align 4		; <i32> [#uses=0]
+	br i1 false, label %bb207, label %bb204
+
+bb204:		; preds = %bb203
+	%tmp2 = getelementptr i32* %decl, i32 1		; <i32*> [#uses=1]
+	br label %bb208
+
+bb207:		; preds = %bb203
+	br label %bb208
+
+bb208:		; preds = %bb207, %bb204
+	%iftmp.1374.0.in = phi i32* [ null, %bb207 ], [ %tmp2, %bb204 ]		; <i32*> [#uses=1]
+	%iftmp.1374.0 = load i32* %iftmp.1374.0.in		; <i32> [#uses=0]
+	unreachable
+}





More information about the llvm-commits mailing list