2016-08-15 21:58:16 +08:00
; RUN: opt %loadPolly -pass-remarks-analysis="polly-scops" -polly-scops \
; RUN: -polly-invariant-load-hoisting=true -disable-output < %s 2>&1 | FileCheck %s
2015-11-12 10:32:32 +08:00
;
; CHECK: remark: test/ScopInfo/remarks.c:4:7: SCoP begins here.
[ScopInfo] Simplify inbounds assumptions under domain constraints
Without this simplification for a loop nest:
void foo(long n1_a, long n1_b, long n1_c, long n1_d,
long p1_b, long p1_c, long p1_d,
float A_1[][p1_b][p1_c][p1_d]) {
for (long i = 0; i < n1_a; i++)
for (long j = 0; j < n1_b; j++)
for (long k = 0; k < n1_c; k++)
for (long l = 0; l < n1_d; l++)
A_1[i][j][k][l] += i + j + k + l;
}
the assumption:
n1_a <= 0 or (n1_a > 0 and n1_b <= 0) or
(n1_a > 0 and n1_b > 0 and n1_c <= 0) or
(n1_a > 0 and n1_b > 0 and n1_c > 0 and n1_d <= 0) or
(n1_a > 0 and n1_b > 0 and n1_c > 0 and n1_d > 0 and
p1_b >= n1_b and p1_c >= n1_c and p1_d >= n1_d)
is taken rather than the simpler assumption:
p9_b >= n9_b and p9_c >= n9_c and p9_d >= n9_d.
The former is less strict, as it allows arbitrary values of p1_* in case, the
loop is not executed at all. However, in practice these precise constraints
explode when combined across different accesses and loops. For now it seems
to make more sense to take less precise, but more scalable constraints by
default. In case we find a practical example where more precise constraints
are needed, we can think about allowing such precise constraints in specific
situations where they help.
This change speeds up the new test case from taking very long (waited at least
a minute, but it probably takes a lot more) to below a second.
llvm-svn: 296456
2017-02-28 17:45:54 +08:00
; CHECK: remark: test/ScopInfo/remarks.c:9:15: Inbounds assumption: [N, M, Debug] -> { : M <= 100 }
2016-04-12 21:27:35 +08:00
; CHECK: remark: test/ScopInfo/remarks.c:13:7: No-error restriction: [N, M, Debug] -> { : N > 0 and M >= 0 and (Debug < 0 or Debug > 0) }
; CHECK: remark: test/ScopInfo/remarks.c:8:5: Finite loop restriction: [N, M, Debug] -> { : N > 0 and (M <= -2 or M = -1) }
2016-04-12 21:28:39 +08:00
; CHECK: remark: test/ScopInfo/remarks.c:4:7: No-overflows restriction: [N, M, Debug] -> { : M <= -2147483649 - N or M >= 2147483648 - N }
2015-11-12 10:32:51 +08:00
; CHECK: remark: test/ScopInfo/remarks.c:9:18: Possibly aliasing pointer, use restrict keyword.
; CHECK: remark: test/ScopInfo/remarks.c:9:33: Possibly aliasing pointer, use restrict keyword.
; CHECK: remark: test/ScopInfo/remarks.c:9:15: Possibly aliasing pointer, use restrict keyword.
2015-11-12 10:32:32 +08:00
; CHECK: remark: test/ScopInfo/remarks.c:14:3: SCoP ends here.
; CHECK: remark: test/ScopInfo/remarks.c:19:3: SCoP begins here.
2016-05-23 18:40:54 +08:00
; CHECK: remark: test/ScopInfo/remarks.c:21:11: Invariant load restriction: [tmp] -> { : tmp < 0 or tmp > 0 }
2015-11-12 10:32:32 +08:00
; CHECK: remark: test/ScopInfo/remarks.c:22:16: SCoP ends here but was dismissed.
;
; #include <stdio.h>
;
; void valid(int *A, int *B, int N, int M, int C[100][100], int Debug) {
; if (N + M == -1)
; C[0][0] = 0;
;
; for (int i = 0; i < N; i++) {
; for (int j = 0; j != M; j++) {
; C[i][j] += A[i * M + j] + B[i + j];
; }
;
; if (Debug)
; printf("Printf!");
; }
; }
;
; void invalid0(int *A) {
; for (int i = 0; i < 10; i++)
; for (int j = 0; j < 10; j++)
; if (A[0])
; A[0] = 0;
; }
;
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
@.str = private unnamed_addr constant [ 8 x i8 ] c "Printf!\00" , align 1
define void @valid ( i32 * %A , i32 * %B , i32 %N , i32 %M , [ 100 x i32 ] * %C , i32 %Debug ) #0 !dbg !4 {
entry:
call void @llvm.dbg.value ( metadata i32 * %A , i64 0 , metadata !23 , metadata !24 ) , !dbg !25
call void @llvm.dbg.value ( metadata i32 * %B , i64 0 , metadata !26 , metadata !24 ) , !dbg !27
call void @llvm.dbg.value ( metadata i32 %N , i64 0 , metadata !28 , metadata !24 ) , !dbg !29
call void @llvm.dbg.value ( metadata i32 %M , i64 0 , metadata !30 , metadata !24 ) , !dbg !31
call void @llvm.dbg.value ( metadata [ 100 x i32 ] * %C , i64 0 , metadata !32 , metadata !24 ) , !dbg !33
call void @llvm.dbg.value ( metadata i32 %Debug , i64 0 , metadata !34 , metadata !24 ) , !dbg !35
br label %entry.split
entry.split:
%add = add i32 %N , %M , !dbg !36
%cmp = icmp eq i32 %add , -1 , !dbg !38
br i1 %cmp , label %if.then , label %if.end , !dbg !39
if.then: ; preds = %entry
%arrayidx1 = getelementptr inbounds [ 100 x i32 ] , [ 100 x i32 ] * %C , i64 0 , i64 0 , !dbg !40
store i32 0 , i32 * %arrayidx1 , align 4 , !dbg !41
br label %if.end , !dbg !40
if.end: ; preds = %if.then, %entry
call void @llvm.dbg.value ( metadata i32 0 , i64 0 , metadata !42 , metadata !24 ) , !dbg !44
%N64 = sext i32 %N to i64 , !dbg !45
%M64 = sext i32 %M to i64 , !dbg !45
br label %for.cond , !dbg !45
for.cond: ; preds = %for.inc.19, %if.end
%indvars.iv3 = phi i64 [ %indvars.iv.next4 , %for.inc.19 ] , [ 0 , %if.end ]
%cmp2 = icmp slt i64 %indvars.iv3 , %N64 , !dbg !46
br i1 %cmp2 , label %for.body , label %for.end.21 , !dbg !49
for.body: ; preds = %for.cond
call void @llvm.dbg.value ( metadata i32 0 , i64 0 , metadata !50 , metadata !24 ) , !dbg !53
br label %for.cond.3 , !dbg !54
for.cond.3: ; preds = %for.inc, %for.body
%indvars.iv = phi i64 [ %indvars.iv.next , %for.inc ] , [ 0 , %for.body ]
%cmp4 = icmp eq i64 %indvars.iv , %M64 , !dbg !55
br i1 %cmp4 , label %for.end , label %for.body.5 , !dbg !58
for.body.5: ; preds = %for.cond.3
%tmp8 = mul i64 %indvars.iv3 , %M64 , !dbg !59
%tmp9 = add i64 %tmp8 , %indvars.iv , !dbg !61
%arrayidx7 = getelementptr inbounds i32 , i32 * %A , i64 %tmp9 , !dbg !62
%tmp10 = load i32 , i32 * %arrayidx7 , align 4 , !dbg !62
%tmp11 = add i64 %indvars.iv3 , %indvars.iv , !dbg !63
%arrayidx10 = getelementptr inbounds i32 , i32 * %B , i64 %tmp11 , !dbg !64
%tmp12 = load i32 , i32 * %arrayidx10 , align 4 , !dbg !64
%add11 = add i32 %tmp10 , %tmp12 , !dbg !65
%arrayidx15 = getelementptr inbounds [ 100 x i32 ] , [ 100 x i32 ] * %C , i64 %indvars.iv3 , i64 %indvars.iv , !dbg !66
%tmp13 = load i32 , i32 * %arrayidx15 , align 4 , !dbg !67
%add16 = add i32 %tmp13 , %add11 , !dbg !67
store i32 %add16 , i32 * %arrayidx15 , align 4 , !dbg !67
br label %for.inc , !dbg !68
for.inc: ; preds = %for.body.5
%indvars.iv.next = add i64 %indvars.iv , 1 , !dbg !69
call void @llvm.dbg.value ( metadata !2 , i64 0 , metadata !50 , metadata !24 ) , !dbg !53
br label %for.cond.3 , !dbg !69
for.end: ; preds = %for.cond.3
%tobool = icmp eq i32 %Debug , 0 , !dbg !70
br i1 %tobool , label %if.end.18 , label %if.then.17 , !dbg !72
if.then.17: ; preds = %for.end
%call = call i32 ( i8 * , . . . ) @printf ( i8 * nonnull getelementptr inbounds ( [ 8 x i8 ] , [ 8 x i8 ] * @.str , i64 0 , i64 0 ) ) #3 , !dbg !73
br label %if.end.18 , !dbg !73
if.end.18: ; preds = %for.end, %if.then.17
br label %for.inc.19 , !dbg !74
for.inc.19: ; preds = %if.end.18
%indvars.iv.next4 = add nuw nsw i64 %indvars.iv3 , 1 , !dbg !75
call void @llvm.dbg.value ( metadata !2 , i64 0 , metadata !42 , metadata !24 ) , !dbg !44
br label %for.cond , !dbg !75
for.end.21: ; preds = %for.cond
ret void , !dbg !76
}
declare void @llvm.dbg.declare ( metadata , metadata , metadata ) #1
declare i32 @printf ( i8 * , . . . ) #2
define void @invalid0 ( i32 * %A ) #0 !dbg !13 {
entry:
call void @llvm.dbg.value ( metadata i32 * %A , i64 0 , metadata !77 , metadata !24 ) , !dbg !78
call void @llvm.dbg.value ( metadata i32 0 , i64 0 , metadata !79 , metadata !24 ) , !dbg !81
br label %for.cond , !dbg !82
for.cond: ; preds = %for.inc.5, %entry
%i.0 = phi i32 [ 0 , %entry ] , [ %inc6 , %for.inc.5 ]
%exitcond1 = icmp ne i32 %i.0 , 10 , !dbg !83
br i1 %exitcond1 , label %for.body , label %for.end.7 , !dbg !83
for.body: ; preds = %for.cond
call void @llvm.dbg.value ( metadata i32 0 , i64 0 , metadata !86 , metadata !24 ) , !dbg !88
br label %for.cond.1 , !dbg !89
for.cond.1: ; preds = %for.inc, %for.body
%j.0 = phi i32 [ 0 , %for.body ] , [ %inc , %for.inc ]
%exitcond = icmp ne i32 %j.0 , 10 , !dbg !90
br i1 %exitcond , label %for.body.3 , label %for.end , !dbg !90
for.body.3: ; preds = %for.cond.1
%tmp = load i32 , i32 * %A , align 4 , !dbg !93
%tobool = icmp eq i32 %tmp , 0 , !dbg !93
br i1 %tobool , label %if.end , label %if.then , !dbg !95
if.then: ; preds = %for.body.3
store i32 0 , i32 * %A , align 4 , !dbg !96
br label %if.end , !dbg !97
if.end: ; preds = %for.body.3, %if.then
br label %for.inc , !dbg !98
for.inc: ; preds = %if.end
%inc = add nuw nsw i32 %j.0 , 1 , !dbg !100
call void @llvm.dbg.value ( metadata i32 %inc , i64 0 , metadata !86 , metadata !24 ) , !dbg !88
br label %for.cond.1 , !dbg !101
for.end: ; preds = %for.cond.1
br label %for.inc.5 , !dbg !102
for.inc.5: ; preds = %for.end
%inc6 = add nuw nsw i32 %i.0 , 1 , !dbg !103
call void @llvm.dbg.value ( metadata i32 %inc6 , i64 0 , metadata !79 , metadata !24 ) , !dbg !81
br label %for.cond , !dbg !104
for.end.7: ; preds = %for.cond
ret void , !dbg !105
}
declare void @llvm.dbg.value ( metadata , i64 , metadata , metadata ) #1
attributes #0 = { nounwind uwtable "disable-tail-calls" = "false" "less-precise-fpmad" = "false" "no-frame-pointer-elim" = "true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math" = "false" "no-nans-fp-math" = "false" "stack-protector-buffer-size" = "8" "target-cpu" = "x86-64" "target-features" = "+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math" = "false" "use-soft-float" = "false" }
attributes #1 = { nounwind readnone }
attributes #2 = { "disable-tail-calls" = "false" "less-precise-fpmad" = "false" "no-frame-pointer-elim" = "true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math" = "false" "no-nans-fp-math" = "false" "stack-protector-buffer-size" = "8" "target-cpu" = "x86-64" "target-features" = "+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math" = "false" "use-soft-float" = "false" }
attributes #3 = { nounwind }
!llvm.dbg.cu = ! { !0 }
!llvm.module.flags = ! { !20 , !21 }
!llvm.ident = ! { !22 }
2016-04-16 04:51:27 +08:00
!0 = distinct !DICompileUnit ( language: D W _ L A N G _ C 99 , file: !1 , producer: "clang version 3.8.0 (http://llvm.org/git/clang.git 65eeefc97d2eee4d075ec7d9ed56b5f0786b6421)" , isOptimized: false , runtimeVersion: 0 , emissionKind: 1 , enums: !2 )
2015-11-12 10:32:32 +08:00
!1 = !DIFile ( filename: "test/ScopInfo/remarks.c" , directory: "/home/johannes/repos/llvm-polly/tools/polly" )
!2 = ! { }
2016-04-16 04:51:27 +08:00
!4 = distinct !DISubprogram ( name: "valid" , scope: !1 , file: !1 , line: 3 , type: !5 , isLocal: false , isDefinition: true , scopeLine: 3 , flags: D I F l a g P r o t o t y p e d , isOptimized: false , unit: !0 , variables: !2 )
2015-11-12 10:32:32 +08:00
!5 = !DISubroutineType ( types: !6 )
!6 = ! { null , !7 , !7 , !8 , !8 , !9 , !8 }
!7 = !DIDerivedType ( tag: D W _ T A G _ p o i n t e r _ type , baseType: !8 , size: 64 , align: 64 )
!8 = !DIBasicType ( name: "int" , size: 32 , align: 32 , encoding: D W _ A T E _ s i g n e d )
!9 = !DIDerivedType ( tag: D W _ T A G _ p o i n t e r _ type , baseType: !10 , size: 64 , align: 64 )
!10 = !DICompositeType ( tag: D W _ T A G _ a r r a y _ type , baseType: !8 , size: 3200 , align: 32 , elements: !11 )
!11 = ! { !12 }
!12 = !DISubrange ( count: 100 )
2016-04-16 04:51:27 +08:00
!13 = distinct !DISubprogram ( name: "invalid0" , scope: !1 , file: !1 , line: 18 , type: !14 , isLocal: false , isDefinition: true , scopeLine: 18 , flags: D I F l a g P r o t o t y p e d , isOptimized: false , unit: !0 , variables: !2 )
2015-11-12 10:32:32 +08:00
!14 = !DISubroutineType ( types: !15 )
!15 = ! { null , !7 }
2016-04-16 04:51:27 +08:00
!16 = distinct !DISubprogram ( name: "invalid1" , scope: !1 , file: !1 , line: 25 , type: !17 , isLocal: false , isDefinition: true , scopeLine: 25 , flags: D I F l a g P r o t o t y p e d , isOptimized: false , unit: !0 , variables: !2 )
2015-11-12 10:32:32 +08:00
!17 = !DISubroutineType ( types: !18 )
!18 = ! { null , !19 , !19 }
!19 = !DIDerivedType ( tag: D W _ T A G _ p o i n t e r _ type , baseType: !7 , size: 64 , align: 64 )
!20 = ! { i32 2 , !"Dwarf Version" , i32 4 }
!21 = ! { i32 2 , !"Debug Info Version" , i32 3 }
!22 = ! { !"clang version 3.8.0 (http://llvm.org/git/clang.git 65eeefc97d2eee4d075ec7d9ed56b5f0786b6421)" }
!23 = !DILocalVariable ( name: "A" , arg: 1 , scope: !4 , file: !1 , line: 3 , type: !7 )
!24 = !DIExpression ( )
!25 = !DILocation ( line: 3 , column: 17 , scope: !4 )
!26 = !DILocalVariable ( name: "B" , arg: 2 , scope: !4 , file: !1 , line: 3 , type: !7 )
!27 = !DILocation ( line: 3 , column: 25 , scope: !4 )
!28 = !DILocalVariable ( name: "N" , arg: 3 , scope: !4 , file: !1 , line: 3 , type: !8 )
!29 = !DILocation ( line: 3 , column: 32 , scope: !4 )
!30 = !DILocalVariable ( name: "M" , arg: 4 , scope: !4 , file: !1 , line: 3 , type: !8 )
!31 = !DILocation ( line: 3 , column: 39 , scope: !4 )
!32 = !DILocalVariable ( name: "C" , arg: 5 , scope: !4 , file: !1 , line: 3 , type: !9 )
!33 = !DILocation ( line: 3 , column: 46 , scope: !4 )
!34 = !DILocalVariable ( name: "Debug" , arg: 6 , scope: !4 , file: !1 , line: 3 , type: !8 )
!35 = !DILocation ( line: 3 , column: 63 , scope: !4 )
!36 = !DILocation ( line: 4 , column: 9 , scope: !37 )
!37 = distinct !DILexicalBlock ( scope: !4 , file: !1 , line: 4 , column: 7 )
!38 = !DILocation ( line: 4 , column: 13 , scope: !37 )
!39 = !DILocation ( line: 4 , column: 7 , scope: !4 )
!40 = !DILocation ( line: 5 , column: 5 , scope: !37 )
!41 = !DILocation ( line: 5 , column: 13 , scope: !37 )
!42 = !DILocalVariable ( name: "i" , scope: !43 , file: !1 , line: 7 , type: !8 )
!43 = distinct !DILexicalBlock ( scope: !4 , file: !1 , line: 7 , column: 3 )
!44 = !DILocation ( line: 7 , column: 12 , scope: !43 )
!45 = !DILocation ( line: 7 , column: 8 , scope: !43 )
!46 = !DILocation ( line: 7 , column: 21 , scope: !47 )
!47 = !DILexicalBlockFile ( scope: !48 , file: !1 , discriminator: 1 )
!48 = distinct !DILexicalBlock ( scope: !43 , file: !1 , line: 7 , column: 3 )
!49 = !DILocation ( line: 7 , column: 3 , scope: !47 )
!50 = !DILocalVariable ( name: "j" , scope: !51 , file: !1 , line: 8 , type: !8 )
!51 = distinct !DILexicalBlock ( scope: !52 , file: !1 , line: 8 , column: 5 )
!52 = distinct !DILexicalBlock ( scope: !48 , file: !1 , line: 7 , column: 31 )
!53 = !DILocation ( line: 8 , column: 14 , scope: !51 )
!54 = !DILocation ( line: 8 , column: 10 , scope: !51 )
!55 = !DILocation ( line: 8 , column: 23 , scope: !56 )
!56 = !DILexicalBlockFile ( scope: !57 , file: !1 , discriminator: 1 )
!57 = distinct !DILexicalBlock ( scope: !51 , file: !1 , line: 8 , column: 5 )
!58 = !DILocation ( line: 8 , column: 5 , scope: !56 )
!59 = !DILocation ( line: 9 , column: 22 , scope: !60 )
!60 = distinct !DILexicalBlock ( scope: !57 , file: !1 , line: 8 , column: 34 )
!61 = !DILocation ( line: 9 , column: 26 , scope: !60 )
!62 = !DILocation ( line: 9 , column: 18 , scope: !60 )
!63 = !DILocation ( line: 9 , column: 37 , scope: !60 )
!64 = !DILocation ( line: 9 , column: 33 , scope: !60 )
!65 = !DILocation ( line: 9 , column: 31 , scope: !60 )
!66 = !DILocation ( line: 9 , column: 7 , scope: !60 )
!67 = !DILocation ( line: 9 , column: 15 , scope: !60 )
!68 = !DILocation ( line: 10 , column: 5 , scope: !60 )
!69 = !DILocation ( line: 8 , column: 5 , scope: !57 )
!70 = !DILocation ( line: 12 , column: 9 , scope: !71 )
!71 = distinct !DILexicalBlock ( scope: !52 , file: !1 , line: 12 , column: 9 )
!72 = !DILocation ( line: 12 , column: 9 , scope: !52 )
!73 = !DILocation ( line: 13 , column: 7 , scope: !71 )
!74 = !DILocation ( line: 14 , column: 3 , scope: !52 )
!75 = !DILocation ( line: 7 , column: 3 , scope: !48 )
!76 = !DILocation ( line: 16 , column: 1 , scope: !4 )
!77 = !DILocalVariable ( name: "A" , arg: 1 , scope: !13 , file: !1 , line: 18 , type: !7 )
!78 = !DILocation ( line: 18 , column: 20 , scope: !13 )
!79 = !DILocalVariable ( name: "i" , scope: !80 , file: !1 , line: 19 , type: !8 )
!80 = distinct !DILexicalBlock ( scope: !13 , file: !1 , line: 19 , column: 3 )
!81 = !DILocation ( line: 19 , column: 12 , scope: !80 )
!82 = !DILocation ( line: 19 , column: 8 , scope: !80 )
!83 = !DILocation ( line: 19 , column: 3 , scope: !84 )
!84 = !DILexicalBlockFile ( scope: !85 , file: !1 , discriminator: 1 )
!85 = distinct !DILexicalBlock ( scope: !80 , file: !1 , line: 19 , column: 3 )
!86 = !DILocalVariable ( name: "j" , scope: !87 , file: !1 , line: 20 , type: !8 )
!87 = distinct !DILexicalBlock ( scope: !85 , file: !1 , line: 20 , column: 5 )
!88 = !DILocation ( line: 20 , column: 14 , scope: !87 )
!89 = !DILocation ( line: 20 , column: 10 , scope: !87 )
!90 = !DILocation ( line: 20 , column: 5 , scope: !91 )
!91 = !DILexicalBlockFile ( scope: !92 , file: !1 , discriminator: 1 )
!92 = distinct !DILexicalBlock ( scope: !87 , file: !1 , line: 20 , column: 5 )
!93 = !DILocation ( line: 21 , column: 11 , scope: !94 )
!94 = distinct !DILexicalBlock ( scope: !92 , file: !1 , line: 21 , column: 11 )
!95 = !DILocation ( line: 21 , column: 11 , scope: !92 )
!96 = !DILocation ( line: 22 , column: 14 , scope: !94 )
!97 = !DILocation ( line: 22 , column: 9 , scope: !94 )
!98 = !DILocation ( line: 21 , column: 14 , scope: !99 )
!99 = !DILexicalBlockFile ( scope: !94 , file: !1 , discriminator: 1 )
!100 = !DILocation ( line: 20 , column: 30 , scope: !92 )
!101 = !DILocation ( line: 20 , column: 5 , scope: !92 )
!102 = !DILocation ( line: 22 , column: 16 , scope: !87 )
!103 = !DILocation ( line: 19 , column: 28 , scope: !85 )
!104 = !DILocation ( line: 19 , column: 3 , scope: !85 )
!105 = !DILocation ( line: 23 , column: 1 , scope: !13 )
!106 = !DILocalVariable ( name: "A" , arg: 1 , scope: !16 , file: !1 , line: 25 , type: !19 )
!107 = !DILocation ( line: 25 , column: 21 , scope: !16 )
!108 = !DILocalVariable ( name: "B" , arg: 2 , scope: !16 , file: !1 , line: 25 , type: !19 )
!109 = !DILocation ( line: 25 , column: 30 , scope: !16 )
!110 = !DILocalVariable ( name: "i" , scope: !111 , file: !1 , line: 26 , type: !8 )
!111 = distinct !DILexicalBlock ( scope: !16 , file: !1 , line: 26 , column: 3 )
!112 = !DILocation ( line: 26 , column: 12 , scope: !111 )
!113 = !DILocation ( line: 26 , column: 8 , scope: !111 )
!114 = !DILocation ( line: 26 , column: 3 , scope: !115 )
!115 = !DILexicalBlockFile ( scope: !116 , file: !1 , discriminator: 1 )
!116 = distinct !DILexicalBlock ( scope: !111 , file: !1 , line: 26 , column: 3 )
!117 = !DILocalVariable ( name: "j" , scope: !118 , file: !1 , line: 27 , type: !8 )
!118 = distinct !DILexicalBlock ( scope: !116 , file: !1 , line: 27 , column: 5 )
!119 = !DILocation ( line: 27 , column: 14 , scope: !118 )
!120 = !DILocation ( line: 27 , column: 10 , scope: !118 )
!121 = !DILocation ( line: 27 , column: 5 , scope: !122 )
!122 = !DILexicalBlockFile ( scope: !123 , file: !1 , discriminator: 1 )
!123 = distinct !DILexicalBlock ( scope: !118 , file: !1 , line: 27 , column: 5 )
!124 = !DILocation ( line: 28 , column: 17 , scope: !123 )
!125 = !DILocation ( line: 28 , column: 7 , scope: !123 )
!126 = !DILocation ( line: 28 , column: 15 , scope: !123 )
!127 = !DILocation ( line: 27 , column: 5 , scope: !123 )
!128 = !DILocation ( line: 28 , column: 23 , scope: !118 )
!129 = !DILocation ( line: 26 , column: 3 , scope: !116 )
!130 = !DILocation ( line: 29 , column: 1 , scope: !16 )