summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorMikael Holmen <mikael.holmen@ericsson.com>2017-07-10 06:07:24 +0000
committerMikael Holmen <mikael.holmen@ericsson.com>2017-07-10 06:07:24 +0000
commite0ced14449c18aad0fc5cd526b4728c3c3dd5ee0 (patch)
tree34f99f55e803abea45d6c123b3a9eb4bc82d2692 /llvm/test
parent1efd10ab75b41d6976bb81d41e28cdb8bafb8e7a (diff)
downloadbcm5719-llvm-e0ced14449c18aad0fc5cd526b4728c3c3dd5ee0.tar.gz
bcm5719-llvm-e0ced14449c18aad0fc5cd526b4728c3c3dd5ee0.zip
[ArgumentPromotion] Change use of removed argument in llvm.dbg.value to undef
Summary: This solves PR33641. When removing a dead argument we must also handle possibly existing calls to llvm.dbg.value that use the removed argument. Now we change the use of the otherwise dead argument to an undef for some other pass to cleanup later. If the calls are left untouched, they will later on cause errors: "function-local metadata used in wrong function" since the ArgumentPromotion rewrites the code by creating a new function with the wanted signature, but the metadata is not recreated so the new function may then erroneously use metadata from the old function. Reviewers: mstorsjo, rnk, arsenm Reviewed By: rnk Subscribers: wdng, llvm-commits Differential Revision: https://reviews.llvm.org/D34874 llvm-svn: 307521
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/Transforms/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll38
1 files changed, 38 insertions, 0 deletions
diff --git a/llvm/test/Transforms/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll b/llvm/test/Transforms/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll
new file mode 100644
index 00000000000..7ce8ab3ac52
--- /dev/null
+++ b/llvm/test/Transforms/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll
@@ -0,0 +1,38 @@
+; RUN: opt -argpromotion -verify -dse -S %s -o - | FileCheck %s
+
+; Fix for PR33641. ArgumentPromotion removed the argument to bar but left the call to
+; dbg.value which still used the removed argument.
+
+%p_t = type i16*
+%fun_t = type void (%p_t)*
+
+define void @foo() {
+ %tmp = alloca %fun_t
+ store %fun_t @bar, %fun_t* %tmp
+ ret void
+}
+
+define internal void @bar(%p_t %p) {
+ call void @llvm.dbg.value(metadata %p_t %p, i64 0, metadata !4, metadata !5), !dbg !6
+ ret void
+}
+
+declare void @llvm.dbg.value(metadata, i64, metadata, metadata)
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!2}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1)
+!1 = !DIFile(filename: "test.c", directory: "")
+!2 = !{i32 2, !"Debug Info Version", i32 3}
+!3 = distinct !DISubprogram(name: "bar", unit: !0)
+!4 = !DILocalVariable(name: "p", scope: !3)
+!5 = !DIExpression()
+!6 = !DILocation(line: 1, column: 1, scope: !3)
+
+; The %p argument should be removed, and the use of it in dbg.value should be
+; changed to undef.
+; CHECK: define internal void @bar() {
+; CHECK-NEXT: call void @llvm.dbg.value(metadata i16* undef
+; CHECK-NEXT: ret void
+; CHECK-NEXT: }
OpenPOWER on IntegriCloud