1; TEST that counter updates are promoted outside the whole loop nest
2; RUN: opt < %s -pgo-instr-gen -instrprof -do-counter-promotion=true -S | FileCheck --check-prefix=PROMO  %s
3; RUN: opt < %s --passes=pgo-instr-gen,instrprof -do-counter-promotion=true -S | FileCheck --check-prefix=PROMO  %s
4
5@g = common local_unnamed_addr global i32 0, align 4
6@c = local_unnamed_addr global i32 10, align 4
7
8; Function Attrs: noinline norecurse nounwind uwtable
9define void @bar() local_unnamed_addr #0 {
10bb:
11  %tmp2 = load i32, i32* @g, align 4, !tbaa !2
12  %tmp3 = add nsw i32 %tmp2, 1
13  store i32 %tmp3, i32* @g, align 4, !tbaa !2
14  ret void
15}
16
17; Function Attrs: norecurse nounwind uwtable
18define i32 @main() local_unnamed_addr #1 {
19bb:
20  store i32 0, i32* @g, align 4, !tbaa !2
21  %tmp = load i32, i32* @c, align 4, !tbaa !2
22  %tmp1 = icmp sgt i32 %tmp, 0
23  br i1 %tmp1, label %bb2_1, label %bb84
24
25bb2_1:
26  br label %bb2
27
28bb2:                                              ; preds = %bb39, %bb
29  %tmp3 = phi i32 [ %tmp40, %bb39 ], [ %tmp, %bb2_1 ]
30  %tmp5 = phi i32 [ %tmp43, %bb39 ], [ 0, %bb2_1 ]
31  %tmp7 = icmp sgt i32 %tmp3, 0
32  br i1 %tmp7, label %bb14_1, label %bb39
33
34bb8:                                              ; preds = %bb39
35; PROMO-LABEL: bb8
36; PROMO: load {{.*}} @__profc_main{{.*}}
37; PROMO-NEXT: add
38; PROMO-NEXT: store {{.*}}@__profc_main{{.*}}
39; PROMO-NEXT: load {{.*}} @__profc_main{{.*}}
40; PROMO-NEXT: add
41; PROMO-NEXT: store {{.*}}@__profc_main{{.*}}
42; PROMO-NEXT: load {{.*}} @__profc_main{{.*}}
43; PROMO-NEXT: add
44; PROMO-NEXT: store {{.*}}@__profc_main{{.*}}
45; PROMO-NEXT: load {{.*}} @__profc_main{{.*}}
46; PROMO-NEXT: add
47; PROMO-NEXT: store {{.*}}@__profc_main{{.*}}
48; PROMO-NEXT: load {{.*}} @__profc_main{{.*}}
49; PROMO-NEXT: add
50; PROMO-NEXT: store {{.*}}@__profc_main{{.*}}
51
52  %tmp13 = icmp sgt i32 %tmp40, 0
53  br i1 %tmp13, label %bb45, label %bb84
54
55bb14_1:
56  br label %bb14
57
58bb14:                                             ; preds = %bb29, %bb2
59  %tmp15 = phi i32 [ %tmp30, %bb29 ], [ %tmp3, %bb14_1 ]
60  %tmp16 = phi i64 [ %tmp31, %bb29 ], [ 0, %bb14_1 ]
61  %tmp17 = phi i64 [ %tmp32, %bb29 ], [ 0, %bb14_1 ]
62  %tmp18 = phi i32 [ %tmp33, %bb29 ], [ 0, %bb14_1 ]
63  %tmp19 = icmp sgt i32 %tmp15, 0
64  br i1 %tmp19, label %bb20_split, label %bb29
65
66bb20_split:
67 br label %bb20
68
69bb20:                                             ; preds = %bb20, %bb14
70  %tmp21 = phi i64 [ %tmp23, %bb20 ], [ 0, %bb20_split ]
71  %tmp22 = phi i32 [ %tmp24, %bb20 ], [ 0, %bb20_split ]
72  %tmp23 = add nuw i64 %tmp21, 1
73  tail call void @bar()
74  %tmp24 = add nuw nsw i32 %tmp22, 1
75  %tmp25 = load i32, i32* @c, align 4, !tbaa !2
76  %tmp26 = icmp slt i32 %tmp24, %tmp25
77  br i1 %tmp26, label %bb20, label %bb27
78
79bb27:                                             ; preds = %bb20
80  %tmp28 = add i64 %tmp23, %tmp16
81  br label %bb29
82
83bb29:                                             ; preds = %bb27, %bb14
84  %tmp30 = phi i32 [ %tmp25, %bb27 ], [ %tmp15, %bb14 ]
85  %tmp31 = phi i64 [ %tmp28, %bb27 ], [ %tmp16, %bb14 ]
86  %tmp32 = add nuw i64 %tmp17, 1
87  %tmp33 = add nuw nsw i32 %tmp18, 1
88  %tmp34 = icmp slt i32 %tmp33, %tmp30
89  br i1 %tmp34, label %bb14, label %bb35
90
91bb35:                                             ; preds = %bb29
92  %tmp36 = insertelement <2 x i64> undef, i64 %tmp31, i32 0
93  br label %bb39
94
95bb39:                                             ; preds = %bb35, %bb2
96  %tmp40 = phi i32 [ %tmp30, %bb35 ], [ %tmp3, %bb2 ]
97  %tmp43 = add nuw nsw i32 %tmp5, 1
98  %tmp44 = icmp slt i32 %tmp43, %tmp40
99  br i1 %tmp44, label %bb2, label %bb8
100
101bb45:                                             ; preds = %bb67, %bb8
102  %tmp46 = phi i32 [ %tmp68, %bb67 ], [ %tmp40, %bb8 ]
103  %tmp47 = phi i64 [ %tmp69, %bb67 ], [ 0, %bb8 ]
104  %tmp48 = phi i64 [ %tmp70, %bb67 ], [ 0, %bb8 ]
105  %tmp49 = phi i32 [ %tmp71, %bb67 ], [ 0, %bb8 ]
106  %tmp50 = icmp sgt i32 %tmp46, 0
107  br i1 %tmp50, label %bb57, label %bb67
108
109bb51:                                             ; preds = %bb67
110  %tmp56 = icmp sgt i32 %tmp68, 0
111  br i1 %tmp56, label %bb73, label %bb84
112
113bb57:                                             ; preds = %bb57, %bb45
114  %tmp58 = phi i64 [ %tmp60, %bb57 ], [ 0, %bb45 ]
115  %tmp59 = phi i32 [ %tmp61, %bb57 ], [ 0, %bb45 ]
116  %tmp60 = add nuw i64 %tmp58, 1
117  tail call void @bar()
118  %tmp61 = add nuw nsw i32 %tmp59, 1
119  %tmp62 = load i32, i32* @c, align 4, !tbaa !2
120  %tmp63 = mul nsw i32 %tmp62, 10
121  %tmp64 = icmp slt i32 %tmp61, %tmp63
122  br i1 %tmp64, label %bb57, label %bb65
123
124bb65:                                             ; preds = %bb57
125  %tmp66 = add i64 %tmp60, %tmp47
126  br label %bb67
127
128bb67:                                             ; preds = %bb65, %bb45
129  %tmp68 = phi i32 [ %tmp62, %bb65 ], [ %tmp46, %bb45 ]
130  %tmp69 = phi i64 [ %tmp66, %bb65 ], [ %tmp47, %bb45 ]
131  %tmp70 = add nuw i64 %tmp48, 1
132  %tmp71 = add nuw nsw i32 %tmp49, 1
133  %tmp72 = icmp slt i32 %tmp71, %tmp68
134  br i1 %tmp72, label %bb45, label %bb51
135
136bb73:                                             ; preds = %bb73, %bb51
137  %tmp74 = phi i64 [ %tmp76, %bb73 ], [ 0, %bb51 ]
138  %tmp75 = phi i32 [ %tmp77, %bb73 ], [ 0, %bb51 ]
139  %tmp76 = add nuw i64 %tmp74, 1
140  tail call void @bar()
141  %tmp77 = add nuw nsw i32 %tmp75, 1
142  %tmp78 = load i32, i32* @c, align 4, !tbaa !2
143  %tmp79 = mul nsw i32 %tmp78, 100
144  %tmp80 = icmp slt i32 %tmp77, %tmp79
145  br i1 %tmp80, label %bb73, label %bb81
146
147bb81:                                             ; preds = %bb73
148  br label %bb84
149
150bb84:                                             ; preds = %bb81, %bb51, %bb8, %bb
151  ret i32 0
152}
153
154attributes #0 = { noinline }
155attributes #1 = { norecurse nounwind uwtable }
156
157!llvm.module.flags = !{!0}
158!llvm.ident = !{!1}
159
160!0 = !{i32 1, !"wchar_size", i32 4}
161!1 = !{!"clang version 5.0.0 (trunk 307355)"}
162!2 = !{!3, !3, i64 0}
163!3 = !{!"int", !4, i64 0}
164!4 = !{!"omnipotent char", !5, i64 0}
165!5 = !{!"Simple C/C++ TBAA"}
166