forked from OSchip/llvm-project
[mlir] Add Tosa dialect const folder for tosa.const.
* Was missed in the initial submission and is required for a ConstantLike op. * Also adds a materializeConstant hook to preserve it. * Tightens up the argument constraint on tosa.const to match what is actually legal. Differential Revision: https://reviews.llvm.org/D92040
This commit is contained in:
parent
0ec73a61cc
commit
db9713cd77
|
@ -38,6 +38,7 @@ def Tosa_Dialect : Dialect {
|
||||||
}];
|
}];
|
||||||
|
|
||||||
let cppNamespace = "mlir::tosa";
|
let cppNamespace = "mlir::tosa";
|
||||||
|
let hasConstantMaterializer = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
|
@ -1512,12 +1512,13 @@ def Tosa_ConstOp : Tosa_Op<"const", [ConstantLike, NoSideEffect,
|
||||||
}];
|
}];
|
||||||
|
|
||||||
let arguments = (ins
|
let arguments = (ins
|
||||||
AnyAttr:$value
|
ElementsAttr:$value
|
||||||
);
|
);
|
||||||
|
|
||||||
let results = (outs
|
let results = (outs
|
||||||
Tosa_TensorUpto4D:$output
|
Tosa_TensorUpto4D:$output
|
||||||
);
|
);
|
||||||
|
let hasFolder = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
|
@ -89,6 +89,24 @@ void TosaDialect::initialize() {
|
||||||
addInterfaces<TosaInlinerInterface>();
|
addInterfaces<TosaInlinerInterface>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Operation *TosaDialect::materializeConstant(OpBuilder &builder, Attribute value,
|
||||||
|
Type type, Location loc) {
|
||||||
|
// Tosa dialect constants only support ElementsAttr unlike standard dialect
|
||||||
|
// constant which supports all attributes.
|
||||||
|
if (value.isa<ElementsAttr>())
|
||||||
|
return builder.create<tosa::ConstOp>(loc, type, value.cast<ElementsAttr>());
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// Operator Folders.
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
OpFoldResult ConstOp::fold(ArrayRef<Attribute> operands) {
|
||||||
|
assert(operands.empty() && "constant has no operands");
|
||||||
|
return valueAttr();
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// TOSA Operator Verifiers.
|
// TOSA Operator Verifiers.
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
// RUN: mlir-opt --test-constant-fold %s | FileCheck %s
|
||||||
|
|
||||||
|
// CHECK-LABEL: func @test_const
|
||||||
|
func @test_const(%arg0 : index) -> tensor<4xi32> {
|
||||||
|
// CHECK: "tosa.const"
|
||||||
|
%0 = "tosa.const"() {value = dense<[3, 0, 1, 2]> : tensor<4xi32>} : () -> tensor<4xi32>
|
||||||
|
return %0 : tensor<4xi32>
|
||||||
|
}
|
Loading…
Reference in New Issue