[sanitizer-coverage] don't instrument a function if it's entry block ends with 'unreachable'

llvm-svn: 332072
diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
index 4f0abc6..a19cd6d 100644
--- a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
+++ b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
@@ -480,6 +480,8 @@
   if (F.getName() == "__local_stdio_printf_options" ||
       F.getName() == "__local_stdio_scanf_options")
     return false;
+  if (isa<UnreachableInst>(F.getEntryBlock().getTerminator()))
+    return false;
   // Don't instrument functions using SEH for now. Splitting basic blocks like
   // we do for coverage breaks WinEHPrepare.
   // FIXME: Remove this when SEH no longer uses landingpad pattern matching.
diff --git a/llvm/test/Instrumentation/SanitizerCoverage/abort-in-entry-block.ll b/llvm/test/Instrumentation/SanitizerCoverage/abort-in-entry-block.ll
new file mode 100644
index 0000000..9bc8ace
--- /dev/null
+++ b/llvm/test/Instrumentation/SanitizerCoverage/abort-in-entry-block.ll
@@ -0,0 +1,17 @@
+; Checks that a function with no-return in the entry block is not instrumented.
+; RUN: opt < %s -sancov -sanitizer-coverage-level=3 -sanitizer-coverage-trace-pc-guard -S | FileCheck %s
+; CHECK-NOT: call void @__sanitizer_cov_trace_pc_guard
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define dso_local void @_Z3foov() noinline nounwind optnone uwtable {
+entry:
+  call void @abort() noreturn nounwind
+  unreachable
+
+return:                                           ; No predecessors!
+  ret void
+}
+
+declare dso_local void @abort() noreturn nounwind