mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-12 22:26:14 +00:00
Transforms: Use getFirstNonPHI to set the insertion point for PHIs
We were previously using getFirstInsertionPt to insert PHI instructions when vectorizing, but getFirstInsertionPt also skips past landingpads, causing this to generate invalid IR. We can avoid this issue by using getFirstNonPHI instead. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191526 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0548a5487a
commit
d237e834a8
@ -1552,7 +1552,7 @@ InnerLoopVectorizer::createEmptyLoop(LoopVectorizationLegality *Legal) {
|
||||
|
||||
// Use this IR builder to create the loop instructions (Phi, Br, Cmp)
|
||||
// inside the loop.
|
||||
Builder.SetInsertPoint(VecBody->getFirstInsertionPt());
|
||||
Builder.SetInsertPoint(VecBody->getFirstNonPHI());
|
||||
|
||||
// Generate the induction variable.
|
||||
setDebugLocFromInst(Builder, getDebugLocFromInstOrOperands(OldInduction));
|
||||
|
@ -1201,7 +1201,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
|
||||
switch (Opcode) {
|
||||
case Instruction::PHI: {
|
||||
PHINode *PH = dyn_cast<PHINode>(VL0);
|
||||
Builder.SetInsertPoint(PH->getParent()->getFirstInsertionPt());
|
||||
Builder.SetInsertPoint(PH->getParent()->getFirstNonPHI());
|
||||
Builder.SetCurrentDebugLocation(PH->getDebugLoc());
|
||||
PHINode *NewPhi = Builder.CreatePHI(VecTy, PH->getNumIncomingValues());
|
||||
E->VectorizedValue = NewPhi;
|
||||
|
31
test/Transforms/SLPVectorizer/X86/phi_landingpad.ll
Normal file
31
test/Transforms/SLPVectorizer/X86/phi_landingpad.ll
Normal file
@ -0,0 +1,31 @@
|
||||
; RUN: opt < %s -slp-vectorizer -mtriple=x86_64-apple-macosx10.9.0 -disable-output
|
||||
|
||||
target datalayout = "f64:64:64-v64:64:64"
|
||||
|
||||
define void @test_phi_in_landingpad() {
|
||||
entry:
|
||||
invoke void @foo()
|
||||
to label %inner unwind label %lpad
|
||||
|
||||
inner:
|
||||
%x0 = fsub double undef, undef
|
||||
%y0 = fsub double undef, undef
|
||||
invoke void @foo()
|
||||
to label %done unwind label %lpad
|
||||
|
||||
lpad:
|
||||
%x1 = phi double [ undef, %entry ], [ undef, %inner ]
|
||||
%y1 = phi double [ undef, %entry ], [ undef, %inner ]
|
||||
landingpad { i8*, i32 } personality i8*
|
||||
bitcast (i32 (...)* @__gxx_personality_v0 to i8*) catch i8* null
|
||||
br label %done
|
||||
|
||||
done:
|
||||
phi double [ %x0, %inner ], [ %x1, %lpad ]
|
||||
phi double [ %y0, %inner ], [ %y1, %lpad ]
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @foo()
|
||||
|
||||
declare i32 @__gxx_personality_v0(...)
|
Loading…
Reference in New Issue
Block a user