Follow up to d0858bffa11, add missing REQUIRES x86
[llvm-project.git] / llvm / test / Transforms / PGOProfile / coverage.ll
blob1b7658a2ea9ed0726519d1eb50af16484445f6d7
1 ; RUN: opt < %s -passes=pgo-instr-gen -pgo-function-entry-coverage -S | FileCheck %s --implicit-check-not="instrprof.cover" --check-prefixes=CHECK,GEN,ENTRY
2 ; RUN: opt < %s -passes=pgo-instr-gen -pgo-block-coverage -S | FileCheck %s --implicit-check-not="instrprof.cover" --check-prefixes=CHECK,GEN,BLOCK
4 ; RUN: llvm-profdata merge %S/Inputs/coverage.proftext -o %t.profdata
5 ; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefixes=CHECK,USE
6 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
7 target triple = "x86_64-unknown-linux-gnu"
9 ; CHECK-LABEL: @foo()
10 ; USE-SAME: !prof ![[HOT:[0-9]+]]
11 define void @foo() {
12 ; CHECK-LABEL: entry:
13 entry:
14   ; ENTRY: call void @llvm.instrprof.cover({{.*}})
15   %c = call i1 @choice()
16   br i1 %c, label %if.then, label %if.else
17   ; USE: br i1 %c, label %if.then, label %if.else, !prof ![[WEIGHTS0:[0-9]+]]
19 ; CHECK-LABEL: if.then:
20 if.then:
21   ; BLOCK: call void @llvm.instrprof.cover({{.*}})
22   br label %if.end
24 ; CHECK-LABEL: if.else:
25 if.else:
26   ; BLOCK: call void @llvm.instrprof.cover({{.*}})
27   br label %if.end
29 ; CHECK-LABEL: if.end:
30 if.end:
31   ret void
34 ; CHECK-LABEL: @bar()
35 ; USE-SAME: !prof ![[HOT:[0-9]+]]
36 define void @bar() {
37 ; CHECK-LABEL: entry:
38 entry:
39   ; ENTRY: call void @llvm.instrprof.cover({{.*}})
40   %c = call i1 @choice()
41   br i1 %c, label %if.then, label %if.end
42   ; USE: br i1 %c, label %if.then, label %if.end, !prof ![[WEIGHTS1:[0-9]+]]
44 ; CHECK-LABEL: if.then:
45 if.then:
46   ; BLOCK: call void @llvm.instrprof.cover({{.*}})
47   br label %if.end
49 ; CHECK-LABEL: if.end:
50 if.end:
51   ; BLOCK: call void @llvm.instrprof.cover({{.*}})
52   ret void
55 ; CHECK-LABEL: @goo()
56 ; USE-SAME: !prof ![[HOT:[0-9]+]]
57 define void @goo() {
58 ; CHECK-LABEL: entry:
59 entry:
60   ; GEN: call void @llvm.instrprof.cover({{.*}})
61   ret void
64 ; CHECK-LABEL: @loop()
65 ; USE-SAME: !prof ![[HOT:[0-9]+]]
66 define void @loop() {
67 ; CHECK-LABEL: entry:
68 entry:
69   ; GEN: call void @llvm.instrprof.cover({{.*}})
70   br label %while
71 while:
72   ; BLOCK: call void @llvm.instrprof.cover({{.*}})
73   br label %while
76 ; CHECK-LABEL: @hoo(
77 ; USE-SAME: !prof ![[HOT:[0-9]+]]
78 define void @hoo(i32 %a) #0 {
79 ; CHECK-LABEL: entry:
80 entry:
81   ; ENTRY: call void @llvm.instrprof.cover({{.*}})
82   %a.addr = alloca i32, align 4
83   %i = alloca i32, align 4
84   store i32 %a, i32* %a.addr, align 4
85   %0 = load i32, i32* %a.addr, align 4
86   %rem = srem i32 %0, 2
87   %cmp = icmp eq i32 %rem, 0
88   br i1 %cmp, label %if.then, label %if.else
89   ; USE: br i1 %cmp, label %if.then, label %if.else, !prof ![[WEIGHTS1]]
91 ; CHECK-LABEL: if.then:
92 if.then:                                          ; preds = %entry
93   ; BLOCK: call void @llvm.instrprof.cover({{.*}})
94   br label %if.end
96 ; CHECK-LABEL: if.else:
97 if.else:                                          ; preds = %entry
98   ; BLOCK: call void @llvm.instrprof.cover({{.*}})
99   br label %if.end
101 ; CHECK-LABEL: if.end:
102 if.end:                                           ; preds = %if.else, %if.then
103   store i32 1, i32* %i, align 4
104   br label %for.cond
106 ; CHECK-LABEL: for.cond:
107 for.cond:                                         ; preds = %for.inc, %if.end
108   %1 = load i32, i32* %i, align 4
109   %2 = load i32, i32* %a.addr, align 4
110   %cmp1 = icmp slt i32 %1, %2
111   br i1 %cmp1, label %for.body, label %for.end
112   ; USE: br i1 %cmp1, label %for.body, label %for.end, !prof ![[WEIGHTS1]]
114 ; CHECK-LABEL: for.body:
115 for.body:                                         ; preds = %for.cond
116   %3 = load i32, i32* %a.addr, align 4
117   %rem2 = srem i32 %3, 3
118   %cmp3 = icmp eq i32 %rem2, 0
119   br i1 %cmp3, label %if.then4, label %if.else5
120   ; USE: br i1 %cmp3, label %if.then4, label %if.else5, !prof ![[WEIGHTS0]]
122 ; CHECK-LABEL: if.then4:
123 if.then4:                                         ; preds = %for.body
124   ; BLOCK: call void @llvm.instrprof.cover({{.*}})
125   br label %if.end10
127 ; CHECK-LABEL: if.else5:
128 if.else5:                                         ; preds = %for.body
129   %4 = load i32, i32* %a.addr, align 4
130   %rem6 = srem i32 %4, 1001
131   %cmp7 = icmp eq i32 %rem6, 0
132   br i1 %cmp7, label %if.then8, label %if.end9
133   ; USE: br i1 %cmp7, label %if.then8, label %if.end9, !prof ![[WEIGHTS1]]
135 ; CHECK-LABEL: if.then8:
136 if.then8:                                         ; preds = %if.else5
137   ; BLOCK: call void @llvm.instrprof.cover({{.*}})
138   br label %return
140 ; CHECK-LABEL: if.end9:
141 if.end9:                                          ; preds = %if.else5
142   ; BLOCK: call void @llvm.instrprof.cover({{.*}})
143   br label %if.end10
145 ; CHECK-LABEL: if.end10:
146 if.end10:                                         ; preds = %if.end9, %if.then4
147   br label %for.inc
149 ; CHECK-LABEL: for.inc:
150 for.inc:                                          ; preds = %if.end10
151   %5 = load i32, i32* %i, align 4
152   %inc = add nsw i32 %5, 1
153   store i32 %inc, i32* %i, align 4
154   br label %for.cond
156 ; CHECK-LABEL: for.end:
157 for.end:                                          ; preds = %for.cond
158   ; BLOCK: call void @llvm.instrprof.cover({{.*}})
159   br label %return
161 ; CHECK-LABEL: return:
162 return:                                           ; preds = %for.end, %if.then8
163   ret void
166 declare i1 @choice()
168 ; GEN: declare void @llvm.instrprof.cover({{.*}})
170 ; USE-DAG: ![[HOT]] = !{!"function_entry_count", i64 10000}
171 ; USE-DAG: ![[WEIGHTS0]] = !{!"branch_weights", i32 1, i32 1}
172 ; USE-DAG: ![[WEIGHTS1]] = !{!"branch_weights", i32 1, i32 0}