[llvm] r251680 - Update the discriminator assignment algorithm
Dehao Chen via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 29 22:04:28 PDT 2015
This patch actually fixes the "FIXME" in the failing test:
// FIXME: Looks like we don't actually need both these lexical blocks (disc
2
// just refers to disc 1, nothing actually uses disc 2).
// GMLT-NOT: !DILexicalBlock
// GMLT: !DILexicalBlockFile({{.*}}, discriminator: 2)
// GMLT-NOT: !DILexicalBlock
I will update the test in clang to remove the FIXME and the reference to
disc2. And recommit the original patch.
Dehao
On Thu, Oct 29, 2015 at 9:42 PM, Dehao Chen <dehao at google.com> wrote:
>
>
> On Thu, Oct 29, 2015 at 9:13 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>>
>>
>> On Thu, Oct 29, 2015 at 7:38 PM, Dehao Chen via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>>> Author: dehao
>>> Date: Thu Oct 29 21:38:29 2015
>>> New Revision: 251680
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=251680&view=rev
>>> Log:
>>> Update the discriminator assignment algorithm
>>>
>>> * If a scope has already been assigned a discriminator, do not reassign
>>> a nested discriminator for it.
>>> * If the file and line both match, even if the column does not match, we
>>> should assign a new discriminator for the stmt.
>>>
>>
>> Why do we need a discriminator even when the column is distinct?
>>
>
> Similar to gdb, sample profile does not use column number to index
> profile. This also ensures that gcc profile can be used correctly in llvm.
>
>
>>
>>
>>>
>>> original code:
>>> ; #1 int foo(int i) {
>>> ; #2 if (i == 3 || i == 5) return 100; else return 99;
>>> ; #3 }
>>>
>>> ; i == 3: discriminator 0
>>> ; i == 5: discriminator 2
>>> ; return 100: discriminator 1
>>> ; return 99: discriminator 3
>>>
>>> Added:
>>> llvm/trunk/test/Transforms/AddDiscriminators/oneline.ll
>>> Modified:
>>> llvm/trunk/lib/Transforms/Utils/AddDiscriminators.cpp
>>>
>>> Modified: llvm/trunk/lib/Transforms/Utils/AddDiscriminators.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/AddDiscriminators.cpp?rev=251680&r1=251679&r2=251680&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Transforms/Utils/AddDiscriminators.cpp (original)
>>> +++ llvm/trunk/lib/Transforms/Utils/AddDiscriminators.cpp Thu Oct 29
>>> 21:38:29 2015
>>> @@ -180,7 +180,7 @@ bool AddDiscriminators::runOnFunction(Fu
>>> BasicBlock *Succ = Last->getSuccessor(I);
>>> Instruction *First = Succ->getFirstNonPHIOrDbgOrLifetime();
>>> const DILocation *FirstDIL = First->getDebugLoc();
>>> - if (!FirstDIL)
>>> + if (!FirstDIL || FirstDIL->getDiscriminator())
>>> continue;
>>>
>>> // If the first instruction (First) of Succ is at the same file
>>> @@ -202,21 +202,22 @@ bool AddDiscriminators::runOnFunction(Fu
>>> unsigned Discriminator = FirstDIL->computeNewDiscriminator();
>>> auto *NewScope =
>>> Builder.createLexicalBlockFile(Scope, File, Discriminator);
>>> - auto *NewDIL =
>>> - DILocation::get(Ctx, FirstDIL->getLine(),
>>> FirstDIL->getColumn(),
>>> - NewScope, FirstDIL->getInlinedAt());
>>> - DebugLoc newDebugLoc = NewDIL;
>>>
>>> // Attach this new debug location to First and every
>>> // instruction following First that shares the same location.
>>> for (BasicBlock::iterator I1(*First), E1 = Succ->end(); I1 !=
>>> E1;
>>> ++I1) {
>>> - if (I1->getDebugLoc().get() != FirstDIL)
>>> - break;
>>> - I1->setDebugLoc(newDebugLoc);
>>> - DEBUG(dbgs() << NewDIL->getFilename() << ":" <<
>>> NewDIL->getLine()
>>> - << ":" << NewDIL->getColumn() << ":"
>>> - << NewDIL->getDiscriminator() << *I1 << "\n");
>>> + const DILocation *CurrentDIL = I1->getDebugLoc();
>>> + if (CurrentDIL && CurrentDIL->getLine() ==
>>> FirstDIL->getLine() &&
>>> + CurrentDIL->getFilename() == FirstDIL->getFilename()) {
>>> + I1->setDebugLoc(DILocation::get(Ctx, CurrentDIL->getLine(),
>>> + CurrentDIL->getColumn(),
>>> NewScope,
>>> +
>>> CurrentDIL->getInlinedAt()));
>>> + DEBUG(dbgs() << CurrentDIL->getFilename() << ":"
>>> + << CurrentDIL->getLine() << ":"
>>> + << CurrentDIL->getColumn() << ":"
>>> + << CurrentDIL->getDiscriminator() << *I1 <<
>>> "\n");
>>> + }
>>> }
>>> DEBUG(dbgs() << "\n");
>>> Changed = true;
>>>
>>> Added: llvm/trunk/test/Transforms/AddDiscriminators/oneline.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/AddDiscriminators/oneline.ll?rev=251680&view=auto
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/Transforms/AddDiscriminators/oneline.ll (added)
>>> +++ llvm/trunk/test/Transforms/AddDiscriminators/oneline.ll Thu Oct 29
>>> 21:38:29 2015
>>> @@ -0,0 +1,98 @@
>>> +; RUN: opt < %s -add-discriminators -S | FileCheck %s
>>> +
>>> +; Discriminator support for code that is written in one line:
>>> +; #1 int foo(int i) {
>>> +; #2 if (i == 3 || i == 5) return 100; else return 99;
>>> +; #3 }
>>> +
>>> +; i == 3: discriminator 0
>>> +; i == 5: discriminator 2
>>> +; return 100: discriminator 1
>>> +; return 99: discriminator 3
>>> +
>>> +define i32 @_Z3fooi(i32 %i) #0 {
>>> + %1 = alloca i32, align 4
>>> + %2 = alloca i32, align 4
>>> + store i32 %i, i32* %2, align 4, !tbaa !13
>>> + call void @llvm.dbg.declare(metadata i32* %2, metadata !9, metadata
>>> !17), !dbg !18
>>> + %3 = load i32, i32* %2, align 4, !dbg !19, !tbaa !13
>>> + %4 = icmp eq i32 %3, 3, !dbg !21
>>> + br i1 %4, label %8, label %5, !dbg !22
>>> +
>>> +; <label>:5 ; preds = %0
>>> + %6 = load i32, i32* %2, align 4, !dbg !23, !tbaa !13
>>> +; CHECK: %6 = load i32, i32* %2, align 4, !dbg ![[THEN1:[0-9]+]],{{.*}}
>>> +
>>> + %7 = icmp eq i32 %6, 5, !dbg !24
>>> +; CHECK: %7 = icmp eq i32 %6, 5, !dbg ![[THEN2:[0-9]+]]
>>> +
>>> + br i1 %7, label %8, label %9, !dbg !25
>>> +; CHECK: br i1 %7, label %8, label %9, !dbg ![[THEN3:[0-9]+]]
>>> +
>>> +; <label>:8 ; preds = %5, %0
>>> + store i32 100, i32* %1, align 4, !dbg !26
>>> +; CHECK: store i32 100, i32* %1, align 4, !dbg ![[ELSE:[0-9]+]]
>>> +
>>> + br label %10, !dbg !26
>>> +; CHECK: br label %10, !dbg ![[ELSE]]
>>> +
>>> +; <label>:9 ; preds = %5
>>> + store i32 99, i32* %1, align 4, !dbg !27
>>> +; CHECK: store i32 99, i32* %1, align 4, !dbg ![[COMBINE:[0-9]+]]
>>> +
>>> + br label %10, !dbg !27
>>> +; CHECK: br label %10, !dbg ![[COMBINE]]
>>> +
>>> +; <label>:10 ; preds = %9, %8
>>> + %11 = load i32, i32* %1, align 4, !dbg !28
>>> + ret i32 %11, !dbg !28
>>> +}
>>> +
>>> +; Function Attrs: nounwind readnone
>>> +declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
>>> +
>>> +attributes #0 = { nounwind uwtable "disable-tail-calls"="false"
>>> "less-precise-fpmad"="false" "no-frame-pointer-elim"="false"
>>> "no-infs-fp-math"="false" "no-nans-fp-math"="false"
>>> "stack-protector-buffer-size"="8" "target-cpu"="x86-64"
>>> "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false"
>>> "use-soft-float"="false" }
>>> +attributes #1 = { nounwind readnone }
>>> +
>>> +!llvm.dbg.cu = !{!0}
>>> +!llvm.module.flags = !{!10, !11}
>>> +!llvm.ident = !{!12}
>>> +
>>> +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1,
>>> producer: "clang version 3.8.0 (trunk 250915)", isOptimized: true,
>>> runtimeVersion: 0, emissionKind: 1, enums: !2, subprograms: !3)
>>> +!1 = !DIFile(filename: "a.cc", directory:
>>> "/usr/local/google/home/dehao/discr")
>>> +!2 = !{}
>>> +!3 = !{!4}
>>> +!4 = distinct !DISubprogram(name: "foo", linkageName: "_Z3fooi", scope:
>>> !1, file: !1, line: 1, type: !5, isLocal: false, isDefinition: true,
>>> scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, function: i32
>>> (i32)* @_Z3fooi, variables: !8)
>>> +!5 = !DISubroutineType(types: !6)
>>> +!6 = !{!7, !7}
>>> +!7 = !DIBasicType(name: "int", size: 32, align: 32, encoding:
>>> DW_ATE_signed)
>>> +!8 = !{!9}
>>> +!9 = !DILocalVariable(name: "i", arg: 1, scope: !4, file: !1, line: 1,
>>> type: !7)
>>> +!10 = !{i32 2, !"Dwarf Version", i32 4}
>>> +!11 = !{i32 2, !"Debug Info Version", i32 3}
>>> +!12 = !{!"clang version 3.8.0 (trunk 250915)"}
>>> +!13 = !{!14, !14, i64 0}
>>> +!14 = !{!"int", !15, i64 0}
>>> +!15 = !{!"omnipotent char", !16, i64 0}
>>> +!16 = !{!"Simple C/C++ TBAA"}
>>> +!17 = !DIExpression()
>>> +!18 = !DILocation(line: 1, column: 13, scope: !4)
>>> +!19 = !DILocation(line: 2, column: 7, scope: !20)
>>> +!20 = distinct !DILexicalBlock(scope: !4, file: !1, line: 2, column: 7)
>>> +!21 = !DILocation(line: 2, column: 9, scope: !20)
>>> +!22 = !DILocation(line: 2, column: 14, scope: !20)
>>> +!23 = !DILocation(line: 2, column: 17, scope: !20)
>>> +!24 = !DILocation(line: 2, column: 19, scope: !20)
>>> +!25 = !DILocation(line: 2, column: 7, scope: !4)
>>> +!26 = !DILocation(line: 2, column: 25, scope: !20)
>>> +!27 = !DILocation(line: 2, column: 42, scope: !20)
>>> +!28 = !DILocation(line: 3, column: 1, scope: !4)
>>> +
>>> +; CHECK: ![[THEN1]] = !DILocation(line: 2, column: 17, scope:
>>> ![[THENBLOCK:[0-9]+]])
>>> +; CHECK: ![[THENBLOCK]] = !DILexicalBlockFile({{.*}} discriminator: 2)
>>> +; CHECK: ![[THEN2]] = !DILocation(line: 2, column: 19, scope:
>>> ![[THENBLOCK]])
>>> +; CHECK: ![[THEN3]] = !DILocation(line: 2, column: 7, scope:
>>> ![[THENBLOCK]])
>>> +; CHECK: ![[ELSE]] = !DILocation(line: 2, column: 25, scope:
>>> ![[ELSEBLOCK:[0-9]+]])
>>> +; CHECK: ![[ELSEBLOCK]] = !DILexicalBlockFile({{.*}} discriminator: 1)
>>> +; CHECK: ![[COMBINE]] = !DILocation(line: 2, column: 42, scope:
>>> ![[COMBINEBLOCK:[0-9]+]])
>>> +; CHECK: ![[COMBINEBLOCK]] = !DILexicalBlockFile({{.*}} discriminator:
>>> 3)
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151029/c0a61ef4/attachment.html>
More information about the llvm-commits
mailing list