From bd5c522e4db8a9783eb9150e62bc8329d2a1d7c6 Mon Sep 17 00:00:00 2001 From: Karl-Johan Karlsson Date: Fri, 10 Nov 2017 09:48:40 +0000 Subject: [PATCH] [RegisterCoalescer] Move debug value after rematerialize trivial def 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 | 3 ++ llvm/test/DebugInfo/MIR/X86/regcoalescer.mir | 50 ++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 llvm/test/DebugInfo/MIR/X86/regcoalescer.mir diff --git a/llvm/lib/CodeGen/RegisterCoalescer.cpp b/llvm/lib/CodeGen/RegisterCoalescer.cpp index 84c2e25..41411a5 100644 --- a/llvm/lib/CodeGen/RegisterCoalescer.cpp +++ b/llvm/lib/CodeGen/RegisterCoalescer.cpp @@ -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 index 0000000..cca9266 --- /dev/null +++ b/llvm/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 -- 2.7.4