diff --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp --- a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp +++ b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp @@ -452,6 +452,15 @@ if (getOperands().empty() && !getDefaultAttr()) return emitError("at least one operand or the default attribute " "must appear on the data operation"); + + for (mlir::Value operand : getDataClauseOperands()) + if (!mlir::isa( + operand.getDefiningOp())) + return emitError("expect data entry/exit operation or acc.getdeviceptr " + "as defining op"); + return success(); } diff --git a/mlir/test/Dialect/OpenACC/invalid.mlir b/mlir/test/Dialect/OpenACC/invalid.mlir --- a/mlir/test/Dialect/OpenACC/invalid.mlir +++ b/mlir/test/Dialect/OpenACC/invalid.mlir @@ -76,6 +76,14 @@ // ----- +%value = memref.alloc() : memref<10xf32> +// expected-error@+1 {{expect data entry/exit operation or acc.getdeviceptr as defining op}} +acc.data dataOperands(%value : memref<10xf32>) { + acc.yield +} + +// ----- + // expected-error@+1 {{at least one value must be present in hostOperands or deviceOperands}} acc.update