[llvm] r363331 - [GlobalISel][IRTranslator] Add debug loc with line 0 to constants emitted into the entry block.

Amara Emerson via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 13 15:15:35 PDT 2019


Author: aemerson
Date: Thu Jun 13 15:15:35 2019
New Revision: 363331

URL: http://llvm.org/viewvc/llvm-project?rev=363331&view=rev
Log:
[GlobalISel][IRTranslator] Add debug loc with line 0 to constants emitted into the entry block.

Constants, including G_GLOBAL_VALUE, are all emitted into the entry block which
lets us use the vreg def assuming it dominates all other users. However, it can
cause jumpy debug behaviour since the DebugLoc attached to these MIs are from
a user instruction that could be in a different block.

Fixes PR40887.

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

Added:
    llvm/trunk/test/CodeGen/AArch64/GlobalISel/constant-dbg-loc.ll
Modified:
    llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp
    llvm/trunk/test/DebugInfo/AArch64/cfi-eof-prologue.ll

Modified: llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp?rev=363331&r1=363330&r2=363331&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp (original)
+++ llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp Thu Jun 13 15:15:35 2019
@@ -136,7 +136,11 @@ public:
     LLVM_DEBUG(dbgs() << "Checking DILocation from " << *CurrInst
                       << " was copied to " << MI);
 #endif
-    assert(CurrInst->getDebugLoc() == MI.getDebugLoc() &&
+    // We allow insts in the entry block to have a debug loc line of 0 because
+    // they could have originated from constants, and we don't want a jumpy
+    // debug experience.
+    assert((CurrInst->getDebugLoc() == MI.getDebugLoc() ||
+            MI.getDebugLoc().getLine() == 0) &&
            "Line info was not transferred to all instructions");
   }
 };
@@ -1713,8 +1717,15 @@ bool IRTranslator::valueIsSplit(const Va
 
 bool IRTranslator::translate(const Instruction &Inst) {
   CurBuilder->setDebugLoc(Inst.getDebugLoc());
-  EntryBuilder->setDebugLoc(Inst.getDebugLoc());
-  switch(Inst.getOpcode()) {
+  // We only emit constants into the entry block from here. To prevent jumpy
+  // debug behaviour set the line to 0.
+  if (const DebugLoc &DL = Inst.getDebugLoc())
+    EntryBuilder->setDebugLoc(
+        DebugLoc::get(0, 0, DL.getScope(), DL.getInlinedAt()));
+  else
+    EntryBuilder->setDebugLoc(DebugLoc());
+
+  switch (Inst.getOpcode()) {
 #define HANDLE_INST(NUM, OPCODE, CLASS)                                        \
   case Instruction::OPCODE:                                                    \
     return translate##OPCODE(Inst, *CurBuilder.get());

Added: llvm/trunk/test/CodeGen/AArch64/GlobalISel/constant-dbg-loc.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/GlobalISel/constant-dbg-loc.ll?rev=363331&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/GlobalISel/constant-dbg-loc.ll (added)
+++ llvm/trunk/test/CodeGen/AArch64/GlobalISel/constant-dbg-loc.ll Thu Jun 13 15:15:35 2019
@@ -0,0 +1,74 @@
+; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
+; RUN: llc -mtriple aarch64 -O0 -stop-after=irtranslator -global-isel -verify-machineinstrs %s -o - 2>&1 | FileCheck %s
+target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
+target triple = "arm64-apple-ios5.0.0"
+
+ at var1 = common global i32 0, align 4, !dbg !0
+ at var2 = common global i32 0, align 4, !dbg !6
+
+; We check here that the G_GLOBAL_VALUE has a debug loc with line 0.
+define i32 @main() #0 !dbg !14 {
+  ; CHECK-LABEL: name: main
+  ; CHECK: bb.1.entry:
+  ; CHECK:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK:   [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
+  ; CHECK:   [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var1, debug-location !DILocation(line: 0, scope: !18)
+  ; CHECK:   [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1, debug-location !DILocation(line: 0, scope: !18)
+  ; CHECK:   [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 2, debug-location !DILocation(line: 0, scope: !22)
+  ; CHECK:   [[GV1:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var2, debug-location !DILocation(line: 0, scope: !22)
+  ; CHECK:   [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0.retval
+  ; CHECK:   G_STORE [[C]](s32), [[FRAME_INDEX]](p0) :: (store 4 into %ir.retval)
+  ; CHECK:   [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[GV]](p0), debug-location !17 :: (load 4 from @var1)
+  ; CHECK:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[LOAD]](s32), [[C1]], debug-location !19
+  ; CHECK:   G_BRCOND [[ICMP]](s1), %bb.2, debug-location !20
+  ; CHECK:   G_BR %bb.3, debug-location !20
+  ; CHECK: bb.2.if.then:
+  ; CHECK:   successors: %bb.3(0x80000000)
+  ; CHECK:   G_STORE [[C2]](s32), [[GV1]](p0), debug-location !21 :: (store 4 into @var2)
+  ; CHECK: bb.3.if.end:
+  ; CHECK:   $w0 = COPY [[C]](s32), debug-location !24
+  ; CHECK:   RET_ReallyLR implicit $w0, debug-location !24
+entry:
+  %retval = alloca i32, align 4
+  store i32 0, i32* %retval, align 4
+  %0 = load i32, i32* @var1, align 4, !dbg !17
+  %cmp = icmp eq i32 %0, 1, !dbg !19
+  br i1 %cmp, label %if.then, label %if.end, !dbg !20
+
+if.then:
+  store i32 2, i32* @var2, align 4, !dbg !21
+  br label %if.end, !dbg !23
+
+if.end:
+  ret i32 0, !dbg !24
+}
+
+!llvm.dbg.cu = !{!2}
+!llvm.module.flags = !{!9, !10, !11, !12}
+!llvm.ident = !{!13}
+
+!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
+!1 = distinct !DIGlobalVariable(name: "var1", scope: !2, file: !3, line: 1, type: !8, isLocal: false, isDefinition: true)
+!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5, nameTableKind: GNU)
+!3 = !DIFile(filename: "dbg.c", directory: "/")
+!4 = !{}
+!5 = !{!0, !6}
+!6 = !DIGlobalVariableExpression(var: !7, expr: !DIExpression())
+!7 = distinct !DIGlobalVariable(name: "var2", scope: !2, file: !3, line: 2, type: !8, isLocal: false, isDefinition: true)
+!8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+!9 = !{i32 2, !"Dwarf Version", i32 2}
+!10 = !{i32 2, !"Debug Info Version", i32 3}
+!11 = !{i32 1, !"wchar_size", i32 4}
+!12 = !{i32 7, !"PIC Level", i32 2}
+!13 = !{!"clang"}
+!14 = distinct !DISubprogram(name: "main", scope: !3, file: !3, line: 3, type: !15, scopeLine: 3, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !4)
+!15 = !DISubroutineType(types: !16)
+!16 = !{!8}
+!17 = !DILocation(line: 4, column: 7, scope: !18)
+!18 = distinct !DILexicalBlock(scope: !14, file: !3, line: 4, column: 7)
+!19 = !DILocation(line: 4, column: 12, scope: !18)
+!20 = !DILocation(line: 4, column: 7, scope: !14)
+!21 = !DILocation(line: 5, column: 10, scope: !22)
+!22 = distinct !DILexicalBlock(scope: !18, file: !3, line: 4, column: 18)
+!23 = !DILocation(line: 6, column: 3, scope: !22)
+!24 = !DILocation(line: 7, column: 3, scope: !14)

Modified: llvm/trunk/test/DebugInfo/AArch64/cfi-eof-prologue.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/AArch64/cfi-eof-prologue.ll?rev=363331&r1=363330&r2=363331&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/AArch64/cfi-eof-prologue.ll (original)
+++ llvm/trunk/test/DebugInfo/AArch64/cfi-eof-prologue.ll Thu Jun 13 15:15:35 2019
@@ -14,7 +14,7 @@
 ; The location of the prologue_end marker should not be affected by the presence
 ; of CFI instructions.
 
-; RUN: llc -O0 -filetype=asm < %s | FileCheck %s
+; RUN: llc -fast-isel -O0 -filetype=asm < %s | FileCheck %s
 
 ; ModuleID = 'test1.cpp'
 target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"




More information about the llvm-commits mailing list