From 00a1a45a7dcdcd8b1f969958a6d927b595567090 Mon Sep 17 00:00:00 2001 From: Abid Qadeer Date: Thu, 22 Aug 2024 10:08:04 +0100 Subject: [PATCH] [mlir][llvmir][debug] Correctly generate location for phi nodes. (#105534) In [convertBlockImpl](https://github.com/llvm/llvm-project/blob/87eeed1f0ebe57abffde560c25dd9829dc6038f3/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. --- mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 2 ++ mlir/test/Target/LLVMIR/llvmir-phi-loc.mlir | 32 ++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 mlir/test/Target/LLVMIR/llvmir-phi-loc.mlir diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp index 930300d26c44..2827713e2bf2 100644 --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -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); diff --git a/mlir/test/Target/LLVMIR/llvmir-phi-loc.mlir b/mlir/test/Target/LLVMIR/llvmir-phi-loc.mlir new file mode 100644 index 000000000000..fd0450260528 --- /dev/null +++ b/mlir/test/Target/LLVMIR/llvmir-phi-loc.mlir @@ -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, + sourceLanguage = DW_LANG_Fortran95, file = #file, isOptimized = false, + emissionKind = Full> +#sp_ty = #llvm.di_subroutine_type +#sp = #llvm.di_subprogram, 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{{.*}})