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
...
|