Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP1:Update
llvm.7809
backport-llvm-r197909
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File backport-llvm-r197909 of Package llvm.7809
------------------------------------------------------------------------ r197909 | rsandifo | 2013-12-23 15:51:56 +0100 (Mon, 23 Dec 2013) | 8 lines 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. ------------------------------------------------------------------------ Index: lib/Transforms/Scalar/Scalarizer.cpp =================================================================== --- lib/Transforms/Scalar/Scalarizer.cpp.orig +++ 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<PHINode>(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)); Index: test/Transforms/Scalarizer/basic.ll =================================================================== --- test/Transforms/Scalarizer/basic.ll.orig +++ test/Transforms/Scalarizer/basic.ll @@ -414,6 +414,35 @@ define void @f13(<4 x float *> *%dest, < 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 }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor