[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
This commit is contained in:
Juan Manuel MARTINEZ CAAMAÑO 2022-09-27 12:15:36 +00:00
parent 853a1b7236
commit df7606a066
2 changed files with 54 additions and 1 deletions

View File

@ -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;
}

View File

@ -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}