<div dir="ltr">I've reverted this change as it began to cause build timeouts on sanitizer-x86_64-linux-autoconf such as <a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-autoconf/builds/44917">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-autoconf/builds/44917</a><div><br></div><div>I was able to verify that this change was responsible by verifying that without this change the reproducer below runs in ~10s and with the change it does not terminate after several minutes:</div><div>time ~/Development/new-llvm-release/bin/clang "-cc1" "-triple" "x86_64-unknown-linux-gnu" "-emit-obj" "-disable-free" "-main-file-name" "ModuleMap.cpp" "-mrelocation-model" "pic" "-pic-level" "2" "-mthread-model" "posix" "-mframe-pointer=none" "-fmath-errno" "-fno-rounding-math" "-masm-verbose" "-mconstructor-aliases" "-munwind-tables" "-fuse-init-array" "-target-cpu" "x86-64" "-dwarf-column-info" "-debug-info-kind=limited" "-dwarf-version=4" "-debugger-tuning=gdb" "-ffunction-sections" "-fdata-sections" "-D" "GTEST_HAS_RTTI=0" "-D" "_DEBUG" "-D" "_GNU_SOURCE" "-D" "__STDC_CONSTANT_MACROS" "-D" "__STDC_FORMAT_MACROS" "-D" "__STDC_LIMIT_MACROS" "-U" "NDEBUG" "-O2" "-Werror=date-time" "-Werror=unguarded-availability-new" "-Wall" "-Wextra" "-Wno-unused-parameter" "-Wwrite-strings" "-Wcast-qual" "-Wmissing-field-initializers" "-Wno-long-long" "-Wimplicit-fallthrough" "-Wcovered-switch-default" "-Wno-noexcept-type" "-Wnon-virtual-dtor" "-Wdelete-non-virtual-dtor" "-Wstring-conversion" "-Woverloaded-virtual" "-Wno-nested-anon-types" "-pedantic" "-std=c++14" "-fdeprecated-macro" "-ferror-limit" "19" "-fmessage-length" "0" "-fvisibility-inlines-hidden" "-fno-rtti" "-fgnuc-version=4.2.1" "-fobjc-runtime=gcc" "-fno-common" "-fdiagnostics-show-option" "-vectorize-loops" "-vectorize-slp" "-faddrsig" "-x" "c++" "ModuleMap-cce0b1.cpp"<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Dec 10, 2019 at 5:43 AM via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: stozer<br>
Date: 2019-12-10T13:33:32Z<br>
New Revision: f2ba93971ccc236c0eef5323704d31f48107e04f<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/f2ba93971ccc236c0eef5323704d31f48107e04f" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/f2ba93971ccc236c0eef5323704d31f48107e04f</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/f2ba93971ccc236c0eef5323704d31f48107e04f.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/f2ba93971ccc236c0eef5323704d31f48107e04f.diff</a><br>
<br>
LOG: Reapply: [DebugInfo] Recover debug intrinsics when killing duplicated/empty...<br>
<br>
basic blocks<br>
<br>
Originally applied in 72ce759928e6dfee6a9efa310b966c19722352ba.<br>
<br>
Fixed a build failure caused by incorrect use of cast instead of<br>
dyn_cast.<br>
<br>
This reverts commit 8b0780f795eb58fca0a2456e308adaaa1a0b5013.<br>
<br>
Added: <br>
    llvm/test/Transforms/SimplifyCFG/hoist-dbgvalue-else.ll<br>
    llvm/test/Transforms/SimplifyCFG/hoist-dbgvalue-empty.ll<br>
<br>
Modified: <br>
    llvm/include/llvm/Transforms/Utils/Local.h<br>
    llvm/lib/Transforms/Utils/Local.cpp<br>
    llvm/lib/Transforms/Utils/SimplifyCFG.cpp<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/llvm/include/llvm/Transforms/Utils/Local.h b/llvm/include/llvm/Transforms/Utils/Local.h<br>
index d1dc0b3e46b9..0b50ebddd00f 100644<br>
--- a/llvm/include/llvm/Transforms/Utils/Local.h<br>
+++ b/llvm/include/llvm/Transforms/Utils/Local.h<br>
@@ -178,6 +178,8 @@ bool SimplifyInstructionsInBlock(BasicBlock *BB,<br>
 /// Returns true if the dbg values have been changed.<br>
 bool replaceDbgUsesWithUndef(Instruction *I);<br>
<br>
+void setDbgVariableUndef(DbgVariableIntrinsic *DVI);<br>
+<br>
 //===----------------------------------------------------------------------===//<br>
 //  Control Flow Graph Restructuring.<br>
 //<br>
<br>
diff  --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp<br>
index 41f1dd951a84..c9d60ad2f4ad 100644<br>
--- a/llvm/lib/Transforms/Utils/Local.cpp<br>
+++ b/llvm/lib/Transforms/Utils/Local.cpp<br>
@@ -485,15 +485,19 @@ void llvm::RecursivelyDeleteTriviallyDeadInstructions(<br>
     I.eraseFromParent();<br>
   }<br>
 }<br>
+void llvm::setDbgVariableUndef(DbgVariableIntrinsic *DVI) {<br>
+  Value *DbgValue = DVI->getVariableLocation(false);<br>
+  Value *Undef = UndefValue::get(DbgValue ? DbgValue->getType()<br>
+                                          : Type::getInt1Ty(DVI->getContext()));<br>
+  DVI->setOperand(<br>
+      0, MetadataAsValue::get(DVI->getContext(), ValueAsMetadata::get(Undef)));<br>
+}<br>
<br>
 bool llvm::replaceDbgUsesWithUndef(Instruction *I) {<br>
   SmallVector<DbgVariableIntrinsic *, 1> DbgUsers;<br>
   findDbgUsers(DbgUsers, I);<br>
-  for (auto *DII : DbgUsers) {<br>
-    Value *Undef = UndefValue::get(I->getType());<br>
-    DII->setOperand(0, MetadataAsValue::get(DII->getContext(),<br>
-                                            ValueAsMetadata::get(Undef)));<br>
-  }<br>
+  for (auto *DII : DbgUsers)<br>
+    setDbgVariableUndef(DII);<br>
   return !DbgUsers.empty();<br>
 }<br>
<br>
@@ -1040,6 +1044,19 @@ bool llvm::TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB,<br>
       assert(PN->use_empty() && "There shouldn't be any uses here!");<br>
       PN->eraseFromParent();<br>
     }<br>
+    // If Succ has multiple predecessors, each debug intrinsic in BB may or may<br>
+    // not be valid when we reach Succ, so the debug variable should be set<br>
+    // undef since its value is unknown.<br>
+    Instruction *DbgInsertPoint = Succ->getFirstNonPHI();<br>
+    while (DbgInfoIntrinsic *DI = dyn_cast<DbgInfoIntrinsic>(&BB->front())) {<br>
+      if (auto DVI = dyn_cast<DbgVariableIntrinsic>(DI)) {<br>
+        if (!isa<DbgDeclareInst>(DVI))<br>
+          setDbgVariableUndef(DVI);<br>
+        DVI->moveBefore(DbgInsertPoint);<br>
+      } else {<br>
+        break;<br>
+      }<br>
+    }<br>
   }<br>
<br>
   // If the unconditional branch we replaced contains llvm.loop metadata, we<br>
<br>
diff  --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp<br>
index d93ca4f04cdb..681c344f87ab 100644<br>
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp<br>
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp<br>
@@ -13,6 +13,7 @@<br>
 #include "llvm/ADT/APInt.h"<br>
 #include "llvm/ADT/ArrayRef.h"<br>
 #include "llvm/ADT/DenseMap.h"<br>
+#include "llvm/ADT/MapVector.h"<br>
 #include "llvm/ADT/Optional.h"<br>
 #include "llvm/ADT/STLExtras.h"<br>
 #include "llvm/ADT/SetOperations.h"<br>
@@ -38,6 +39,7 @@<br>
 #include "llvm/IR/ConstantRange.h"<br>
 #include "llvm/IR/Constants.h"<br>
 #include "llvm/IR/DataLayout.h"<br>
+#include "llvm/IR/DebugInfoMetadata.h"<br>
 #include "llvm/IR/DerivedTypes.h"<br>
 #include "llvm/IR/Function.h"<br>
 #include "llvm/IR/GlobalValue.h"<br>
@@ -1250,14 +1252,38 @@ static bool HoistThenElseCodeToIf(BranchInst *BI,<br>
<br>
   Instruction *I1 = &*BB1_Itr++, *I2 = &*BB2_Itr++;<br>
   // Skip debug info if it is not identical.<br>
-  DbgInfoIntrinsic *DBI1 = dyn_cast<DbgInfoIntrinsic>(I1);<br>
-  DbgInfoIntrinsic *DBI2 = dyn_cast<DbgInfoIntrinsic>(I2);<br>
-  if (!DBI1 || !DBI2 || !DBI1->isIdenticalToWhenDefined(DBI2)) {<br>
-    while (isa<DbgInfoIntrinsic>(I1))<br>
-      I1 = &*BB1_Itr++;<br>
-    while (isa<DbgInfoIntrinsic>(I2))<br>
-      I2 = &*BB2_Itr++;<br>
-  }<br>
+<br>
+  // If the terminator instruction is hoisted, and any variable locations have<br>
+  // non-identical debug intrinsics, then those variable locations must be set<br>
+  // as undef.<br>
+  // FIXME: If each block contains identical debug variable intrinsics in a<br>
+  // <br>
diff erent order, they will be considered non-identical and be dropped.<br>
+  MapVector<DebugVariable, DbgVariableIntrinsic *> UndefDVIs;<br>
+<br>
+  auto SkipDbgInfo = [&UndefDVIs](Instruction *&I,<br>
+                                  BasicBlock::iterator &BB_Itr) {<br>
+    while (isa<DbgInfoIntrinsic>(I)) {<br>
+      if (DbgVariableIntrinsic *DVI = dyn_cast<DbgVariableIntrinsic>(I))<br>
+        UndefDVIs.insert(<br>
+            {DebugVariable(DVI->getVariable(), DVI->getExpression(),<br>
+                           DVI->getDebugLoc()->getInlinedAt()),<br>
+             DVI});<br>
+      I = &*BB_Itr++;<br>
+    }<br>
+  };<br>
+<br>
+  auto SkipNonIdenticalDbgInfo =<br>
+      [&BB1_Itr, &BB2_Itr, &SkipDbgInfo](Instruction *&I1, Instruction *&I2) {<br>
+        DbgInfoIntrinsic *DBI1 = dyn_cast<DbgInfoIntrinsic>(I1);<br>
+        DbgInfoIntrinsic *DBI2 = dyn_cast<DbgInfoIntrinsic>(I2);<br>
+        if (!DBI1 || !DBI2 || !DBI1->isIdenticalToWhenDefined(DBI2)) {<br>
+          SkipDbgInfo(I1, BB1_Itr);<br>
+          SkipDbgInfo(I2, BB2_Itr);<br>
+        }<br>
+      };<br>
+<br>
+  SkipNonIdenticalDbgInfo(I1, I2);<br>
+<br>
   // FIXME: Can we define a safety predicate for CallBr?<br>
   if (isa<PHINode>(I1) || !I1->isIdenticalToWhenDefined(I2) ||<br>
       (isa<InvokeInst>(I1) && !isSafeToHoistInvoke(BB1, BB2, I1, I2)) ||<br>
@@ -1330,15 +1356,7 @@ static bool HoistThenElseCodeToIf(BranchInst *BI,<br>
<br>
     I1 = &*BB1_Itr++;<br>
     I2 = &*BB2_Itr++;<br>
-    // Skip debug info if it is not identical.<br>
-    DbgInfoIntrinsic *DBI1 = dyn_cast<DbgInfoIntrinsic>(I1);<br>
-    DbgInfoIntrinsic *DBI2 = dyn_cast<DbgInfoIntrinsic>(I2);<br>
-    if (!DBI1 || !DBI2 || !DBI1->isIdenticalToWhenDefined(DBI2)) {<br>
-      while (isa<DbgInfoIntrinsic>(I1))<br>
-        I1 = &*BB1_Itr++;<br>
-      while (isa<DbgInfoIntrinsic>(I2))<br>
-        I2 = &*BB2_Itr++;<br>
-    }<br>
+    SkipNonIdenticalDbgInfo(I1, I2);<br>
   } while (I1->isIdenticalToWhenDefined(I2));<br>
<br>
   return true;<br>
@@ -1374,6 +1392,13 @@ static bool HoistThenElseCodeToIf(BranchInst *BI,<br>
   }<br>
<br>
   // Okay, it is safe to hoist the terminator.<br>
+  for (auto DIVariableInst : UndefDVIs) {<br>
+    DbgVariableIntrinsic *DVI = DIVariableInst.second;<br>
+    DVI->moveBefore(BI);<br>
+    if (DVI->getVariableLocation())<br>
+      setDbgVariableUndef(DVI);<br>
+  }<br>
+<br>
   Instruction *NT = I1->clone();<br>
   BIParent->getInstList().insert(BI->getIterator(), NT);<br>
   if (!NT->getType()->isVoidTy()) {<br>
<br>
diff  --git a/llvm/test/Transforms/SimplifyCFG/hoist-dbgvalue-else.ll b/llvm/test/Transforms/SimplifyCFG/hoist-dbgvalue-else.ll<br>
new file mode 100644<br>
index 000000000000..32962886be5d<br>
--- /dev/null<br>
+++ b/llvm/test/Transforms/SimplifyCFG/hoist-dbgvalue-else.ll<br>
@@ -0,0 +1,67 @@<br>
+; RUN: opt -simplifycfg -S < %s | FileCheck %s<br>
+; Checks that when the if.then and if.else blocks are both eliminated by<br>
+; SimplifyCFG, as the common code is hoisted out, the variables with a<br>
+; dbg.value in either of those blocks are set undef just before the<br>
+; conditional branch instruction.<br>
+<br>
+define i32 @"?fn@@YAHH@Z"(i32 %foo) !dbg !8 {<br>
+; CHECK-LABEL: entry:<br>
+entry:<br>
+  call void @llvm.dbg.value(metadata i32 %foo, metadata !13, metadata !DIExpression()), !dbg !16<br>
+  call void @llvm.dbg.value(metadata i32 0, metadata !14, metadata !DIExpression()), !dbg !16<br>
+  call void @llvm.dbg.value(metadata i32 0, metadata !15, metadata !DIExpression()), !dbg !16<br>
+  %cmp = icmp eq i32 %foo, 4, !dbg !17<br>
+; CHECK: call void @llvm.dbg.value(metadata i32 undef, metadata [[BEARDS:![0-9]+]]<br>
+; CHECK: call void @llvm.dbg.value(metadata i32 undef, metadata [[BIRDS:![0-9]+]]<br>
+  br i1 %cmp, label %if.then, label %if.else, !dbg !17<br>
+<br>
+if.then:                                          ; preds = %entry<br>
+  call void @llvm.dbg.value(metadata i32 8, metadata !14, metadata !DIExpression()), !dbg !16<br>
+  br label %if.end, !dbg !18<br>
+<br>
+if.else:                                          ; preds = %entry<br>
+  call void @llvm.dbg.value(metadata i32 4, metadata !14, metadata !DIExpression()), !dbg !16<br>
+  call void @llvm.dbg.value(metadata i32 8, metadata !15, metadata !DIExpression()), !dbg !16<br>
+  br label %if.end, !dbg !21<br>
+<br>
+if.end:                                           ; preds = %if.else, %if.then<br>
+  %beards.0 = phi i32 [ 8, %if.then ], [ 4, %if.else ], !dbg !23<br>
+  call void @llvm.dbg.value(metadata i32 %beards.0, metadata !14, metadata !DIExpression()), !dbg !16<br>
+  ret i32 %beards.0, !dbg !24<br>
+}<br>
+<br>
+declare void @llvm.dbg.value(metadata, metadata, metadata)<br>
+<br>
+!<a href="http://llvm.dbg.cu" rel="noreferrer" target="_blank">llvm.dbg.cu</a> = !{!0}<br>
+!llvm.module.flags = !{!3, !4, !5, !6}<br>
+!llvm.ident = !{!7}<br>
+<br>
+; CHECK-LABEL: }<br>
+; CHECK: [[BEARDS]] = !DILocalVariable(name: "beards"<br>
+; CHECK: [[BIRDS]] = !DILocalVariable(name: "birds"<br>
+<br>
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 10.0.0 ", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, nameTableKind: None)<br>
+!1 = !DIFile(filename: "test.cpp", directory: "C:\5Cdev\5Cllvm-project", checksumkind: CSK_MD5, checksum: "64604a72fdf5b6db8aa2328236bedd6b")<br>
+!2 = !{}<br>
+!3 = !{i32 2, !"CodeView", i32 1}<br>
+!4 = !{i32 2, !"Debug Info Version", i32 3}<br>
+!5 = !{i32 1, !"wchar_size", i32 2}<br>
+!6 = !{i32 7, !"PIC Level", i32 2}<br>
+!7 = !{!"clang version 10.0.0 "}<br>
+!8 = distinct !DISubprogram(name: "fn", linkageName: "?fn@@YAHH@Z", scope: !1, file: !1, line: 1, type: !9, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12)<br>
+!9 = !DISubroutineType(types: !10)<br>
+!10 = !{!11, !11}<br>
+!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)<br>
+!12 = !{!13, !14, !15}<br>
+!13 = !DILocalVariable(name: "foo", arg: 1, scope: !8, file: !1, line: 1, type: !11)<br>
+!14 = !DILocalVariable(name: "beards", scope: !8, file: !1, line: 2, type: !11)<br>
+!15 = !DILocalVariable(name: "birds", scope: !8, file: !1, line: 3, type: !11)<br>
+!16 = !DILocation(line: 0, scope: !8)<br>
+!17 = !DILocation(line: 5, scope: !8)<br>
+!18 = !DILocation(line: 8, scope: !19)<br>
+!19 = distinct !DILexicalBlock(scope: !20, file: !1, line: 5)<br>
+!20 = distinct !DILexicalBlock(scope: !8, file: !1, line: 5)<br>
+!21 = !DILocation(line: 11, scope: !22)<br>
+!22 = distinct !DILexicalBlock(scope: !20, file: !1, line: 8)<br>
+!23 = !DILocation(line: 0, scope: !20)<br>
+!24 = !DILocation(line: 13, scope: !8)<br>
<br>
diff  --git a/llvm/test/Transforms/SimplifyCFG/hoist-dbgvalue-empty.ll b/llvm/test/Transforms/SimplifyCFG/hoist-dbgvalue-empty.ll<br>
new file mode 100644<br>
index 000000000000..7d5e32a2d656<br>
--- /dev/null<br>
+++ b/llvm/test/Transforms/SimplifyCFG/hoist-dbgvalue-empty.ll<br>
@@ -0,0 +1,71 @@<br>
+; RUN: opt -simplifycfg -S < %s | FileCheck %s<br>
+; Checks that when the if.then block is eliminated due to containing no<br>
+; instructions, the debug intrinsics are hoisted out of the block before its<br>
+; deletion. The hoisted intrinsics should have undef values as the branch<br>
+; behaviour is unknown to the intrinsics after hoisting.<br>
+<br>
+define dso_local i32 @"?fn@@YAHH@Z"(i32 %foo) local_unnamed_addr !dbg !8 {<br>
+entry:<br>
+  call void @llvm.dbg.value(metadata i32 %foo, metadata !13, metadata !DIExpression()), !dbg !16<br>
+  call void @llvm.dbg.value(metadata i32 0, metadata !14, metadata !DIExpression()), !dbg !16<br>
+  call void @llvm.dbg.value(metadata i32 0, metadata !15, metadata !DIExpression()), !dbg !16<br>
+  %cmp = icmp eq i32 %foo, 4, !dbg !17<br>
+  br i1 %cmp, label %if.then, label %if.else, !dbg !17<br>
+<br>
+if.then:                                          ; preds = %entry<br>
+  call void @llvm.dbg.value(metadata i32 8, metadata !14, metadata !DIExpression()), !dbg !16<br>
+  call void @llvm.dbg.value(metadata i32 3, metadata !15, metadata !DIExpression()), !dbg !16<br>
+  br label %if.end, !dbg !18<br>
+<br>
+if.else:                                          ; preds = %entry<br>
+  call void @"?side@@YAXXZ"(), !dbg !21<br>
+  call void @llvm.dbg.value(metadata i32 4, metadata !14, metadata !DIExpression()), !dbg !16<br>
+  call void @llvm.dbg.value(metadata i32 6, metadata !15, metadata !DIExpression()), !dbg !16<br>
+  br label %if.end, !dbg !23<br>
+<br>
+; CHECK-LABEL: if.end:<br>
+if.end:                                           ; preds = %if.else, %if.then<br>
+; CHECK: call void @llvm.dbg.value(metadata i32 undef, metadata [[BEARDS:![0-9]+]]<br>
+; CHECK: call void @llvm.dbg.value(metadata i32 undef, metadata [[BIRDS:![0-9]+]]<br>
+  %beards.0 = phi i32 [ 8, %if.then ], [ 4, %if.else ], !dbg !24<br>
+  call void @llvm.dbg.value(metadata i32 %beards.0, metadata !14, metadata !DIExpression()), !dbg !16<br>
+  ret i32 %beards.0, !dbg !25<br>
+}<br>
+<br>
+declare dso_local void @"?side@@YAXXZ"() local_unnamed_addr<br>
+<br>
+declare void @llvm.dbg.value(metadata, metadata, metadata)<br>
+<br>
+!<a href="http://llvm.dbg.cu" rel="noreferrer" target="_blank">llvm.dbg.cu</a> = !{!0}<br>
+!llvm.module.flags = !{!3, !4, !5, !6}<br>
+!llvm.ident = !{!7}<br>
+<br>
+; CHECK: [[BEARDS]] = !DILocalVariable(name: "beards"<br>
+; CHECK: [[BIRDS]] = !DILocalVariable(name: "birds"<br>
+<br>
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 10.0.0 ", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, nameTableKind: None)<br>
+!1 = !DIFile(filename: "test2.cpp", directory: "C:\5Cdev\5Cllvm-project", checksumkind: CSK_MD5, checksum: "8ac5d40fcc9914d6479c1a770dfdc176")<br>
+!2 = !{}<br>
+!3 = !{i32 2, !"CodeView", i32 1}<br>
+!4 = !{i32 2, !"Debug Info Version", i32 3}<br>
+!5 = !{i32 1, !"wchar_size", i32 2}<br>
+!6 = !{i32 7, !"PIC Level", i32 2}<br>
+!7 = !{!"clang version 10.0.0 "}<br>
+!8 = distinct !DISubprogram(name: "fn", linkageName: "?fn@@YAHH@Z", scope: !1, file: !1, line: 3, type: !9, scopeLine: 3, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12)<br>
+!9 = !DISubroutineType(types: !10)<br>
+!10 = !{!11, !11}<br>
+!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)<br>
+!12 = !{!13, !14, !15}<br>
+!13 = !DILocalVariable(name: "foo", arg: 1, scope: !8, file: !1, line: 3, type: !11)<br>
+!14 = !DILocalVariable(name: "beards", scope: !8, file: !1, line: 4, type: !11)<br>
+!15 = !DILocalVariable(name: "birds", scope: !8, file: !1, line: 5, type: !11)<br>
+!16 = !DILocation(line: 0, scope: !8)<br>
+!17 = !DILocation(line: 7, scope: !8)<br>
+!18 = !DILocation(line: 10, scope: !19)<br>
+!19 = distinct !DILexicalBlock(scope: !20, file: !1, line: 7)<br>
+!20 = distinct !DILexicalBlock(scope: !8, file: !1, line: 7)<br>
+!21 = !DILocation(line: 11, scope: !22)<br>
+!22 = distinct !DILexicalBlock(scope: !20, file: !1, line: 10)<br>
+!23 = !DILocation(line: 14, scope: !22)<br>
+!24 = !DILocation(line: 0, scope: !20)<br>
+!25 = !DILocation(line: 16, scope: !8)<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>