From 5216ace86d655833fb4e3f591a2f91b1cbdcead9 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Mon, 4 Jan 2016 23:16:22 +0000 Subject: [PATCH] [LICM] Fix a small oversight introduced in r256763 r256763 had promoteLoopAccessesToScalars check for the existence of a catchswitch when the exit blocks were populated but promoteLoopAccessesToScalars may be called with a prepopulated set of exit blocks which would also need to be checked. This fixes PR26019. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256788 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LICM.cpp | 12 ++++++------ test/Transforms/LICM/funclet.ll | 4 ++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/Transforms/Scalar/LICM.cpp b/lib/Transforms/Scalar/LICM.cpp index 2d6f6cecafe..e01e23f7173 100644 --- a/lib/Transforms/Scalar/LICM.cpp +++ b/lib/Transforms/Scalar/LICM.cpp @@ -1015,15 +1015,15 @@ bool llvm::promoteLoopAccessesToScalars(AliasSet &AS, CurLoop->getUniqueExitBlocks(ExitBlocks); InsertPts.clear(); InsertPts.reserve(ExitBlocks.size()); - for (BasicBlock *ExitBlock : ExitBlocks) { - // Can't insert into a catchswitch. - if (isa(ExitBlock->getTerminator())) - return Changed; - + for (BasicBlock *ExitBlock : ExitBlocks) InsertPts.push_back(&*ExitBlock->getFirstInsertionPt()); - } } + // Can't insert into a catchswitch. + for (BasicBlock *ExitBlock : ExitBlocks) + if (isa(ExitBlock->getTerminator())) + return Changed; + // Otherwise, this is safe to promote, lets do it! DEBUG(dbgs() << "LICM: Promoting value stored to in loop: " <<*SomePtr<<'\n'); Changed = true; diff --git a/test/Transforms/LICM/funclet.ll b/test/Transforms/LICM/funclet.ll index 10001526ffc..ef4be296915 100644 --- a/test/Transforms/LICM/funclet.ll +++ b/test/Transforms/LICM/funclet.ll @@ -63,7 +63,9 @@ try.cont: ; preds = %catch, %while.cond define void @test3(i1 %a, i1 %b, i1 %c) personality i32 (...)* @__CxxFrameHandler3 { entry: %.frame = alloca i8, align 4 + %.frame2 = alloca i8, align 4 %bc = bitcast i8* %.frame to i32* + %bc2 = bitcast i8* %.frame2 to i32* br i1 %a, label %try.success.or.caught, label %forbody catch.object.Throwable: ; preds = %catch.dispatch @@ -84,6 +86,7 @@ catch.dispatch: ; preds = %else, %forbody forbody: ; preds = %forcond.backedge, %0 store i32 1, i32* %bc, align 4 + store i32 2, i32* %bc2, align 4 invoke void @may_throw() to label %postinvoke unwind label %catch.dispatch @@ -95,6 +98,7 @@ else: ; preds = %postinvoke ; CHECK-LABEL: define void @test3( ; CHECK: catchswitch within none ; CHECK: store i32 1, i32* %bc, align 4 +; CHECK: store i32 2, i32* %bc2, align 4 declare void @may_throw() -- 2.34.1