[PATCH] D54997: [DebugInfo] PR39807: Create unknown locations when hoisting to locationless blocks

Jeremy Morse via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 28 04:01:44 PST 2018


jmorse created this revision.
jmorse added reviewers: aprantl, vsk, gbedwell, nikic.
Herald added a subscriber: llvm-commits.

This is a fix for https://bugs.llvm.org/show_bug.cgi?id=39807, where two inlineable calls are merged to a basic block with no debug locations.

We have to pick _a_ location to avoid later inlining failures, but there are none in the destination BB, and we possibly can't pick either of the locations to hand if they're reached conditionally.

Thus, whenever there are no destination BB locations, delegate to getMergedLocation: it'll produce an "unknown" location if all else fails.

This solution is slightly stronger than necessary, in that non-call instructions will get "unknown" locations when merged into an otherwise empty BB. IMHO this is a feature: such insns explicitly don't have a location, and get marked as such.

The test case is adapted from the PR and checks that a) we don't crash, and b) an unknown location is emitted.


Repository:
  rL LLVM

https://reviews.llvm.org/D54997

Files:
  lib/Transforms/Utils/SimplifyCFG.cpp
  test/Transforms/SimplifyCFG/pr39807.ll


Index: test/Transforms/SimplifyCFG/pr39807.ll
===================================================================
--- /dev/null
+++ test/Transforms/SimplifyCFG/pr39807.ll
@@ -0,0 +1,43 @@
+; RUN: opt -S -simplifycfg < %s | FileCheck %s
+
+declare void @personality()
+
+define void @test(i1 %b) personality void()* @personality !dbg !1 {
+; CHECK:      invoke void @inlinable()
+; CHECK-NEXT:    to label %success unwind label %failure, !dbg ![[DBGLOC:[0-9]+]]
+    br i1 %b, label %if, label %else
+
+if:
+    invoke void @inlinable()
+        to label %success unwind label %failure, !dbg !2
+
+else:
+    invoke void @inlinable()
+        to label %success unwind label %failure, !dbg !8
+
+success:
+    ret void
+
+failure:
+    landingpad {}
+        cleanup
+    ret void
+}
+
+define internal void @inlinable() !dbg !7 {
+    ret void
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!4, !5, !6}
+
+; CHECK: ![[DBGLOC]] = !DILocation(line: 0
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, runtimeVersion: 0, file: !3)
+!1 = distinct !DISubprogram(name: "test", unit: !0)
+!2 = !DILocation(line: 2, scope: !1)
+!3 = !DIFile(filename: "foo", directory: ".")
+!4 = !{i32 2, !"Dwarf Version", i32 4}
+!5 = !{i32 2, !"Debug Info Version", i32 3}
+!6 = !{i32 1, !"wchar_size", i32 4}
+!7 = distinct !DISubprogram(name: "inlinable", unit: !0)
+!8 = !DILocation(line: 3, scope: !1)
Index: lib/Transforms/Utils/SimplifyCFG.cpp
===================================================================
--- lib/Transforms/Utils/SimplifyCFG.cpp
+++ lib/Transforms/Utils/SimplifyCFG.cpp
@@ -37,6 +37,7 @@
 #include "llvm/IR/ConstantRange.h"
 #include "llvm/IR/Constants.h"
 #include "llvm/IR/DataLayout.h"
+#include "llvm/IR/DebugInfoMetadata.h"
 #include "llvm/IR/DerivedTypes.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/GlobalValue.h"
@@ -1395,7 +1396,10 @@
   // are created from any PHI nodes, will take its debug location, giving
   // the impression that those 'select' instructions are in the true branch,
   // causing incorrect stepping, affecting the debug experience.
-  NT->setDebugLoc(InsertPt ? InsertPt->getDebugLoc() : DebugLoc());
+  // If there are no earlier locations, either adopt from the merged insns
+  // or produce an unknown location.
+  NT->setDebugLoc(InsertPt ? InsertPt->getDebugLoc().get() :
+    DILocation::getMergedLocation(I1->getDebugLoc(), I2->getDebugLoc()));
 
   IRBuilder<NoFolder> Builder(NT);
   // Hoisting one of the terminators from our successor is a great thing.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D54997.175651.patch
Type: text/x-patch
Size: 2526 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181128/6a4007a6/attachment.bin>


More information about the llvm-commits mailing list