Index: llvm/lib/Transforms/Scalar/GVN.cpp =================================================================== --- llvm/lib/Transforms/Scalar/GVN.cpp +++ llvm/lib/Transforms/Scalar/GVN.cpp @@ -1369,6 +1369,8 @@ unsigned int NumInsts = MaxNumInsnsPerBlock; for (Instruction &Inst : *SuccBB) { + if (Inst.isDebugOrPseudoInst()) + continue; if (--NumInsts == 0) return nullptr; Index: llvm/test/Transforms/GVN/PRE/pre-load-dbg.ll =================================================================== --- /dev/null +++ llvm/test/Transforms/GVN/PRE/pre-load-dbg.ll @@ -0,0 +1,319 @@ +; RUN: opt < %s -passes=gvn -enable-load-pre -S | FileCheck %s + +; Debug information should not impact gvn. The following two functions have same +; code except debug information. They should generate same optimized +; instructions. + +%struct.a = type { i16 } + +@f = local_unnamed_addr global i16 0, align 1 +@q = local_unnamed_addr global i16 0, align 1 +@l = local_unnamed_addr global i32 0, align 1 +@g = local_unnamed_addr global i32 0, align 1 +@i = local_unnamed_addr global i32 0, align 1 +@r = local_unnamed_addr global i32 0, align 1 +@n = local_unnamed_addr global i16 0, align 1 +@m = local_unnamed_addr global ptr null, align 1 +@p = local_unnamed_addr global i16 0, align 1 +@o = local_unnamed_addr global i16 0, align 1 +@k = local_unnamed_addr global i32 0, align 1 +@h = global %struct.a zeroinitializer, align 1 + +define void @withdbg() { +; CHECK-LABEL: @withdbg +; CHECK: [[PRE_PRE1:%.*]] = load i16, ptr @f, align 1 +; CHECK-NEXT: [[PRE_PRE2:%.*]] = load ptr, ptr @m, align 1 +; CHECK-NEXT: br i1 true, label %[[BLOCK1:.*]], label %[[BLOCK2:.*]] +; CHECK: [[BLOCK1]]: +; CHECK-NEXT: [[CONV:%.*]] = sext i16 [[PRE_PRE1]] to i32 +; CHECK-NEXT: store i32 [[CONV]], ptr [[PRE_PRE2]], align 1 + +entry: + %agg.tmp.ensured.sroa.0.i = alloca i16, align 1 + br i1 icmp ne (ptr @withdbg, ptr null), label %lor.end, label %lor.rhs + +lor.rhs: ; preds = %entry + call void @llvm.lifetime.start.p0(i64 1, ptr %agg.tmp.ensured.sroa.0.i) + call void @llvm.dbg.declare(metadata ptr undef, metadata !46, metadata !DIExpression()), !dbg !40 + call void @llvm.dbg.declare(metadata ptr undef, metadata !47, metadata !DIExpression()), !dbg !58 + call void @llvm.dbg.declare(metadata ptr undef, metadata !48, metadata !DIExpression()), !dbg !59 + call void @llvm.dbg.declare(metadata ptr undef, metadata !49, metadata !DIExpression()), !dbg !60 + call void @llvm.dbg.declare(metadata ptr undef, metadata !50, metadata !DIExpression()), !dbg !61 + call void @llvm.dbg.declare(metadata ptr undef, metadata !51, metadata !DIExpression()), !dbg !62 + call void @llvm.dbg.value(metadata i32 0, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 0, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -1, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 -1, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.1.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.1.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -2, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 -2, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.2.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.2.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -3, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 -3, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.3.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.3.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -4, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 -4, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.4.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.4.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -5, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 -5, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.5.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.5.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -6, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 -6, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.6.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.6.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -7, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 -7, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.7.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.7.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -8, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 -8, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.8.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.8.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -9, metadata !52, metadata !DIExpression()), !dbg !63 + %0 = load i32, ptr @k, align 1 + %1 = load i16, ptr @p, align 1 + %conv.i = sext i16 %1 to i32 + %add.i = add nsw i32 %0, %conv.i + store i32 %add.i, ptr @k, align 1 + %conv2.i = trunc i32 %add.i to i16 + store i16 %conv2.i, ptr @o, align 1 + call void @llvm.dbg.declare(metadata ptr undef, metadata !74, metadata !DIExpression()), !dbg !81 + call void @llvm.dbg.declare(metadata ptr undef, metadata !79, metadata !DIExpression()), !dbg !82 + call void @llvm.dbg.declare(metadata ptr undef, metadata !80, metadata !DIExpression()), !dbg !83 + %2 = load i16, ptr @f, align 1 + %cmp.i.i = icmp sgt i16 %2, 5 + %shr.i.i = lshr i16 67, %2 + %cmp1.i.i = icmp ult i16 %shr.i.i, 9 + %3 = select i1 %cmp.i.i, i1 true, i1 %cmp1.i.i + %shl.i.i = shl i16 9, %2 + %cond.i.i = select i1 %3, i16 1, i16 %shl.i.i + store i16 %cond.i.i, ptr @q, align 1 + %conv.i.i = sext i16 %cond.i.i to i32 + %4 = inttoptr i32 %conv.i.i to ptr + %cmp2.i.i = icmp ugt ptr %4, @s + %conv4.i.i = zext i1 %cmp2.i.i to i32 + %5 = load i32, ptr @l, align 1 + %and.i.i = and i32 %5, %conv4.i.i + store i32 %and.i.i, ptr @l, align 1 + %6 = load i32, ptr @g, align 1 + %tobool.i.i = icmp ne i32 %6, 0 + %7 = load i32, ptr @i, align 1 + %tobool5.i.i = icmp ne i32 %7, 0 + %8 = select i1 %tobool.i.i, i1 %tobool5.i.i, i1 false + %conv6.i.i = zext i1 %8 to i32 + %add.i.i = add nsw i32 %6, %conv6.i.i + store i32 %add.i.i, ptr @r, align 1 + %9 = load i16, ptr @n, align 1 + %conv7.i.i = sext i16 %9 to i32 + %cmp8.i.i = icmp eq i32 %add.i.i, %conv7.i.i + %conv10.i.i = zext i1 %cmp8.i.i to i32 + %10 = load ptr, ptr @m, align 1 + br label %lor.end + +lor.end: ; preds = %lor.rhs, %entry + %tmp11 = load i16, ptr @f, align 1 + %conv.i.i6 = sext i16 %tmp11 to i32 + %tmp12 = load ptr, ptr @m, align 1 + store i32 %conv.i.i6, ptr %tmp12, align 1 + ret void +} + +define void @lessdbg() { +; CHECK-LABEL: @lessdbg +; CHECK: [[PRE_PRE1:%.*]] = load i16, ptr @f, align 1 +; CHECK-NEXT: [[PRE_PRE2:%.*]] = load ptr, ptr @m, align 1 +; CHECK-NEXT: br i1 true, label %[[BLOCK1:.*]], label %[[BLOCK2:.*]] +; CHECK: [[BLOCK1]]: +; CHECK-NEXT: [[CONV:%.*]] = sext i16 [[PRE_PRE1]] to i32 +; CHECK-NEXT: store i32 [[CONV]], ptr [[PRE_PRE2]], align 1 + +entry: + %agg.tmp.ensured.sroa.0.i = alloca i16, align 1 + br i1 icmp ne (ptr @lessdbg, ptr null), label %lor.end, label %lor.rhs + +lor.rhs: ; preds = %entry + call void @llvm.lifetime.start.p0(i64 1, ptr %agg.tmp.ensured.sroa.0.i) + %agg.tmp.ensured.sroa.0.0.copyload.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -1, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 -1, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.1.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.1.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -2, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 -2, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.2.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.2.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -3, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 -3, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.3.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.3.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -4, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 -4, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.4.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.4.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -5, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 -5, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.5.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.5.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -6, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 -6, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.6.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.6.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -7, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 -7, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.7.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.7.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -8, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.value(metadata i32 -8, metadata !52, metadata !DIExpression()), !dbg !63 + call void @llvm.dbg.declare(metadata ptr undef, metadata !53, metadata !DIExpression()), !dbg !64 + call void @llvm.dbg.declare(metadata ptr undef, metadata !57, metadata !DIExpression()), !dbg !65 + %agg.tmp.ensured.sroa.0.0.copyload.8.i = load volatile i16, ptr @h, align 1 + store volatile i16 %agg.tmp.ensured.sroa.0.0.copyload.8.i, ptr %agg.tmp.ensured.sroa.0.i, align 1 + call void @llvm.dbg.value(metadata i32 -9, metadata !52, metadata !DIExpression()), !dbg !63 + %0 = load i32, ptr @k, align 1 + %1 = load i16, ptr @p, align 1 + %conv.i = sext i16 %1 to i32 + %add.i = add nsw i32 %0, %conv.i + store i32 %add.i, ptr @k, align 1 + %conv2.i = trunc i32 %add.i to i16 + store i16 %conv2.i, ptr @o, align 1 + call void @llvm.dbg.declare(metadata ptr undef, metadata !74, metadata !DIExpression()), !dbg !81 + call void @llvm.dbg.declare(metadata ptr undef, metadata !79, metadata !DIExpression()), !dbg !82 + call void @llvm.dbg.declare(metadata ptr undef, metadata !80, metadata !DIExpression()), !dbg !83 + %2 = load i16, ptr @f, align 1 + %cmp.i.i = icmp sgt i16 %2, 5 + %shr.i.i = lshr i16 67, %2 + %cmp1.i.i = icmp ult i16 %shr.i.i, 9 + %3 = select i1 %cmp.i.i, i1 true, i1 %cmp1.i.i + %shl.i.i = shl i16 9, %2 + %cond.i.i = select i1 %3, i16 1, i16 %shl.i.i + store i16 %cond.i.i, ptr @q, align 1 + %conv.i.i = sext i16 %cond.i.i to i32 + %4 = inttoptr i32 %conv.i.i to ptr + %cmp2.i.i = icmp ugt ptr %4, @s + %conv4.i.i = zext i1 %cmp2.i.i to i32 + %5 = load i32, ptr @l, align 1 + %and.i.i = and i32 %5, %conv4.i.i + store i32 %and.i.i, ptr @l, align 1 + %6 = load i32, ptr @g, align 1 + %tobool.i.i = icmp ne i32 %6, 0 + %7 = load i32, ptr @i, align 1 + %tobool5.i.i = icmp ne i32 %7, 0 + %8 = select i1 %tobool.i.i, i1 %tobool5.i.i, i1 false + %conv6.i.i = zext i1 %8 to i32 + %add.i.i = add nsw i32 %6, %conv6.i.i + store i32 %add.i.i, ptr @r, align 1 + %9 = load i16, ptr @n, align 1 + %conv7.i.i = sext i16 %9 to i32 + %cmp8.i.i = icmp eq i32 %add.i.i, %conv7.i.i + %conv10.i.i = zext i1 %cmp8.i.i to i32 + %10 = load ptr, ptr @m, align 1 + br label %lor.end + +lor.end: ; preds = %lor.rhs, %entry + %tmp11 = load i16, ptr @f, align 1 + %conv.i.i6 = sext i16 %tmp11 to i32 + %tmp12 = load ptr, ptr @m, align 1 + store i32 %conv.i.i6, ptr %tmp12, align 1 + ret void +} + +declare void @llvm.dbg.declare(metadata, metadata, metadata) +declare void @s(...) +declare void @llvm.dbg.value(metadata, metadata, metadata) +declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!35, !36, !37, !38} +!llvm.ident = !{!39} + +!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, producer: "clang version 17.0.0.prerel", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None) +!1 = !DIFile(filename: "bbi-78272.c", directory: "/tmp") +!5 = !DIBasicType(name: "int", size: 16, encoding: DW_ATE_signed) + +!16 = !DIDerivedType(tag: DW_TAG_typedef, name: "e", file: !1, line: 1, baseType: !17) +!17 = !DIBasicType(name: "long", size: 32, encoding: DW_ATE_signed) + +!32 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "a", file: !1, line: 4, size: 16, elements: !33) +!33 = !{!34} +!34 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !32, file: !1, line: 5, baseType: !5, size: 16) +!35 = !{i32 7, !"Dwarf Version", i32 4} +!36 = !{i32 2, !"Debug Info Version", i32 3} +!37 = !{i32 1, !"wchar_size", i32 1} +!38 = !{i32 7, !"frame-pointer", i32 2} +!39 = !{!"clang version 17.0.0.prerel"} +!40 = !DILocation(line: 15, column: 7, scope: !41) +!41 = distinct !DISubprogram(name: "x", scope: !1, file: !1, line: 14, type: !42, scopeLine: 14, flags: DIFlagAllCallsDescribed, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !45) +!42 = !DISubroutineType(types: !43) +!43 = !{!44} +!44 = !DIBasicType(name: "unsigned int", size: 16, encoding: DW_ATE_unsigned) +!45 = !{!46, !47, !48, !49, !50, !51, !52, !53, !57} +!46 = !DILocalVariable(name: "t", scope: !41, file: !1, line: 15, type: !5) +!47 = !DILocalVariable(name: "c", scope: !41, file: !1, line: 15, type: !5) +!48 = !DILocalVariable(name: "v", scope: !41, file: !1, line: 15, type: !5) +!49 = !DILocalVariable(name: "d", scope: !41, file: !1, line: 15, type: !5) +!50 = !DILocalVariable(name: "u", scope: !41, file: !1, line: 16, type: !17) +!51 = !DILocalVariable(name: "a", scope: !41, file: !1, line: 16, type: !17) +!52 = !DILocalVariable(name: "j", scope: !41, file: !1, line: 16, type: !17) +!53 = !DILocalVariable(name: "e", scope: !54, file: !1, line: 18, type: !16) +!54 = distinct !DILexicalBlock(scope: !55, file: !1, line: 17, column: 24) +!55 = distinct !DILexicalBlock(scope: !56, file: !1, line: 17, column: 3) +!56 = distinct !DILexicalBlock(scope: !41, file: !1, line: 17, column: 3) +!57 = !DILocalVariable(name: "d", scope: !54, file: !1, line: 19, type: !5) +!58 = !DILocation(line: 15, column: 10, scope: !41) +!59 = !DILocation(line: 15, column: 13, scope: !41) +!60 = !DILocation(line: 15, column: 16, scope: !41) +!61 = !DILocation(line: 16, column: 8, scope: !41) +!62 = !DILocation(line: 16, column: 11, scope: !41) +!63 = !DILocation(line: 0, scope: !41) +!64 = !DILocation(line: 18, column: 7, scope: !54) +!65 = !DILocation(line: 19, column: 9, scope: !54) +!74 = !DILocalVariable(name: "b", scope: !75, file: !1, line: 26, type: !17) +!75 = distinct !DISubprogram(name: "y", scope: !1, file: !1, line: 25, type: !76, scopeLine: 25, flags: DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !78) +!76 = !DISubroutineType(types: !77) +!77 = !{null} +!78 = !{!74, !79, !80} +!79 = !DILocalVariable(name: "c", scope: !75, file: !1, line: 26, type: !17) +!80 = !DILocalVariable(name: "d", scope: !75, file: !1, line: 27, type: !5) +!81 = !DILocation(line: 26, column: 8, scope: !75) +!82 = !DILocation(line: 26, column: 11, scope: !75) +!83 = !DILocation(line: 27, column: 7, scope: !75)