[PATCH] D38024: [RegisterCoalescer] Move debug value after rematerialize trivial def

Karl-Johan Karlsson via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 18 23:57:00 PDT 2017


Ka-Ka created this revision.
Herald added subscribers: qcolombet, MatzeB.

The associated debug value is updated when the virtual source register of a copy is completely eliminated and replaced with a rematerialize value in the defed register of the copy. As the debug value now is associated with another register it also need to be moved, otherwise the debug value isn't valid.


https://reviews.llvm.org/D38024

Files:
  lib/CodeGen/RegisterCoalescer.cpp
  test/DebugInfo/MIR/X86/regcoalescer.mir


Index: test/DebugInfo/MIR/X86/regcoalescer.mir
===================================================================
--- /dev/null
+++ test/DebugInfo/MIR/X86/regcoalescer.mir
@@ -0,0 +1,50 @@
+# RUN: llc -O1 -filetype=asm -mtriple x86_64-unknown-linux-gnu -mcpu=x86-64 -o - %s  -start-before=simple-register-coalescing -stop-after=simple-register-coalescing | FileCheck %s
+
+--- |
+  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+  target triple = "x86_64-unknown-linux-gnu"
+
+  define i32 @main() local_unnamed_addr !dbg !14 {
+  entry:
+    %shl = shl i32 undef, undef, !dbg !19
+    tail call void @llvm.dbg.value(metadata i32 %shl, metadata !18, metadata !DIExpression()), !dbg !20
+    ret i32 %shl, !dbg !21
+  }
+
+  declare void @llvm.dbg.value(metadata, metadata, metadata)
+
+  !llvm.dbg.cu = !{!0}
+  !llvm.module.flags = !{!12, !13}
+
+  !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 6.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, globals: !2)
+  !1 = !DIFile(filename: "bar.c", directory: "")
+  !2 = !{}
+  !7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+  !12 = !{i32 2, !"Debug Info Version", i32 3}
+  !13 = !{i32 1, !"wchar_size", i32 4}
+  !14 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 12, type: !15, isLocal: false, isDefinition: true, scopeLine: 12, isOptimized: true, unit: !0, variables: !17)
+  !15 = !DISubroutineType(types: !16)
+  !16 = !{!7}
+  !17 = !{!18}
+  !18 = !DILocalVariable(name: "bazinga", scope: !14, file: !1, line: 13, type: !7)
+  !19 = !DILocation(line: 14, column: 11, scope: !14)
+  !20 = !DILocation(line: 13, column: 7, scope: !14)
+  !21 = !DILocation(line: 16, column: 3, scope: !14)
+
+...
+---
+name:            main
+alignment:       4
+registers:
+  - { id: 0, class: gr32, preferred-register: '' }
+body:             |
+  bb.0.entry:
+    %0 = MOV32r0 implicit-def dead %eflags, debug-location !19
+    DBG_VALUE debug-use %0, debug-use _, !18, !DIExpression(), debug-location !20
+    %eax = COPY killed %0, debug-location !21
+    RET 0, killed %eax, debug-location !21
+
+...
+
+# CHECK: %eax = MOV32r0
+# CHECK-NEXT: DBG_VALUE debug-use %eax
Index: lib/CodeGen/RegisterCoalescer.cpp
===================================================================
--- lib/CodeGen/RegisterCoalescer.cpp
+++ lib/CodeGen/RegisterCoalescer.cpp
@@ -1319,6 +1319,9 @@
       MachineInstr *UseMI = UseMO.getParent();
       if (UseMI->isDebugValue()) {
         UseMO.setReg(DstReg);
+        // Move the debug value directly after the def of the rematerialized
+        // value in DstReg.
+        MBB->splice(std::next(NewMI.getIterator()), UseMI->getParent(), UseMI);
         DEBUG(dbgs() << "\t\tupdated: " << *UseMI);
       }
     }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D38024.115793.patch
Type: text/x-patch
Size: 2814 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170919/1334bd94/attachment.bin>


More information about the llvm-commits mailing list