r225495 - InstrProf: Don't emit counter increments in dead code

Justin Bogner mail at justinbogner.com
Thu Jan 8 17:46:40 PST 2015


Author: bogner
Date: Thu Jan  8 19:46:40 2015
New Revision: 225495

URL: http://llvm.org/viewvc/llvm-project?rev=225495&view=rev
Log:
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.

Added:
    cfe/trunk/test/Profile/c-unreachable-after-switch.c
Modified:
    cfe/trunk/lib/CodeGen/CodeGenPGO.cpp

Modified: cfe/trunk/lib/CodeGen/CodeGenPGO.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenPGO.cpp?rev=225495&r1=225494&r2=225495&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenPGO.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenPGO.cpp Thu Jan  8 19:46:40 2015
@@ -788,6 +788,8 @@ CodeGenPGO::applyFunctionAttributes(llvm
 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),

Added: cfe/trunk/test/Profile/c-unreachable-after-switch.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Profile/c-unreachable-after-switch.c?rev=225495&view=auto
==============================================================================
--- cfe/trunk/test/Profile/c-unreachable-after-switch.c (added)
+++ cfe/trunk/test/Profile/c-unreachable-after-switch.c Thu Jan  8 19:46:40 2015
@@ -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}
+}





More information about the cfe-commits mailing list