[Mlir-commits] [mlir] [mlir][tosa] Make TOSA RESIZE's scale, offset, border as Input (PR #124956)
Hsiangkai Wang
llvmlistbot at llvm.org
Wed Feb 12 04:05:17 PST 2025
================
@@ -519,6 +526,106 @@ LogicalResult TosaValidation::applyVariableCheck(Operation *op) {
return success();
}
+bool checkErrorIfResize(Operation *op) {
+ if (auto resize = dyn_cast<tosa::ResizeOp>(op)) {
+ const Value input = resize.getInput();
+ const Value output = resize.getOutput();
+ const RankedTensorType inputType =
+ llvm::dyn_cast<RankedTensorType>(input.getType());
+ const RankedTensorType outputType =
+ llvm::dyn_cast<RankedTensorType>(output.getType());
+
+ if (!inputType || !outputType) {
+ op->emitOpError("expect ranked input/output tensor");
+ return false;
+ }
+
+ // Ensure the image size is supported by GPU APIs and that for integer
+ // implementations, position * stride does not overflow int32_t.
+ if (inputType.hasStaticShape() && outputType.hasStaticShape()) {
+ const SmallVector<int64_t, 4> sizes = {
+ outputType.getDimSize(1), outputType.getDimSize(2),
+ inputType.getDimSize(1), inputType.getDimSize(2)};
+ const int64_t *maxDim = llvm::max_element(sizes);
+ if (maxDim != sizes.end() && *maxDim >= 16384) {
+ op->emitOpError("expect input/output height/width dims to be < 16384, ")
+ << "got [OH, OW, IH, IW] = " << sizes;
+ return false;
+ }
+ }
+
+ SmallVector<int64_t> scale;
+ if (!tosa::getConstShapeValue(resize.getScale().getDefiningOp(), scale)) {
+ return false;
+ }
+
+ const int64_t scaleYN = scale[0];
+ const int64_t scaleYD = scale[1];
+ const int64_t scaleXN = scale[2];
+ const int64_t scaleXD = scale[3];
+
+ // Ensure scale values don't overflow int32 accumulator
+ if (scaleYN > (1 << 11) || scaleXN > (1 << 11)) {
+ op->emitOpError("expect all scale numerator values to be <= (1 << 11), "
+ "got scale_y_n=")
+ << scaleYN << ", scale_x_n=" << scaleXN;
+ return false;
+ }
+
+ if (scaleYD >= 16 * scaleYN || scaleXD >= 16 * scaleXN) {
+ op->emitOpError("expect a downscale ratio larger than 1/16, got y=")
+ << scaleYN << "/" << scaleYD << ", x=" << scaleXN << "/" << scaleXD;
+ return false;
+ }
+
+ SmallVector<int64_t> offset;
+ SmallVector<int64_t> border;
+ if (!tosa::getConstShapeValue(resize.getOffset().getDefiningOp(), offset) ||
+ !tosa::getConstShapeValue(resize.getBorder().getDefiningOp(), border)) {
+ return false;
+ }
+
+ const int64_t offsetY = offset[0];
+ const int64_t offsetX = offset[1];
+ const int64_t borderY = border[0];
----------------
Hsiangkai wrote:
Done.
https://github.com/llvm/llvm-project/pull/124956
More information about the Mlir-commits
mailing list