[llvm-commits] [llvm] r40495 - in /llvm/trunk: lib/Analysis/MemoryDependenceAnalysis.cpp test/Transforms/GVN/2007-07-25-Loop.ll

Owen Anderson resistor at mac.com
Wed Jul 25 14:26:36 PDT 2007


Author: resistor
Date: Wed Jul 25 16:26:36 2007
New Revision: 40495

URL: http://llvm.org/viewvc/llvm-project?rev=40495&view=rev
Log:
Fix a bug in non-local memdep that was causing an infinite loop on 175.vpr.

Added:
    llvm/trunk/test/Transforms/GVN/2007-07-25-Loop.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=40495&r1=40494&r2=40495&view=diff

==============================================================================
--- llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Wed Jul 25 16:26:36 2007
@@ -103,7 +103,8 @@
 
 bool MemoryDependenceAnalysis::nonLocalHelper(Instruction* query,
                                               BasicBlock* block,
-                                              DenseMap<BasicBlock*, Value*>& resp) {
+                                              DenseMap<BasicBlock*, Value*>& resp,
+                                              SmallPtrSet<BasicBlock*, 4>& visited) {
   if (resp.count(block))
     return resp[block] != None;
   
@@ -113,10 +114,15 @@
     return true;
   }
   
+  visited.insert(block);
+  
   bool inserted = false;
   for (pred_iterator PI = pred_begin(block), PE = pred_end(block);
        PI != PE; ++PI)
-    inserted |= nonLocalHelper(query, *PI, resp);
+    if (!visited.count(*PI))
+      inserted |= nonLocalHelper(query, *PI, resp, visited);
+  
+  visited.erase(block);
   
   if (!inserted)
     resp.insert(std::make_pair(block, None));
@@ -133,11 +139,14 @@
   }
   
   bool inserted = false;
+  SmallPtrSet<BasicBlock*, 4> visited;
+  visited.insert(query->getParent());
   
   BasicBlock* parent = query->getParent();
   for (pred_iterator PI = pred_begin(parent), PE = pred_end(parent);
        PI != PE; ++PI) {
-    inserted |= nonLocalHelper(query, *PI, resp);
+    if (!visited.count(*PI))
+      inserted |= nonLocalHelper(query, *PI, resp, visited);
   }
   
   if (!inserted)

Added: llvm/trunk/test/Transforms/GVN/2007-07-25-Loop.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/2007-07-25-Loop.ll?rev=40495&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/GVN/2007-07-25-Loop.ll (added)
+++ llvm/trunk/test/Transforms/GVN/2007-07-25-Loop.ll Wed Jul 25 16:26:36 2007
@@ -0,0 +1,15 @@
+; RUN: llvm-as < %s | opt -gvn | llvm-dis
+
+	%struct.s_segment_inf = type { float, i32, i16, i16, float, float, i32, float, float }
+
+define void @print_arch(i8* %arch_file, i32 %route_type, i64 %det_routing_arch.0.0, i64 %det_routing_arch.0.1, i64 %det_routing_arch.0.2, i64 %det_routing_arch.0.3, i64 %det_routing_arch.0.4, %struct.s_segment_inf* %segment_inf, i64 %timing_inf.0.0, i64 %timing_inf.0.1, i64 %timing_inf.0.2, i64 %timing_inf.0.3, i64 %timing_inf.0.4, i32 %timing_inf.1) {
+entry:
+	br i1 false, label %bb278, label %bb344
+
+bb278:		; preds = %bb278, %entry
+	br i1 false, label %bb278, label %bb344
+
+bb344:		; preds = %bb278, %entry
+	%tmp38758 = load i16* null, align 2		; <i16> [#uses=0]
+	ret void
+}





More information about the llvm-commits mailing list