aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/CodeGen/X86/tail-dup-debugvalue.mir
blob: 6fe93f04fbe69b11d552c6721249b9643f239914 (plain)
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
# RUN: llc -run-pass=early-tailduplication -mtriple=x86_64-unknown-linux-gnu %s -o - | FileCheck %s

# Tail Duplication may update SSA values and invalidate any DBG_VALUEs that
# use those values; those DBG_VALUEs should be set undef. This is tested
# for DBG_VALUE users, and DBG_VALUE_LISTs that use the value multiple times.

# CHECK: ![[VAR_J:[0-9]+]] = !DILocalVariable(name: "j"
# CHECK: ![[VAR_K:[0-9]+]] = !DILocalVariable(name: "k"
# CHECK-LABEL: bb.1.L:
# CHECK: %[[REGISTER:[0-9]+]]:gr32 = PHI
# CHECK-LABEL: bb.2.if.end4:
# CHECK: DBG_VALUE_LIST ![[VAR_J]],
# CHECK-SAME: %[[REGISTER]], 1, %[[REGISTER]]
# CHECK: DBG_VALUE %[[REGISTER]], $noreg, ![[VAR_K]]

--- |
  target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
  target triple = "x86_64-unknown-linux-gnu"
  
  define dso_local void @main() local_unnamed_addr #0 !dbg !15 {
  entry:
    br label %L.outer
  
  L:                                                ; preds = %L, %L.outer
    %tobool2.not = icmp eq i32 undef, 0
    br i1 %tobool2.not, label %if.end4, label %L
  
  if.end4:                                          ; preds = %L
    call void @llvm.dbg.value(metadata !DIArgList(i32 %f.0.ph, i32 1, i32 %f.0.ph), metadata !19, metadata !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_LLVM_arg, 2, DW_OP_and, DW_OP_or, DW_OP_stack_value)), !dbg !21
    %cmp = icmp slt i32 %f.0.ph, undef
    br i1 %cmp, label %if.then5, label %if.end6
  
  if.then5:                                         ; preds = %if.end4
    call void @h() #2
    br label %L.outer
  
  L.outer:                                          ; preds = %if.then5, %entry
    %f.0.ph = phi i32 [ 0, %if.then5 ], [ 1, %entry ]
    br label %L
  
  if.end6:                                          ; preds = %if.end4
    ret void
  }
  
  declare dso_local void @h() local_unnamed_addr
  
  declare void @llvm.dbg.value(metadata, metadata, metadata)
  
  !llvm.dbg.cu = !{!0}
  !llvm.module.flags = !{!13, !14}
  
  !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 13.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, globals: !3, splitDebugInlining: false, nameTableKind: None)
  !1 = !DIFile(filename: "tail-dup-debugvalue.c", directory: "/tmp")
  !2 = !{}
  !3 = !{!4, !7, !9, !11}
  !4 = !DIGlobalVariableExpression(var: !5, expr: !DIExpression())
  !5 = distinct !DIGlobalVariable(name: "a", scope: !0, file: !1, line: 2, type: !6, isLocal: false, isDefinition: true)
  !6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
  !7 = !DIGlobalVariableExpression(var: !8, expr: !DIExpression())
  !8 = distinct !DIGlobalVariable(name: "b", scope: !0, file: !1, line: 2, type: !6, isLocal: false, isDefinition: true)
  !9 = !DIGlobalVariableExpression(var: !10, expr: !DIExpression())
  !10 = distinct !DIGlobalVariable(name: "c", scope: !0, file: !1, line: 2, type: !6, isLocal: false, isDefinition: true)
  !11 = !DIGlobalVariableExpression(var: !12, expr: !DIExpression())
  !12 = distinct !DIGlobalVariable(name: "d", scope: !0, file: !1, line: 2, type: !6, isLocal: false, isDefinition: true)
  !13 = !{i32 2, !"Debug Info Version", i32 3}
  !14 = !{i32 7, !"uwtable", i32 1}
  !15 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 3, type: !16, scopeLine: 3, flags: DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !18)
  !16 = !DISubroutineType(types: !17)
  !17 = !{!6}
  !18 = !{!19, !20}
  !19 = !DILocalVariable(name: "j", scope: !15, file: !1, line: 14, type: !6)
  !20 = !DILocalVariable(name: "k", scope: !15, file: !1, line: 14, type: !6)
  !21 = !DILocation(line: 0, scope: !15)

...
---
name:            main
alignment:       16
tracksRegLiveness: true
registers:
  - { id: 0, class: gr32 }
  - { id: 1, class: gr32 }
  - { id: 2, class: gr32 }
  - { id: 3, class: gr8 }
  - { id: 4, class: gr32 }
  - { id: 5, class: gr32 }
  - { id: 6, class: gr32 }
frameInfo:
  maxAlignment:    1
  hasCalls:        true
machineFunctionInfo: {}
body:             |
  bb.0.entry:
    successors: %bb.4(0x80000000)
  
    %1:gr32 = MOV32ri 1
    JMP_1 %bb.4
  
  bb.1.L:
    successors: %bb.2(0x04000000), %bb.1(0x7c000000)
  
    %2:gr32 = MOV32r0 implicit-def dead $eflags
    %3:gr8 = COPY %2.sub_8bit
    TEST8rr %3, %3, implicit-def $eflags
    JCC_1 %bb.1, 5, implicit $eflags
    JMP_1 %bb.2
  
  bb.2.if.end4:
    successors: %bb.3(0x783e0f0f), %bb.5(0x07c1f0f1)
  
    DBG_VALUE_LIST !19, !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_LLVM_arg, 2, DW_OP_and, DW_OP_or, DW_OP_stack_value), %0, 1, %0, debug-location !21
    DBG_VALUE %0, $noreg, !20, !DIExpression(), debug-location !21
    %5:gr32 = IMPLICIT_DEF
    %4:gr32 = SUB32rr %0, killed %5, implicit-def $eflags
    JCC_1 %bb.5, 13, implicit $eflags
    JMP_1 %bb.3
  
  bb.3.if.then5:
    successors: %bb.4(0x80000000)
  
    ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
    CALL64pcrel32 @h, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp
    ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
    %6:gr32 = MOV32r0 implicit-def dead $eflags
  
  bb.4.L.outer:
    successors: %bb.1(0x80000000)
  
    %0:gr32 = PHI %1, %bb.0, %6, %bb.3
    JMP_1 %bb.1
  
  bb.5.if.end6:
    RET 0

...