blob: 381be8714eb67457b186665653d40b63f49dbb9e [file] [log] [blame]
Diego Novillo9518b632014-01-10 23:23:51 +00001; RUN: opt < %s -sample-profile -sample-profile-file=%S/Inputs/calls.prof | opt -analyze -branch-prob | FileCheck %s
2
3; Original C++ test case
4;
5; #include <stdio.h>
6;
7; int sum(int x, int y) {
8; return x + y;
9; }
10;
11; int main() {
12; int s, i = 0;
13; while (i++ < 20000 * 20000)
14; if (i != 100) s = sum(i, s); else s = 30;
15; printf("sum is %d\n", s);
16; return 0;
17; }
18
19@.str = private unnamed_addr constant [11 x i8] c"sum is %d\0A\00", align 1
20
21; Function Attrs: nounwind uwtable
22define i32 @_Z3sumii(i32 %x, i32 %y) {
23entry:
24 %x.addr = alloca i32, align 4
25 %y.addr = alloca i32, align 4
26 store i32 %x, i32* %x.addr, align 4
27 store i32 %y, i32* %y.addr, align 4
28 %0 = load i32* %x.addr, align 4, !dbg !11
29 %1 = load i32* %y.addr, align 4, !dbg !11
30 %add = add nsw i32 %0, %1, !dbg !11
31 ret i32 %add, !dbg !11
32}
33
34; Function Attrs: uwtable
35define i32 @main() {
36entry:
37 %retval = alloca i32, align 4
38 %s = alloca i32, align 4
39 %i = alloca i32, align 4
40 store i32 0, i32* %retval
41 store i32 0, i32* %i, align 4, !dbg !12
42 br label %while.cond, !dbg !13
43
44while.cond: ; preds = %if.end, %entry
Diego Novillo92aa8c22014-03-10 22:41:28 +000045 %0 = load i32* %i, align 4, !dbg !14
46 %inc = add nsw i32 %0, 1, !dbg !14
47 store i32 %inc, i32* %i, align 4, !dbg !14
48 %cmp = icmp slt i32 %0, 400000000, !dbg !14
49 br i1 %cmp, label %while.body, label %while.end, !dbg !14
50; CHECK: edge while.cond -> while.body probability is 5391 / 5392 = 99.9815% [HOT edge]
51; CHECK: edge while.cond -> while.end probability is 1 / 5392 = 0.018546%
Diego Novillo9518b632014-01-10 23:23:51 +000052
53while.body: ; preds = %while.cond
Diego Novillo92aa8c22014-03-10 22:41:28 +000054 %1 = load i32* %i, align 4, !dbg !16
55 %cmp1 = icmp ne i32 %1, 100, !dbg !16
56 br i1 %cmp1, label %if.then, label %if.else, !dbg !16
57; Without discriminator information, the profiler used to think that
58; both branches out of while.body had the same weight. In reality,
59; the edge while.body->if.then is taken most of the time.
60;
61; CHECK: edge while.body -> if.then probability is 5752 / 5753 = 99.9826% [HOT edge]
62; CHECK: edge while.body -> if.else probability is 1 / 5753 = 0.0173822%
63
Diego Novillo9518b632014-01-10 23:23:51 +000064
65if.then: ; preds = %while.body
Diego Novillo92aa8c22014-03-10 22:41:28 +000066 %2 = load i32* %i, align 4, !dbg !18
67 %3 = load i32* %s, align 4, !dbg !18
68 %call = call i32 @_Z3sumii(i32 %2, i32 %3), !dbg !18
69 store i32 %call, i32* %s, align 4, !dbg !18
70 br label %if.end, !dbg !18
Diego Novillo9518b632014-01-10 23:23:51 +000071
72if.else: ; preds = %while.body
Diego Novillo92aa8c22014-03-10 22:41:28 +000073 store i32 30, i32* %s, align 4, !dbg !20
Diego Novillo9518b632014-01-10 23:23:51 +000074 br label %if.end
75
76if.end: ; preds = %if.else, %if.then
Diego Novillo92aa8c22014-03-10 22:41:28 +000077 br label %while.cond, !dbg !22
Diego Novillo9518b632014-01-10 23:23:51 +000078
79while.end: ; preds = %while.cond
Diego Novillo92aa8c22014-03-10 22:41:28 +000080 %4 = load i32* %s, align 4, !dbg !24
81 %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([11 x i8]* @.str, i32 0, i32 0), i32 %4), !dbg !24
82 ret i32 0, !dbg !25
Diego Novillo9518b632014-01-10 23:23:51 +000083}
84
Diego Novillo92aa8c22014-03-10 22:41:28 +000085declare i32 @printf(i8*, ...) #2
Diego Novillo9518b632014-01-10 23:23:51 +000086
87!llvm.dbg.cu = !{!0}
88!llvm.module.flags = !{!8, !9}
89!llvm.ident = !{!10}
90
91!0 = metadata !{i32 786449, metadata !1, i32 4, metadata !"clang version 3.5 ", i1 false, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2, metadata !""} ; [ DW_TAG_compile_unit ] [./calls.cc] [DW_LANG_C_plus_plus]
92!1 = metadata !{metadata !"calls.cc", metadata !"."}
Diego Novillo92aa8c22014-03-10 22:41:28 +000093!2 = metadata !{}
Diego Novillo9518b632014-01-10 23:23:51 +000094!3 = metadata !{metadata !4, metadata !7}
95!4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"sum", metadata !"sum", metadata !"", i32 3, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 (i32, i32)* @_Z3sumii, null, null, metadata !2, i32 3} ; [ DW_TAG_subprogram ] [line 3] [def] [sum]
96!5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [./calls.cc]
97!6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !2, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
98!7 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"main", metadata !"main", metadata !"", i32 7, metadata !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !2, i32 7} ; [ DW_TAG_subprogram ] [line 7] [def] [main]
99!8 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
100!9 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
101!10 = metadata !{metadata !"clang version 3.5 "}
102!11 = metadata !{i32 4, i32 0, metadata !4, null}
103!12 = metadata !{i32 8, i32 0, metadata !7, null} ; [ DW_TAG_imported_declaration ]
104!13 = metadata !{i32 9, i32 0, metadata !7, null}
Diego Novillo92aa8c22014-03-10 22:41:28 +0000105!14 = metadata !{i32 9, i32 0, metadata !15, null}
106!15 = metadata !{i32 786443, metadata !1, metadata !7, i32 9, i32 0, i32 1, i32 1} ; [ DW_TAG_lexical_block ] [./calls.cc]
107!16 = metadata !{i32 10, i32 0, metadata !17, null}
108!17 = metadata !{i32 786443, metadata !1, metadata !7, i32 10, i32 0, i32 0, i32 0} ; [ DW_TAG_lexical_block ] [./calls.cc]
109!18 = metadata !{i32 10, i32 0, metadata !19, null}
110!19 = metadata !{i32 786443, metadata !1, metadata !17, i32 10, i32 0, i32 1, i32 2} ; [ DW_TAG_lexical_block ] [./calls.cc]
111!20 = metadata !{i32 10, i32 0, metadata !21, null}
112!21 = metadata !{i32 786443, metadata !1, metadata !17, i32 10, i32 0, i32 2, i32 3} ; [ DW_TAG_lexical_block ] [./calls.cc]
113!22 = metadata !{i32 10, i32 0, metadata !23, null}
114!23 = metadata !{i32 786443, metadata !1, metadata !17, i32 10, i32 0, i32 3, i32 4} ; [ DW_TAG_lexical_block ] [./calls.cc]
115!24 = metadata !{i32 11, i32 0, metadata !7, null}
116!25 = metadata !{i32 12, i32 0, metadata !7, null}