From 224408d4a228ef685cc11e23a04e83b75dbd36e9 Mon Sep 17 00:00:00 2001 From: Hans Wennborg Date: Thu, 30 Aug 2018 09:34:31 +0000 Subject: Merging r340900: ------------------------------------------------------------------------ r340900 | hans | 2018-08-29 08:55:27 +0200 (Wed, 29 Aug 2018) | 6 lines LoopSink: Don't sink into blocks without an insertion point (PR38462) In the PR, LoopSink was trying to sink into a catchswitch block, which doesn't have a valid insertion point. Differential Revision: https://reviews.llvm.org/D51307 ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_70@341048 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LoopSink.cpp | 8 ++++ test/Transforms/LICM/loopsink-pr38462.ll | 65 ++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 test/Transforms/LICM/loopsink-pr38462.ll diff --git a/lib/Transforms/Scalar/LoopSink.cpp b/lib/Transforms/Scalar/LoopSink.cpp index 760177c9c5e..7d62349d471 100644 --- a/lib/Transforms/Scalar/LoopSink.cpp +++ b/lib/Transforms/Scalar/LoopSink.cpp @@ -152,6 +152,14 @@ findBBsToSinkInto(const Loop &L, const SmallPtrSetImpl &UseBBs, } } + // Can't sink into blocks that have no valid insertion point. + for (BasicBlock *BB : BBsToSinkInto) { + if (BB->getFirstInsertionPt() == BB->end()) { + BBsToSinkInto.clear(); + break; + } + } + // If the total frequency of BBsToSinkInto is larger than preheader frequency, // do not sink. if (adjustedSumFreq(BBsToSinkInto, BFI) > diff --git a/test/Transforms/LICM/loopsink-pr38462.ll b/test/Transforms/LICM/loopsink-pr38462.ll new file mode 100644 index 00000000000..146e2506b7e --- /dev/null +++ b/test/Transforms/LICM/loopsink-pr38462.ll @@ -0,0 +1,65 @@ +; RUN: opt -S -loop-sink < %s | FileCheck %s + +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-windows-msvc19.13.26128" + +%struct.FontInfoData = type { i32 (...)** } +%struct.S = type { i8 } + +; CHECK: @pr38462 +; Make sure not to assert by trying to sink into catch.dispatch. + +define void @pr38462(%struct.FontInfoData* %this) personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) !prof !1 { +entry: + %s = alloca %struct.S + %call6 = call i32 @f() + %tobool7 = icmp eq i32 %call6, 0 + br i1 %tobool7, label %for.body.lr.ph, label %for.cond.cleanup + +for.body.lr.ph: + %0 = getelementptr inbounds %struct.S, %struct.S* %s, i64 0, i32 0 + br label %for.body + +for.cond.cleanup.loopexit: + br label %for.cond.cleanup + +for.cond.cleanup: + ret void + +for.body: + %call2 = invoke i32 @f() to label %__try.cont unwind label %catch.dispatch + +catch.dispatch: + %1 = catchswitch within none [label %__except] unwind to caller + +__except: + %2 = catchpad within %1 [i8* null] + catchret from %2 to label %__except3 + +__except3: + call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull %0) + %call.i = call zeroext i1 @g(%struct.S* nonnull %s) + br i1 %call.i, label %if.then.i, label %exit + +if.then.i: + %call2.i = call i32 @f() + br label %exit + +exit: + call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull %0) + br label %__try.cont + +__try.cont: + %call = call i32 @f() + %tobool = icmp eq i32 %call, 0 + br i1 %tobool, label %for.body, label %for.cond.cleanup.loopexit +} + +declare i32 @__C_specific_handler(...) +declare i32 @f() +declare zeroext i1 @g(%struct.S*) +declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) +declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) + +!1 = !{!"function_entry_count", i64 1} + -- cgit v1.2.3