[Mlir-commits] [mlir] 667a195 - [mlir][LLVM] Fix dbg intrinsic import of killed locations
Christian Ulmann
llvmlistbot at llvm.org
Sun Aug 13 23:40:18 PDT 2023
Author: Christian Ulmann
Date: 2023-08-14T06:30:45Z
New Revision: 667a195fcd1088cb7d182a3ec0ac8b9fb06bbcbe
URL: https://github.com/llvm/llvm-project/commit/667a195fcd1088cb7d182a3ec0ac8b9fb06bbcbe
DIFF: https://github.com/llvm/llvm-project/commit/667a195fcd1088cb7d182a3ec0ac8b9fb06bbcbe.diff
LOG: [mlir][LLVM] Fix dbg intrinsic import of killed locations
This commit ensures that debug intrinsics of killed variables do not
cause a crash of the importer. Killed locations are usually undef
constants, but in infrequent cases can also be metadata nodes, which
caused problems.
Reviewed By: zero9178
Differential Revision: https://reviews.llvm.org/D157724
Added:
Modified:
mlir/lib/Target/LLVMIR/ModuleImport.cpp
mlir/test/Target/LLVMIR/Import/import-failure.ll
Removed:
################################################################################
diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
index c71e87ed2673cc..35b2fcd3d3abe4 100644
--- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
@@ -1750,6 +1750,18 @@ LogicalResult ModuleImport::processFunction(llvm::Function *func) {
return success();
}
+/// Checks if `dbgIntr` is a kill location that holds metadata instead of an SSA
+/// value.
+static bool isMetadataKillLocation(llvm::DbgVariableIntrinsic *dbgIntr) {
+ if (!dbgIntr->isKillLocation())
+ return false;
+ llvm::Value *value = dbgIntr->getArgOperand(0);
+ auto *nodeAsVal = dyn_cast<llvm::MetadataAsValue>(value);
+ if (!nodeAsVal)
+ return false;
+ return !isa<llvm::ValueAsMetadata>(nodeAsVal->getMetadata());
+}
+
LogicalResult
ModuleImport::processDebugIntrinsic(llvm::DbgVariableIntrinsic *dbgIntr,
DominanceInfo &domInfo) {
@@ -1763,9 +1775,15 @@ ModuleImport::processDebugIntrinsic(llvm::DbgVariableIntrinsic *dbgIntr,
// TODO: Support debug intrinsics that evaluate a debug expression.
if (dbgIntr->hasArgList() || dbgIntr->getExpression()->getNumElements() != 0)
return emitUnsupportedWarning();
+ // Kill locations can have metadata nodes as location operand. This
+ // cannot be converted to poison as the type cannot be reconstructed.
+ // TODO: find a way to support this case.
+ if (isMetadataKillLocation(dbgIntr))
+ return emitUnsupportedWarning();
FailureOr<Value> argOperand = convertMetadataValue(dbgIntr->getArgOperand(0));
if (failed(argOperand))
- return failure();
+ return emitError(loc) << "failed to convert a debug intrinsic operand: "
+ << diag(*dbgIntr);
// Ensure that the debug instrinsic is inserted right after its operand is
// defined. Otherwise, the operand might not necessarily dominate the
diff --git a/mlir/test/Target/LLVMIR/Import/import-failure.ll b/mlir/test/Target/LLVMIR/Import/import-failure.ll
index a753c464335237..19837072f67637 100644
--- a/mlir/test/Target/LLVMIR/Import/import-failure.ll
+++ b/mlir/test/Target/LLVMIR/Import/import-failure.ll
@@ -65,9 +65,12 @@ declare void @llvm.dbg.value(metadata, metadata, metadata)
; CHECK-SAME: warning: dropped intrinsic: call void @llvm.dbg.value(metadata i64 %arg1, metadata !3, metadata !DIExpression(DW_OP_plus_uconst, 42, DW_OP_stack_value)), !dbg !5
; CHECK: import-failure.ll
; CHECK-SAME: warning: dropped intrinsic: call void @llvm.dbg.value(metadata !DIArgList(i64 %arg1, i64 undef), metadata !3, metadata !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_constu, 1, DW_OP_mul, DW_OP_plus, DW_OP_stack_value)), !dbg !5
+; CHECK: import-failure.ll
+; CHECK-SAME: warning: dropped intrinsic: call void @llvm.dbg.value(metadata !6, metadata !3, metadata !DIExpression()), !dbg !5
define void @dropped_instruction(i64 %arg1) {
call void @llvm.dbg.value(metadata i64 %arg1, metadata !3, metadata !DIExpression(DW_OP_plus_uconst, 42, DW_OP_stack_value)), !dbg !5
call void @llvm.dbg.value(metadata !DIArgList(i64 %arg1, i64 undef), metadata !3, metadata !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_constu, 1, DW_OP_mul, DW_OP_plus, DW_OP_stack_value)), !dbg !5
+ call void @llvm.dbg.value(metadata !6, metadata !3, metadata !DIExpression()), !dbg !5
ret void
}
@@ -79,6 +82,7 @@ define void @dropped_instruction(i64 %arg1) {
!3 = !DILocalVariable(scope: !4, name: "arg1", file: !2, line: 1, arg: 1, align: 64);
!4 = distinct !DISubprogram(name: "intrinsic", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1)
!5 = !DILocation(line: 1, column: 2, scope: !4)
+!6 = !{}
; // -----
More information about the Mlir-commits
mailing list