From 76c9c0f9159bf809440d1f1caf9e422e0dd24ea7 Mon Sep 17 00:00:00 2001 From: Diego Novillo Date: Tue, 27 Oct 2015 17:37:00 +0000 Subject: [PATCH] Fix SamplePGO segfault when debug info is missing. When emitting a remark for a conditional branch annotation, the remark uses the line location information of the conditional branch in the message. In some cases, that information is unavailable and the optimization would segfaul. I'm still not sure whether this is a bug or WAI, but the optimizer should not die because of this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251420 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/SampleProfile.cpp | 6 ++- .../SampleProfile/Inputs/nolocinfo.prof | 3 ++ test/Transforms/SampleProfile/nolocinfo.ll | 38 +++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 test/Transforms/SampleProfile/Inputs/nolocinfo.prof create mode 100644 test/Transforms/SampleProfile/nolocinfo.ll diff --git a/lib/Transforms/IPO/SampleProfile.cpp b/lib/Transforms/IPO/SampleProfile.cpp index 6ab73450d16..d8f8eb8b1a3 100644 --- a/lib/Transforms/IPO/SampleProfile.cpp +++ b/lib/Transforms/IPO/SampleProfile.cpp @@ -780,8 +780,10 @@ void SampleProfileLoader::propagateWeights(Function &F) { emitOptimizationRemark( Ctx, DEBUG_TYPE, F, MaxDestLoc, Twine("most popular destination for conditional branches at ") + - BranchLoc->getFilename() + ":" + Twine(BranchLoc.getLine()) + - ":" + Twine(BranchLoc.getCol())); + ((BranchLoc) ? Twine(BranchLoc->getFilename() + ":" + + Twine(BranchLoc.getLine()) + ":" + + Twine(BranchLoc.getCol())) + : Twine(""))); } else { DEBUG(dbgs() << "SKIPPED. All branch weights are zero.\n"); } diff --git a/test/Transforms/SampleProfile/Inputs/nolocinfo.prof b/test/Transforms/SampleProfile/Inputs/nolocinfo.prof new file mode 100644 index 00000000000..fc69aa8ae78 --- /dev/null +++ b/test/Transforms/SampleProfile/Inputs/nolocinfo.prof @@ -0,0 +1,3 @@ +foo:30000:100 + 2: 28000 + 3: 1000 diff --git a/test/Transforms/SampleProfile/nolocinfo.ll b/test/Transforms/SampleProfile/nolocinfo.ll new file mode 100644 index 00000000000..d700e5f289a --- /dev/null +++ b/test/Transforms/SampleProfile/nolocinfo.ll @@ -0,0 +1,38 @@ +; RUN: opt < %s -sample-profile -sample-profile-file=%S/Inputs/nolocinfo.prof -S -pass-remarks=sample-profile 2>&1 | FileCheck %s + +define i32 @foo(i32 %i) { +entry: + %i.addr = alloca i32, align 4 + %0 = load i32, i32* %i.addr, align 4 + %cmp = icmp sgt i32 %0, 1000 + +; Remarks for conditional branches need debug location information for the +; referring branch. When that is not present, the compiler should not abort. +; +; CHECK: remark: nolocinfo.c:3:5: most popular destination for conditional branches at + br i1 %cmp, label %if.then, label %if.end + +if.then: + ret i32 0, !dbg !18 + +if.end: + ret i32 1 +} + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!8, !9} +!llvm.ident = !{!10} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 3.8.0 (trunk 251335) (llvm/trunk 251344)", isOptimized: false, runtimeVersion: 0, emissionKind: 1, enums: !2, subprograms: !3) +!1 = !DIFile(filename: "nolocinfo.c", directory: ".") +!2 = !{} +!3 = !{!4} +!4 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !5, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, function: i32 (i32)* @foo, variables: !2) +!5 = !DISubroutineType(types: !6) +!6 = !{!7, !7} +!7 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed) +!8 = !{i32 2, !"Dwarf Version", i32 4} +!9 = !{i32 2, !"Debug Info Version", i32 3} +!10 = !{!"clang version 3.8.0 (trunk 251335) (llvm/trunk 251344)"} +!15 = distinct !DILexicalBlock(scope: !4, file: !1, line: 2, column: 7) +!18 = !DILocation(line: 3, column: 5, scope: !15) -- 2.34.1