mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
ed3a815136
When a phi node is finally lowered to a machine instruction it is important that the lowered "load" instruction is placed before the associated DEBUG_VALUE entry describing the value loaded. Renamed the existing SkipPHIsAndLabels to SkipPHIsLabelsAndDebug to more fully describe that it also skips debug entries. Then used the "new" function SkipPHIsAndLabels when the debug information should not be skipped when placing the lowered "load" instructions so that it is placed before the debug entries. Differential Revision: https://reviews.llvm.org/D23760 llvm-svn: 281727
76 lines
3.1 KiB
LLVM
76 lines
3.1 KiB
LLVM
; RUN: llc -O0 %s -mtriple=aarch64 -o - | FileCheck %s
|
|
|
|
; Test that a DEBUG_VALUE node is create for variable c after the phi has been
|
|
; converted to a ldr. The DEBUG_VALUE must be *after* the ldr and not before it.
|
|
|
|
; Created from the C code, compiled with -O0 -g and then passed through opt -mem2reg:
|
|
;
|
|
; int func(int a)
|
|
; {
|
|
; int c = 1;
|
|
; if (a < 0 ) {
|
|
; c = 12;
|
|
; }
|
|
; return c;
|
|
; }
|
|
;
|
|
; Function Attrs: nounwind
|
|
define i32 @func(i32) #0 !dbg !8 {
|
|
call void @llvm.dbg.value(metadata i32 %0, i64 0, metadata !12, metadata !13), !dbg !14
|
|
call void @llvm.dbg.value(metadata i32 1, i64 0, metadata !15, metadata !13), !dbg !16
|
|
%2 = icmp slt i32 %0, 0, !dbg !17
|
|
br i1 %2, label %3, label %4, !dbg !19
|
|
|
|
; <label>:3: ; preds = %1
|
|
call void @llvm.dbg.value(metadata i32 12, i64 0, metadata !15, metadata !13), !dbg !16
|
|
br label %4, !dbg !20
|
|
|
|
; <label>:4: ; preds = %3, %1
|
|
%.0 = phi i32 [ 12, %3 ], [ 1, %1 ]
|
|
; CHECK: ldr w[[REG:[0-9]+]], [sp, #8]
|
|
; CHECK-NEXT: .Ltmp
|
|
call void @llvm.dbg.value(metadata i32 %.0, i64 0, metadata !15, metadata !13), !dbg !16
|
|
; CHECK-NEXT: //DEBUG_VALUE: func:c <- %W[[REG]]
|
|
%5 = add nsw i32 %.0, %0, !dbg !22
|
|
call void @llvm.dbg.value(metadata i32 %5, i64 0, metadata !15, metadata !13), !dbg !16
|
|
ret i32 %5, !dbg !23
|
|
}
|
|
|
|
; Function Attrs: nounwind readnone
|
|
declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
|
|
|
|
; Function Attrs: nounwind readnone
|
|
declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #1
|
|
|
|
attributes #0 = { nounwind }
|
|
attributes #1 = { nounwind readnone }
|
|
|
|
!llvm.dbg.cu = !{!0}
|
|
!llvm.module.flags = !{!3, !4, !5, !6}
|
|
!llvm.ident = !{!7}
|
|
|
|
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
|
|
!1 = !DIFile(filename: "a.c", directory: "/tmp")
|
|
!2 = !{}
|
|
!3 = !{i32 2, !"Dwarf Version", i32 4}
|
|
!4 = !{i32 2, !"Debug Info Version", i32 3}
|
|
!5 = !{i32 1, !"wchar_size", i32 4}
|
|
!6 = !{i32 1, !"min_enum_size", i32 4}
|
|
!7 = !{!"clang"}
|
|
!8 = distinct !DISubprogram(name: "func", scope: !1, file: !1, line: 1, type: !9, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
|
|
!9 = !DISubroutineType(types: !10)
|
|
!10 = !{!11, !11}
|
|
!11 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
|
|
!12 = !DILocalVariable(name: "a", arg: 1, scope: !8, file: !1, line: 1, type: !11)
|
|
!13 = !DIExpression()
|
|
!14 = !DILocation(line: 1, column: 14, scope: !8)
|
|
!15 = !DILocalVariable(name: "c", scope: !8, file: !1, line: 3, type: !11)
|
|
!16 = !DILocation(line: 3, column: 13, scope: !8)
|
|
!17 = !DILocation(line: 4, column: 15, scope: !18)
|
|
!18 = distinct !DILexicalBlock(scope: !8, file: !1, line: 4, column: 13)
|
|
!19 = !DILocation(line: 4, column: 13, scope: !8)
|
|
!20 = !DILocation(line: 6, column: 9, scope: !21)
|
|
!21 = distinct !DILexicalBlock(scope: !18, file: !1, line: 4, column: 21)
|
|
!22 = !DILocation(line: 7, column: 4, scope: !8)
|
|
!23 = !DILocation(line: 8, column: 9, scope: !8)
|