From: Mikael Holmen Date: Thu, 24 Aug 2017 09:05:00 +0000 (+0000) Subject: [Reassociate] Do not drop debug location if replacement is missing X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6dbfbe1563d4440f53d34b62990546d2f99aa513;p=llvm [Reassociate] Do not drop debug location if replacement is missing Summary: When reassociating an expression, do not drop the instruction's original debug location in case the replacement location is missing. The debug location must at least not be dropped for inlinable callsites of debug-info-bearing functions in debug-info-bearing functions. Failing to do so would result in an "inlinable function " "call in a function with debug info must have a !dbg location" error in the verifier. As preserving the original debug location is not expected to result in overly jumpy debug line information, it is preserved for all other cases too. This fixes PR34231: https://bugs.llvm.org/show_bug.cgi?id=34231 Original patch by David Stenberg Reviewers: davide, craig.topper, mcrosier, dblaikie, aprantl Reviewed By: davide, aprantl Subscribers: aprantl Differential Revision: https://reviews.llvm.org/D36865 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311642 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/Reassociate.cpp b/lib/Transforms/Scalar/Reassociate.cpp index e0ef8cfe46b..58832447e1e 100644 --- a/lib/Transforms/Scalar/Reassociate.cpp +++ b/lib/Transforms/Scalar/Reassociate.cpp @@ -2137,7 +2137,8 @@ void ReassociatePass::ReassociateExpression(BinaryOperator *I) { DEBUG(dbgs() << "Reassoc to scalar: " << *V << '\n'); I->replaceAllUsesWith(V); if (Instruction *VI = dyn_cast(V)) - VI->setDebugLoc(I->getDebugLoc()); + if (I->getDebugLoc()) + VI->setDebugLoc(I->getDebugLoc()); RedoInsts.insert(I); ++NumAnnihil; return; diff --git a/test/Transforms/Reassociate/keep-debug-loc.ll b/test/Transforms/Reassociate/keep-debug-loc.ll new file mode 100644 index 00000000000..1a1031f3584 --- /dev/null +++ b/test/Transforms/Reassociate/keep-debug-loc.ll @@ -0,0 +1,48 @@ +; RUN: opt -S -reassociate < %s | FileCheck %s + +; PR34231 +; +; Verify that the original debug location is kept if the +; replacement debug location is missing when +; reassociating expressions. + +define i16 @fn1() !dbg !3 { + ret i16 undef +} + +define void @fn2() !dbg !6 { +; CHECK-LABEL: @fn2 +; CHECK: call i16 @fn1(), !dbg ![[LOC1:[0-9]+]] +; CHECK-NOT: or i16 + %inlinable_call = call i16 @fn1(), !dbg !7 + %dbgless_instruction = or i16 %inlinable_call, 0 + store i16 %dbgless_instruction, i16* undef, align 1 + unreachable +} + +define void @fn3() !dbg !8 { +; CHECK-LABEL: @fn3 +; CHECK: load i16, i16* undef, !dbg ![[LOC2:[0-9]+]] +; CHECK-NOT: or i16 + %instruction = load i16, i16* undef, !dbg !9 + %dbgless_instruction = or i16 %instruction, 0 + store i16 %dbgless_instruction, i16* undef, align 1 + unreachable +} + +; CHECK: ![[LOC1]] = !DILocation(line: 7 +; CHECK: ![[LOC2]] = !DILocation(line: 9 + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!2} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 6.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly) +!1 = !DIFile(filename: "foo.c", directory: "/") +!2 = !{i32 2, !"Debug Info Version", i32 3} +!3 = distinct !DISubprogram(name: "fn1", scope: !1, file: !1, line: 2, type: !4, isLocal: false, isDefinition: true, scopeLine: 2, isOptimized: true, unit: !0) +!4 = !DISubroutineType(types: !5) +!5 = !{} +!6 = distinct !DISubprogram(name: "fn2", scope: !1, file: !1, line: 3, type: !4, isLocal: false, isDefinition: true, scopeLine: 3, isOptimized: true, unit: !0) +!7 = !DILocation(line: 7, column: 10, scope: !6) +!8 = distinct !DISubprogram(name: "fn3", scope: !1, file: !1, line: 8, type: !4, isLocal: false, isDefinition: true, scopeLine: 3, isOptimized: true, unit: !0) +!9 = !DILocation(line: 9, column: 10, scope: !8)