Author: resistor Date: Wed Jul 25 17:03:06 2007 New Revision: 40497 URL: http://llvm.org/viewvc/llvm-project?rev=40497&view=rev Log: Fix an infinite loop on 300.twolf.
Added: llvm/trunk/test/Transforms/GVN/2007-07-25-InfiniteLoop.ll Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=40497&r1=40496&r2=40497&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Wed Jul 25 17:03:06 2007 @@ -651,7 +651,8 @@ SmallVector<Instruction*, 4>& toErase); bool processNonLocalLoad(LoadInst* L, SmallVector<Instruction*, 4>& toErase); Value *performPHIConstruction(BasicBlock *BB, LoadInst* orig, - DenseMap<BasicBlock*, Value*> &Phis); + DenseMap<BasicBlock*, Value*> &Phis, + SmallPtrSet<BasicBlock*, 4>& visited); void dump(DenseMap<BasicBlock*, Value*>& d); }; @@ -706,7 +707,8 @@ Value *GVN::performPHIConstruction(BasicBlock *BB, LoadInst* orig, - DenseMap<BasicBlock*, Value*> &Phis) { + DenseMap<BasicBlock*, Value*> &Phis, + SmallPtrSet<BasicBlock*, 4>& visited) { DenseMap<BasicBlock*, Value*>::iterator DI = Phis.find(BB); if (DI != Phis.end()) return DI->second; @@ -719,17 +721,25 @@ Phis.insert(std::make_pair(BB, DI->second)); return DI->second; } else { - Value* domV = performPHIConstruction(*pred_begin(BB), orig, Phis); + visited.insert(BB); + Value* domV = performPHIConstruction(*pred_begin(BB), orig, Phis, visited); + visited.erase(BB); + Phis.insert(std::make_pair(BB, domV)); return domV; } } else { PHINode *PN = new PHINode(orig->getType(), orig->getName()+".rle", BB->begin()); PN->reserveOperandSpace(numPreds); - + + visited.insert(BB); // Fill in the incoming values for the block. for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) - PN->addIncoming(performPHIConstruction(*PI, orig, Phis), *PI); + if (!visited.count(*PI)) + PN->addIncoming(performPHIConstruction(*PI, orig, Phis, visited), *PI); + else + PN->addIncoming(PN, *PI); + visited.erase(BB); bool all_same = PN->getNumIncomingValues() != 1; Value* first = PN->getIncomingValue(0); @@ -772,7 +782,8 @@ return false; } - Value* v = performPHIConstruction(L->getParent(), L, repl); + SmallPtrSet<BasicBlock*, 4> visited; + Value* v = performPHIConstruction(L->getParent(), L, repl, visited); MD.removeInstruction(L); L->replaceAllUsesWith(v); Added: llvm/trunk/test/Transforms/GVN/2007-07-25-InfiniteLoop.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GVN/2007-07-25-InfiniteLoop.ll?rev=40497&view=auto ============================================================================== --- llvm/trunk/test/Transforms/GVN/2007-07-25-InfiniteLoop.ll (added) +++ llvm/trunk/test/Transforms/GVN/2007-07-25-InfiniteLoop.ll Wed Jul 25 17:03:06 2007 @@ -0,0 +1,14 @@ +; RUN: llvm-as < %s | opt -gvn | llvm-dis + + %struct.INT2 = type { i32, i32 } [EMAIL PROTECTED] = external global %struct.INT2* ; <%struct.INT2**> [#uses=2] + +define i32 @xcompact() { +entry: + store %struct.INT2* null, %struct.INT2** @blkshifts, align 4 + br label %bb + +bb: ; preds = %bb, %entry + %tmp10 = load %struct.INT2** @blkshifts, align 4 ; <%struct.INT2*> [#uses=0] + br label %bb +} _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits