Index: llvm/trunk/lib/Transforms/IPO/WholeProgramDevirt.cpp =================================================================== --- llvm/trunk/lib/Transforms/IPO/WholeProgramDevirt.cpp +++ llvm/trunk/lib/Transforms/IPO/WholeProgramDevirt.cpp @@ -1325,15 +1325,14 @@ bool DevirtModule::areRemarksEnabled() { const auto &FL = M.getFunctionList(); - if (FL.empty()) - return false; - const Function &Fn = FL.front(); - - const auto &BBL = Fn.getBasicBlockList(); - if (BBL.empty()) - return false; - auto DI = OptimizationRemark(DEBUG_TYPE, "", DebugLoc(), &BBL.front()); - return DI.isEnabled(); + for (const Function &Fn : FL) { + const auto &BBL = Fn.getBasicBlockList(); + if (BBL.empty()) + continue; + auto DI = OptimizationRemark(DEBUG_TYPE, "", DebugLoc(), &BBL.front()); + return DI.isEnabled(); + } + return false; } void DevirtModule::scanTypeTestUsers(Function *TypeTestFunc, Index: llvm/trunk/test/ThinLTO/X86/cfi-devirt.ll =================================================================== --- llvm/trunk/test/ThinLTO/X86/cfi-devirt.ll +++ llvm/trunk/test/ThinLTO/X86/cfi-devirt.ll @@ -11,6 +11,7 @@ ; RUN: -r=%t.o,_ZN1A1nEi,p \ ; RUN: -r=%t.o,_ZN1B1fEi,p \ ; RUN: -r=%t.o,_ZN1C1fEi,p \ +; RUN: -r=%t.o,empty,p \ ; RUN: -r=%t.o,_ZTV1B, \ ; RUN: -r=%t.o,_ZTV1C, \ ; RUN: -r=%t.o,_ZN1A1nEi, \ @@ -27,6 +28,7 @@ ; RUN: -r=%t.o,_ZN1A1nEi,p \ ; RUN: -r=%t.o,_ZN1B1fEi,p \ ; RUN: -r=%t.o,_ZN1C1fEi,p \ +; RUN: -r=%t.o,empty,p \ ; RUN: -r=%t.o,_ZTV1B, \ ; RUN: -r=%t.o,_ZTV1C, \ ; RUN: -r=%t.o,_ZN1A1nEi, \ @@ -48,6 +50,10 @@ @_ZTV1B = constant { [4 x i8*] } { [4 x i8*] [i8* null, i8* undef, i8* bitcast (i32 (%struct.B*, i32)* @_ZN1B1fEi to i8*), i8* bitcast (i32 (%struct.A*, i32)* @_ZN1A1nEi to i8*)] }, !type !0, !type !1 @_ZTV1C = constant { [4 x i8*] } { [4 x i8*] [i8* null, i8* undef, i8* bitcast (i32 (%struct.C*, i32)* @_ZN1C1fEi to i8*), i8* bitcast (i32 (%struct.A*, i32)* @_ZN1A1nEi to i8*)] }, !type !0, !type !2 +; Put declaration first to test handling of remarks when the first +; function has no basic blocks. +declare void @empty() + ; CHECK-IR-LABEL: define i32 @test define i32 @test(%struct.A* %obj, i32 %a) { entry: