[mlir][llvmir][debug] Correctly generate location for phi nodes. (#105534)

In
[convertBlockImpl](87eeed1f0e/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp (L959)),
the debug location is set on the builder before the op is processed.
This results in correct location being given to corresponding llvm
instructions. But same is not done when phi nodes are created a few
lines above. This result is phi nodes getting whatever the current debug
location of the builder is. It can be nothing or in worst case a stale
location. Fixed by calling SetCurrentDebugLocation before generating phi
nodes.
This commit is contained in:
Abid Qadeer
2024-08-22 10:08:04 +01:00
committed by GitHub
parent 1e44e7afd7
commit 00a1a45a7d
2 changed files with 34 additions and 0 deletions

View File

@@ -947,6 +947,8 @@ LogicalResult ModuleTranslation::convertBlockImpl(Block &bb,
if (!isCompatibleType(wrappedType))
return emitError(bb.front().getLoc(),
"block argument does not have an LLVM type");
builder.SetCurrentDebugLocation(
debugTranslation->translateLoc(arg.getLoc(), subprogram));
llvm::Type *type = convertType(wrappedType);
llvm::PHINode *phi = builder.CreatePHI(type, numPredecessors);
mapValue(arg, phi);

View File

@@ -0,0 +1,32 @@
// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s
llvm.func @test_phi_locations(%arg0: !llvm.ptr) {
%0 = llvm.mlir.constant(1 : i64) : i64 loc(#loc1)
%1 = llvm.mlir.constant(100 : i32) : i32 loc(#loc1)
llvm.br ^bb1(%1, %0 : i32, i64) loc(#loc1)
^bb1(%2: i32 loc(#loc2), %3: i64 loc(#loc3)):
%4 = llvm.icmp "sgt" %3, %0 : i64 loc(#loc1)
llvm.cond_br %4, ^bb2, ^bb1(%2, %3 : i32, i64) loc(#loc1)
^bb2:
llvm.return loc(#loc1)
} loc(#loc4)
#file = #llvm.di_file<"test.f90" in "">
#cu = #llvm.di_compile_unit<id = distinct[0]<>,
sourceLanguage = DW_LANG_Fortran95, file = #file, isOptimized = false,
emissionKind = Full>
#sp_ty = #llvm.di_subroutine_type<callingConvention = DW_CC_normal>
#sp = #llvm.di_subprogram<id = distinct[1]<>, compileUnit = #cu, scope = #file,
name = "test_phi_locations", file = #file, subprogramFlags = Definition,
type = #sp_ty>
#loc1 = loc("test.f90":15:22)
#loc2 = loc("test.f90":8:2)
#loc3 = loc("test.f90":9:5)
#loc4 = loc(fused<#sp>[#loc1])
// CHECK-LABEL: define void @test_phi_locations
// CHECK: phi i32{{.*}}!dbg ![[LOC1:[0-9]+]]
// CHECK: phi i64{{.*}}!dbg ![[LOC2:[0-9]+]]
// CHECK: ![[LOC1]] = !DILocation(line: 8, column: 2{{.*}})
// CHECK: ![[LOC2]] = !DILocation(line: 9, column: 5{{.*}})