From 5d79bb8770a5a655af0dccc87b952c3ea9bad45e Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Fri, 1 Mar 2013 19:07:31 +0000 Subject: LoopVectorize: Don't hang forever if a PHI only has skipped PHI uses. Fixes PR15384. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@176366 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Vectorize/LoopVectorize.cpp | 9 ++++++++- test/Transforms/LoopVectorize/phi-hang.ll | 29 +++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 test/Transforms/LoopVectorize/phi-hang.ll diff --git a/lib/Transforms/Vectorize/LoopVectorize.cpp b/lib/Transforms/Vectorize/LoopVectorize.cpp index a696a2f..ef9c7c9 100644 --- a/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -2724,6 +2724,9 @@ bool LoopVectorizationLegality::AddReductionVar(PHINode *Phi, // Is this a bin op ? FoundBinOp |= !isa(Iter); + // Remember the current instruction. + Instruction *OldIter = Iter; + // For each of the *users* of iter. for (Value::use_iterator it = Iter->use_begin(), e = Iter->use_end(); it != e; ++it) { @@ -2749,7 +2752,7 @@ bool LoopVectorizationLegality::AddReductionVar(PHINode *Phi, if (isa(Iter) && isa(U) && U->getParent() != TheLoop->getHeader() && TheLoop->contains(U) && - Iter->getNumUses() > 1) + Iter->hasNUsesOrMore(2)) continue; // We can't have multiple inside users. @@ -2769,6 +2772,10 @@ bool LoopVectorizationLegality::AddReductionVar(PHINode *Phi, Iter = U; } + // If all uses were skipped this can't be a reduction variable. + if (Iter == OldIter) + return false; + // We found a reduction var if we have reached the original // phi node and we only have a single instruction with out-of-loop // users. diff --git a/test/Transforms/LoopVectorize/phi-hang.ll b/test/Transforms/LoopVectorize/phi-hang.ll new file mode 100644 index 0000000..b80d459 --- /dev/null +++ b/test/Transforms/LoopVectorize/phi-hang.ll @@ -0,0 +1,29 @@ +; RUN: opt -S -loop-vectorize < %s + +; PR15384 +define void @test1(i32 %arg) { +bb: + br label %bb1 + +bb1: ; preds = %bb5, %bb + %tmp = phi i32 [ 1, %bb ], [ %tmp7, %bb5 ] + %tmp2 = phi i32 [ %arg, %bb ], [ %tmp9, %bb5 ] + br i1 true, label %bb5, label %bb3 + +bb3: ; preds = %bb1 + br label %bb4 + +bb4: ; preds = %bb3 + br label %bb5 + +bb5: ; preds = %bb4, %bb1 + %tmp6 = phi i32 [ 0, %bb4 ], [ %tmp, %bb1 ] + %tmp7 = phi i32 [ 0, %bb4 ], [ %tmp6, %bb1 ] + %tmp8 = phi i32 [ 0, %bb4 ], [ %tmp, %bb1 ] + %tmp9 = add nsw i32 %tmp2, 1 + %tmp10 = icmp eq i32 %tmp9, 0 + br i1 %tmp10, label %bb11, label %bb1 + +bb11: ; preds = %bb5 + ret void +} -- cgit v1.1