[RegisterCoalescer] Move debug value after rematerialize trivial def
authorKarl-Johan Karlsson <karl-johan.karlsson@ericsson.com>
Fri, 10 Nov 2017 09:48:40 +0000 (09:48 +0000)
committerKarl-Johan Karlsson <karl-johan.karlsson@ericsson.com>
Fri, 10 Nov 2017 09:48:40 +0000 (09:48 +0000)
Summary:
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.

Reviewers: aprantl

Reviewed By: aprantl

Subscribers: MatzeB, llvm-commits, qcolombet

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

llvm-svn: 317880

llvm/lib/CodeGen/RegisterCoalescer.cpp
llvm/test/DebugInfo/MIR/X86/regcoalescer.mir [new file with mode: 0644]

index 84c2e25..41411a5 100644 (file)
@@ -1337,6 +1337,9 @@ bool RegisterCoalescer::reMaterializeTrivialDef(const CoalescerPair &CP,
       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);
       }
     }
diff --git a/llvm/test/DebugInfo/MIR/X86/regcoalescer.mir b/llvm/test/DebugInfo/MIR/X86/regcoalescer.mir
new file mode 100644 (file)
index 0000000..cca9266
--- /dev/null
@@ -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