ModuleOp is a natural place to provide scoped data layout information. However, it is undesirable for ModuleOp to implement the entirety of DataLayoutOpInterface because that would require either pushing the interface inside the IR library instead of a separate library, or putting the default implementation of the interface as inline functions in headers leading to binary bloat. Instead, ModuleOp accepts an arbitrary data layout spec attribute and has a dedicated hook to extract it, and DataLayout is modified to know about ModuleOp particularities. Reviewed By: herhut, nicolasvasilache Differential Revision: https://reviews.llvm.org/D98500
93 lines
3.3 KiB
MLIR
93 lines
3.3 KiB
MLIR
// RUN: mlir-opt -split-input-file -verify-diagnostics %s
|
|
|
|
// expected-error@below {{attribute 'dlti.unknown' not supported by dialect}}
|
|
"test.unknown_op"() { dlti.unknown } : () -> ()
|
|
|
|
// -----
|
|
|
|
// expected-error@below {{'dlti.dl_spec' is expected to be a #dlti.dl_spec attribute}}
|
|
"test.unknown_op"() { dlti.dl_spec = 42 } : () -> ()
|
|
|
|
// -----
|
|
|
|
// expected-error@below {{invalid kind of attribute specified}}
|
|
"test.unknown_op"() { dlti.dl_spec = #dlti.dl_spec<[]> } : () -> ()
|
|
|
|
// -----
|
|
|
|
// expected-error@below {{expected a type or a quoted string}}
|
|
"test.unknown_op"() { test.unknown_attr = #dlti.dl_entry<42, 42> } : () -> ()
|
|
|
|
// -----
|
|
|
|
// expected-error@below {{repeated layout entry key: test.id}}
|
|
"test.unknown_op"() { test.unknown_attr = #dlti.dl_spec<
|
|
#dlti.dl_entry<"test.id", 42>,
|
|
#dlti.dl_entry<"test.id", 43>
|
|
>} : () -> ()
|
|
|
|
// -----
|
|
|
|
// expected-error@below {{repeated layout entry key: 'i32'}}
|
|
"test.unknown_op"() { test.unknown_attr = #dlti.dl_spec<
|
|
#dlti.dl_entry<i32, 42>,
|
|
#dlti.dl_entry<i32, 42>
|
|
>} : () -> ()
|
|
|
|
// -----
|
|
|
|
// expected-error@below {{unknown attrribute type: unknown}}
|
|
"test.unknown_op"() { test.unknown_attr = #dlti.unknown } : () -> ()
|
|
|
|
// -----
|
|
|
|
// expected-error@below {{unknown data layout entry name: dlti.unknown_id}}
|
|
"test.op_with_data_layout"() ({
|
|
}) { dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<"dlti.unknown_id", 42>> } : () -> ()
|
|
|
|
// -----
|
|
|
|
// expected-error@below {{'dlti.endianness' data layout entry is expected to be either 'big' or 'little'}}
|
|
"test.op_with_data_layout"() ({
|
|
}) { dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<"dlti.endianness", "some">> } : () -> ()
|
|
|
|
// -----
|
|
|
|
// Mismatching entries don't combine.
|
|
"test.op_with_data_layout"() ({
|
|
// expected-error@below {{data layout does not combine with layouts of enclosing ops}}
|
|
// expected-note@above {{enclosing op with data layout}}
|
|
"test.op_with_data_layout"() { dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<"unknown.unknown", 32>> } : () -> ()
|
|
"test.maybe_terminator_op"() : () -> ()
|
|
}) { dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<"unknown.unknown", 33>> } : () -> ()
|
|
|
|
// -----
|
|
|
|
// Layout not supported for built-in types.
|
|
// expected-error@below {{unexpected data layout for a built-in type}}
|
|
"test.op_with_data_layout"() { dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<i32, 32>> } : () -> ()
|
|
|
|
// -----
|
|
|
|
// expected-error@below {{data layout specified for a type that does not support it}}
|
|
"test.op_with_data_layout"() { dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<!test.test_type, 32>> } : () -> ()
|
|
|
|
// -----
|
|
|
|
// Mismatching entries are checked on module ops as well.
|
|
module attributes { dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<"unknown.unknown", 33>>} {
|
|
// expected-error@below {{data layout does not combine with layouts of enclosing ops}}
|
|
// expected-note@above {{enclosing op with data layout}}
|
|
module attributes { dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<"unknown.unknown", 32>>} {
|
|
}
|
|
}
|
|
|
|
// -----
|
|
|
|
// Mismatching entries are checked on a combination of modules and other ops.
|
|
module attributes { dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<"unknown.unknown", 33>>} {
|
|
// expected-error@below {{data layout does not combine with layouts of enclosing ops}}
|
|
// expected-note@above {{enclosing op with data layout}}
|
|
"test.op_with_data_layout"() { dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<"unknown.unknown", 32>>} : () -> ()
|
|
}
|