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