diff options
| author | Dehao Chen <dehao@google.com> | 2015-10-21 01:22:27 +0000 |
|---|---|---|
| committer | Dehao Chen <dehao@google.com> | 2015-10-21 01:22:27 +0000 |
| commit | 100424124bf1f2845c8cac18e39333cf5f04b1ae (patch) | |
| tree | 92f5b929fba79726bf7d69543d9fa218ecb27963 /llvm/test/Transforms/SampleProfile | |
| parent | 4c3f2b944689bdb23e929ab27815bbc87c20c035 (diff) | |
| download | bcm5719-llvm-100424124bf1f2845c8cac18e39333cf5f04b1ae.tar.gz bcm5719-llvm-100424124bf1f2845c8cac18e39333cf5f04b1ae.zip | |
Tolerate negative offset when matching sample profile.
In some cases (as illustrated in the unittest), lineno can be less than the heade_lineno because the function body are included from some other files. In this case, offset will be negative. This patch makes clang still able to match the profile to IR in this situation.
http://reviews.llvm.org/D13914
llvm-svn: 250873
Diffstat (limited to 'llvm/test/Transforms/SampleProfile')
| -rw-r--r-- | llvm/test/Transforms/SampleProfile/Inputs/offset.prof | 4 | ||||
| -rw-r--r-- | llvm/test/Transforms/SampleProfile/offset.ll | 82 |
2 files changed, 86 insertions, 0 deletions
diff --git a/llvm/test/Transforms/SampleProfile/Inputs/offset.prof b/llvm/test/Transforms/SampleProfile/Inputs/offset.prof new file mode 100644 index 00000000000..b07ce3504fb --- /dev/null +++ b/llvm/test/Transforms/SampleProfile/Inputs/offset.prof @@ -0,0 +1,4 @@ +_Z3fooi:300:1 + 65532: 1000 + 65533: 10 + 65535: 990 diff --git a/llvm/test/Transforms/SampleProfile/offset.ll b/llvm/test/Transforms/SampleProfile/offset.ll new file mode 100644 index 00000000000..151fc0941ed --- /dev/null +++ b/llvm/test/Transforms/SampleProfile/offset.ll @@ -0,0 +1,82 @@ +; RUN: opt < %s -sample-profile -sample-profile-file=%S/Inputs/offset.prof | opt -analyze -branch-prob | FileCheck %s + +; Original C++ code for this test case: +; +; a.cc: +; #1 +; #2 +; #3 +; #4 +; #5 int foo(int a) { +; #6 #include "a.b" +; #7} +; +; a.b: +; #1 if (a > 0) { +; #2 return 10; +; #3 } else { +; #4 return 20; +; #5 } + +; Function Attrs: nounwind uwtable +define i32 @_Z3fooi(i32 %a) #0 { +entry: + %retval = alloca i32, align 4 + %a.addr = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + call void @llvm.dbg.declare(metadata i32* %a.addr, metadata !11, metadata !12), !dbg !13 + %0 = load i32, i32* %a.addr, align 4, !dbg !14 + %cmp = icmp sgt i32 %0, 0, !dbg !18 + br i1 %cmp, label %if.then, label %if.else, !dbg !19 +; CHECK: edge entry -> if.then probability is 0x0147ae14 / 0x80000000 = 1.00% +; CHECK: edge entry -> if.else probability is 0x7eb851ec / 0x80000000 = 99.00% [HOT edge] + +if.then: ; preds = %entry + store i32 10, i32* %retval, align 4, !dbg !20 + br label %return, !dbg !20 + +if.else: ; preds = %entry + store i32 20, i32* %retval, align 4, !dbg !22 + br label %return, !dbg !22 + +return: ; preds = %if.else, %if.then + %1 = load i32, i32* %retval, align 4, !dbg !24 + ret i32 %1, !dbg !24 +} + +; 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"="true" "no-frame-pointer-elim-non-leaf" "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 = !{!8, !9} +!llvm.ident = !{!10} + +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.8.0 (trunk 250750)", isOptimized: false, runtimeVersion: 0, emissionKind: 1, enums: !2, subprograms: !3) +!1 = !DIFile(filename: "a.cc", directory: "/tmp") +!2 = !{} +!3 = !{!4} +!4 = distinct !DISubprogram(name: "foo", linkageName: "_Z3fooi", scope: !1, file: !1, line: 5, type: !5, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: false, function: i32 (i32)* @_Z3fooi, 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 250750)"} +!11 = !DILocalVariable(name: "a", arg: 1, scope: !4, file: !1, line: 5, type: !7) +!12 = !DIExpression() +!13 = !DILocation(line: 5, column: 13, scope: !4) +!14 = !DILocation(line: 1, column: 5, scope: !15) +!15 = distinct !DILexicalBlock(scope: !17, file: !16, line: 1, column: 5) +!16 = !DIFile(filename: "./a.b", directory: "/tmp") +!17 = !DILexicalBlockFile(scope: !4, file: !16, discriminator: 0) +!18 = !DILocation(line: 1, column: 7, scope: !15) +!19 = !DILocation(line: 1, column: 5, scope: !17) +!20 = !DILocation(line: 2, column: 3, scope: !21) +!21 = distinct !DILexicalBlock(scope: !15, file: !16, line: 1, column: 12) +!22 = !DILocation(line: 4, column: 3, scope: !23) +!23 = distinct !DILexicalBlock(scope: !15, file: !16, line: 3, column: 8) +!24 = !DILocation(line: 7, column: 1, scope: !25) +!25 = !DILexicalBlockFile(scope: !4, file: !1, discriminator: 0) |

