1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -analyze -block-freq | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -analyze -lazy-block-freq | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %i, i32* %a) { 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Printing analysis {{.*}} for function 'test1': 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: block-frequency-info: test1 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: float = 1.0, int = [[ENTRY:[0-9]+]] 9*9880d681SAndroid Build Coastguard Workerentry: 10*9880d681SAndroid Build Coastguard Worker br label %body 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; Loop backedges are weighted and thus their bodies have a greater frequency. 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: body: float = 32.0, 14*9880d681SAndroid Build Coastguard Workerbody: 15*9880d681SAndroid Build Coastguard Worker %iv = phi i32 [ 0, %entry ], [ %next, %body ] 16*9880d681SAndroid Build Coastguard Worker %base = phi i32 [ 0, %entry ], [ %sum, %body ] 17*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i32 %iv 18*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx 19*9880d681SAndroid Build Coastguard Worker %sum = add nsw i32 %0, %base 20*9880d681SAndroid Build Coastguard Worker %next = add i32 %iv, 1 21*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %next, %i 22*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %exit, label %body 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: exit: float = 1.0, int = [[ENTRY]] 25*9880d681SAndroid Build Coastguard Workerexit: 26*9880d681SAndroid Build Coastguard Worker ret i32 %sum 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %i, i32 %a, i32 %b) { 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Printing analysis {{.*}} for function 'test2': 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: block-frequency-info: test2 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: float = 1.0, int = [[ENTRY:[0-9]+]] 33*9880d681SAndroid Build Coastguard Workerentry: 34*9880d681SAndroid Build Coastguard Worker %cond = icmp ult i32 %i, 42 35*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %then, label %else, !prof !0 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; The 'then' branch is predicted more likely via branch weight metadata. 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: then: float = 0.9411{{[0-9]*}}, 39*9880d681SAndroid Build Coastguard Workerthen: 40*9880d681SAndroid Build Coastguard Worker br label %exit 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: else: float = 0.05882{{[0-9]*}}, 43*9880d681SAndroid Build Coastguard Workerelse: 44*9880d681SAndroid Build Coastguard Worker br label %exit 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: exit: float = 1.0, int = [[ENTRY]] 47*9880d681SAndroid Build Coastguard Workerexit: 48*9880d681SAndroid Build Coastguard Worker %result = phi i32 [ %a, %then ], [ %b, %else ] 49*9880d681SAndroid Build Coastguard Worker ret i32 %result 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker!0 = !{!"branch_weights", i32 64, i32 4} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %i, i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) { 55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Printing analysis {{.*}} for function 'test3': 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: block-frequency-info: test3 57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: float = 1.0, int = [[ENTRY:[0-9]+]] 58*9880d681SAndroid Build Coastguard Workerentry: 59*9880d681SAndroid Build Coastguard Worker switch i32 %i, label %case_a [ i32 1, label %case_b 60*9880d681SAndroid Build Coastguard Worker i32 2, label %case_c 61*9880d681SAndroid Build Coastguard Worker i32 3, label %case_d 62*9880d681SAndroid Build Coastguard Worker i32 4, label %case_e ], !prof !1 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: case_a: float = 0.05, 65*9880d681SAndroid Build Coastguard Workercase_a: 66*9880d681SAndroid Build Coastguard Worker br label %exit 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: case_b: float = 0.05, 69*9880d681SAndroid Build Coastguard Workercase_b: 70*9880d681SAndroid Build Coastguard Worker br label %exit 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; The 'case_c' branch is predicted more likely via branch weight metadata. 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: case_c: float = 0.8, 74*9880d681SAndroid Build Coastguard Workercase_c: 75*9880d681SAndroid Build Coastguard Worker br label %exit 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: case_d: float = 0.05, 78*9880d681SAndroid Build Coastguard Workercase_d: 79*9880d681SAndroid Build Coastguard Worker br label %exit 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: case_e: float = 0.05, 82*9880d681SAndroid Build Coastguard Workercase_e: 83*9880d681SAndroid Build Coastguard Worker br label %exit 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: exit: float = 1.0, int = [[ENTRY]] 86*9880d681SAndroid Build Coastguard Workerexit: 87*9880d681SAndroid Build Coastguard Worker %result = phi i32 [ %a, %case_a ], 88*9880d681SAndroid Build Coastguard Worker [ %b, %case_b ], 89*9880d681SAndroid Build Coastguard Worker [ %c, %case_c ], 90*9880d681SAndroid Build Coastguard Worker [ %d, %case_d ], 91*9880d681SAndroid Build Coastguard Worker [ %e, %case_e ] 92*9880d681SAndroid Build Coastguard Worker ret i32 %result 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker!1 = !{!"branch_weights", i32 4, i32 4, i32 64, i32 4, i32 4} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerdefine void @nested_loops(i32 %a) { 98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Printing analysis {{.*}} for function 'nested_loops': 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: block-frequency-info: nested_loops 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: float = 1.0, int = [[ENTRY:[0-9]+]] 101*9880d681SAndroid Build Coastguard Workerentry: 102*9880d681SAndroid Build Coastguard Worker br label %for.cond1.preheader 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: for.cond1.preheader: float = 4001.0, 105*9880d681SAndroid Build Coastguard Workerfor.cond1.preheader: 106*9880d681SAndroid Build Coastguard Worker %x.024 = phi i32 [ 0, %entry ], [ %inc12, %for.inc11 ] 107*9880d681SAndroid Build Coastguard Worker br label %for.cond4.preheader 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: for.cond4.preheader: float = 16007984.8, 110*9880d681SAndroid Build Coastguard Workerfor.cond4.preheader: 111*9880d681SAndroid Build Coastguard Worker %y.023 = phi i32 [ 0, %for.cond1.preheader ], [ %inc9, %for.inc8 ] 112*9880d681SAndroid Build Coastguard Worker %add = add i32 %y.023, %x.024 113*9880d681SAndroid Build Coastguard Worker br label %for.body6 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: for.body6: float = 64047914563.9, 116*9880d681SAndroid Build Coastguard Workerfor.body6: 117*9880d681SAndroid Build Coastguard Worker %z.022 = phi i32 [ 0, %for.cond4.preheader ], [ %inc, %for.body6 ] 118*9880d681SAndroid Build Coastguard Worker %add7 = add i32 %add, %z.022 119*9880d681SAndroid Build Coastguard Worker tail call void @g(i32 %add7) 120*9880d681SAndroid Build Coastguard Worker %inc = add i32 %z.022, 1 121*9880d681SAndroid Build Coastguard Worker %cmp5 = icmp ugt i32 %inc, %a 122*9880d681SAndroid Build Coastguard Worker br i1 %cmp5, label %for.inc8, label %for.body6, !prof !2 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: for.inc8: float = 16007984.8, 125*9880d681SAndroid Build Coastguard Workerfor.inc8: 126*9880d681SAndroid Build Coastguard Worker %inc9 = add i32 %y.023, 1 127*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp ugt i32 %inc9, %a 128*9880d681SAndroid Build Coastguard Worker br i1 %cmp2, label %for.inc11, label %for.cond4.preheader, !prof !2 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: for.inc11: float = 4001.0, 131*9880d681SAndroid Build Coastguard Workerfor.inc11: 132*9880d681SAndroid Build Coastguard Worker %inc12 = add i32 %x.024, 1 133*9880d681SAndroid Build Coastguard Worker %cmp = icmp ugt i32 %inc12, %a 134*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.end13, label %for.cond1.preheader, !prof !2 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: for.end13: float = 1.0, int = [[ENTRY]] 137*9880d681SAndroid Build Coastguard Workerfor.end13: 138*9880d681SAndroid Build Coastguard Worker ret void 139*9880d681SAndroid Build Coastguard Worker} 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerdeclare void @g(i32) 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker!2 = !{!"branch_weights", i32 1, i32 4000} 144