2019-09-11 16:19:50 +00:00
; RUN: llvm-profdata merge %S/Inputs/misexpect-switch.proftext -o %t.profdata
; RUN: llvm-profdata merge %S/Inputs/misexpect-switch-correct.proftext -o %t.c.profdata
2020-07-22 14:58:42 -07:00
; RUN: opt < %s -lower-expect -pgo-instr-use -pgo-instrument-entry=false -pgo-test-profile-file=%t.profdata -S -pgo-warn-misexpect 2>&1 | FileCheck %s --check-prefix=WARNING
; RUN: opt < %s -lower-expect -pgo-instr-use -pgo-instrument-entry=false -pgo-test-profile-file=%t.profdata -S -pass-remarks=misexpect 2>&1 | FileCheck %s --check-prefix=REMARK
; RUN: opt < %s -lower-expect -pgo-instr-use -pgo-instrument-entry=false -pgo-test-profile-file=%t.profdata -S -pgo-warn-misexpect -pass-remarks=misexpect 2>&1 | FileCheck %s --check-prefix=BOTH
; RUN: opt < %s -lower-expect -pgo-instr-use -pgo-instrument-entry=false -pgo-test-profile-file=%t.profdata -S 2>&1 | FileCheck %s --check-prefix=DISABLED
2019-09-11 16:19:50 +00:00
; New PM
2020-07-22 14:58:42 -07:00
; RUN: opt < %s -passes="function(lower-expect),pgo-instr-use" -pgo-instrument-entry=false -pgo-test-profile-file=%t.profdata -pgo-warn-misexpect -S 2>&1 | FileCheck %s --check-prefix=WARNING
; RUN: opt < %s -passes="function(lower-expect),pgo-instr-use" -pgo-instrument-entry=false -pgo-test-profile-file=%t.profdata -pass-remarks=misexpect -S 2>&1 | FileCheck %s --check-prefix=REMARK
; RUN: opt < %s -passes="function(lower-expect),pgo-instr-use" -pgo-instrument-entry=false -pgo-test-profile-file=%t.profdata -pgo-warn-misexpect -pass-remarks=misexpect -S 2>&1 | FileCheck %s --check-prefix=BOTH
; RUN: opt < %s -passes="function(lower-expect),pgo-instr-use" -pgo-instrument-entry=false -pgo-test-profile-file=%t.profdata -S 2>&1 | FileCheck %s --check-prefix=DISABLED
; RUN: opt < %s -lower-expect -pgo-instr-use -pgo-instrument-entry=false -pgo-test-profile-file=%t.c.profdata -S -pgo-warn-misexpect -pass-remarks=misexpect 2>&1 | FileCheck %s --check-prefix=CORRECT
; RUN: opt < %s -passes="function(lower-expect),pgo-instr-use" -pgo-instrument-entry=false -pgo-test-profile-file=%t.c.profdata -pgo-warn-misexpect -pass-remarks=misexpect -S 2>&1 | FileCheck %s --check-prefix=CORRECT
2019-09-11 16:19:50 +00:00
2020-07-22 14:58:42 -07:00
; RUN: llvm-profdata merge %S/Inputs/misexpect-switch_entry.proftext -o %t2.profdata
; RUN: llvm-profdata merge %S/Inputs/misexpect-switch-correct_entry.proftext -o %t2.c.profdata
2019-09-11 16:19:50 +00:00
2020-07-22 14:58:42 -07:00
; RUN: opt < %s -lower-expect -pgo-instr-use -pgo-instrument-entry=true -pgo-test-profile-file=%t2.profdata -S -pgo-warn-misexpect 2>&1 | FileCheck %s --check-prefix=WARNING
; RUN: opt < %s -lower-expect -pgo-instr-use -pgo-instrument-entry=true -pgo-test-profile-file=%t2.profdata -S -pass-remarks=misexpect 2>&1 | FileCheck %s --check-prefix=REMARK
; RUN: opt < %s -lower-expect -pgo-instr-use -pgo-instrument-entry=true -pgo-test-profile-file=%t2.profdata -S -pgo-warn-misexpect -pass-remarks=misexpect 2>&1 | FileCheck %s --check-prefix=BOTH
; RUN: opt < %s -lower-expect -pgo-instr-use -pgo-instrument-entry=true -pgo-test-profile-file=%t2.profdata -S 2>&1 | FileCheck %s --check-prefix=DISABLED
; New PM
; RUN: opt < %s -passes="function(lower-expect),pgo-instr-use" -pgo-instrument-entry=true -pgo-test-profile-file=%t2.profdata -pgo-warn-misexpect -S 2>&1 | FileCheck %s --check-prefix=WARNING
; RUN: opt < %s -passes="function(lower-expect),pgo-instr-use" -pgo-instrument-entry=true -pgo-test-profile-file=%t2.profdata -pass-remarks=misexpect -S 2>&1 | FileCheck %s --check-prefix=REMARK
; RUN: opt < %s -passes="function(lower-expect),pgo-instr-use" -pgo-instrument-entry=true -pgo-test-profile-file=%t2.profdata -pgo-warn-misexpect -pass-remarks=misexpect -S 2>&1 | FileCheck %s --check-prefix=BOTH
; RUN: opt < %s -passes="function(lower-expect),pgo-instr-use" -pgo-instrument-entry=true -pgo-test-profile-file=%t2.profdata -S 2>&1 | FileCheck %s --check-prefix=DISABLED
; RUN: opt < %s -lower-expect -pgo-instr-use -pgo-instrument-entry=true -pgo-test-profile-file=%t2.c.profdata -S -pgo-warn-misexpect -pass-remarks=misexpect 2>&1 | FileCheck %s --check-prefix=CORRECT
; RUN: opt < %s -passes="function(lower-expect),pgo-instr-use" -pgo-instrument-entry=true -pgo-test-profile-file=%t2.c.profdata -pgo-warn-misexpect -pass-remarks=misexpect -S 2>&1 | FileCheck %s --check-prefix=CORRECT
2019-09-11 16:19:50 +00:00
; WARNING-DAG: warning: misexpect-switch.c:26:5: 0.00%
; WARNING-NOT: remark: misexpect-switch.c:26:5: Potential performance regression from use of the llvm.expect intrinsic: Annotation was correct on 0.00% (0 / 8112) of profiled executions.
; REMARK-NOT: warning: misexpect-switch.c:26:5: 0.00%
; REMARK-DAG: remark: misexpect-switch.c:26:5: Potential performance regression from use of the llvm.expect intrinsic: Annotation was correct on 0.00% (0 / 8112) of profiled executions.
; BOTH-DAG: warning: misexpect-switch.c:26:5: 0.00%
; BOTH-DAG: remark: misexpect-switch.c:26:5: Potential performance regression from use of the llvm.expect intrinsic: Annotation was correct on 0.00% (0 / 8112) of profiled executions.
; DISABLED-NOT: warning: misexpect-switch.c:26:5: 0.00%
; DISABLED-NOT: remark: misexpect-switch.c:26:5: Potential performance regression from use of the llvm.expect intrinsic: Annotation was correct on 0.00% (0 / 8112) of profiled executions.
; DISABLED-NOT: warning: misexpect-switch.c:26:5: 0.00%
; DISABLED-NOT: remark: misexpect-switch.c:26:5: Potential performance regression from use of the llvm.expect intrinsic: Annotation was correct on 0.00% (0 / 8112) of profiled executions.
; CORRECT-NOT: warning: {{.*}}
; CORRECT-NOT: remark: {{.*}}
; CHECK-DAG: !{!"misexpect", i64 0, i64 2000, i64 1}
; ModuleID = 'misexpect-switch.c'
source_filename = "misexpect-switch.c"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@inner_loop = d s o _ l o c a l constant i32 1000 , align 4 , !dbg !0
@outer_loop = d s o _ l o c a l constant i32 20 , align 4 , !dbg !6
@arry_size = d s o _ l o c a l constant i32 25 , align 4 , !dbg !10
@arry = d s o _ l o c a l global [ 25 x i32 ] zeroinitializer , align 16 , !dbg !12
; Function Attrs: nounwind uwtable
define d s o _ l o c a l void @init_arry ( ) #0 !dbg !21 {
entry:
%i = alloca i32 , align 4
%0 = bitcast i32 * %i to i8 * , !dbg !26
call void @llvm.lifetime.start.p0i8 ( i64 4 , i8 * %0 ) #6 , !dbg !26
call void @llvm.dbg.declare ( metadata i32 * %i , metadata !25 , metadata !DIExpression ( ) ) , !dbg !27
store i32 0 , i32 * %i , align 4 , !dbg !28 , !tbaa !30
br label %for.cond , !dbg !34
for.cond: ; preds = %for.inc, %entry
%1 = load i32 , i32 * %i , align 4 , !dbg !35 , !tbaa !30
%cmp = icmp slt i32 %1 , 25 , !dbg !37
br i1 %cmp , label %for.body , label %for.end , !dbg !38
for.body: ; preds = %for.cond
%call = call i32 @rand ( ) #6 , !dbg !39
%rem = srem i32 %call , 10 , !dbg !41
%2 = load i32 , i32 * %i , align 4 , !dbg !42 , !tbaa !30
%idxprom = sext i32 %2 to i64 , !dbg !43
%arrayidx = getelementptr inbounds [ 25 x i32 ] , [ 25 x i32 ] * @arry , i64 0 , i64 %idxprom , !dbg !43
store i32 %rem , i32 * %arrayidx , align 4 , !dbg !44 , !tbaa !30
br label %for.inc , !dbg !45
for.inc: ; preds = %for.body
%3 = load i32 , i32 * %i , align 4 , !dbg !46 , !tbaa !30
%inc = add nsw i32 %3 , 1 , !dbg !46
store i32 %inc , i32 * %i , align 4 , !dbg !46 , !tbaa !30
br label %for.cond , !dbg !47 , !llvm.loop !48
for.end: ; preds = %for.cond
%4 = bitcast i32 * %i to i8 * , !dbg !50
call void @llvm.lifetime.end.p0i8 ( i64 4 , i8 * %4 ) #6 , !dbg !50
ret void , !dbg !50
}
; Function Attrs: argmemonly nounwind willreturn
declare void @llvm.lifetime.start.p0i8 ( i64 i m m a r g , i8 * nocapture ) #1
; Function Attrs: nounwind readnone speculatable willreturn
declare void @llvm.dbg.declare ( metadata , metadata , metadata ) #2
; Function Attrs: nounwind
declare d s o _ l o c a l i32 @rand ( ) #3
; Function Attrs: argmemonly nounwind willreturn
declare void @llvm.lifetime.end.p0i8 ( i64 i m m a r g , i8 * nocapture ) #1
; Function Attrs: nounwind uwtable
define d s o _ l o c a l i32 @main ( ) #0 !dbg !51 {
entry:
%retval = alloca i32 , align 4
%val = alloca i32 , align 4
%j = alloca i32 , align 4
%condition = alloca i32 , align 4
store i32 0 , i32 * %retval , align 4
call void @init_arry ( ) , !dbg !62
%0 = bitcast i32 * %val to i8 * , !dbg !63
call void @llvm.lifetime.start.p0i8 ( i64 4 , i8 * %0 ) #6 , !dbg !63
call void @llvm.dbg.declare ( metadata i32 * %val , metadata !55 , metadata !DIExpression ( ) ) , !dbg !64
store i32 0 , i32 * %val , align 4 , !dbg !64 , !tbaa !30
%1 = bitcast i32 * %j to i8 * , !dbg !65
call void @llvm.lifetime.start.p0i8 ( i64 4 , i8 * %1 ) #6 , !dbg !65
call void @llvm.dbg.declare ( metadata i32 * %j , metadata !56 , metadata !DIExpression ( ) ) , !dbg !66
store i32 0 , i32 * %j , align 4 , !dbg !67 , !tbaa !30
br label %for.cond , !dbg !68
for.cond: ; preds = %for.inc, %entry
%2 = load i32 , i32 * %j , align 4 , !dbg !69 , !tbaa !30
%cmp = icmp slt i32 %2 , 20000 , !dbg !70
br i1 %cmp , label %for.body , label %for.end , !dbg !71
for.body: ; preds = %for.cond
%3 = bitcast i32 * %condition to i8 * , !dbg !72
call void @llvm.lifetime.start.p0i8 ( i64 4 , i8 * %3 ) #6 , !dbg !72
call void @llvm.dbg.declare ( metadata i32 * %condition , metadata !57 , metadata !DIExpression ( ) ) , !dbg !73
%call = call i32 @rand ( ) #6 , !dbg !74
%rem = srem i32 %call , 5 , !dbg !75
store i32 %rem , i32 * %condition , align 4 , !dbg !73 , !tbaa !30
%4 = load i32 , i32 * %condition , align 4 , !dbg !76 , !tbaa !30
%conv = zext i32 %4 to i64 , !dbg !76
%expval = call i64 @llvm.expect.i64 ( i64 %conv , i64 0 ) , !dbg !77
switch i64 %expval , label %sw.default [
i64 0 , label %sw.bb
i64 1 , label %sw.bb2
i64 2 , label %sw.bb2
i64 3 , label %sw.bb2
i64 4 , label %sw.bb3
] , !dbg !78
sw.bb: ; preds = %for.body
%call1 = call i32 @sum ( i32 * getelementptr inbounds ( [ 25 x i32 ] , [ 25 x i32 ] * @arry , i64 0 , i64 0 ) , i32 25 ) , !dbg !79
%5 = load i32 , i32 * %val , align 4 , !dbg !81 , !tbaa !30
%add = add nsw i32 %5 , %call1 , !dbg !81
store i32 %add , i32 * %val , align 4 , !dbg !81 , !tbaa !30
br label %sw.epilog , !dbg !82
sw.bb2: ; preds = %for.body, %for.body, %for.body
br label %sw.epilog , !dbg !83
sw.bb3: ; preds = %for.body
%call4 = call i32 @random_sample ( i32 * getelementptr inbounds ( [ 25 x i32 ] , [ 25 x i32 ] * @arry , i64 0 , i64 0 ) , i32 25 ) , !dbg !84
%6 = load i32 , i32 * %val , align 4 , !dbg !85 , !tbaa !30
%add5 = add nsw i32 %6 , %call4 , !dbg !85
store i32 %add5 , i32 * %val , align 4 , !dbg !85 , !tbaa !30
br label %sw.epilog , !dbg !86
sw.default: ; preds = %for.body
unreachable , !dbg !87
sw.epilog: ; preds = %sw.bb3, %sw.bb2, %sw.bb
%7 = bitcast i32 * %condition to i8 * , !dbg !88
call void @llvm.lifetime.end.p0i8 ( i64 4 , i8 * %7 ) #6 , !dbg !88
br label %for.inc , !dbg !89
for.inc: ; preds = %sw.epilog
%8 = load i32 , i32 * %j , align 4 , !dbg !90 , !tbaa !30
%inc = add nsw i32 %8 , 1 , !dbg !90
store i32 %inc , i32 * %j , align 4 , !dbg !90 , !tbaa !30
br label %for.cond , !dbg !91 , !llvm.loop !92
for.end: ; preds = %for.cond
%9 = bitcast i32 * %j to i8 * , !dbg !94
call void @llvm.lifetime.end.p0i8 ( i64 4 , i8 * %9 ) #6 , !dbg !94
%10 = bitcast i32 * %val to i8 * , !dbg !94
call void @llvm.lifetime.end.p0i8 ( i64 4 , i8 * %10 ) #6 , !dbg !94
ret i32 0 , !dbg !95
}
; Function Attrs: nounwind readnone willreturn
declare i64 @llvm.expect.i64 ( i64 , i64 ) #4
declare d s o _ l o c a l i32 @sum ( i32 * , i32 ) #5
declare d s o _ l o c a l i32 @random_sample ( i32 * , i32 ) #5
attributes #0 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math" = "false" "disable-tail-calls" = "false" "frame-pointer" = "none" "less-precise-fpmad" = "false" "min-legal-vector-width" = "0" "no-infs-fp-math" = "false" "no-jump-tables" = "false" "no-nans-fp-math" = "false" "no-signed-zeros-fp-math" = "false" "no-trapping-math" = "false" "stack-protector-buffer-size" = "8" "target-cpu" = "x86-64" "target-features" = "+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math" = "false" "use-soft-float" = "false" }
attributes #1 = { argmemonly nounwind w i l l r e t u r n }
attributes #2 = { nounwind readnone s p e c u l a t a b l e w i l l r e t u r n }
attributes #3 = { nounwind "correctly-rounded-divide-sqrt-fp-math" = "false" "disable-tail-calls" = "false" "frame-pointer" = "none" "less-precise-fpmad" = "false" "no-infs-fp-math" = "false" "no-nans-fp-math" = "false" "no-signed-zeros-fp-math" = "false" "no-trapping-math" = "false" "stack-protector-buffer-size" = "8" "target-cpu" = "x86-64" "target-features" = "+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math" = "false" "use-soft-float" = "false" }
attributes #4 = { nounwind readnone w i l l r e t u r n }
attributes #5 = { "correctly-rounded-divide-sqrt-fp-math" = "false" "disable-tail-calls" = "false" "frame-pointer" = "none" "less-precise-fpmad" = "false" "no-infs-fp-math" = "false" "no-nans-fp-math" = "false" "no-signed-zeros-fp-math" = "false" "no-trapping-math" = "false" "stack-protector-buffer-size" = "8" "target-cpu" = "x86-64" "target-features" = "+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math" = "false" "use-soft-float" = "false" }
attributes #6 = { nounwind }
!llvm.dbg.cu = ! { !2 }
!llvm.module.flags = ! { !17 , !18 , !19 }
!llvm.ident = ! { !20 }
!0 = !DIGlobalVariableExpression ( var: !1 , expr: !DIExpression ( ) )
!1 = distinct !DIGlobalVariable ( name: "inner_loop" , scope: !2 , file: !3 , line: 7 , type: !8 , isLocal: false , isDefinition: true )
!2 = distinct !DICompileUnit ( language: D W _ L A N G _ C 99 , file: !3 , producer: "clang version 10.0.0" , isOptimized: true , runtimeVersion: 0 , emissionKind: F u l l D e b u g , enums: !4 , globals: !5 , nameTableKind: N one )
!3 = !DIFile ( filename: "misexpect-switch.c" , directory: "." )
!4 = ! { }
!5 = ! { !0 , !6 , !10 , !12 }
!6 = !DIGlobalVariableExpression ( var: !7 , expr: !DIExpression ( ) )
!7 = distinct !DIGlobalVariable ( name: "outer_loop" , scope: !2 , file: !3 , line: 8 , type: !8 , isLocal: false , isDefinition: true )
!8 = !DIDerivedType ( tag: D W _ T A G _ c o n s t _ type , baseType: !9 )
!9 = !DIBasicType ( name: "int" , size: 32 , encoding: D W _ A T E _ s i g n e d )
!10 = !DIGlobalVariableExpression ( var: !11 , expr: !DIExpression ( ) )
!11 = distinct !DIGlobalVariable ( name: "arry_size" , scope: !2 , file: !3 , line: 9 , type: !8 , isLocal: false , isDefinition: true )
!12 = !DIGlobalVariableExpression ( var: !13 , expr: !DIExpression ( ) )
!13 = distinct !DIGlobalVariable ( name: "arry" , scope: !2 , file: !3 , line: 11 , type: !14 , isLocal: false , isDefinition: true )
!14 = !DICompositeType ( tag: D W _ T A G _ a r r a y _ type , baseType: !9 , size: 800 , elements: !15 )
!15 = ! { !16 }
!16 = !DISubrange ( count: 25 )
!17 = ! { i32 2 , !"Dwarf Version" , i32 4 }
!18 = ! { i32 2 , !"Debug Info Version" , i32 3 }
!19 = ! { i32 1 , !"wchar_size" , i32 4 }
!20 = ! { !"clang version 10.0.0" }
!21 = distinct !DISubprogram ( name: "init_arry" , scope: !3 , file: !3 , line: 13 , type: !22 , scopeLine: 13 , spFlags: D I S P F l a g D e f i n i t i o n | D I S P F l a g O p t i m i z e d , unit: !2 , retainedNodes: !24 )
!22 = !DISubroutineType ( types: !23 )
!23 = ! { null }
!24 = ! { !25 }
!25 = !DILocalVariable ( name: "i" , scope: !21 , file: !3 , line: 14 , type: !9 )
!26 = !DILocation ( line: 14 , column: 3 , scope: !21 )
!27 = !DILocation ( line: 14 , column: 7 , scope: !21 )
!28 = !DILocation ( line: 15 , column: 10 , scope: !29 )
!29 = distinct !DILexicalBlock ( scope: !21 , file: !3 , line: 15 , column: 3 )
!30 = ! { !31 , !31 , i64 0 }
!31 = ! { !"int" , !32 , i64 0 }
!32 = ! { !"omnipotent char" , !33 , i64 0 }
!33 = ! { !"Simple C/C++ TBAA" }
!34 = !DILocation ( line: 15 , column: 8 , scope: !29 )
!35 = !DILocation ( line: 15 , column: 15 , scope: !36 )
!36 = distinct !DILexicalBlock ( scope: !29 , file: !3 , line: 15 , column: 3 )
!37 = !DILocation ( line: 15 , column: 17 , scope: !36 )
!38 = !DILocation ( line: 15 , column: 3 , scope: !29 )
!39 = !DILocation ( line: 16 , column: 15 , scope: !40 )
!40 = distinct !DILexicalBlock ( scope: !36 , file: !3 , line: 15 , column: 35 )
!41 = !DILocation ( line: 16 , column: 22 , scope: !40 )
!42 = !DILocation ( line: 16 , column: 10 , scope: !40 )
!43 = !DILocation ( line: 16 , column: 5 , scope: !40 )
!44 = !DILocation ( line: 16 , column: 13 , scope: !40 )
!45 = !DILocation ( line: 17 , column: 3 , scope: !40 )
!46 = !DILocation ( line: 15 , column: 30 , scope: !36 )
!47 = !DILocation ( line: 15 , column: 3 , scope: !36 )
!48 = distinct ! { !48 , !38 , !49 }
!49 = !DILocation ( line: 17 , column: 3 , scope: !29 )
!50 = !DILocation ( line: 18 , column: 1 , scope: !21 )
!51 = distinct !DISubprogram ( name: "main" , scope: !3 , file: !3 , line: 20 , type: !52 , scopeLine: 20 , spFlags: D I S P F l a g D e f i n i t i o n | D I S P F l a g O p t i m i z e d , unit: !2 , retainedNodes: !54 )
!52 = !DISubroutineType ( types: !53 )
!53 = ! { !9 }
!54 = ! { !55 , !56 , !57 }
!55 = !DILocalVariable ( name: "val" , scope: !51 , file: !3 , line: 22 , type: !9 )
!56 = !DILocalVariable ( name: "j" , scope: !51 , file: !3 , line: 23 , type: !9 )
!57 = !DILocalVariable ( name: "condition" , scope: !58 , file: !3 , line: 25 , type: !61 )
!58 = distinct !DILexicalBlock ( scope: !59 , file: !3 , line: 24 , column: 49 )
!59 = distinct !DILexicalBlock ( scope: !60 , file: !3 , line: 24 , column: 3 )
!60 = distinct !DILexicalBlock ( scope: !51 , file: !3 , line: 24 , column: 3 )
!61 = !DIBasicType ( name: "unsigned int" , size: 32 , encoding: D W _ A T E _ u n s i g n e d )
!62 = !DILocation ( line: 21 , column: 3 , scope: !51 )
!63 = !DILocation ( line: 22 , column: 3 , scope: !51 )
!64 = !DILocation ( line: 22 , column: 7 , scope: !51 )
!65 = !DILocation ( line: 23 , column: 3 , scope: !51 )
!66 = !DILocation ( line: 23 , column: 7 , scope: !51 )
!67 = !DILocation ( line: 24 , column: 10 , scope: !60 )
!68 = !DILocation ( line: 24 , column: 8 , scope: !60 )
!69 = !DILocation ( line: 24 , column: 15 , scope: !59 )
!70 = !DILocation ( line: 24 , column: 17 , scope: !59 )
!71 = !DILocation ( line: 24 , column: 3 , scope: !60 )
!72 = !DILocation ( line: 25 , column: 5 , scope: !58 )
!73 = !DILocation ( line: 25 , column: 14 , scope: !58 )
!74 = !DILocation ( line: 25 , column: 26 , scope: !58 )
!75 = !DILocation ( line: 25 , column: 33 , scope: !58 )
!76 = !DILocation ( line: 26 , column: 30 , scope: !58 )
!77 = !DILocation ( line: 26 , column: 13 , scope: !58 )
!78 = !DILocation ( line: 26 , column: 5 , scope: !58 )
!79 = !DILocation ( line: 28 , column: 14 , scope: !80 )
!80 = distinct !DILexicalBlock ( scope: !58 , file: !3 , line: 26 , column: 45 )
!81 = !DILocation ( line: 28 , column: 11 , scope: !80 )
!82 = !DILocation ( line: 29 , column: 7 , scope: !80 )
!83 = !DILocation ( line: 33 , column: 7 , scope: !80 )
!84 = !DILocation ( line: 35 , column: 14 , scope: !80 )
!85 = !DILocation ( line: 35 , column: 11 , scope: !80 )
!86 = !DILocation ( line: 36 , column: 7 , scope: !80 )
!87 = !DILocation ( line: 38 , column: 7 , scope: !80 )
!88 = !DILocation ( line: 40 , column: 3 , scope: !59 )
!89 = !DILocation ( line: 40 , column: 3 , scope: !58 )
!90 = !DILocation ( line: 24 , column: 44 , scope: !59 )
!91 = !DILocation ( line: 24 , column: 3 , scope: !59 )
!92 = distinct ! { !92 , !71 , !93 }
!93 = !DILocation ( line: 40 , column: 3 , scope: !60 )
!94 = !DILocation ( line: 43 , column: 1 , scope: !51 )
!95 = !DILocation ( line: 42 , column: 3 , scope: !51 )