Index: lib/Transforms/Instrumentation/SanitizerCoverage.cpp =================================================================== --- lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -384,6 +384,11 @@ if (Options.NoPrune || &F.getEntryBlock() == BB) return true; + // Do not instrument blocks with no successors and multiple predecessors. + if (succ_begin(BB) == succ_end(BB) + && BB->getSinglePredecessor() == nullptr) + return false; + return !isFullDominator(BB, DT); } Index: test/Instrumentation/SanitizerCoverage/coverage.ll =================================================================== --- test/Instrumentation/SanitizerCoverage/coverage.ll +++ test/Instrumentation/SanitizerCoverage/coverage.ll @@ -54,7 +54,7 @@ ; CHECK_WITH_CHECK: ret void ; CHECK_WITH_CHECK-LABEL: define internal void @sancov.module_ctor ; CHECK_WITH_CHECK-NOT: ret -; CHECK_WITH_CHECK: call void @__sanitizer_cov_module_init({{.*}}, i64 4, +; CHECK_WITH_CHECK: call void @__sanitizer_cov_module_init({{.*}}, i64 3, ; CHECK_WITH_CHECK: ret ; CHECK2-LABEL: define void @foo @@ -68,7 +68,7 @@ ; CHECK2-LABEL: define internal void @sancov.module_ctor ; CHECK2-NOT: ret -; CHECK2: call void @__sanitizer_cov_module_init({{.*}}, i64 4, +; CHECK2: call void @__sanitizer_cov_module_init({{.*}}, i64 3, ; CHECK2: ret ; CHECK3-LABEL: define void @foo @@ -76,7 +76,6 @@ ; CHECK3: call void @__sanitizer_cov ; CHECK3-NOT: ret void ; CHECK3: call void @__sanitizer_cov -; CHECK3: call void @__sanitizer_cov ; CHECK3-NOT: call void @__sanitizer_cov ; CHECK3: ret void @@ -112,6 +111,5 @@ ; CHECKPRUNE: call void @__sanitizer_cov ; CHECKPRUNE: call void @__sanitizer_cov ; CHECKPRUNE: call void @__sanitizer_cov -; CHECKPRUNE: call void @__sanitizer_cov ; CHECKPRUNE-NOT: call void @__sanitizer_cov ; CHECKPRUNE: ret void Index: test/Instrumentation/SanitizerCoverage/tracing.ll =================================================================== --- test/Instrumentation/SanitizerCoverage/tracing.ll +++ test/Instrumentation/SanitizerCoverage/tracing.ll @@ -22,7 +22,6 @@ ; CHECK_PC: call void @__sanitizer_cov_trace_pc ; CHECK_PC: call void @__sanitizer_cov_trace_pc ; CHECK_PC: call void @__sanitizer_cov_trace_pc -; CHECK_PC: call void @__sanitizer_cov_trace_pc ; CHECK_PC-NOT: call void @__sanitizer_cov_trace_pc ; CHECK_PC: ret void ; CHECK_PC-NOT: call void @__sanitizer_cov_module_init @@ -31,7 +30,6 @@ ; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard ; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard ; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard -; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard ; CHECK_PC_GUARD-NOT: call void @__sanitizer_cov_trace_pc ; CHECK_PC_GUARD: ret void ; CHECK_PC_GUARD: call void @__sanitizer_cov_trace_pc_guard_init(i32* bitcast (i32** @__start___sancov_guards to i32*), i32* bitcast (i32** @__stop___sancov_guards to i32*)) @@ -40,7 +38,6 @@ ; CHECK_PC_GUARD_DARWIN: call void @__sanitizer_cov_trace_pc_guard ; CHECK_PC_GUARD_DARWIN: call void @__sanitizer_cov_trace_pc_guard ; CHECK_PC_GUARD_DARWIN: call void @__sanitizer_cov_trace_pc_guard -; CHECK_PC_GUARD_DARWIN: call void @__sanitizer_cov_trace_pc_guard ; CHECK_PC_GUARD_DARWIN-NOT: call void @__sanitizer_cov_trace_pc ; CHECK_PC_GUARD_DARWIN: ret void ; CHECK_PC_GUARD_DARWIN: call void @__sanitizer_cov_trace_pc_guard_init(i32* bitcast (i32** @"\01section$start$__DATA$__sancov_guards" to i32*), i32* bitcast (i32** @"\01section$end$__DATA$__sancov_guards" to i32*))