The attribute is translated into LLVM's function attribute 'readonly'. The attribute can be only used for pointers.
Reviewed By: nicolasvasilache
Differential Revision: https://reviews.llvm.org/D139641
static StringRef getDataLayoutAttrName() { return "llvm.data_layout"; }
static StringRef getAlignAttrName() { return "llvm.align"; }
static StringRef getNoAliasAttrName() { return "llvm.noalias"; }
+ static StringRef getReadonlyAttrName() { return "llvm.readonly"; }
static StringRef getNoAliasScopesAttrName() { return "noalias_scopes"; }
static StringRef getAliasScopesAttrName() { return "alias_scopes"; }
static StringRef getLoopAttrName() { return "llvm.loop"; }
<< "llvm.noalias attribute attached to non-pointer result";
return success();
}
+ if (name == LLVMDialect::getReadonlyAttrName()) {
+ if (!attrValue.isa<UnitAttr>())
+ return op->emitError() << "expected llvm.readonly result attribute to "
+ "be a unit attribute";
+ if (verifyValueType && !resTy.isa<LLVMPointerType>())
+ return op->emitError()
+ << "llvm.readonly attribute attached to non-pointer result";
+ return success();
+ }
if (name == LLVMDialect::getNoUndefAttrName()) {
if (!attrValue.isa<UnitAttr>())
return op->emitError() << "expected llvm.noundef result attribute to "
"llvm.noalias attribute attached to LLVM non-pointer argument");
llvmArg.addAttr(llvm::Attribute::AttrKind::NoAlias);
}
+ if (auto attr = function.getArgAttrOfType<UnitAttr>(
+ argIdx, LLVMDialect::getReadonlyAttrName())) {
+ if (!mlirArgTy.isa<LLVM::LLVMPointerType>())
+ return function.emitError(
+ "llvm.readonly attribute attached to LLVM non-pointer argument");
+ llvmArg.addAttr(llvm::Attribute::AttrKind::ReadOnly);
+ }
if (auto attr = function.getArgAttrOfType<IntegerAttr>(
argIdx, LLVMDialect::getAlignAttrName())) {
%0 = llvm.intr.experimental.stepvector : vector<7xf32>
llvm.return %0 : vector<7xf32>
}
+
+// -----
+
+// expected-error @below{{llvm.readonly attribute attached to LLVM non-pointer argument}}
+llvm.func @wrong_readonly_attribute(%vec : f32 {llvm.readonly}) {
+ llvm.return
+}
// CHECK: declare void @readnone_function() #[[ATTR:[0-9]+]]
// CHECK: attributes #[[ATTR]] = { memory(none) }
llvm.func @readnone_function() attributes {llvm.readnone}
+
+// -----
+// CHECK: declare void @readonly_function([[PTR:.+]] readonly)
+llvm.func @readonly_function(%arg0: !llvm.ptr<f32> {llvm.readonly})