LiveDebugValues: Fix another crash related to unreachable blocks
authorAdrian Prantl <aprantl@apple.com>
Tue, 9 Aug 2022 17:34:57 +0000 (10:34 -0700)
committerAdrian Prantl <aprantl@apple.com>
Tue, 9 Aug 2022 17:34:57 +0000 (10:34 -0700)
This is a follow-up patch to D130999. In the test, the MIR contains an
unreachable MBB but the code attempts to look it up in MLocs. This
patch fixes this issue by checking for the default-constructed value.

rdar://97226240

Differential Revision: https://reviews.llvm.org/D131453

llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp
llvm/test/DebugInfo/MIR/X86/ldv_unreachable_blocks2.mir [new file with mode: 0644]

index 968283e..aa3e7a3 100644 (file)
@@ -297,6 +297,8 @@ public:
     for (auto Location : MTracker->locations()) {
       LocIdx Idx = Location.Idx;
       ValueIDNum &VNum = MLocs[Idx.asU64()];
+      if (VNum == ValueIDNum::EmptyValue)
+        continue;
       VarLocs.push_back(VNum);
 
       // Is there a variable that wants a location for this value? If not, skip.
diff --git a/llvm/test/DebugInfo/MIR/X86/ldv_unreachable_blocks2.mir b/llvm/test/DebugInfo/MIR/X86/ldv_unreachable_blocks2.mir
new file mode 100644 (file)
index 0000000..d1fbb25
--- /dev/null
@@ -0,0 +1,32 @@
+# RUN: llc -mtriple=x86_64-apple-macos %s -start-before=livedebugvalues -filetype=obj -o - | llvm-dwarfdump - | FileCheck %s
+# CHECK: DW_TAG_subprogram
+# Test that LiveDebugValues can handle MBBs that are not reachable in a RPOT.
+--- |
+  define hidden zeroext i1 @__foo_block_invoke(i8* nocapture noundef readonly %.block_descriptor, i64 noundef %type) !dbg !7 {
+  entry:
+    unreachable
+  do.body.i129.i:                                   ; preds = %if.else6.i128.i
+    unreachable
+  }
+  !llvm.dbg.cu = !{!3}
+  !llvm.module.flags = !{!5, !6}
+  !2 = !{}
+  !3 = distinct !DICompileUnit(language: DW_LANG_C99, file: !4, producer: "clang", runtimeVersion: 0, emissionKind: FullDebug)
+  !4 = !DIFile(filename: "t.c", directory: "/")
+  !5 = !{i32 2, !"Debug Info Version", i32 3}
+  !6 = !{i32 1, !"LTOPostLink", i32 1}
+  !7 = distinct !DISubprogram(name: "__foo_block_invoke", scope: !4, file: !4, line: 573, type: !9, scopeLine: 573, flags: DIFlagPrototyped, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !3, retainedNodes: !2)
+  !9 = !DISubroutineType(types: !2)
+  !11 = !DILocalVariable(name: ".block_descriptor", arg: 1, scope: !7, file: !4, line: 557, type: !12, flags: DIFlagArtificial)
+  !12 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !13, size: 64)
+  !13 = !DICompositeType(tag: DW_TAG_structure_type, name: "__block_literal_1", scope: !4, file: !4, line: 557, size: 392, elements: !2)
+  !15 = !DILocation(line: 558, column: 7, scope: !7)
+name:            __foo_block_invoke
+body:             |
+  bb.0.entry:
+    DBG_VALUE $rdi, $noreg, !11, !DIExpression(), debug-location !15
+    $ecx = MOV32rr undef $edi, implicit $dil, debug-location !15
+  bb.2:
+    successors: 
+    TRAP
+  bb.21.do.body.i129.i (address-taken):