[Mlir-commits] [mlir] 00a1a45 - [mlir][llvmir][debug] Correctly generate location for phi nodes. (#105534)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Thu Aug 22 02:08:08 PDT 2024


Author: Abid Qadeer
Date: 2024-08-22T10:08:04+01:00
New Revision: 00a1a45a7dcdcd8b1f969958a6d927b595567090

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

LOG: [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.

Added: 
    mlir/test/Target/LLVMIR/llvmir-phi-loc.mlir

Modified: 
    mlir/lib/Target/LLVMIR/ModuleTranslation.cpp

Removed: 
    


################################################################################
diff  --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
index 930300d26c4479..2827713e2bf213 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 00000000000000..fd045026052848
--- /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<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{{.*}})


        


More information about the Mlir-commits mailing list