reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
# RUN: llc -debug-entry-values -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, flags: DIFlagArgumentNotModified)
  !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, flags: DIFlagArgumentNotModified)
  !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 4 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
    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 4 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)