diff --git a/mlir/lib/Dialect/GPU/Transforms/ModuleToBinary.cpp b/mlir/lib/Dialect/GPU/Transforms/ModuleToBinary.cpp index e81992ca8e9a3..70d36297e103f 100644 --- a/mlir/lib/Dialect/GPU/Transforms/ModuleToBinary.cpp +++ b/mlir/lib/Dialect/GPU/Transforms/ModuleToBinary.cpp @@ -101,6 +101,9 @@ LogicalResult moduleSerializer(GPUModuleOp op, const TargetOptions &targetOptions) { OpBuilder builder(op->getContext()); SmallVector objects; + // Fail if there are no target attributes + if (!op.getTargetsAttr()) + return op.emitError("the module has no target attributes"); // Serialize all targets. for (auto targetAttr : op.getTargetsAttr()) { assert(targetAttr && "Target attribute cannot be null."); diff --git a/mlir/test/Dialect/GPU/module-to-binary-invalid.mlir b/mlir/test/Dialect/GPU/module-to-binary-invalid.mlir new file mode 100644 index 0000000000000..7043c4fe49e1a --- /dev/null +++ b/mlir/test/Dialect/GPU/module-to-binary-invalid.mlir @@ -0,0 +1,12 @@ +// RUN: mlir-opt %s --gpu-module-to-binary --verify-diagnostics + +module attributes {gpu.container_module} { + // expected-error @below {{the module has no target attributes}} + gpu.module @kernel_module1 { + llvm.func @kernel(%arg0: i32, %arg1: !llvm.ptr, + %arg2: !llvm.ptr, %arg3: i64, %arg4: i64, + %arg5: i64) attributes {gpu.kernel} { + llvm.return + } + } +}