summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2017-08-01 19:45:09 +0000
committerReid Kleckner <rnk@google.com>2017-08-01 19:45:09 +0000
commit29c675247d7dabd0859a3d9e3d59d19592f739a3 (patch)
tree2ae1f3c5e245fcf0426362a204e4a7c389006089 /llvm
parent693ef999356086c09cb28a6f63763eafc46416f6 (diff)
downloadbcm5719-llvm-29c675247d7dabd0859a3d9e3d59d19592f739a3.tar.gz
bcm5719-llvm-29c675247d7dabd0859a3d9e3d59d19592f739a3.zip
[DebugInfo] Don't turn dbg.declare into DBG_VALUE for static allocas
Summary: We already have information about static alloca stack locations in our side table. Emitting instructions for them is inefficient, and it only happens when the address of the alloca has been materialized within the current block, which isn't often. Reviewers: aprantl, probinson, dblaikie Subscribers: jfb, dschuff, sbc100, jgravelle-google, hiraditya, llvm-commits, aheejin Differential Revision: https://reviews.llvm.org/D36117 llvm-svn: 309729
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp7
-rw-r--r--llvm/test/DebugInfo/COFF/local-variables.ll2
-rw-r--r--llvm/test/DebugInfo/WebAssembly/dbg-declare.ll3
-rw-r--r--llvm/test/DebugInfo/X86/array.ll18
-rw-r--r--llvm/test/DebugInfo/X86/dbg-declare-alloca.ll63
-rw-r--r--llvm/test/DebugInfo/X86/dbg-declare.ll14
6 files changed, 96 insertions, 11 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index 4e19ec32a3a..e90db4803ee 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -5102,6 +5102,13 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
return nullptr;
}
+ // Static allocas are handled more efficiently in the variable frame index
+ // side table.
+ const auto *AI =
+ dyn_cast<AllocaInst>(Address->stripInBoundsConstantOffsets());
+ if (AI && AI->isStaticAlloca() && FuncInfo.StaticAllocaMap.count(AI))
+ return nullptr;
+
// Byval arguments with frame indices were already handled after argument
// lowering and before isel.
const auto *Arg =
diff --git a/llvm/test/DebugInfo/COFF/local-variables.ll b/llvm/test/DebugInfo/COFF/local-variables.ll
index 2a630230721..80b8814e2ec 100644
--- a/llvm/test/DebugInfo/COFF/local-variables.ll
+++ b/llvm/test/DebugInfo/COFF/local-variables.ll
@@ -33,8 +33,8 @@
; ASM: .cv_loc 0 1 8 7 # t.cpp:8:7
; ASM: testl %ecx, %ecx
; ASM: je .LBB0_2
-; ASM: [[if_start:\.Ltmp.*]]:
; ASM: # BB#1: # %if.then
+; ASM: [[if_start:\.Ltmp.*]]:
; ASM: .cv_loc 0 1 9 9 # t.cpp:9:9
; ASM: movl $42, 40(%rsp)
; ASM: [[inline_site1:\.Ltmp.*]]:
diff --git a/llvm/test/DebugInfo/WebAssembly/dbg-declare.ll b/llvm/test/DebugInfo/WebAssembly/dbg-declare.ll
index d0f172c6988..814ce68ef1b 100644
--- a/llvm/test/DebugInfo/WebAssembly/dbg-declare.ll
+++ b/llvm/test/DebugInfo/WebAssembly/dbg-declare.ll
@@ -1,7 +1,6 @@
; RUN: llc < %s -verify-machineinstrs -mtriple=wasm32-unknown-unknown-wasm | FileCheck %s
; RUN: llc < %s -verify-machineinstrs -mtriple=wasm32-unknown-unknown-wasm -fast-isel | FileCheck --check-prefix=CHECK-FAST %s
-; CHECK: #DEBUG_VALUE: decode:i <- [%vreg
-; CHECK: #DEBUG_VALUE: decode:v <- [%vreg
+
; CHECK: DW_TAG_variable
; CHECK-FAST: DW_TAG_variable
diff --git a/llvm/test/DebugInfo/X86/array.ll b/llvm/test/DebugInfo/X86/array.ll
index 8cb235c9fec..ed13b97794d 100644
--- a/llvm/test/DebugInfo/X86/array.ll
+++ b/llvm/test/DebugInfo/X86/array.ll
@@ -13,14 +13,18 @@
; }
;
; RUN: llc -filetype=asm %s -o - | FileCheck %s
-; Test that we only emit register-indirect locations for the array array.
-; rdar://problem/14874886
-;
-; CHECK-NOT: ##DEBUG_VALUE: main:array <- %R{{.*}}
+; RUN: llc -filetype=obj %s -o - | llvm-dwarfdump - --debug-dump=info | FileCheck %s --check-prefix=DWARF
+
+; CHECK-LABEL: _main:
+; CHECK: movaps {{.*}}, (%rsp)
; CHECK: movq %rsp, %rdi
-; CHECK-NOT: ##DEBUG_VALUE: main:array <- %R{{.*}}
-; CHECK: ##DEBUG_VALUE: main:array <- [%RDI+0]
-; CHECK-NOT: ##DEBUG_VALUE: main:array <- %R{{.*}}
+; CHECK: callq _f
+
+; DWARF: DW_TAG_variable
+; "<0x2> 91 00" means fbreg 0, i.e. offset RSP+0.
+; DWARF-NEXT: DW_AT_location [DW_FORM_exprloc] (<0x2> 91 00 )
+; DWARF-NEXT: DW_AT_name [DW_FORM_strp] ( {{.*}} = "array")
+
; ModuleID = '/tmp/array.c'
source_filename = "/tmp/array.c"
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
diff --git a/llvm/test/DebugInfo/X86/dbg-declare-alloca.ll b/llvm/test/DebugInfo/X86/dbg-declare-alloca.ll
new file mode 100644
index 00000000000..1b23604b022
--- /dev/null
+++ b/llvm/test/DebugInfo/X86/dbg-declare-alloca.ll
@@ -0,0 +1,63 @@
+; RUN: llc < %s | FileCheck %s
+; RUN: llc < %s -filetype=obj | llvm-dwarfdump - -debug-dump=info | FileCheck %s --check-prefix=DWARF
+
+; This should use the frame index side table for allocas, not DBG_VALUE
+; instructions. For SDAG ISel, this test would see an SDNode materializing the
+; argument to escape_foo and we'd get DBG_VALUE MachineInstr.
+
+; CHECK-LABEL: use_dbg_declare:
+; CHECK-NOT: #DEBUG_VALUE
+
+; "<0x2> 91 00" means "fbreg uleb(0)", i.e. RSP+0.
+; DWARF: DW_TAG_variable
+; DWARF-NEXT: DW_AT_location [DW_FORM_exprloc] (<0x2> 91 00 )
+; DWARF-NEXT: DW_AT_name [DW_FORM_strp] ( {{.*}} = "o")
+
+
+; ModuleID = 't.c'
+source_filename = "t.c"
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64--linux"
+
+%struct.Foo = type { i32 }
+
+; Function Attrs: noinline nounwind uwtable
+define void @use_dbg_declare() #0 !dbg !7 {
+entry:
+ %o = alloca %struct.Foo, align 4
+ call void @llvm.dbg.declare(metadata %struct.Foo* %o, metadata !10, metadata !15), !dbg !16
+ call void @escape_foo(%struct.Foo* %o), !dbg !17
+ ret void, !dbg !18
+}
+
+; Function Attrs: nounwind readnone speculatable
+declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
+
+declare void @escape_foo(%struct.Foo*)
+
+attributes #0 = { noinline nounwind uwtable }
+attributes #1 = { nounwind readnone speculatable }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3, !4, !5}
+!llvm.ident = !{!6}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 6.0.0 ", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "t.c", directory: "C:\5Csrc\5Cllvm-project\5Cbuild")
+!2 = !{}
+!3 = !{i32 2, !"Dwarf Version", i32 4}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = !{i32 1, !"wchar_size", i32 4}
+!6 = !{!"clang version 6.0.0 "}
+!7 = distinct !DISubprogram(name: "use_dbg_declare", scope: !1, file: !1, line: 3, type: !8, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
+!8 = !DISubroutineType(types: !9)
+!9 = !{null}
+!10 = !DILocalVariable(name: "o", scope: !7, file: !1, line: 4, type: !11)
+!11 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "Foo", file: !1, line: 1, size: 32, elements: !12)
+!12 = !{!13}
+!13 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !11, file: !1, line: 1, baseType: !14, size: 32)
+!14 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+!15 = !DIExpression()
+!16 = !DILocation(line: 4, column: 14, scope: !7)
+!17 = !DILocation(line: 5, column: 3, scope: !7)
+!18 = !DILocation(line: 6, column: 1, scope: !7)
diff --git a/llvm/test/DebugInfo/X86/dbg-declare.ll b/llvm/test/DebugInfo/X86/dbg-declare.ll
index 29c90013255..5d81b5fc4d1 100644
--- a/llvm/test/DebugInfo/X86/dbg-declare.ll
+++ b/llvm/test/DebugInfo/X86/dbg-declare.ll
@@ -1,6 +1,18 @@
-; RUN: llc < %s -O0 -mtriple x86_64-apple-darwin
+; RUN: llc < %s -O0 -mtriple x86_64-apple-darwin | FileCheck %s
+; RUN: llc < %s -O0 -mtriple x86_64-apple-darwin -filetype=obj \
+; RUN: | llvm-dwarfdump - -debug-dump=info | FileCheck %s --check-prefix=DWARF
; <rdar://problem/11134152>
+; CHECK-LABEL: _foo:
+; CHECK-NOT: #DEBUG_VALUE
+
+; "[DW_FORM_exprloc] <0x2> 91 XX" means fbreg uleb(XX)
+; DWARF-LABEL: DW_TAG_formal_parameter
+; DWARF-NEXT: DW_AT_location [DW_FORM_exprloc] (<0x2> 91 70 )
+; DWARF-NEXT: DW_AT_name [DW_FORM_strp] ( {{.*}} = "x")
+
+; FIXME: There is no debug info to describe "a".
+
define i32 @foo(i32* %x) nounwind uwtable ssp !dbg !5 {
entry:
%x.addr = alloca i32*, align 8
OpenPOWER on IntegriCloud