[PATCH] D34874: [ArgumentPromotion] Change use of removed argument in llvm.dbg.value to undef

Mikael Holmén via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 3 07:34:08 PDT 2017


uabelho updated this revision to Diff 105039.
uabelho retitled this revision from "[ArgPromotion] Remove llvm.dbg.value on removed argument" to "[ArgumentPromotion] Change use of removed argument in llvm.dbg.value to undef".
uabelho edited the summary of this revision.
uabelho added a comment.

Changed according to rnk's comments.

Thanks!


https://reviews.llvm.org/D34874

Files:
  lib/Transforms/IPO/ArgumentPromotion.cpp
  test/Transforms/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll


Index: test/Transforms/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll
===================================================================
--- /dev/null
+++ 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: }
Index: lib/Transforms/IPO/ArgumentPromotion.cpp
===================================================================
--- lib/Transforms/IPO/ArgumentPromotion.cpp
+++ lib/Transforms/IPO/ArgumentPromotion.cpp
@@ -124,6 +124,12 @@
     } else if (I->use_empty()) {
       // Dead argument (which are always marked as promotable)
       ++NumArgumentsDead;
+
+      // Calls to llvm.dbg.value do not exist in the use list of the function
+      // arguments even if the argument is used in the call. Therefore we need
+      // to handle them separately and replace such uses with undef for some other
+      // pass to cleanup.
+      I->replaceAllUsesWith(UndefValue::get(I->getType()));
     } else {
       // Okay, this is being promoted. This means that the only uses are loads
       // or GEPs which are only used by loads


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D34874.105039.patch
Type: text/x-patch
Size: 2260 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170703/ef3cfb85/attachment.bin>


More information about the llvm-commits mailing list