xref: /llvm-project/llvm/test/DebugInfo/X86/instr-ref-unreachable.mir (revision 0670470a8ded8ece91444722a81a9b02b93dcf4a)
1*0670470aSStephen Tozer# RUN: llc --run-pass=livedebugvalues %s -o - -experimental-debug-variable-locations | FileCheck %s
2*0670470aSStephen Tozer
3*0670470aSStephen Tozer## Tests that when a block that is not directly reachable from the entry block
4*0670470aSStephen Tozer## contains a DBG_PHI, we treat those DBG_PHIs as referring to live-in values,
5*0670470aSStephen Tozer## and resolve them for users as normal.
6*0670470aSStephen Tozer## FIXME: "def" currently does not have a value due to blocks that are not
7*0670470aSStephen Tozer## directly reachable from the entry block not being fully covered by the
8*0670470aSStephen Tozer## LiveDebugValues analysis.
9*0670470aSStephen Tozer
10*0670470aSStephen Tozer# CHECK-DAG: ![[UNDEFVAR:[0-9]+]] = !DILocalVariable(name: "undef"
11*0670470aSStephen Tozer# CHECK-DAG: ![[DEFVAR:[0-9]+]] = !DILocalVariable(name: "def"
12*0670470aSStephen Tozer
13*0670470aSStephen Tozer# CHECK-LABEL: bb.1.bb1
14*0670470aSStephen Tozer# CHECK: DBG_VALUE_LIST ![[UNDEFVAR]], {{.+}}, $noreg
15*0670470aSStephen Tozer# CHECK-LABEL: bb.4.bb3
16*0670470aSStephen Tozer# CHECK: DBG_VALUE_LIST ![[DEFVAR]], {{.+}}, $noreg
17*0670470aSStephen Tozer
18*0670470aSStephen Tozer--- |
19*0670470aSStephen Tozer  ; ModuleID = 'llvm/test/DebugInfo/X86/instr-ref-unreachable.mir'
20*0670470aSStephen Tozer  source_filename = "/tmp/b.ll"
21*0670470aSStephen Tozer  target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
22*0670470aSStephen Tozer  target triple = "x86_64-unknown-linux-gnu"
23*0670470aSStephen Tozer
24*0670470aSStephen Tozer  @global = private constant [2 x ptr] [ptr blockaddress(@foo, %bb3), ptr blockaddress(@foo, %bb1)]
25*0670470aSStephen Tozer
26*0670470aSStephen Tozer  define ptr @foo() !dbg !4 {
27*0670470aSStephen Tozer  bb:
28*0670470aSStephen Tozer    br label %bb3
29*0670470aSStephen Tozer
30*0670470aSStephen Tozer  bb1:                                              ; preds = %bb3
31*0670470aSStephen Tozer    call void @llvm.dbg.value(metadata i64 %phi, metadata !6, metadata !DIExpression()), !dbg !8
32*0670470aSStephen Tozer    call void @llvm.dbg.value(metadata i64 %phi, metadata !9, metadata !DIExpression()), !dbg !8
33*0670470aSStephen Tozer    store i32 0, ptr null, align 4, !dbg !10
34*0670470aSStephen Tozer    %getelementptr = getelementptr i32, ptr null, i64 %phi
35*0670470aSStephen Tozer    store i32 0, ptr %getelementptr, align 4
36*0670470aSStephen Tozer    br label %bb2
37*0670470aSStephen Tozer
38*0670470aSStephen Tozer  bb2:                                              ; preds = %bb2, %bb1
39*0670470aSStephen Tozer    %select = select i1 false, i1 false, i1 false
40*0670470aSStephen Tozer    br i1 %select, label %bb3, label %bb2
41*0670470aSStephen Tozer
42*0670470aSStephen Tozer  bb3:                                              ; preds = %bb2, %bb
43*0670470aSStephen Tozer    %phi = phi i64 [ 1, %bb ], [ 0, %bb2 ]
44*0670470aSStephen Tozer    br label %bb1
45*0670470aSStephen Tozer  }
46*0670470aSStephen Tozer
47*0670470aSStephen Tozer  declare void @llvm.dbg.value(metadata, metadata, metadata)
48*0670470aSStephen Tozer
49*0670470aSStephen Tozer  !llvm.dbg.cu = !{!0}
50*0670470aSStephen Tozer  !llvm.module.flags = !{!3}
51*0670470aSStephen Tozer
52*0670470aSStephen Tozer  !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !2, globals: !2, imports: !2, splitDebugInlining: false, nameTableKind: GNU)
53*0670470aSStephen Tozer  !1 = !DIFile(filename: "test.cpp", directory: ".")
54*0670470aSStephen Tozer  !2 = !{}
55*0670470aSStephen Tozer  !3 = !{i32 2, !"Debug Info Version", i32 3}
56*0670470aSStephen Tozer  !4 = distinct !DISubprogram(name: "GetNumericFormat", linkageName: "f", scope: null, file: !1, line: 980, type: !5, scopeLine: 984, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
57*0670470aSStephen Tozer  !5 = distinct !DISubroutineType(types: !2)
58*0670470aSStephen Tozer  !6 = !DILocalVariable(name: "undef", scope: !4, file: !1, line: 263, type: !7)
59*0670470aSStephen Tozer  !7 = !DIBasicType(name: "unsigned long", size: 64, encoding: DW_ATE_unsigned)
60*0670470aSStephen Tozer  !8 = !DILocation(line: 0, scope: !4)
61*0670470aSStephen Tozer  !9 = !DILocalVariable(name: "def", scope: !4, file: !1, line: 263, type: !7)
62*0670470aSStephen Tozer  !10 = !DILocation(line: 151, column: 41, scope: !4)
63*0670470aSStephen Tozer
64*0670470aSStephen Tozer...
65*0670470aSStephen Tozer---
66*0670470aSStephen Tozername:            foo
67*0670470aSStephen Tozeralignment:       16
68*0670470aSStephen TozertracksRegLiveness: true
69*0670470aSStephen TozerdebugInstrRef:   true
70*0670470aSStephen TozertracksDebugUserValues: true
71*0670470aSStephen TozerframeInfo:
72*0670470aSStephen Tozer  maxAlignment:    1
73*0670470aSStephen Tozerbody:             |
74*0670470aSStephen Tozer  bb.0.bb:
75*0670470aSStephen Tozer    successors: %bb.1(0x80000000)
76*0670470aSStephen Tozer
77*0670470aSStephen Tozer    $ecx = MOV32ri 1, implicit-def $rcx
78*0670470aSStephen Tozer    renamable $al = MOV8ri 1
79*0670470aSStephen Tozer
80*0670470aSStephen Tozer  bb.1.bb1 (ir-block-address-taken %ir-block.bb1, align 16):
81*0670470aSStephen Tozer    successors: %bb.2(0x80000000)
82*0670470aSStephen Tozer    liveins: $al, $rcx
83*0670470aSStephen Tozer
84*0670470aSStephen Tozer    DBG_INSTR_REF !6, !DIExpression(DW_OP_LLVM_arg, 0), dbg-instr-ref(1, 0), debug-location !8
85*0670470aSStephen Tozer    MOV32mi $noreg, 1, $noreg, 0, $noreg, 0, debug-location !10 :: (store (s32) into `ptr null`)
86*0670470aSStephen Tozer    MOV32mi $noreg, 4, killed renamable $rcx, 0, $noreg, 0 :: (store (s32) into %ir.getelementptr)
87*0670470aSStephen Tozer
88*0670470aSStephen Tozer  bb.2.bb2 (align 16):
89*0670470aSStephen Tozer    successors: %bb.3(0x04000000), %bb.2(0x7c000000)
90*0670470aSStephen Tozer    liveins: $al
91*0670470aSStephen Tozer
92*0670470aSStephen Tozer    TEST8rr renamable $al, renamable $al, implicit-def $eflags
93*0670470aSStephen Tozer    JCC_1 %bb.2, 5, implicit killed $eflags
94*0670470aSStephen Tozer
95*0670470aSStephen Tozer  bb.3:
96*0670470aSStephen Tozer    successors: %bb.1(0x80000000)
97*0670470aSStephen Tozer    liveins: $al
98*0670470aSStephen Tozer
99*0670470aSStephen Tozer    renamable $ecx = XOR32rr undef $ecx, undef $ecx, implicit-def dead $eflags, implicit-def $rcx
100*0670470aSStephen Tozer    JMP_1 %bb.1
101*0670470aSStephen Tozer
102*0670470aSStephen Tozer  bb.4.bb3 (ir-block-address-taken %ir-block.bb3):
103*0670470aSStephen Tozer    successors: %bb.1(0x80000000)
104*0670470aSStephen Tozer    liveins: $al, $rcx
105*0670470aSStephen Tozer
106*0670470aSStephen Tozer    DBG_PHI $rcx, 1
107*0670470aSStephen Tozer    DBG_INSTR_REF !9, !DIExpression(DW_OP_LLVM_arg, 0), dbg-instr-ref(1, 0), debug-location !8
108*0670470aSStephen Tozer    JMP_1 %bb.1
109*0670470aSStephen Tozer
110*0670470aSStephen Tozer...
111