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 +} _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits