# We do not support the call site info for the target now, so we use the experimental option (-emit-call-site-info -debug-entry-values).

# RUN: llc -emit-call-site-info -debug-entry-values -run-pass=livedebugvalues -o - %s | FileCheck %s
# RUN: llc -emit-call-site-info -debug-entry-values -force-instr-ref-livedebugvalues=1 -run-pass=livedebugvalues -o - %s | FileCheck %s

# Verify that the entry values for the input parameters are inserted after the
# bundles which contains the registers' clobbering instructions (the calls to
# @clobber). Previously the insertions would thrash the bundles, later on
# triggering a crash in DebugHandlerBase.

--- |
  target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"
  target triple = "hexagon"

  ; Function Attrs: nounwind
  define i32 @foo(i32 %arg) !dbg !12 {
  entry:
    call void @llvm.dbg.value(metadata i32 %arg, metadata !16, metadata !DIExpression()), !dbg !17
    %call = tail call i32 @clobber(), !dbg !18
    ret i32 1, !dbg !19
  }

  declare !dbg !4 i32 @clobber()

  ; Function Attrs: nounwind
  define i32 @bar(i32 %b) !dbg !20 {
  entry:
    call void @llvm.dbg.value(metadata i32 %b, metadata !22, metadata !DIExpression()), !dbg !23
    %tobool = icmp eq i32 %b, 0, !dbg !24
    br i1 %tobool, label %land.end, label %land.rhs, !dbg !24

  land.rhs:                                         ; preds = %entry
    %call = tail call i32 @clobber(), !dbg !25
    br label %land.end

  land.end:                                         ; preds = %entry, %land.rhs
    ret i32 undef, !dbg !27
  }

  ; Function Attrs: nounwind readnone speculatable
  declare void @llvm.dbg.value(metadata, metadata, metadata) #0

  attributes #0 = { nounwind readnone speculatable }

  !llvm.dbg.cu = !{!0}
  !llvm.module.flags = !{!8, !9, !10}
  !llvm.ident = !{!11}

  !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 10.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None)
  !1 = !DIFile(filename: "foo.c", directory: "/")
  !2 = !{}
  !3 = !{!4}
  !4 = !DISubprogram(name: "clobber", scope: !1, file: !1, line: 1, type: !5, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized, retainedNodes: !2)
  !5 = !DISubroutineType(types: !6)
  !6 = !{!7}
  !7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
  !8 = !{i32 2, !"Dwarf Version", i32 4}
  !9 = !{i32 2, !"Debug Info Version", i32 3}
  !10 = !{i32 1, !"wchar_size", i32 4}
  !11 = !{!"clang version 10.0.0"}
  !12 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 3, type: !13, scopeLine: 3, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !15)
  !13 = !DISubroutineType(types: !14)
  !14 = !{!7, !7}
  !15 = !{!16}
  !16 = !DILocalVariable(name: "arg", arg: 1, scope: !12, file: !1, line: 3, type: !7)
  !17 = !DILocation(line: 0, scope: !12)
  !18 = !DILocation(line: 4, scope: !12)
  !19 = !DILocation(line: 5, scope: !12)
  !20 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 8, type: !13, scopeLine: 8, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !21)
  !21 = !{!22}
  !22 = !DILocalVariable(name: "arg", arg: 1, scope: !20, file: !1, line: 8, type: !7)
  !23 = !DILocation(line: 0, scope: !20)
  !24 = !DILocation(line: 9, scope: !20)
  !25 = !DILocation(line: 9, scope: !26)
  !26 = distinct !DILexicalBlock(scope: !20, file: !1, line: 9)
  !27 = !DILocation(line: 10, scope: !20)

...
---
name:            foo
tracksRegLiveness: true
body:             |
  bb.0.entry:
    DBG_VALUE $r0, $noreg, !16, !DIExpression(), debug-location !17
    CFI_INSTRUCTION def_cfa $r30, 8
    CFI_INSTRUCTION offset $r31, -4
    CFI_INSTRUCTION offset $r30, -8
    BUNDLE implicit-def $r29, implicit-def $r30, implicit-def dead $pc, implicit-def dead $r31, implicit-def dead $r0, implicit $r29, implicit killed $framekey, implicit killed $framelimit, implicit killed $r30, implicit killed $r31, debug-location !18 {
      $r29 = S2_allocframe $r29, 0, implicit-def $r30, implicit killed $framekey, implicit killed $framelimit, implicit killed $r30, implicit killed $r31, debug-location !18 :: (store (s32) into stack)
      J2_call @clobber, hexagoncsr, implicit-def dead $pc, implicit-def dead $r31, implicit internal killed $r29, implicit-def $r29, implicit-def dead $r0, debug-location !18
    }
    BUNDLE implicit-def dead $r0, implicit-def $d15, implicit-def $r30, implicit-def $r31, implicit-def $pc, implicit-def $r29, implicit killed $r30, implicit killed $framekey, debug-location !19 {
      $r0 = A2_tfrsi 1, debug-location !19
      $d15 = L4_return killed $r30, implicit-def $pc, implicit-def $r29, implicit killed $framekey, implicit-def dead $pc, implicit internal killed $r0, debug-location !19
    }

...

# CHECK-LABEL: name: foo
# CHECK: BUNDLE
# CHECK-NEXT: $r29 = S2_allocframe $r29, 0
# CHECK-NEXT: J2_call @clobber
# CHECK-NEXT: }
# CHECK-NEXT: DBG_VALUE $r0, $noreg, !16, !DIExpression(DW_OP_LLVM_entry_value, 1)

---
name:            bar
tracksRegLiveness: true
liveins:
  - { reg: '$r0' }
body:             |
  bb.0.entry:
    successors: %bb.1
    liveins: $r0

    DBG_VALUE $r0, $noreg, !22, !DIExpression(), debug-location !23
    BUNDLE implicit-def dead $p0, implicit-def $pc, implicit killed $r0, implicit killed $r31, debug-location !24 {
      renamable $p0 = C2_cmpeqi killed renamable $r0, 0, debug-location !24
      PS_jmprettnew internal killed $p0, killed $r31, implicit-def $pc, implicit-def $pc, implicit killed undef $r0, debug-location !27
    }

  bb.1.land.rhs:
    CFI_INSTRUCTION def_cfa $r30, 8
    CFI_INSTRUCTION offset $r31, -4
    CFI_INSTRUCTION offset $r30, -8
    BUNDLE implicit-def $r29, implicit-def $r30, implicit-def $pc, implicit-def $r31, implicit-def dead $r0, implicit $r29, implicit killed $framekey, implicit killed $framelimit, implicit killed $r30, implicit killed $r31, debug-location !25 {
      $r29 = S2_allocframe $r29, 0, implicit-def $r30, implicit killed $framekey, implicit killed $framelimit, implicit killed $r30, implicit killed $r31, debug-location !25 :: (store (s32) into stack)
      J2_call @clobber, hexagoncsr, implicit-def $pc, implicit-def $r31, implicit internal killed $r29, implicit-def $r29, implicit-def dead $r0, debug-location !25
    }
    $d15 = L2_deallocframe killed $r30, implicit-def $r29, implicit killed $framekey
    PS_jmpret killed $r31, implicit-def $pc, implicit killed undef $r0, debug-location !27

...

# CHECK-LABEL: name: bar
# CHECK: BUNDLE
# CHECK: BUNDLE
# CHECK-NEXT: $r29 = S2_allocframe $r29, 0
# CHECK-NEXT: J2_call @clobber
# CHECK-NEXT: }
# CHECK-NEXT: DBG_VALUE $r0, $noreg, !22, !DIExpression(DW_OP_LLVM_entry_value, 1)
