[llvm] df7606a - [DebugInfo][LICM] Drop DebugLoc from IntrinsicInst when hoisting

Juan Manuel MARTINEZ CAAMAÑO via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 30 02:25:24 PDT 2022


Author: Juan Manuel MARTINEZ CAAMAÑO
Date: 2022-09-30T09:12:35Z
New Revision: df7606a066b75ce55ae4a186c785f996e0985db1

URL: https://github.com/llvm/llvm-project/commit/df7606a066b75ce55ae4a186c785f996e0985db1
DIFF: https://github.com/llvm/llvm-project/commit/df7606a066b75ce55ae4a186c785f996e0985db1.diff

LOG: [DebugInfo][LICM] Drop DebugLoc from IntrinsicInst when hoisting

The DebugLoc is conserved when hoisting function calls, to ensure the
DIScope is preserved if inlining occurs.

This commit drops the DebugLoc in the case the call is an intrinsic
call that won't be lowered into a function call.

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

Added: 
    llvm/test/DebugInfo/Generic/licm-hoist-intrinsic-debug-loc.ll

Modified: 
    llvm/lib/IR/DebugInfo.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp
index 2ef3f72f253af..5752233ed2d97 100644
--- a/llvm/lib/IR/DebugInfo.cpp
+++ b/llvm/lib/IR/DebugInfo.cpp
@@ -823,7 +823,14 @@ void Instruction::dropLocation() {
 
   // If this isn't a call, drop the location to allow a location from a
   // preceding instruction to propagate.
-  if (!isa<CallBase>(this)) {
+  bool MayLowerToCall = false;
+  if (isa<CallBase>(this)) {
+    auto *II = dyn_cast<IntrinsicInst>(this);
+    MayLowerToCall =
+        !II || IntrinsicInst::mayLowerToFunctionCall(II->getIntrinsicID());
+  }
+
+  if (!MayLowerToCall) {
     setDebugLoc(DebugLoc());
     return;
   }

diff  --git a/llvm/test/DebugInfo/Generic/licm-hoist-intrinsic-debug-loc.ll b/llvm/test/DebugInfo/Generic/licm-hoist-intrinsic-debug-loc.ll
new file mode 100644
index 0000000000000..50cba7c5b2825
--- /dev/null
+++ b/llvm/test/DebugInfo/Generic/licm-hoist-intrinsic-debug-loc.ll
@@ -0,0 +1,46 @@
+; RUN: opt -S -licm %s | FileCheck %s
+;
+; LICM should null out debug locations when it hoists intrinsics that won't lower to function calls out of a loop.
+; CHECK: define float @foo
+; CHECK-NEXT: entry:
+; CHECK-NEXT: call float @llvm.fma.f32(float %coef_0, float %coef_1, float 0.000000e+00){{$}}
+; CHECK-NEXT: br label %loop.header
+;
+define float @foo(float* %A, float %coef_0, float %coef_1, i32 %n) !dbg !2 {
+entry:
+  br label %loop.header
+
+loop.header:
+  %i = phi i32 [ 0, %entry ], [ %i.inc, %loop.backedge ]
+  %a = phi float [ 0.000000e+00, %entry ], [ %a.inc, %loop.backedge ]
+  %cond = icmp ult i32 %i, %n
+  br i1 %cond, label %loop.backedge, label %exit
+
+loop.backedge:
+  %i.cast = zext i32 %i to i64
+  %A.ptr = getelementptr inbounds float, float* %A, i64 %i.cast
+  %A.load = load float, float* %A.ptr
+  %fma = call float @llvm.fma.f32(float %coef_0, float %coef_1, float 0.000000e+00), !dbg !3
+  %mul = fmul float %fma, %A.load
+  %a.inc = fadd float %mul, %a
+  %i.inc = add i32 %i, 1
+  br label %loop.header
+
+exit:
+  ret float %a
+}
+
+declare float @llvm.fma.f32(float, float, float) #1
+
+attributes #0 = { nofree nosync nounwind readnone speculatable willreturn }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!6}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 14", isOptimized: false, runtimeVersion: 0, emissionKind: LineTablesOnly, splitDebugInlining: false, nameTableKind: None)
+!1 = !DIFile(filename: "source.c", directory: "/")
+!2 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !4, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !5)
+!3 = !DILocation(line: 4, column: 17, scope: !2)
+!4 = !DISubroutineType(types: !5)
+!5 = !{}
+!6 = !{i32 2, !"Debug Info Version", i32 3}
\ No newline at end of file


        


More information about the llvm-commits mailing list