b5ee2f3466024ba6968a39b5fb7d9164b8217212
[oota-llvm.git] / test / Analysis / Profiling / load-branch-weights-ifs.ll
1 ; RUN: opt -insert-edge-profiling -o %t1 < %s
2 ; RUN: rm -f %t1.prof_data
3 ; RUN: lli -load %llvmshlibdir/libprofile_rt%shlibext %t1 \
4 ; RUN:     -llvmprof-output %t1.prof_data
5 ; RUN: opt -profile-file %t1.prof_data -profile-metadata-loader -S -o - < %s \
6 ; RUN:     | FileCheck %s
7 ; RUN: rm -f %t1.prof_data
8
9 ;; func_mod - Branch taken 6 times in 7.
10 define i32 @func_mod(i32 %N) nounwind uwtable {
11 entry:
12   %retval = alloca i32, align 4
13   %N.addr = alloca i32, align 4
14   store i32 %N, i32* %N.addr, align 4
15   %0 = load i32* %N.addr, align 4
16   %rem = srem i32 %0, 7
17   %tobool = icmp ne i32 %rem, 0
18   br i1 %tobool, label %if.then, label %if.else
19 ; CHECK: br i1 %tobool, label %if.then, label %if.else, !prof !0
20
21 if.then:
22   store i32 1, i32* %retval
23   br label %return
24
25 if.else:
26   store i32 0, i32* %retval
27   br label %return
28
29 return:
30   %1 = load i32* %retval
31   ret i32 %1
32 }
33
34 ;; func_const_true - conditional branch which 100% taken probability.
35 define i32 @func_const_true(i32 %N) nounwind uwtable {
36 entry:
37   %retval = alloca i32, align 4
38   %N.addr = alloca i32, align 4
39   store i32 %N, i32* %N.addr, align 4
40   %0 = load i32* %N.addr, align 4
41   %cmp = icmp eq i32 %0, 1
42   br i1 %cmp, label %if.then, label %if.end
43 ; CHECK: br i1 %cmp, label %if.then, label %if.end, !prof !1
44
45 if.then:
46   store i32 1, i32* %retval
47   br label %return
48
49 if.end:
50   store i32 0, i32* %retval
51   br label %return
52
53 return:
54   %1 = load i32* %retval
55   ret i32 %1
56 }
57
58 ;; func_const_true - conditional branch which 100% not-taken probability.
59 define i32 @func_const_false(i32 %N) nounwind uwtable {
60 entry:
61   %retval = alloca i32, align 4
62   %N.addr = alloca i32, align 4
63   store i32 %N, i32* %N.addr, align 4
64   %0 = load i32* %N.addr, align 4
65   %cmp = icmp eq i32 %0, 1
66   br i1 %cmp, label %if.then, label %if.end
67 ; CHECK: br i1 %cmp, label %if.then, label %if.end, !prof !2
68
69 if.then:
70   store i32 1, i32* %retval
71   br label %return
72
73 if.end:
74   store i32 0, i32* %retval
75   br label %return
76
77 return:
78   %1 = load i32* %retval
79   ret i32 %1
80 }
81
82 define i32 @main(i32 %argc, i8** %argv) nounwind uwtable {
83 entry:
84   %retval = alloca i32, align 4
85   %argc.addr = alloca i32, align 4
86   %argv.addr = alloca i8**, align 8
87   %loop = alloca i32, align 4
88   store i32 0, i32* %retval
89   store i32 0, i32* %loop, align 4
90   br label %for.cond
91
92 for.cond:
93   %0 = load i32* %loop, align 4
94   %cmp = icmp slt i32 %0, 7000
95   br i1 %cmp, label %for.body, label %for.end
96 ; CHECK: br i1 %cmp, label %for.body, label %for.end, !prof !3
97
98 for.body:
99   %1 = load i32* %loop, align 4
100   %call = call i32 @func_mod(i32 %1)
101   br label %for.inc
102
103 for.inc:
104   %2 = load i32* %loop, align 4
105   %inc = add nsw i32 %2, 1
106   store i32 %inc, i32* %loop, align 4
107   br label %for.cond
108
109 for.end:
110   %call1 = call i32 @func_const_true(i32 1)
111   %call2 = call i32 @func_const_false(i32 0)
112   ret i32 0
113 }
114
115 ; CHECK: !0 = metadata !{metadata !"branch_weights", i32 6000, i32 1000}
116 ; CHECK: !1 = metadata !{metadata !"branch_weights", i32 1, i32 0}
117 ; CHECK: !2 = metadata !{metadata !"branch_weights", i32 0, i32 1}
118 ; CHECK: !3 = metadata !{metadata !"branch_weights", i32 7000, i32 1}
119 ; CHECK-NOT: !4