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