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