From d237e834a816399b7e1561dd4db2c501f5095712 Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Fri, 27 Sep 2013 15:30:25 +0000 Subject: [PATCH] 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 --- lib/Transforms/Vectorize/LoopVectorize.cpp | 2 +- lib/Transforms/Vectorize/SLPVectorizer.cpp | 2 +- .../SLPVectorizer/X86/phi_landingpad.ll | 31 +++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 test/Transforms/SLPVectorizer/X86/phi_landingpad.ll diff --git a/lib/Transforms/Vectorize/LoopVectorize.cpp b/lib/Transforms/Vectorize/LoopVectorize.cpp index e3bae02c7f9..4833aecc17b 100644 --- a/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -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)); diff --git a/lib/Transforms/Vectorize/SLPVectorizer.cpp b/lib/Transforms/Vectorize/SLPVectorizer.cpp index acb15603af4..7649fffa9ed 100644 --- a/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -1201,7 +1201,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) { switch (Opcode) { case Instruction::PHI: { PHINode *PH = dyn_cast(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; diff --git a/test/Transforms/SLPVectorizer/X86/phi_landingpad.ll b/test/Transforms/SLPVectorizer/X86/phi_landingpad.ll new file mode 100644 index 00000000000..6d2d5e3540c --- /dev/null +++ b/test/Transforms/SLPVectorizer/X86/phi_landingpad.ll @@ -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(...) -- 2.34.1