From: Richard Sandiford Date: Mon, 23 Dec 2013 14:51:56 +0000 (+0000) Subject: Fix Scalarizer insertion point when replacing PHIs with insertelements X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=166acc94892f78cdd78a28b30b218ad73cb785fb;p=oota-llvm.git Fix Scalarizer insertion point when replacing PHIs with insertelements If the Scalarizer scalarized a vector PHI but could not scalarize all uses of it, it would insert a series of insertelements to reconstruct the vector PHI value from the scalar ones. The problem was that it would emit these insertelements immediately after the PHI, even if there were other PHIs after it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197909 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/Scalarizer.cpp b/lib/Transforms/Scalar/Scalarizer.cpp index 33ccb7350d8..e614ecee53a 100644 --- a/lib/Transforms/Scalar/Scalarizer.cpp +++ b/lib/Transforms/Scalar/Scalarizer.cpp @@ -638,8 +638,11 @@ bool Scalarizer::finish() { // InsertElements. Type *Ty = Op->getType(); Value *Res = UndefValue::get(Ty); + BasicBlock *BB = Op->getParent(); unsigned Count = Ty->getVectorNumElements(); - IRBuilder<> Builder(Op->getParent(), Op); + IRBuilder<> Builder(BB, Op); + if (isa(Op)) + Builder.SetInsertPoint(BB, BB->getFirstInsertionPt()); for (unsigned I = 0; I < Count; ++I) Res = Builder.CreateInsertElement(Res, CV[I], Builder.getInt32(I), Op->getName() + ".upto" + Twine(I)); diff --git a/test/Transforms/Scalarizer/basic.ll b/test/Transforms/Scalarizer/basic.ll index 67e61057bc5..1cfc0dd2901 100644 --- a/test/Transforms/Scalarizer/basic.ll +++ b/test/Transforms/Scalarizer/basic.ll @@ -414,6 +414,35 @@ define void @f13(<4 x float *> *%dest, <4 x [4 x float] *> %ptr, <4 x i32> %i, ret void } +; Test combinations of vector and non-vector PHIs. +define <4 x float> @f14(<4 x float> %acc, i32 %count) { +; CHECK-LABEL: @f14( +; CHECK: %this_acc.i0 = phi float [ %acc.i0, %entry ], [ %next_acc.i0, %loop ] +; CHECK: %this_acc.i1 = phi float [ %acc.i1, %entry ], [ %next_acc.i1, %loop ] +; CHECK: %this_acc.i2 = phi float [ %acc.i2, %entry ], [ %next_acc.i2, %loop ] +; CHECK: %this_acc.i3 = phi float [ %acc.i3, %entry ], [ %next_acc.i3, %loop ] +; CHECK: %this_count = phi i32 [ %count, %entry ], [ %next_count, %loop ] +; CHECK: %this_acc.upto0 = insertelement <4 x float> undef, float %this_acc.i0, i32 0 +; CHECK: %this_acc.upto1 = insertelement <4 x float> %this_acc.upto0, float %this_acc.i1, i32 1 +; CHECK: %this_acc.upto2 = insertelement <4 x float> %this_acc.upto1, float %this_acc.i2, i32 2 +; CHECK: %this_acc = insertelement <4 x float> %this_acc.upto2, float %this_acc.i3, i32 3 +; CHECK: ret <4 x float> %next_acc +entry: + br label %loop + +loop: + %this_acc = phi <4 x float> [ %acc, %entry ], [ %next_acc, %loop ] + %this_count = phi i32 [ %count, %entry ], [ %next_count, %loop ] + %foo = call <4 x float> @ext(<4 x float> %this_acc) + %next_acc = fadd <4 x float> %this_acc, %foo + %next_count = sub i32 %this_count, 1 + %cmp = icmp eq i32 %next_count, 0 + br i1 %cmp, label %loop, label %exit + +exit: + ret <4 x float> %next_acc +} + !0 = metadata !{ metadata !"root" } !1 = metadata !{ metadata !"set1", metadata !0 } !2 = metadata !{ metadata !"set2", metadata !0 }