From ded77cc92373f73bc0206f515a059488451546a8 Mon Sep 17 00:00:00 2001 From: Dehao Chen Date: Tue, 22 Nov 2016 22:50:01 +0000 Subject: [PATCH] Before sample pgo annotation, do not inline a function that has no debug info. (NFC) If there is no debug info in the callee, inlining it will not help annotator. This avoids infinite loop as reported in PR/31119. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@287710 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/SampleProfile.cpp | 2 ++ .../SampleProfile/Inputs/nodebug.prof | 2 ++ test/Transforms/SampleProfile/early-inline.ll | 3 ++- test/Transforms/SampleProfile/nodebug.ll | 20 +++++++++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 test/Transforms/SampleProfile/Inputs/nodebug.prof create mode 100644 test/Transforms/SampleProfile/nodebug.ll diff --git a/lib/Transforms/IPO/SampleProfile.cpp b/lib/Transforms/IPO/SampleProfile.cpp index 6e1818b2f58..cf0e02e8ecc 100644 --- a/lib/Transforms/IPO/SampleProfile.cpp +++ b/lib/Transforms/IPO/SampleProfile.cpp @@ -651,6 +651,8 @@ bool SampleProfileLoader::inlineHotFunctions(Function &F) { InvokeInst *II = dyn_cast(I); Function *CalledFunction = (CI == nullptr ? II->getCalledFunction() : CI->getCalledFunction()); + if (!CalledFunction || !CalledFunction->getSubprogram()) + continue; DebugLoc DLoc = I->getDebugLoc(); uint64_t NumSamples = findCalleeFunctionSamples(*I)->getTotalSamples(); if ((CI && InlineFunction(CI, IFI)) || (II && InlineFunction(II, IFI))) { diff --git a/test/Transforms/SampleProfile/Inputs/nodebug.prof b/test/Transforms/SampleProfile/Inputs/nodebug.prof new file mode 100644 index 00000000000..48596035758 --- /dev/null +++ b/test/Transforms/SampleProfile/Inputs/nodebug.prof @@ -0,0 +1,2 @@ +foo:100:10 + 0: bar:10 diff --git a/test/Transforms/SampleProfile/early-inline.ll b/test/Transforms/SampleProfile/early-inline.ll index 6e55ab1eec7..780ff4751f4 100644 --- a/test/Transforms/SampleProfile/early-inline.ll +++ b/test/Transforms/SampleProfile/early-inline.ll @@ -28,7 +28,7 @@ define void @_Z3foov() #0 personality i8* bitcast (i32 (...)* @__gxx_personality } ; Function Attrs: nounwind uwtable -define internal void @_ZL3barv() #1 { +define internal void @_ZL3barv() !dbg !12 { ret void } @@ -45,3 +45,4 @@ declare i32 @__gxx_personality_v0(...) !9 = !DILocation(line: 6, column: 3, scope: !6) !10 = !DILocation(line: 8, column: 5, scope: !11) !11 = distinct !DILexicalBlock(scope: !6, file: !1, line: 7, column: 7) +!12 = distinct !DISubprogram(linkageName: "_ZL3barv", scope: !1, line: 20, scopeLine: 20, unit: !0) diff --git a/test/Transforms/SampleProfile/nodebug.ll b/test/Transforms/SampleProfile/nodebug.ll new file mode 100644 index 00000000000..d1c53c1a6f2 --- /dev/null +++ b/test/Transforms/SampleProfile/nodebug.ll @@ -0,0 +1,20 @@ +; RUN: opt < %s -sample-profile -sample-profile-file=%S/Inputs/nodebug.prof + +define void @foo() !dbg !3 { + call void @bar(), !dbg !4 + ret void +} + +define void @bar() { + call void @bar() + ret void +} + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!2} + +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1) +!1 = !DIFile(filename: "t", directory: "/tmp/") +!2 = !{i32 2, !"Debug Info Version", i32 3} +!3 = distinct !DISubprogram(name: "a", scope: !1, file: !1, line: 10, unit: !0) +!4 = !DILocation(line: 10, scope: !3) -- 2.50.1