227 lines
9.2 KiB
LLVM
227 lines
9.2 KiB
LLVM
|
; RUN: opt < %s -analyze -block-freq -enable-new-pm=0 | FileCheck %s
|
||
|
; RUN: opt < %s -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s
|
||
|
|
||
|
; Function Attrs: noinline norecurse nounwind readnone uwtable
|
||
|
define i32 @_Z11irreducibleii(i32 %iter_outer, i32 %iter_inner) local_unnamed_addr !prof !27 {
|
||
|
entry:
|
||
|
%cmp24 = icmp sgt i32 %iter_outer, 0
|
||
|
br i1 %cmp24, label %for.body, label %entry.for.cond.cleanup_crit_edge, !prof !28
|
||
|
|
||
|
entry.for.cond.cleanup_crit_edge: ; preds = %entry
|
||
|
br label %for.cond.cleanup
|
||
|
|
||
|
for.cond.cleanup: ; preds = %for.end, %entry.for.cond.cleanup_crit_edge
|
||
|
%sum.0.lcssa = phi i32 [ 0, %entry.for.cond.cleanup_crit_edge ], [ %sum.1, %for.end ]
|
||
|
ret i32 %sum.0.lcssa
|
||
|
|
||
|
for.body: ; preds = %for.end, %entry
|
||
|
%k.026 = phi i32 [ %inc12, %for.end ], [ 0, %entry ]
|
||
|
%sum.025 = phi i32 [ %sum.1, %for.end ], [ 0, %entry ]
|
||
|
%rem23 = and i32 %k.026, 1
|
||
|
%cmp1 = icmp eq i32 %rem23, 0
|
||
|
br i1 %cmp1, label %entry8, label %for.cond2, !prof !29
|
||
|
|
||
|
for.cond2: ; preds = %if.end9, %for.body
|
||
|
%sum.1 = phi i32 [ %add10, %if.end9 ], [ %sum.025, %for.body ]
|
||
|
%i.0 = phi i32 [ %inc, %if.end9 ], [ 0, %for.body ]
|
||
|
%cmp3 = icmp slt i32 %i.0, %iter_inner
|
||
|
br i1 %cmp3, label %for.body4, label %for.end, !prof !30, !irr_loop !31
|
||
|
|
||
|
for.body4: ; preds = %for.cond2
|
||
|
%rem5 = srem i32 %k.026, 3
|
||
|
%cmp6 = icmp eq i32 %rem5, 0
|
||
|
br i1 %cmp6, label %entry8, label %if.end9, !prof !32
|
||
|
|
||
|
entry8: ; preds = %for.body4, %for.body
|
||
|
%sum.2 = phi i32 [ %sum.025, %for.body ], [ %sum.1, %for.body4 ]
|
||
|
%i.1 = phi i32 [ 0, %for.body ], [ %i.0, %for.body4 ]
|
||
|
%add = add nsw i32 %sum.2, 4
|
||
|
br label %if.end9, !irr_loop !33
|
||
|
|
||
|
if.end9: ; preds = %entry8, %for.body4
|
||
|
%sum.3 = phi i32 [ %add, %entry8 ], [ %sum.1, %for.body4 ]
|
||
|
%i.2 = phi i32 [ %i.1, %entry8 ], [ %i.0, %for.body4 ]
|
||
|
%add10 = add nsw i32 %sum.3, 1
|
||
|
%inc = add nsw i32 %i.2, 1
|
||
|
br label %for.cond2, !irr_loop !34
|
||
|
|
||
|
for.end: ; preds = %for.cond2
|
||
|
%inc12 = add nuw nsw i32 %k.026, 1
|
||
|
%exitcond = icmp eq i32 %inc12, %iter_outer
|
||
|
br i1 %exitcond, label %for.cond.cleanup, label %for.body, !prof !35
|
||
|
}
|
||
|
|
||
|
!27 = !{!"function_entry_count", i64 1}
|
||
|
!28 = !{!"branch_weights", i32 1, i32 0}
|
||
|
!29 = !{!"branch_weights", i32 50, i32 50}
|
||
|
!30 = !{!"branch_weights", i32 950, i32 100}
|
||
|
!31 = !{!"loop_header_weight", i64 1050}
|
||
|
!32 = !{!"branch_weights", i32 323, i32 627}
|
||
|
!33 = !{!"loop_header_weight", i64 373}
|
||
|
!34 = !{!"loop_header_weight", i64 1000}
|
||
|
!35 = !{!"branch_weights", i32 1, i32 99}
|
||
|
|
||
|
; CHECK-LABEL: Printing analysis {{.*}} for function '_Z11irreducibleii':
|
||
|
; CHECK-NEXT: block-frequency-info: _Z11irreducibleii
|
||
|
; CHECK-NEXT: - entry: {{.*}} count = 1
|
||
|
; CHECK-NEXT: - entry.for.cond.cleanup_crit_edge: {{.*}} count = 0
|
||
|
; CHECK-NEXT: - for.cond.cleanup: {{.*}} count = 1
|
||
|
; CHECK-NEXT: - for.body: {{.*}} count = 100
|
||
|
; CHECK-NEXT: - for.cond2: {{.*}} count = 1050, irr_loop_header_weight = 1050
|
||
|
; CHECK-NEXT: - for.body4: {{.*}} count = 950
|
||
|
; CHECK-NEXT: - entry8: {{.*}} count = 373, irr_loop_header_weight = 373
|
||
|
; CHECK-NEXT: - if.end9: {{.*}} count = 1000, irr_loop_header_weight = 1000
|
||
|
; CHECK-NEXT: - for.end: {{.*}} count = 100
|
||
|
|
||
|
@targets = local_unnamed_addr global [256 x i8*] zeroinitializer, align 16
|
||
|
@tracing = local_unnamed_addr global i32 0, align 4
|
||
|
|
||
|
; Function Attrs: noinline norecurse nounwind uwtable
|
||
|
define i32 @_Z11irreduciblePh(i8* nocapture readonly %p) !prof !27 {
|
||
|
entry:
|
||
|
%0 = load i32, i32* @tracing, align 4
|
||
|
%1 = trunc i32 %0 to i8
|
||
|
%tobool = icmp eq i32 %0, 0
|
||
|
br label %for.cond1
|
||
|
|
||
|
for.cond1: ; preds = %sw.default, %entry
|
||
|
br label %dispatch_op
|
||
|
|
||
|
dispatch_op: ; preds = %sw.bb6, %for.cond1
|
||
|
switch i8 %1, label %sw.default [
|
||
|
i8 0, label %sw.bb
|
||
|
i8 1, label %dispatch_op.sw.bb6_crit_edge
|
||
|
i8 2, label %sw.bb15
|
||
|
], !prof !36
|
||
|
|
||
|
dispatch_op.sw.bb6_crit_edge: ; preds = %dispatch_op
|
||
|
br label %sw.bb6
|
||
|
|
||
|
sw.bb: ; preds = %indirectgoto, %dispatch_op
|
||
|
br label %exit
|
||
|
|
||
|
TARGET_1: ; preds = %indirectgoto
|
||
|
br label %sw.bb6
|
||
|
|
||
|
sw.bb6: ; preds = %TARGET_1, %dispatch_op.sw.bb6_crit_edge
|
||
|
br i1 %tobool, label %dispatch_op, label %if.then, !prof !37, !irr_loop !38
|
||
|
|
||
|
if.then: ; preds = %sw.bb6
|
||
|
br label %indirectgoto
|
||
|
|
||
|
TARGET_2: ; preds = %indirectgoto
|
||
|
br label %sw.bb15
|
||
|
|
||
|
sw.bb15: ; preds = %TARGET_2, %dispatch_op
|
||
|
br i1 %tobool, label %if.then18, label %exit, !prof !39, !irr_loop !40
|
||
|
|
||
|
if.then18: ; preds = %sw.bb15
|
||
|
br label %indirectgoto
|
||
|
|
||
|
unknown_op: ; preds = %indirectgoto
|
||
|
br label %sw.default
|
||
|
|
||
|
sw.default: ; preds = %unknown_op, %dispatch_op
|
||
|
br label %for.cond1
|
||
|
|
||
|
exit: ; preds = %sw.bb15, %sw.bb
|
||
|
ret i32 0
|
||
|
|
||
|
indirectgoto: ; preds = %if.then18, %if.then
|
||
|
%idxprom21 = zext i32 %0 to i64
|
||
|
%arrayidx22 = getelementptr inbounds [256 x i8*], [256 x i8*]* @targets, i64 0, i64 %idxprom21
|
||
|
%target = load i8*, i8** %arrayidx22, align 8
|
||
|
indirectbr i8* %target, [label %unknown_op, label %sw.bb, label %TARGET_1, label %TARGET_2], !prof !41, !irr_loop !42
|
||
|
}
|
||
|
|
||
|
!36 = !{!"branch_weights", i32 0, i32 0, i32 201, i32 1}
|
||
|
!37 = !{!"branch_weights", i32 201, i32 300}
|
||
|
!38 = !{!"loop_header_weight", i64 501}
|
||
|
!39 = !{!"branch_weights", i32 100, i32 0}
|
||
|
!40 = !{!"loop_header_weight", i64 100}
|
||
|
!41 = !{!"branch_weights", i32 0, i32 1, i32 300, i32 99}
|
||
|
!42 = !{!"loop_header_weight", i64 400}
|
||
|
|
||
|
; CHECK-LABEL: Printing analysis {{.*}} for function '_Z11irreduciblePh':
|
||
|
; CHECK-NEXT: block-frequency-info: _Z11irreduciblePh
|
||
|
; CHECK-NEXT: - entry: {{.*}} count = 1
|
||
|
; CHECK-NEXT: - for.cond1: {{.*}} count = 1
|
||
|
; CHECK-NEXT: - dispatch_op: {{.*}} count = 202
|
||
|
; CHECK-NEXT: - dispatch_op.sw.bb6_crit_edge: {{.*}} count = 201
|
||
|
; CHECK-NEXT: - sw.bb: {{.*}} count = 1
|
||
|
; CHECK-NEXT: - TARGET_1: {{.*}} count = 300
|
||
|
; CHECK-NEXT: - sw.bb6: {{.*}} count = 501, irr_loop_header_weight = 501
|
||
|
; CHECK-NEXT: - if.then: {{.*}} count = 300
|
||
|
; CHECK-NEXT: - TARGET_2: {{.*}} count = 99
|
||
|
; CHECK-NEXT: - sw.bb15: {{.*}} count = 100, irr_loop_header_weight = 100
|
||
|
; CHECK-NEXT: - if.then18: {{.*}} count = 100
|
||
|
; CHECK-NEXT: - unknown_op: {{.*}} count = 0
|
||
|
; CHECK-NEXT: - sw.default: {{.*}} count = 0
|
||
|
; CHECK-NEXT: - exit: {{.*}} count = 1
|
||
|
; CHECK-NEXT: - indirectgoto: {{.*}} count = 400, irr_loop_header_weight = 400
|
||
|
|
||
|
; Missing some irr loop annotations.
|
||
|
; Function Attrs: noinline norecurse nounwind uwtable
|
||
|
define i32 @_Z11irreduciblePh2(i8* nocapture readonly %p) !prof !27 {
|
||
|
entry:
|
||
|
%0 = load i32, i32* @tracing, align 4
|
||
|
%1 = trunc i32 %0 to i8
|
||
|
%tobool = icmp eq i32 %0, 0
|
||
|
br label %for.cond1
|
||
|
|
||
|
for.cond1: ; preds = %sw.default, %entry
|
||
|
br label %dispatch_op
|
||
|
|
||
|
dispatch_op: ; preds = %sw.bb6, %for.cond1
|
||
|
switch i8 %1, label %sw.default [
|
||
|
i8 0, label %sw.bb
|
||
|
i8 1, label %dispatch_op.sw.bb6_crit_edge
|
||
|
i8 2, label %sw.bb15
|
||
|
], !prof !36
|
||
|
|
||
|
dispatch_op.sw.bb6_crit_edge: ; preds = %dispatch_op
|
||
|
br label %sw.bb6
|
||
|
|
||
|
sw.bb: ; preds = %indirectgoto, %dispatch_op
|
||
|
br label %exit
|
||
|
|
||
|
TARGET_1: ; preds = %indirectgoto
|
||
|
br label %sw.bb6
|
||
|
|
||
|
sw.bb6: ; preds = %TARGET_1, %dispatch_op.sw.bb6_crit_edge
|
||
|
br i1 %tobool, label %dispatch_op, label %if.then, !prof !37 ; Missing !irr_loop !38
|
||
|
|
||
|
if.then: ; preds = %sw.bb6
|
||
|
br label %indirectgoto
|
||
|
|
||
|
TARGET_2: ; preds = %indirectgoto
|
||
|
br label %sw.bb15
|
||
|
|
||
|
sw.bb15: ; preds = %TARGET_2, %dispatch_op
|
||
|
br i1 %tobool, label %if.then18, label %exit, !prof !39, !irr_loop !40
|
||
|
|
||
|
if.then18: ; preds = %sw.bb15
|
||
|
br label %indirectgoto
|
||
|
|
||
|
unknown_op: ; preds = %indirectgoto
|
||
|
br label %sw.default
|
||
|
|
||
|
sw.default: ; preds = %unknown_op, %dispatch_op
|
||
|
br label %for.cond1
|
||
|
|
||
|
exit: ; preds = %sw.bb15, %sw.bb
|
||
|
ret i32 0
|
||
|
|
||
|
indirectgoto: ; preds = %if.then18, %if.then
|
||
|
%idxprom21 = zext i32 %0 to i64
|
||
|
%arrayidx22 = getelementptr inbounds [256 x i8*], [256 x i8*]* @targets, i64 0, i64 %idxprom21
|
||
|
%target = load i8*, i8** %arrayidx22, align 8
|
||
|
indirectbr i8* %target, [label %unknown_op, label %sw.bb, label %TARGET_1, label %TARGET_2], !prof !41, !irr_loop !42
|
||
|
}
|
||
|
|
||
|
; CHECK-LABEL: Printing analysis {{.*}} for function '_Z11irreduciblePh2':
|
||
|
; CHECK: block-frequency-info: _Z11irreduciblePh2
|
||
|
; CHECK: - sw.bb6: {{.*}} count = 100
|
||
|
; CHECK: - sw.bb15: {{.*}} count = 100, irr_loop_header_weight = 100
|
||
|
; CHECK: - indirectgoto: {{.*}} count = 400, irr_loop_header_weight = 400
|