1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +01:00
llvm-mirror/test/Transforms/InstCombine/lower-dbg-declare.ll
Alexey Lapshin e9def7c822 [Debuginfo][SROA] Need to handle dbg.value in SROA pass.
SROA pass processes debug info incorrecly if applied twice.
Specifically, after SROA works first time, instcombine converts dbg.declare
intrinsics into dbg.value. Inlining creates new opportunities for SROA,
so it is called again. This time it does not handle correctly previously
inserted dbg.value intrinsics.

Differential Revision: https://reviews.llvm.org/D64595

llvm-svn: 370906
2019-09-04 14:19:49 +00:00

115 lines
4.9 KiB
LLVM

; RUN: opt -instcombine < %s -S | FileCheck %s
; This tests dbg.declare lowering for CallInst users of an alloca. The
; resulting dbg.value expressions should add a deref to the declare's expression.
; Hand-reduced from this example (-g -Og -mllvm -disable-llvm-optzns -gno-column-info):
; static volatile int sink;
; static void escape(int &c) { sink = c; }
; static bool empty ( int p1 ) { return p1 == 0; }
; int main() {
; int d1 = 42;
; while (!empty(d1))
; escape(d1);
; return 0;
; }
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@_ZL4sink = internal global i32 0, align 4, !dbg !0
; CHECK-LABEL: @main
define dso_local i32 @main() !dbg !12 {
entry:
%retval = alloca i32, align 4
%d1 = alloca i32, align 4
store i32 0, i32* %retval, align 4
%0 = bitcast i32* %d1 to i8*, !dbg !17
call void @llvm.lifetime.start.p0i8(i64 4, i8* %0) #4, !dbg !17
; CHECK: dbg.value(metadata i32 42, metadata [[METADATA_IDX1:![0-9]+]], metadata !DIExpression())
; CHECK-NEXT: store
call void @llvm.dbg.declare(metadata i32* %d1, metadata !16, metadata !DIExpression()), !dbg !17
store i32 42, i32* %d1, align 4, !dbg !17
br label %while.cond, !dbg !22
while.cond: ; preds = %while.body, %entry
; CHECK: dbg.value(metadata i32 %1, metadata [[METADATA_IDX1]], metadata !DIExpression())
; CHECK-NEXT: call zeroext i1 @_ZL5emptyi
%1 = load i32, i32* %d1, align 4, !dbg !22
%call = call zeroext i1 @_ZL5emptyi(i32 %1), !dbg !22
%lnot = xor i1 %call, true, !dbg !22
br i1 %lnot, label %while.body, label %while.end, !dbg !22
while.body: ; preds = %while.cond
; CHECK: dbg.value(metadata i32* %d1, metadata [[METADATA_IDX1]], metadata !DIExpression(DW_OP_deref))
; CHECK-NEXT: call void @_ZL6escapeRi
call void @_ZL6escapeRi(i32* dereferenceable(4) %d1), !dbg !23
br label %while.cond, !dbg !22, !llvm.loop !24
while.end: ; preds = %while.cond
%2 = bitcast i32* %d1 to i8*, !dbg !25
call void @llvm.lifetime.end.p0i8(i64 4, i8* %2) #4, !dbg !25
ret i32 0, !dbg !26
}
declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture)
declare void @llvm.dbg.declare(metadata, metadata, metadata)
define internal zeroext i1 @_ZL5emptyi(i32 %p1) !dbg !27 {
ret i1 false
}
define internal void @_ZL6escapeRi(i32* dereferenceable(4) %c) #3 !dbg !34 {
ret void
}
declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #1
!llvm.dbg.cu = !{!2}
!llvm.module.flags = !{!8, !9, !10}
!llvm.ident = !{!11}
; CHECK: DIGlobalVariableExpression
; CHECK: [[METADATA_IDX1]] = !DILocalVariable(name: "d1"
!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
!1 = distinct !DIGlobalVariable(name: "sink", linkageName: "_ZL4sink", scope: !2, file: !3, line: 2, type: !6, isLocal: true, isDefinition: true)
!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5, nameTableKind: None)
!3 = !DIFile(filename: "lower-dbg-declare.cpp", directory: "")
!4 = !{}
!5 = !{!0}
!6 = !DIDerivedType(tag: DW_TAG_volatile_type, baseType: !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"}
!12 = distinct !DISubprogram(name: "main", scope: !3, file: !3, line: 5, type: !13, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !15)
!13 = !DISubroutineType(types: !14)
!14 = !{!7}
!15 = !{!16}
!16 = !DILocalVariable(name: "d1", scope: !12, file: !3, line: 6, type: !7)
!17 = !DILocation(line: 6, scope: !12)
!22 = !DILocation(line: 7, scope: !12)
!23 = !DILocation(line: 8, scope: !12)
!24 = distinct !{!24, !22, !23}
!25 = !DILocation(line: 10, scope: !12)
!26 = !DILocation(line: 9, scope: !12)
!27 = distinct !DISubprogram(name: "empty", linkageName: "_ZL5emptyi", scope: !3, file: !3, line: 4, type: !28, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !31)
!28 = !DISubroutineType(types: !29)
!29 = !{!30, !7}
!30 = !DIBasicType(name: "bool", size: 8, encoding: DW_ATE_boolean)
!31 = !{!32}
!32 = !DILocalVariable(name: "p1", arg: 1, scope: !27, file: !3, line: 4, type: !7)
!33 = !DILocation(line: 4, scope: !27)
!34 = distinct !DISubprogram(name: "escape", linkageName: "_ZL6escapeRi", scope: !3, file: !3, line: 3, type: !35, scopeLine: 3, flags: DIFlagPrototyped, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !38)
!35 = !DISubroutineType(types: !36)
!36 = !{null, !37}
!37 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !7, size: 64)
!38 = !{!39}
!39 = !DILocalVariable(name: "c", arg: 1, scope: !34, file: !3, line: 3, type: !37)
!42 = !DILocation(line: 3, scope: !34)