[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:
@@ -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);
|
||||
|
||||
32
mlir/test/Target/LLVMIR/llvmir-phi-loc.mlir
Normal file
32
mlir/test/Target/LLVMIR/llvmir-phi-loc.mlir
Normal 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{{.*}})
|
||||
Reference in New Issue
Block a user