Files
clang-p2996/llvm/test/DebugInfo/X86/single-location-inlined-param.mir
Simon Pilgrim d391e4fe84 [X86] Update RET/LRET instruction to use the same naming convention as IRET (PR36876). NFC
Be more consistent in the naming convention for the various RET instructions to specify in terms of bitwidth.

Helps prevent future scheduler model mismatches like those that were only addressed in D44687.

Differential Revision: https://reviews.llvm.org/D113302
2021-11-07 15:06:54 +00:00

115 lines
4.6 KiB
YAML

# RUN: llc -start-after=livedebugvalues --filetype=obj %s -o - \
# RUN: | llvm-dwarfdump -v -name=param - | FileCheck %s
#
# Generated with opt -sroa -inline, llc -stop-after=livedebugvalues, with some
# metadata removed by hand.
#
# int glob;
# __attribute__((always_inline))
# static void inline_me(int param) {
# {
# int local = param;
# glob = local;
# }
# }
# int fun(int number) {
# inline_me(number);
# if (number)
# return 0;
# return 1;
# }
#
# The inlined parameter 'param' is available for the entirety of its enclosing
# scope. We expect to see a single location entry despite the fact that the
# final instruction in that scope belongs to a dominated scope.
#
# Except for 'param', all DILocalVariable metadata has been removed.
#
# Ignore first entry (abstract), we want to look at the concrete instance.
# CHECK: DW_TAG_formal_parameter [
# CHECK: DW_TAG_formal_parameter [
# CHECK-NEXT: DW_AT_location [DW_FORM_exprloc] (DW_OP_reg5 RDI)
# CHECK-NEXT: DW_AT_abstract_origin {{.*}} "param"
--- |
target triple = "x86_64-unknown-linux-gnu"
@glob = dso_local global i32 0, align 4, !dbg !0
declare void @llvm.dbg.declare(metadata, metadata, metadata)
declare void @llvm.dbg.value(metadata, metadata, metadata)
define dso_local i32 @fun(i32 %number) !dbg !11 {
entry:
call void @llvm.dbg.value(metadata i32 %number, metadata !17, metadata !DIExpression()), !dbg !24
store i32 %number, i32* @glob, align 4, !dbg !27
%tobool = icmp ne i32 %number, 0, !dbg !32
br i1 %tobool, label %return, label %if.end, !dbg !34
if.end: ; preds = %entry
br label %return, !dbg !35
return: ; preds = %entry, %if.end
%retval.0 = phi i32 [ 1, %if.end ], [ 0, %entry ], !dbg !16
ret i32 %retval.0, !dbg !36
}
!llvm.dbg.cu = !{!2}
!llvm.module.flags = !{!7, !8, !9}
!llvm.ident = !{!10}
!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
!1 = distinct !DIGlobalVariable(name: "glob", scope: !2, file: !3, line: 1, type: !6, isLocal: false, isDefinition: true)
!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, producer: "clang version 11.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5, splitDebugInlining: false, nameTableKind: None)
!3 = !DIFile(filename: "test.c", directory: "/")
!4 = !{}
!5 = !{!0}
!6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!7 = !{i32 7, !"Dwarf Version", i32 4}
!8 = !{i32 2, !"Debug Info Version", i32 3}
!9 = !{i32 1, !"wchar_size", i32 4}
!10 = !{!"clang version 11.0.0"}
!11 = distinct !DISubprogram(name: "fun", scope: !3, file: !3, line: 9, type: !12, scopeLine: 9, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !14)
!12 = !DISubroutineType(types: !13)
!13 = !{!6, !6}
!14 = !{}
!16 = !DILocation(line: 0, scope: !11)
!17 = !DILocalVariable(name: "param", arg: 1, scope: !18, file: !3, line: 3, type: !6)
!18 = distinct !DISubprogram(name: "inline_me", scope: !3, file: !3, line: 3, type: !19, scopeLine: 3, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !21)
!19 = !DISubroutineType(types: !20)
!20 = !{null, !6}
!21 = !{!17}
!23 = distinct !DILexicalBlock(scope: !18, file: !3, line: 4, column: 3)
!24 = !DILocation(line: 0, scope: !18, inlinedAt: !25)
!25 = distinct !DILocation(line: 10, column: 3, scope: !11)
!26 = !DILocation(line: 0, scope: !23, inlinedAt: !25)
!27 = !DILocation(line: 6, column: 10, scope: !23, inlinedAt: !25)
!32 = !DILocation(line: 11, column: 7, scope: !33)
!33 = distinct !DILexicalBlock(scope: !11, file: !3, line: 11, column: 7)
!34 = !DILocation(line: 11, column: 7, scope: !11)
!35 = !DILocation(line: 13, column: 3, scope: !11)
!36 = !DILocation(line: 14, column: 1, scope: !11)
...
---
name: fun
body: |
bb.0.entry:
successors: %bb.2(0x50000000), %bb.1(0x30000000)
liveins: $edi
DBG_VALUE $edi, $noreg, !17, !DIExpression(), debug-location !24
MOV32mr $rip, 1, $noreg, @glob, $noreg, renamable $edi, debug-location !27 :: (store (s32) into @glob)
renamable $eax = XOR32rr undef $eax, undef $eax, implicit-def dead $eflags
TEST32rr killed renamable $edi, renamable $edi, implicit-def $eflags, debug-location !32
JCC_1 %bb.1, 4, implicit $eflags, debug-location !34
bb.2.return:
liveins: $eax
RET64 $eax, debug-location !36
bb.1.if.end:
renamable $eax = MOV32ri 1
RET64 $eax, debug-location !36
...