[llvm] r251420 - Fix SamplePGO segfault when debug info is missing.

Diego Novillo via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 27 10:37:02 PDT 2015


Author: dnovillo
Date: Tue Oct 27 12:37:00 2015
New Revision: 251420

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

Added:
    llvm/trunk/test/Transforms/SampleProfile/Inputs/nolocinfo.prof
    llvm/trunk/test/Transforms/SampleProfile/nolocinfo.ll
Modified:
    llvm/trunk/lib/Transforms/IPO/SampleProfile.cpp

Modified: llvm/trunk/lib/Transforms/IPO/SampleProfile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/SampleProfile.cpp?rev=251420&r1=251419&r2=251420&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/IPO/SampleProfile.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/SampleProfile.cpp Tue Oct 27 12:37:00 2015
@@ -780,8 +780,10 @@ void SampleProfileLoader::propagateWeigh
       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("<UNKNOWN LOCATION>")));
     } else {
       DEBUG(dbgs() << "SKIPPED. All branch weights are zero.\n");
     }

Added: llvm/trunk/test/Transforms/SampleProfile/Inputs/nolocinfo.prof
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SampleProfile/Inputs/nolocinfo.prof?rev=251420&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/SampleProfile/Inputs/nolocinfo.prof (added)
+++ llvm/trunk/test/Transforms/SampleProfile/Inputs/nolocinfo.prof Tue Oct 27 12:37:00 2015
@@ -0,0 +1,3 @@
+foo:30000:100
+ 2: 28000
+ 3: 1000

Added: llvm/trunk/test/Transforms/SampleProfile/nolocinfo.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SampleProfile/nolocinfo.ll?rev=251420&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/SampleProfile/nolocinfo.ll (added)
+++ llvm/trunk/test/Transforms/SampleProfile/nolocinfo.ll Tue Oct 27 12:37:00 2015
@@ -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 <UNKNOWN LOCATION>
+  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)




More information about the llvm-commits mailing list