1dce9def3SHiroshi Yamauchi; RUN: opt < %s -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s 2dce9def3SHiroshi Yamauchi 3dce9def3SHiroshi Yamauchi; Function Attrs: noinline norecurse nounwind readnone uwtable 4dce9def3SHiroshi Yamauchidefine i32 @_Z11irreducibleii(i32 %iter_outer, i32 %iter_inner) local_unnamed_addr !prof !27 { 5dce9def3SHiroshi Yamauchientry: 6dce9def3SHiroshi Yamauchi %cmp24 = icmp sgt i32 %iter_outer, 0 7dce9def3SHiroshi Yamauchi br i1 %cmp24, label %for.body, label %entry.for.cond.cleanup_crit_edge, !prof !28 8dce9def3SHiroshi Yamauchi 9dce9def3SHiroshi Yamauchientry.for.cond.cleanup_crit_edge: ; preds = %entry 10dce9def3SHiroshi Yamauchi br label %for.cond.cleanup 11dce9def3SHiroshi Yamauchi 12dce9def3SHiroshi Yamauchifor.cond.cleanup: ; preds = %for.end, %entry.for.cond.cleanup_crit_edge 13dce9def3SHiroshi Yamauchi %sum.0.lcssa = phi i32 [ 0, %entry.for.cond.cleanup_crit_edge ], [ %sum.1, %for.end ] 14dce9def3SHiroshi Yamauchi ret i32 %sum.0.lcssa 15dce9def3SHiroshi Yamauchi 16dce9def3SHiroshi Yamauchifor.body: ; preds = %for.end, %entry 17dce9def3SHiroshi Yamauchi %k.026 = phi i32 [ %inc12, %for.end ], [ 0, %entry ] 18dce9def3SHiroshi Yamauchi %sum.025 = phi i32 [ %sum.1, %for.end ], [ 0, %entry ] 19dce9def3SHiroshi Yamauchi %rem23 = and i32 %k.026, 1 20dce9def3SHiroshi Yamauchi %cmp1 = icmp eq i32 %rem23, 0 21dce9def3SHiroshi Yamauchi br i1 %cmp1, label %entry8, label %for.cond2, !prof !29 22dce9def3SHiroshi Yamauchi 23dce9def3SHiroshi Yamauchifor.cond2: ; preds = %if.end9, %for.body 24dce9def3SHiroshi Yamauchi %sum.1 = phi i32 [ %add10, %if.end9 ], [ %sum.025, %for.body ] 25dce9def3SHiroshi Yamauchi %i.0 = phi i32 [ %inc, %if.end9 ], [ 0, %for.body ] 26dce9def3SHiroshi Yamauchi %cmp3 = icmp slt i32 %i.0, %iter_inner 27dce9def3SHiroshi Yamauchi br i1 %cmp3, label %for.body4, label %for.end, !prof !30, !irr_loop !31 28dce9def3SHiroshi Yamauchi 29dce9def3SHiroshi Yamauchifor.body4: ; preds = %for.cond2 30dce9def3SHiroshi Yamauchi %rem5 = srem i32 %k.026, 3 31dce9def3SHiroshi Yamauchi %cmp6 = icmp eq i32 %rem5, 0 32dce9def3SHiroshi Yamauchi br i1 %cmp6, label %entry8, label %if.end9, !prof !32 33dce9def3SHiroshi Yamauchi 34dce9def3SHiroshi Yamauchientry8: ; preds = %for.body4, %for.body 35dce9def3SHiroshi Yamauchi %sum.2 = phi i32 [ %sum.025, %for.body ], [ %sum.1, %for.body4 ] 36dce9def3SHiroshi Yamauchi %i.1 = phi i32 [ 0, %for.body ], [ %i.0, %for.body4 ] 37dce9def3SHiroshi Yamauchi %add = add nsw i32 %sum.2, 4 38dce9def3SHiroshi Yamauchi br label %if.end9, !irr_loop !33 39dce9def3SHiroshi Yamauchi 40dce9def3SHiroshi Yamauchiif.end9: ; preds = %entry8, %for.body4 41dce9def3SHiroshi Yamauchi %sum.3 = phi i32 [ %add, %entry8 ], [ %sum.1, %for.body4 ] 42dce9def3SHiroshi Yamauchi %i.2 = phi i32 [ %i.1, %entry8 ], [ %i.0, %for.body4 ] 43dce9def3SHiroshi Yamauchi %add10 = add nsw i32 %sum.3, 1 44dce9def3SHiroshi Yamauchi %inc = add nsw i32 %i.2, 1 45dce9def3SHiroshi Yamauchi br label %for.cond2, !irr_loop !34 46dce9def3SHiroshi Yamauchi 47dce9def3SHiroshi Yamauchifor.end: ; preds = %for.cond2 48dce9def3SHiroshi Yamauchi %inc12 = add nuw nsw i32 %k.026, 1 49dce9def3SHiroshi Yamauchi %exitcond = icmp eq i32 %inc12, %iter_outer 50dce9def3SHiroshi Yamauchi br i1 %exitcond, label %for.cond.cleanup, label %for.body, !prof !35 51dce9def3SHiroshi Yamauchi} 52dce9def3SHiroshi Yamauchi 53dce9def3SHiroshi Yamauchi!27 = !{!"function_entry_count", i64 1} 54dce9def3SHiroshi Yamauchi!28 = !{!"branch_weights", i32 1, i32 0} 55dce9def3SHiroshi Yamauchi!29 = !{!"branch_weights", i32 50, i32 50} 56dce9def3SHiroshi Yamauchi!30 = !{!"branch_weights", i32 950, i32 100} 57dce9def3SHiroshi Yamauchi!31 = !{!"loop_header_weight", i64 1050} 58dce9def3SHiroshi Yamauchi!32 = !{!"branch_weights", i32 323, i32 627} 59dce9def3SHiroshi Yamauchi!33 = !{!"loop_header_weight", i64 373} 60dce9def3SHiroshi Yamauchi!34 = !{!"loop_header_weight", i64 1000} 61dce9def3SHiroshi Yamauchi!35 = !{!"branch_weights", i32 1, i32 99} 62dce9def3SHiroshi Yamauchi 63dce9def3SHiroshi Yamauchi; CHECK-LABEL: Printing analysis {{.*}} for function '_Z11irreducibleii': 64dce9def3SHiroshi Yamauchi; CHECK-NEXT: block-frequency-info: _Z11irreducibleii 65dce9def3SHiroshi Yamauchi; CHECK-NEXT: - entry: {{.*}} count = 1 66dce9def3SHiroshi Yamauchi; CHECK-NEXT: - entry.for.cond.cleanup_crit_edge: {{.*}} count = 0 67dce9def3SHiroshi Yamauchi; CHECK-NEXT: - for.cond.cleanup: {{.*}} count = 1 68dce9def3SHiroshi Yamauchi; CHECK-NEXT: - for.body: {{.*}} count = 100 69dce9def3SHiroshi Yamauchi; CHECK-NEXT: - for.cond2: {{.*}} count = 1050, irr_loop_header_weight = 1050 70dce9def3SHiroshi Yamauchi; CHECK-NEXT: - for.body4: {{.*}} count = 950 71dce9def3SHiroshi Yamauchi; CHECK-NEXT: - entry8: {{.*}} count = 373, irr_loop_header_weight = 373 72dce9def3SHiroshi Yamauchi; CHECK-NEXT: - if.end9: {{.*}} count = 1000, irr_loop_header_weight = 1000 73dce9def3SHiroshi Yamauchi; CHECK-NEXT: - for.end: {{.*}} count = 100 74dce9def3SHiroshi Yamauchi 75*1aee1e1fSNikita Popov@targets = local_unnamed_addr global [256 x ptr] zeroinitializer, align 16 76dce9def3SHiroshi Yamauchi@tracing = local_unnamed_addr global i32 0, align 4 77dce9def3SHiroshi Yamauchi 78dce9def3SHiroshi Yamauchi; Function Attrs: noinline norecurse nounwind uwtable 79*1aee1e1fSNikita Popovdefine i32 @_Z11irreduciblePh(ptr nocapture readonly %p) !prof !27 { 80dce9def3SHiroshi Yamauchientry: 81*1aee1e1fSNikita Popov %0 = load i32, ptr @tracing, align 4 8269c233acSHiroshi Yamauchi %1 = trunc i32 %0 to i8 83dce9def3SHiroshi Yamauchi %tobool = icmp eq i32 %0, 0 84dce9def3SHiroshi Yamauchi br label %for.cond1 85dce9def3SHiroshi Yamauchi 86dce9def3SHiroshi Yamauchifor.cond1: ; preds = %sw.default, %entry 87dce9def3SHiroshi Yamauchi br label %dispatch_op 88dce9def3SHiroshi Yamauchi 89dce9def3SHiroshi Yamauchidispatch_op: ; preds = %sw.bb6, %for.cond1 9069c233acSHiroshi Yamauchi switch i8 %1, label %sw.default [ 91dce9def3SHiroshi Yamauchi i8 0, label %sw.bb 92dce9def3SHiroshi Yamauchi i8 1, label %dispatch_op.sw.bb6_crit_edge 93dce9def3SHiroshi Yamauchi i8 2, label %sw.bb15 94dce9def3SHiroshi Yamauchi ], !prof !36 95dce9def3SHiroshi Yamauchi 96dce9def3SHiroshi Yamauchidispatch_op.sw.bb6_crit_edge: ; preds = %dispatch_op 97dce9def3SHiroshi Yamauchi br label %sw.bb6 98dce9def3SHiroshi Yamauchi 99dce9def3SHiroshi Yamauchisw.bb: ; preds = %indirectgoto, %dispatch_op 100dce9def3SHiroshi Yamauchi br label %exit 101dce9def3SHiroshi Yamauchi 102dce9def3SHiroshi YamauchiTARGET_1: ; preds = %indirectgoto 103dce9def3SHiroshi Yamauchi br label %sw.bb6 104dce9def3SHiroshi Yamauchi 105dce9def3SHiroshi Yamauchisw.bb6: ; preds = %TARGET_1, %dispatch_op.sw.bb6_crit_edge 10669c233acSHiroshi Yamauchi br i1 %tobool, label %dispatch_op, label %if.then, !prof !37, !irr_loop !38 107dce9def3SHiroshi Yamauchi 108dce9def3SHiroshi Yamauchiif.then: ; preds = %sw.bb6 109dce9def3SHiroshi Yamauchi br label %indirectgoto 110dce9def3SHiroshi Yamauchi 111dce9def3SHiroshi YamauchiTARGET_2: ; preds = %indirectgoto 112dce9def3SHiroshi Yamauchi br label %sw.bb15 113dce9def3SHiroshi Yamauchi 114dce9def3SHiroshi Yamauchisw.bb15: ; preds = %TARGET_2, %dispatch_op 115dce9def3SHiroshi Yamauchi br i1 %tobool, label %if.then18, label %exit, !prof !39, !irr_loop !40 116dce9def3SHiroshi Yamauchi 117dce9def3SHiroshi Yamauchiif.then18: ; preds = %sw.bb15 118dce9def3SHiroshi Yamauchi br label %indirectgoto 119dce9def3SHiroshi Yamauchi 120dce9def3SHiroshi Yamauchiunknown_op: ; preds = %indirectgoto 121dce9def3SHiroshi Yamauchi br label %sw.default 122dce9def3SHiroshi Yamauchi 123dce9def3SHiroshi Yamauchisw.default: ; preds = %unknown_op, %dispatch_op 124dce9def3SHiroshi Yamauchi br label %for.cond1 125dce9def3SHiroshi Yamauchi 126dce9def3SHiroshi Yamauchiexit: ; preds = %sw.bb15, %sw.bb 12769c233acSHiroshi Yamauchi ret i32 0 128dce9def3SHiroshi Yamauchi 129dce9def3SHiroshi Yamauchiindirectgoto: ; preds = %if.then18, %if.then 13069c233acSHiroshi Yamauchi %idxprom21 = zext i32 %0 to i64 131*1aee1e1fSNikita Popov %arrayidx22 = getelementptr inbounds [256 x ptr], ptr @targets, i64 0, i64 %idxprom21 132*1aee1e1fSNikita Popov %target = load ptr, ptr %arrayidx22, align 8 133*1aee1e1fSNikita Popov indirectbr ptr %target, [label %unknown_op, label %sw.bb, label %TARGET_1, label %TARGET_2], !prof !41, !irr_loop !42 134dce9def3SHiroshi Yamauchi} 135dce9def3SHiroshi Yamauchi 136dce9def3SHiroshi Yamauchi!36 = !{!"branch_weights", i32 0, i32 0, i32 201, i32 1} 137dce9def3SHiroshi Yamauchi!37 = !{!"branch_weights", i32 201, i32 300} 138dce9def3SHiroshi Yamauchi!38 = !{!"loop_header_weight", i64 501} 139dce9def3SHiroshi Yamauchi!39 = !{!"branch_weights", i32 100, i32 0} 140dce9def3SHiroshi Yamauchi!40 = !{!"loop_header_weight", i64 100} 141dce9def3SHiroshi Yamauchi!41 = !{!"branch_weights", i32 0, i32 1, i32 300, i32 99} 142dce9def3SHiroshi Yamauchi!42 = !{!"loop_header_weight", i64 400} 143dce9def3SHiroshi Yamauchi 144dce9def3SHiroshi Yamauchi; CHECK-LABEL: Printing analysis {{.*}} for function '_Z11irreduciblePh': 145dce9def3SHiroshi Yamauchi; CHECK-NEXT: block-frequency-info: _Z11irreduciblePh 146dce9def3SHiroshi Yamauchi; CHECK-NEXT: - entry: {{.*}} count = 1 147dce9def3SHiroshi Yamauchi; CHECK-NEXT: - for.cond1: {{.*}} count = 1 148aca738b7SEaswaran Raman; CHECK-NEXT: - dispatch_op: {{.*}} count = 202 149aca738b7SEaswaran Raman; CHECK-NEXT: - dispatch_op.sw.bb6_crit_edge: {{.*}} count = 201 150aca738b7SEaswaran Raman; CHECK-NEXT: - sw.bb: {{.*}} count = 1 151aca738b7SEaswaran Raman; CHECK-NEXT: - TARGET_1: {{.*}} count = 300 152aca738b7SEaswaran Raman; CHECK-NEXT: - sw.bb6: {{.*}} count = 501, irr_loop_header_weight = 501 153aca738b7SEaswaran Raman; CHECK-NEXT: - if.then: {{.*}} count = 300 154aca738b7SEaswaran Raman; CHECK-NEXT: - TARGET_2: {{.*}} count = 99 155aca738b7SEaswaran Raman; CHECK-NEXT: - sw.bb15: {{.*}} count = 100, irr_loop_header_weight = 100 156aca738b7SEaswaran Raman; CHECK-NEXT: - if.then18: {{.*}} count = 100 157dce9def3SHiroshi Yamauchi; CHECK-NEXT: - unknown_op: {{.*}} count = 0 158dce9def3SHiroshi Yamauchi; CHECK-NEXT: - sw.default: {{.*}} count = 0 159dce9def3SHiroshi Yamauchi; CHECK-NEXT: - exit: {{.*}} count = 1 160aca738b7SEaswaran Raman; CHECK-NEXT: - indirectgoto: {{.*}} count = 400, irr_loop_header_weight = 400 161c94d4d70SHiroshi Yamauchi 162c94d4d70SHiroshi Yamauchi; Missing some irr loop annotations. 163c94d4d70SHiroshi Yamauchi; Function Attrs: noinline norecurse nounwind uwtable 164*1aee1e1fSNikita Popovdefine i32 @_Z11irreduciblePh2(ptr nocapture readonly %p) !prof !27 { 165c94d4d70SHiroshi Yamauchientry: 166*1aee1e1fSNikita Popov %0 = load i32, ptr @tracing, align 4 167c94d4d70SHiroshi Yamauchi %1 = trunc i32 %0 to i8 168c94d4d70SHiroshi Yamauchi %tobool = icmp eq i32 %0, 0 169c94d4d70SHiroshi Yamauchi br label %for.cond1 170c94d4d70SHiroshi Yamauchi 171c94d4d70SHiroshi Yamauchifor.cond1: ; preds = %sw.default, %entry 172c94d4d70SHiroshi Yamauchi br label %dispatch_op 173c94d4d70SHiroshi Yamauchi 174c94d4d70SHiroshi Yamauchidispatch_op: ; preds = %sw.bb6, %for.cond1 175c94d4d70SHiroshi Yamauchiswitch i8 %1, label %sw.default [ 176c94d4d70SHiroshi Yamauchi i8 0, label %sw.bb 177c94d4d70SHiroshi Yamauchi i8 1, label %dispatch_op.sw.bb6_crit_edge 178c94d4d70SHiroshi Yamauchi i8 2, label %sw.bb15 179c94d4d70SHiroshi Yamauchi ], !prof !36 180c94d4d70SHiroshi Yamauchi 181c94d4d70SHiroshi Yamauchidispatch_op.sw.bb6_crit_edge: ; preds = %dispatch_op 182c94d4d70SHiroshi Yamauchi br label %sw.bb6 183c94d4d70SHiroshi Yamauchi 184c94d4d70SHiroshi Yamauchisw.bb: ; preds = %indirectgoto, %dispatch_op 185c94d4d70SHiroshi Yamauchi br label %exit 186c94d4d70SHiroshi Yamauchi 187c94d4d70SHiroshi YamauchiTARGET_1: ; preds = %indirectgoto 188c94d4d70SHiroshi Yamauchi br label %sw.bb6 189c94d4d70SHiroshi Yamauchi 190c94d4d70SHiroshi Yamauchisw.bb6: ; preds = %TARGET_1, %dispatch_op.sw.bb6_crit_edge 191c94d4d70SHiroshi Yamauchi br i1 %tobool, label %dispatch_op, label %if.then, !prof !37 ; Missing !irr_loop !38 192c94d4d70SHiroshi Yamauchi 193c94d4d70SHiroshi Yamauchiif.then: ; preds = %sw.bb6 194c94d4d70SHiroshi Yamauchi br label %indirectgoto 195c94d4d70SHiroshi Yamauchi 196c94d4d70SHiroshi YamauchiTARGET_2: ; preds = %indirectgoto 197c94d4d70SHiroshi Yamauchi br label %sw.bb15 198c94d4d70SHiroshi Yamauchi 199c94d4d70SHiroshi Yamauchisw.bb15: ; preds = %TARGET_2, %dispatch_op 200c94d4d70SHiroshi Yamauchi br i1 %tobool, label %if.then18, label %exit, !prof !39, !irr_loop !40 201c94d4d70SHiroshi Yamauchi 202c94d4d70SHiroshi Yamauchiif.then18: ; preds = %sw.bb15 203c94d4d70SHiroshi Yamauchi br label %indirectgoto 204c94d4d70SHiroshi Yamauchi 205c94d4d70SHiroshi Yamauchiunknown_op: ; preds = %indirectgoto 206c94d4d70SHiroshi Yamauchi br label %sw.default 207c94d4d70SHiroshi Yamauchi 208c94d4d70SHiroshi Yamauchisw.default: ; preds = %unknown_op, %dispatch_op 209c94d4d70SHiroshi Yamauchi br label %for.cond1 210c94d4d70SHiroshi Yamauchi 211c94d4d70SHiroshi Yamauchiexit: ; preds = %sw.bb15, %sw.bb 212c94d4d70SHiroshi Yamauchi ret i32 0 213c94d4d70SHiroshi Yamauchi 214c94d4d70SHiroshi Yamauchiindirectgoto: ; preds = %if.then18, %if.then 215c94d4d70SHiroshi Yamauchi %idxprom21 = zext i32 %0 to i64 216*1aee1e1fSNikita Popov %arrayidx22 = getelementptr inbounds [256 x ptr], ptr @targets, i64 0, i64 %idxprom21 217*1aee1e1fSNikita Popov %target = load ptr, ptr %arrayidx22, align 8 218*1aee1e1fSNikita Popov indirectbr ptr %target, [label %unknown_op, label %sw.bb, label %TARGET_1, label %TARGET_2], !prof !41, !irr_loop !42 219c94d4d70SHiroshi Yamauchi} 220c94d4d70SHiroshi Yamauchi 221c94d4d70SHiroshi Yamauchi; CHECK-LABEL: Printing analysis {{.*}} for function '_Z11irreduciblePh2': 222c94d4d70SHiroshi Yamauchi; CHECK: block-frequency-info: _Z11irreduciblePh2 223c94d4d70SHiroshi Yamauchi; CHECK: - sw.bb6: {{.*}} count = 100 224c94d4d70SHiroshi Yamauchi; CHECK: - sw.bb15: {{.*}} count = 100, irr_loop_header_weight = 100 225c94d4d70SHiroshi Yamauchi; CHECK: - indirectgoto: {{.*}} count = 400, irr_loop_header_weight = 400 226