diff options
author | Johannes Doerfert <doerfert@cs.uni-saarland.de> | 2015-11-12 02:32:32 +0000 |
---|---|---|
committer | Johannes Doerfert <doerfert@cs.uni-saarland.de> | 2015-11-12 02:32:32 +0000 |
commit | 48fe86f1ffa74917f476211247c899e630b0fef8 (patch) | |
tree | 6e20a6354d7eaca9b53121866c827b01e7b0e944 | |
parent | ee293c0aacce7ba27a99b3d8bcf765c8e1e9b5c3 (diff) | |
download | bcm5719-llvm-48fe86f1ffa74917f476211247c899e630b0fef8.tar.gz bcm5719-llvm-48fe86f1ffa74917f476211247c899e630b0fef8.zip |
Emit SCoP source location as remark during ScopInfo
This removes a similar feature from ScopDetection, though with
-polly-report that feature present twice anyway.
llvm-svn: 252846
-rw-r--r-- | polly/include/polly/ScopDetectionDiagnostic.h | 9 | ||||
-rw-r--r-- | polly/lib/Analysis/ScopDetection.cpp | 3 | ||||
-rw-r--r-- | polly/lib/Analysis/ScopDetectionDiagnostic.cpp | 13 | ||||
-rw-r--r-- | polly/lib/Analysis/ScopInfo.cpp | 19 | ||||
-rw-r--r-- | polly/test/ScopInfo/remarks.ll | 309 |
5 files changed, 327 insertions, 26 deletions
diff --git a/polly/include/polly/ScopDetectionDiagnostic.h b/polly/include/polly/ScopDetectionDiagnostic.h index ab51773d2ec..e428a2484fa 100644 --- a/polly/include/polly/ScopDetectionDiagnostic.h +++ b/polly/include/polly/ScopDetectionDiagnostic.h @@ -43,6 +43,9 @@ class Region; namespace polly { +/// @brief Set the begin and end source location for the given region @p R. +void getDebugLocations(const Region *R, DebugLoc &Begin, DebugLoc &End); + class RejectLog; /// @brief Emit optimization remarks about the rejected regions to the user. /// @@ -52,12 +55,6 @@ class RejectLog; /// @param Log The error log containing all messages being emitted as remark. void emitRejectionRemarks(const llvm::Function &F, const RejectLog &Log); -/// @brief Emit diagnostic remarks for a valid Scop -/// -/// @param F The function we emit remarks for -/// @param R The region that marks a valid Scop -void emitValidRemarks(const llvm::Function &F, const Region *R); - // Discriminator for LLVM-style RTTI (dyn_cast<> et al.) enum RejectReasonKind { // CFG Category diff --git a/polly/lib/Analysis/ScopDetection.cpp b/polly/lib/Analysis/ScopDetection.cpp index 910243c9356..1ec38d566ed 100644 --- a/polly/lib/Analysis/ScopDetection.cpp +++ b/polly/lib/Analysis/ScopDetection.cpp @@ -1138,9 +1138,6 @@ bool ScopDetection::runOnFunction(llvm::Function &F) { emitMissedRemarksForLeaves(F, TopRegion); } - for (const Region *R : ValidRegions) - emitValidRemarks(F, R); - if (ReportLevel) printLocations(F); diff --git a/polly/lib/Analysis/ScopDetectionDiagnostic.cpp b/polly/lib/Analysis/ScopDetectionDiagnostic.cpp index 4eabfc9c9de..62fe092d394 100644 --- a/polly/lib/Analysis/ScopDetectionDiagnostic.cpp +++ b/polly/lib/Analysis/ScopDetectionDiagnostic.cpp @@ -68,7 +68,7 @@ static bool operator<(const llvm::DebugLoc &LHS, const llvm::DebugLoc &RHS) { } namespace polly { -static void getDebugLocations(const Region *R, DebugLoc &Begin, DebugLoc &End) { +void getDebugLocations(const Region *R, DebugLoc &Begin, DebugLoc &End) { for (const BasicBlock *BB : R->blocks()) for (const Instruction &Inst : *BB) { DebugLoc DL = Inst.getDebugLoc(); @@ -102,17 +102,6 @@ void emitRejectionRemarks(const llvm::Function &F, const RejectLog &Log) { "Invalid Scop candidate ends here."); } -void emitValidRemarks(const llvm::Function &F, const Region *R) { - LLVMContext &Ctx = F.getContext(); - - DebugLoc Begin, End; - getDebugLocations(R, Begin, End); - - emitOptimizationRemark(Ctx, DEBUG_TYPE, F, Begin, - "A valid Scop begins here."); - emitOptimizationRemark(Ctx, DEBUG_TYPE, F, End, "A valid Scop ends here."); -} - //===----------------------------------------------------------------------===// // RejectReason. const DebugLoc RejectReason::Unknown = DebugLoc(); diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index ad546670a26..3bfb07a0d73 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -34,6 +34,7 @@ #include "llvm/Analysis/LoopIterator.h" #include "llvm/Analysis/RegionIterator.h" #include "llvm/Analysis/ScalarEvolutionExpressions.h" +#include "llvm/IR/DiagnosticInfo.h" #include "llvm/Support/Debug.h" #include "isl/aff.h" #include "isl/constraint.h" @@ -3837,20 +3838,28 @@ bool ScopInfo::runOnRegion(Region *R, RGPassManager &RGM) { TD = &F->getParent()->getDataLayout(); DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree(); + DebugLoc Beg, End; + getDebugLocations(R, Beg, End); + std::string Msg = "SCoP begins here."; + emitOptimizationRemarkAnalysis(F->getContext(), DEBUG_TYPE, *F, Beg, Msg); + buildScop(*R, DT); DEBUG(scop->print(dbgs())); if (scop->isEmpty() || !scop->hasFeasibleRuntimeContext()) { + Msg = "SCoP ends here but was dismissed."; delete scop; scop = nullptr; - return false; + } else { + Msg = "SCoP ends here."; + ++ScopFound; + if (scop->getMaxLoopDepth() > 0) + ++RichScopFound; } - // Statistics. - ++ScopFound; - if (scop->getMaxLoopDepth() > 0) - ++RichScopFound; + emitOptimizationRemarkAnalysis(F->getContext(), DEBUG_TYPE, *F, End, Msg); + return false; } diff --git a/polly/test/ScopInfo/remarks.ll b/polly/test/ScopInfo/remarks.ll new file mode 100644 index 00000000000..2f1a97840c8 --- /dev/null +++ b/polly/test/ScopInfo/remarks.ll @@ -0,0 +1,309 @@ +; RUN: opt %loadPolly -pass-remarks-analysis="polly-scops" -polly-scops < %s 2>&1| FileCheck %s +; +; CHECK: remark: test/ScopInfo/remarks.c:4:7: SCoP begins here. +; CHECK: remark: test/ScopInfo/remarks.c:14:3: SCoP ends here. +; CHECK: remark: test/ScopInfo/remarks.c:19:3: SCoP begins here. +; 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} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 3.8.0 (http://llvm.org/git/clang.git 65eeefc97d2eee4d075ec7d9ed56b5f0786b6421)", isOptimized: false, runtimeVersion: 0, emissionKind: 1, enums: !2, subprograms: !3) +!1 = !DIFile(filename: "test/ScopInfo/remarks.c", directory: "/home/johannes/repos/llvm-polly/tools/polly") +!2 = !{} +!3 = !{!4, !13, !16} +!4 = distinct !DISubprogram(name: "valid", scope: !1, file: !1, line: 3, type: !5, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: false, variables: !2) +!5 = !DISubroutineType(types: !6) +!6 = !{null, !7, !7, !8, !8, !9, !8} +!7 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !8, size: 64, align: 64) +!8 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed) +!9 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !10, size: 64, align: 64) +!10 = !DICompositeType(tag: DW_TAG_array_type, baseType: !8, size: 3200, align: 32, elements: !11) +!11 = !{!12} +!12 = !DISubrange(count: 100) +!13 = distinct !DISubprogram(name: "invalid0", scope: !1, file: !1, line: 18, type: !14, isLocal: false, isDefinition: true, scopeLine: 18, flags: DIFlagPrototyped, isOptimized: false, variables: !2) +!14 = !DISubroutineType(types: !15) +!15 = !{null, !7} +!16 = distinct !DISubprogram(name: "invalid1", scope: !1, file: !1, line: 25, type: !17, isLocal: false, isDefinition: true, scopeLine: 25, flags: DIFlagPrototyped, isOptimized: false, variables: !2) +!17 = !DISubroutineType(types: !18) +!18 = !{null, !19, !19} +!19 = !DIDerivedType(tag: DW_TAG_pointer_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) |