From 659e92bcfa578a0bf2cd1f9f50bcaa16c782a41b Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Fri, 9 Jan 2015 01:46:40 +0000 Subject: [PATCH] InstrProf: Don't emit counter increments in dead code We were previously emitting counter increments even if we didn't have an insertion point, which would result in a CallInst with no parent. This leads to a crash, as in pr22166, if we try to do GlobalDCE. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225495 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CodeGenPGO.cpp | 2 ++ test/Profile/c-unreachable-after-switch.c | 15 +++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 test/Profile/c-unreachable-after-switch.c diff --git a/lib/CodeGen/CodeGenPGO.cpp b/lib/CodeGen/CodeGenPGO.cpp index 71bd1ca351..24b035d675 100644 --- a/lib/CodeGen/CodeGenPGO.cpp +++ b/lib/CodeGen/CodeGenPGO.cpp @@ -788,6 +788,8 @@ CodeGenPGO::applyFunctionAttributes(llvm::IndexedInstrProfReader *PGOReader, void CodeGenPGO::emitCounterIncrement(CGBuilderTy &Builder, unsigned Counter) { if (!CGM.getCodeGenOpts().ProfileInstrGenerate || !RegionCounterMap) return; + if (!Builder.GetInsertPoint()) + return; auto *I8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext()); Builder.CreateCall4(CGM.getIntrinsic(llvm::Intrinsic::instrprof_increment), llvm::ConstantExpr::getBitCast(FuncNameVar, I8PtrTy), diff --git a/test/Profile/c-unreachable-after-switch.c b/test/Profile/c-unreachable-after-switch.c new file mode 100644 index 0000000000..0770437510 --- /dev/null +++ b/test/Profile/c-unreachable-after-switch.c @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -O3 -triple x86_64-apple-macosx10.10 -main-file-name c-unreachable-after-switch.c %s -o - -emit-llvm -fprofile-instr-generate | FileCheck %s + +// CHECK: @[[C:__llvm_profile_counters_foo]] = hidden global [3 x i64] zeroinitializer + +// CHECK-LABEL: @foo() +// CHECK: store {{.*}} @[[C]], i64 0, i64 0 +void foo() { + // CHECK: store {{.*}} @[[C]], i64 0, i64 2 + switch (0) { + default: + return; + } + // We shouldn't emit the unreachable counter. This used to crash in GlobalDCE. + // CHECK-NOT: store {{.*}} @[[SWC]], i64 0, i64 1} +} -- 2.40.0