Don't move llvm.localescape outside the entry block in the GCOV profiling pass
authorSylvestre Ledru <sylvestre@debian.org>
Tue, 26 Sep 2017 11:56:43 +0000 (11:56 +0000)
committerSylvestre Ledru <sylvestre@debian.org>
Tue, 26 Sep 2017 11:56:43 +0000 (11:56 +0000)
Summary:
This fixes https://bugs.llvm.org/show_bug.cgi?id=34714.

Patch by Marco Castelluccio

Reviewers: rnk

Reviewed By: rnk

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D38224

llvm-svn: 314201

llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp

index b203353..3154c19 100644 (file)
@@ -502,6 +502,16 @@ static bool functionHasLines(Function &F) {
   return false;
 }
 
+static bool shouldKeepInEntry(BasicBlock::iterator It) {
+       if (isa<AllocaInst>(*It)) return true;
+       if (isa<DbgInfoIntrinsic>(*It)) return true;
+       if (auto *II = dyn_cast<IntrinsicInst>(It)) {
+               if (II->getIntrinsicID() == llvm::Intrinsic::localescape) return true;
+       }
+
+       return false;
+}
+
 void GCOVProfiler::emitProfileNotes() {
   NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
   if (!CU_Nodes) return;
@@ -537,7 +547,7 @@ void GCOVProfiler::emitProfileNotes() {
       // single successor, so split the entry block to make sure of that.
       BasicBlock &EntryBlock = F.getEntryBlock();
       BasicBlock::iterator It = EntryBlock.begin();
-      while (isa<AllocaInst>(*It) || isa<DbgInfoIntrinsic>(*It))
+      while (shouldKeepInEntry(It))
         ++It;
       EntryBlock.splitBasicBlock(It);