307 lines · plain
1// RUN: mlir-opt %s -split-input-file -verify-diagnostics -tosa-attach-target="level=none profiles=pro_int,pro_fp extensions=int16,int4,bf16,fp8e4m3,fp8e5m2,fft,variable,controlflow,dynamic" -tosa-validate="strict-op-spec-alignment"2 3// -----4 5// CHECK-LABEL: test_resize_large_image_size6func.func @test_resize_large_image_size(%arg0: tensor<1x16384x16384x8xf32>) -> tensor<1x32767x32767x8xf32> {7 %scale = tosa.const_shape { values = dense<[2, 1, 2, 1]> : tensor<4xindex> } : () -> !tosa.shape<4>8 %offset = tosa.const_shape { values = dense<0> : tensor<2xindex> } : () -> !tosa.shape<2>9 %border = tosa.const_shape { values = dense<0> : tensor<2xindex> } : () -> !tosa.shape<2>10 // expected-error@+1 {{'tosa.resize' op expect input/output height/width dims to be < 16384, got [OH, OW, IH, IW] = 32767, 32767, 16384, 16384}}11 %1 = tosa.resize %arg0, %scale, %offset, %border { mode = BILINEAR } : (tensor<1x16384x16384x8xf32>, !tosa.shape<4>, !tosa.shape<2>, !tosa.shape<2>) -> tensor<1x32767x32767x8xf32>12 return %1 : tensor<1x32767x32767x8xf32>13}14 15// -----16 17// CHECK-LABEL: test_resize_invalid_scale_numerator18func.func @test_resize_invalid_scale_numerator(%arg0: tensor<1x9x9x8xf32>) -> tensor<?x?x?x?xf32> {19 %scale = tosa.const_shape { values = dense<[2049, 8, 1, 2]> : tensor<4xindex> } : () -> !tosa.shape<4>20 %offset = tosa.const_shape { values = dense<0> : tensor<2xindex> } : () -> !tosa.shape<2>21 %border = tosa.const_shape { values = dense<0> : tensor<2xindex> } : () -> !tosa.shape<2>22 // expected-error@+1 {{'tosa.resize' op expect all scale numerator values to be <= (1 << 11), got scale_y_n=2049, scale_x_n=1}}23 %1 = tosa.resize %arg0, %scale, %offset, %border { mode = BILINEAR } : (tensor<1x9x9x8xf32>, !tosa.shape<4>, !tosa.shape<2>, !tosa.shape<2>) -> tensor<?x?x?x?xf32>24 return %1 : tensor<?x?x?x?xf32>25}26 27// -----28 29// CHECK-LABEL: test_resize_invalid_downscale30func.func @test_resize_invalid_downscale(%arg0: tensor<1x37x37x8xf32>) -> tensor<?x?x?x?xf32> {31 %scale = tosa.const_shape { values = dense<[1, 18, 1, 18]> : tensor<4xindex> } : () -> !tosa.shape<4>32 %offset = tosa.const_shape { values = dense<0> : tensor<2xindex> } : () -> !tosa.shape<2>33 %border = tosa.const_shape { values = dense<0> : tensor<2xindex> } : () -> !tosa.shape<2>34 // expected-error@+1 {{'tosa.resize' op expect a downscale ratio larger than 1/16, got y=1/18, x=1/18}}35 %1 = tosa.resize %arg0, %scale, %offset, %border { mode = BILINEAR } : (tensor<1x37x37x8xf32>, !tosa.shape<4>, !tosa.shape<2>, !tosa.shape<2>) -> tensor<?x?x?x?xf32>36 return %1 : tensor<?x?x?x?xf32>37}38 39// -----40 41// CHECK-LABEL: test_resize_invalid_offset_y42func.func @test_resize_invalid_offset_y(%arg0: tensor<1x8x8x8xf32>) -> tensor<?x?x?x?xf32> {43 %scale = tosa.const_shape { values = dense<[1, 1, 1, 1]> : tensor<4xindex> } : () -> !tosa.shape<4>44 %offset = tosa.const_shape { values = dense<[17, 0]> : tensor<2xindex> } : () -> !tosa.shape<2>45 %border = tosa.const_shape { values = dense<0> : tensor<2xindex> } : () -> !tosa.shape<2>46 // expected-error@+1 {{'tosa.resize' op expect offsetY / scaleYNumerator to be in range [-1, 16), got 17/1}}47 %1 = tosa.resize %arg0, %scale, %offset, %border { mode = BILINEAR } : (tensor<1x8x8x8xf32>, !tosa.shape<4>, !tosa.shape<2>, !tosa.shape<2>) -> tensor<?x?x?x?xf32>48 return %1 : tensor<?x?x?x?xf32>49}50 51// -----52 53// CHECK-LABEL: test_resize_invalid_offset_x54func.func @test_resize_invalid_offset_x(%arg0: tensor<1x8x8x8xf32>) -> tensor<?x?x?x?xf32> {55 %scale = tosa.const_shape { values = dense<[1, 1, 1, 1]> : tensor<4xindex> } : () -> !tosa.shape<4>56 %offset = tosa.const_shape { values = dense<[0, -2]> : tensor<2xindex> } : () -> !tosa.shape<2>57 %border = tosa.const_shape { values = dense<0> : tensor<2xindex> } : () -> !tosa.shape<2>58 // expected-error@+1 {{'tosa.resize' op expect offsetX / scaleXNumerator to be in range [-1, 16), got -2/1}}59 %1 = tosa.resize %arg0, %scale, %offset, %border { mode = BILINEAR } : (tensor<1x8x8x8xf32>, !tosa.shape<4>, !tosa.shape<2>, !tosa.shape<2>) -> tensor<?x?x?x?xf32>60 return %1 : tensor<?x?x?x?xf32>61}62 63// -----64 65// CHECK-LABEL: test_resize_invalid_border_y66func.func @test_resize_invalid_boarder_y(%arg0: tensor<1x8x8x8xf32>) -> tensor<?x?x?x?xf32> {67 %scale = tosa.const_shape { values = dense<[1, 1, 1, 1]> : tensor<4xindex> } : () -> !tosa.shape<4>68 %offset = tosa.const_shape { values = dense<0> : tensor<2xindex> } : () -> !tosa.shape<2>69 %border = tosa.const_shape { values = dense<[-17, 0]> : tensor<2xindex> } : () -> !tosa.shape<2>70 // expected-error@+1 {{'tosa.resize' op expect borderY / scaleYNumerator to be in range [-16, 1), got -17/1}}71 %1 = tosa.resize %arg0, %scale, %offset, %border { mode = BILINEAR } : (tensor<1x8x8x8xf32>, !tosa.shape<4>, !tosa.shape<2>, !tosa.shape<2>) -> tensor<?x?x?x?xf32>72 return %1 : tensor<?x?x?x?xf32>73}74 75// -----76 77// CHECK-LABEL: test_resize_invalid_border_x78func.func @test_resize_invalid_boarder_x(%arg0: tensor<1x8x8x8xf32>) -> tensor<?x?x?x?xf32> {79 %scale = tosa.const_shape { values = dense<[1, 1, 1, 1]> : tensor<4xindex> } : () -> !tosa.shape<4>80 %offset = tosa.const_shape { values = dense<0> : tensor<2xindex> } : () -> !tosa.shape<2>81 %border = tosa.const_shape { values = dense<[0, 2]> : tensor<2xindex> } : () -> !tosa.shape<2>82 // expected-error@+1 {{'tosa.resize' op expect borderX / scaleXNumerator to be in range [-16, 1), got 2/1}}83 %1 = tosa.resize %arg0, %scale, %offset, %border { mode = BILINEAR } : (tensor<1x8x8x8xf32>, !tosa.shape<4>, !tosa.shape<2>, !tosa.shape<2>) -> tensor<?x?x?x?xf32>84 return %1 : tensor<?x?x?x?xf32>85}86 87// -----88 89// CHECK-LABEL: test_mul_negative_shift90func.func @test_mul_negative_shift(%arg0: tensor<1x8x8x8xi32>, %arg1: tensor<1x8x8x8xi32>) -> tensor<1x8x8x8xi32> {91 %shift = "tosa.const" () { values = dense<-1> : tensor<1xi8> } : () -> tensor<1xi8>92 // expected-error@+1 {{'tosa.mul' op requires 0 <= shift && shift <= 63, but got: -1}}93 %mul = tosa.mul %arg0, %arg1, %shift : (tensor<1x8x8x8xi32>, tensor<1x8x8x8xi32>, tensor<1xi8>) -> tensor<1x8x8x8xi32>94 return %mul : tensor<1x8x8x8xi32>95}96 97// -----98 99// CHECK-LABEL: test_mul_too_big_shift100func.func @test_mul_too_big_shift(%arg0: tensor<1x8x8x8xi32>, %arg1: tensor<1x8x8x8xi32>) -> tensor<1x8x8x8xi32> {101 %shift = "tosa.const" () { values = dense<64> : tensor<1xi8> } : () -> tensor<1xi8>102 // expected-error@+1 {{'tosa.mul' op requires 0 <= shift && shift <= 63, but got: 64}}103 %mul = tosa.mul %arg0, %arg1, %shift : (tensor<1x8x8x8xi32>, tensor<1x8x8x8xi32>, tensor<1xi8>) -> tensor<1x8x8x8xi32>104 return %mul : tensor<1x8x8x8xi32>105}106 107// -----108 109// CHECK-LABEL: test_mul_non_zero_shift110func.func @test_mul_non_zero_shift(%arg0: tensor<1x8x8x8xi16>, %arg1: tensor<1x8x8x8xi16>) -> tensor<1x8x8x8xi32> {111 %shift = "tosa.const" () { values = dense<1> : tensor<1xi8> } : () -> tensor<1xi8>112 // expected-error@+1 {{'tosa.mul' op requires shift = 0 for all input data types that are not int32_t, but got: 1}}113 %mul = tosa.mul %arg0, %arg1, %shift : (tensor<1x8x8x8xi16>, tensor<1x8x8x8xi16>, tensor<1xi8>) -> tensor<1x8x8x8xi32>114 return %mul : tensor<1x8x8x8xi32>115}116 117// -----118// CHECK-LABEL: test_i16_table_size119func.func @test_i16_table_size(%arg0: tensor<2x64xi16>, %arg1: tensor<256xi16>) -> tensor<2x64xi32> {120 // expected-error@+1 {{'tosa.table' op requires table size of 513, got 256}}121 %0 = tosa.table %arg0, %arg1 : (tensor<2x64xi16>, tensor<256xi16>) -> tensor<2x64xi32>122 return %0 : tensor<2x64xi32>123}124 125// -----126// CHECK-LABEL: test_i8_table_size127func.func @test_i8_table_size(%arg0: tensor<2x64xi8>, %arg1: tensor<513xi8>) -> tensor<2x64xi8> {128 // expected-error@+1 {{'tosa.table' op requires table size of 256, got 513}}129 %0 = tosa.table %arg0, %arg1 : (tensor<2x64xi8>, tensor<513xi8>) -> tensor<2x64xi8>130 return %0 : tensor<2x64xi8>131}132 133// -----134// CHECK-LABEL: test_error_scale32_with_i48135func.func @test_error_scale32_with_i48(%arg0: tensor<1xi48>) -> tensor<1xi8> {136 %multiplier = "tosa.const"() {values = dense<19689> : tensor<1xi32> } : () -> tensor<1xi32>137 %shift = "tosa.const"() {values = dense<30> : tensor<1xi8> } : () -> tensor<1xi8>138 %input_zp = "tosa.const"() {values = dense<0> : tensor<1xi48>} : () -> tensor<1xi48>139 %output_zp = "tosa.const"() {values = dense<0> : tensor<1xi8>} : () -> tensor<1xi8>140 // expected-error@+1 {{'tosa.rescale' op scale32 is not allowed with 48-bit input}}141 %0 = tosa.rescale %arg0, %multiplier, %shift, %input_zp, %output_zp {scale32 = true, rounding_mode = SINGLE_ROUND, per_channel = false, input_unsigned = false, output_unsigned = false} : (tensor<1xi48>, tensor<1xi32>, tensor<1xi8>, tensor<1xi48>, tensor<1xi8>) -> tensor<1xi8>142 return %0 : tensor<1xi8>143}144 145// -----146// CHECK-LABEL: test_error_input_output_unsigned147func.func @test_error_input_output_unsigned(%arg0: tensor<1xi8>) -> tensor<1xi16> {148 %multiplier = "tosa.const"() {values = dense<19689> : tensor<1xi16> } : () -> tensor<1xi16>149 %shift = "tosa.const"() {values = dense<30> : tensor<1xi8> } : () -> tensor<1xi8>150 %input_zp = "tosa.const"() {values = dense<0> : tensor<1xi8>} : () -> tensor<1xi8>151 %output_zp = "tosa.const"() {values = dense<0> : tensor<1xi16>} : () -> tensor<1xi16>152 // expected-error@+1 {{'tosa.rescale' op input and output cannot be both unsigned}}153 %0 = tosa.rescale %arg0, %multiplier, %shift, %input_zp, %output_zp {scale32 = false, rounding_mode = SINGLE_ROUND, per_channel = false, input_unsigned = true, output_unsigned = true} : (tensor<1xi8>, tensor<1xi16>, tensor<1xi8>, tensor<1xi8>, tensor<1xi16>) -> tensor<1xi16>154 return %0 : tensor<1xi16>155}156 157// -----158// CHECK-LABEL: test_error_i32_output_unsigned_input159func.func @test_error_i32_output_unsigned_input(%arg0: tensor<1xi8>) -> tensor<1xi32> {160 %multiplier = "tosa.const"() {values = dense<19689> : tensor<1xi16> } : () -> tensor<1xi16>161 %shift = "tosa.const"() {values = dense<30> : tensor<1xi8> } : () -> tensor<1xi8>162 %input_zp = "tosa.const"() {values = dense<0> : tensor<1xi8>} : () -> tensor<1xi8>163 %output_zp = "tosa.const"() {values = dense<0> : tensor<1xi32>} : () -> tensor<1xi32>164 // expected-error@+1 {{'tosa.rescale' op i32 output type is not allowed with unsigned input}}165 %0 = tosa.rescale %arg0, %multiplier, %shift, %input_zp, %output_zp {scale32 = false, rounding_mode = SINGLE_ROUND, per_channel = false, input_unsigned = true, output_unsigned = false} : (tensor<1xi8>, tensor<1xi16>, tensor<1xi8>, tensor<1xi8>, tensor<1xi32>) -> tensor<1xi32>166 return %0 : tensor<1xi32>167}168 169// -----170// CHECK-LABEL: test_error_i32_input_unsigned_output171func.func @test_error_i32_input_unsigned_output(%arg0: tensor<1xi32>) -> tensor<1xi8> {172 %multiplier = "tosa.const"() {values = dense<19689> : tensor<1xi16> } : () -> tensor<1xi16>173 %shift = "tosa.const"() {values = dense<30> : tensor<1xi8> } : () -> tensor<1xi8>174 %input_zp = "tosa.const"() {values = dense<0> : tensor<1xi32>} : () -> tensor<1xi32>175 %output_zp = "tosa.const"() {values = dense<0> : tensor<1xi8>} : () -> tensor<1xi8>176 // expected-error@+1 {{'tosa.rescale' op i32 input type is not allowed with unsigned output}}177 %0 = tosa.rescale %arg0, %multiplier, %shift, %input_zp, %output_zp {scale32 = false, rounding_mode = SINGLE_ROUND, per_channel = false, input_unsigned = false, output_unsigned = true} : (tensor<1xi32>, tensor<1xi16>, tensor<1xi8>, tensor<1xi32>, tensor<1xi8>) -> tensor<1xi8>178 return %0 : tensor<1xi8>179}180 181// -----182// CHECK-LABEL: test_error_i48_input_unsigned_output183func.func @test_error_i48_input_unsigned_output(%arg0: tensor<1xi48>) -> tensor<1xi8> {184 %multiplier = "tosa.const"() {values = dense<19689> : tensor<1xi16> } : () -> tensor<1xi16>185 %shift = "tosa.const"() {values = dense<30> : tensor<1xi8> } : () -> tensor<1xi8>186 %input_zp = "tosa.const"() {values = dense<0> : tensor<1xi48>} : () -> tensor<1xi48>187 %output_zp = "tosa.const"() {values = dense<0> : tensor<1xi8>} : () -> tensor<1xi8>188 // expected-error@+1 {{'tosa.rescale' op i48 input type is not allowed with unsigned output}}189 %0 = tosa.rescale %arg0, %multiplier, %shift, %input_zp, %output_zp {scale32 = false, rounding_mode = SINGLE_ROUND, per_channel = false, input_unsigned = false, output_unsigned = true} : (tensor<1xi48>, tensor<1xi16>, tensor<1xi8>, tensor<1xi48>, tensor<1xi8>) -> tensor<1xi8>190 return %0 : tensor<1xi8>191}192 193// -----194// CHECK-LABEL: test_error_i48_unsigned_input195func.func @test_error_i48_input_unsigned_output(%arg0: tensor<1xi48>) -> tensor<1xi8> {196 %multiplier = "tosa.const"() {values = dense<19689> : tensor<1xi16> } : () -> tensor<1xi16>197 %shift = "tosa.const"() {values = dense<30> : tensor<1xi8> } : () -> tensor<1xi8>198 %input_zp = "tosa.const"() {values = dense<0> : tensor<1xi48>} : () -> tensor<1xi48>199 %output_zp = "tosa.const"() {values = dense<0> : tensor<1xi8>} : () -> tensor<1xi8>200 // expected-error@+1 {{'tosa.rescale' op i48 input type cannot be unsigned}}201 %0 = tosa.rescale %arg0, %multiplier, %shift, %input_zp, %output_zp {scale32 = false, rounding_mode = SINGLE_ROUND, per_channel = false, input_unsigned = true, output_unsigned = false} : (tensor<1xi48>, tensor<1xi16>, tensor<1xi8>, tensor<1xi48>, tensor<1xi8>) -> tensor<1xi8>202 return %0 : tensor<1xi8>203}204 205// -----206// CHECK-LABEL: test_error_i32_unsigned_input207func.func @test_error_i32_input_unsigned_output(%arg0: tensor<1xi32>) -> tensor<1xi8> {208 %multiplier = "tosa.const"() {values = dense<19689> : tensor<1xi16> } : () -> tensor<1xi16>209 %shift = "tosa.const"() {values = dense<30> : tensor<1xi8> } : () -> tensor<1xi8>210 %input_zp = "tosa.const"() {values = dense<0> : tensor<1xi32>} : () -> tensor<1xi32>211 %output_zp = "tosa.const"() {values = dense<0> : tensor<1xi8>} : () -> tensor<1xi8>212 // expected-error@+1 {{'tosa.rescale' op i32 input type cannot be unsigned}}213 %0 = tosa.rescale %arg0, %multiplier, %shift, %input_zp, %output_zp {scale32 = false, rounding_mode = SINGLE_ROUND, per_channel = false, input_unsigned = true, output_unsigned = false} : (tensor<1xi32>, tensor<1xi16>, tensor<1xi8>, tensor<1xi32>, tensor<1xi8>) -> tensor<1xi8>214 return %0 : tensor<1xi8>215}216 217// -----218// CHECK-LABEL: test_error_i32_unsigned_output219func.func @test_error_i32_unsigned_output(%arg0: tensor<1xi8>) -> tensor<1xi32> {220 %multiplier = "tosa.const"() {values = dense<19689> : tensor<1xi16> } : () -> tensor<1xi16>221 %shift = "tosa.const"() {values = dense<30> : tensor<1xi8> } : () -> tensor<1xi8>222 %input_zp = "tosa.const"() {values = dense<0> : tensor<1xi8>} : () -> tensor<1xi8>223 %output_zp = "tosa.const"() {values = dense<0> : tensor<1xi32>} : () -> tensor<1xi32>224 // expected-error@+1 {{'tosa.rescale' op i32 output type cannot be unsigned}}225 %0 = tosa.rescale %arg0, %multiplier, %shift, %input_zp, %output_zp {scale32 = false, rounding_mode = SINGLE_ROUND, per_channel = false, input_unsigned = false, output_unsigned = true} : (tensor<1xi8>, tensor<1xi16>, tensor<1xi8>, tensor<1xi8>, tensor<1xi32>) -> tensor<1xi32>226 return %0 : tensor<1xi32>227}228 229// -----230 231func.func @test_cond_if_then_not_isolated_from_above(%arg0: tensor<f32>, %arg1: tensor<f32>, %arg2: tensor<i1>) -> tensor<f32> {232 // expected-error@+1 {{'tosa.cond_if' op is not conformant to the TOSA specification. It requires the 'then' region is isolated from above.}}233 %0 = "tosa.cond_if"(%arg2, %arg1) ({234 ^bb0(%arg3: tensor<f32>):235 tosa.yield %arg1 : tensor<f32>236 }, {237 ^bb0(%arg3: tensor<f32>):238 tosa.yield %arg3 : tensor<f32>239 }) : (tensor<i1>, tensor<f32>) -> tensor<f32>240 return %0 : tensor<f32>241}242 243// -----244 245func.func @test_cond_if_else_not_isolated_from_above(%arg0: tensor<f32>, %arg1: tensor<f32>, %arg2: tensor<i1>) -> tensor<f32> {246 // expected-error@+1 {{'tosa.cond_if' op is not conformant to the TOSA specification. It requires the 'else' region is isolated from above.}}247 %0 = "tosa.cond_if"(%arg2, %arg0, %arg1) ({248 ^bb0(%arg3: tensor<f32>, %arg4: tensor<f32>):249 tosa.yield %arg3 : tensor<f32>250 }, {251 ^bb0(%arg3: tensor<f32>, %arg4: tensor<f32>):252 %add = tosa.add %arg0, %arg4 : (tensor<f32>, tensor<f32>) -> tensor<f32>253 tosa.yield %add : tensor<f32>254 }) : (tensor<i1>, tensor<f32>, tensor<f32>) -> tensor<f32>255 return %0 : tensor<f32>256}257 258// -----259 260func.func @test_cond_if_simplified_form_not_isolated_from_above(%arg0: tensor<f32>, %arg1: tensor<f32>, %arg2: tensor<i1>) -> tensor<f32> {261 // expected-error@+1 {{'tosa.cond_if' op is not conformant to the TOSA specification. It requires the 'then' region is isolated from above.}}262 %0 = tosa.cond_if %arg2 : tensor<i1> -> (tensor<f32>) {263 tosa.yield %arg0 : tensor<f32>264 } else {265 tosa.yield %arg1 : tensor<f32>266 }267 return %0 : tensor<f32>268}269 270// -----271 272func.func @test_while_loop_cond_not_isolated_from_above(%arg0: tensor<i32>, %arg1: tensor<i32>, %arg2: tensor<f32>) {273 %0 = "tosa.const"() {values = dense<0> : tensor<i32>} : () -> tensor<i32>274 // expected-error@+1 {{'tosa.while_loop' op is not conformant to the TOSA specification. It requires the 'cond' region is isolated from above.}}275 %1 = "tosa.while_loop"(%0) ({276 ^bb0(%arg3: tensor<i32>):277 %2 = "tosa.greater_equal"(%arg3, %arg1) : (tensor<i32>, tensor<i32>) -> tensor<i1>278 %3 = "tosa.logical_not"(%2) : (tensor<i1>) -> tensor<i1>279 tosa.yield %3 : tensor<i1>280 }, {281 ^bb0(%arg3: tensor<i32>):282 %2 = "tosa.const"() {values = dense<1> : tensor<i32>} : () -> tensor<i32>283 %3 = "tosa.add"(%arg3, %2) : (tensor<i32>, tensor<i32>) -> tensor<i32>284 tosa.yield %3 : tensor<i32>285 }) : (tensor<i32>) -> (tensor<i32>)286 return287}288 289// -----290 291func.func @test_while_loop_body_not_isolated_from_above(%arg0: tensor<i32>, %arg1: tensor<i32>, %arg2: tensor<f32>) {292 %0 = "tosa.const"() {values = dense<0> : tensor<i32>} : () -> tensor<i32>293 // expected-error@+1 {{'tosa.while_loop' op is not conformant to the TOSA specification. It requires the 'body' region is isolated from above.}}294 %1 = "tosa.while_loop"(%0) ({295 ^bb0(%arg3: tensor<i32>):296 %2 = "tosa.const"() {values = dense<1> : tensor<i32>} : () -> tensor<i32>297 %3 = "tosa.greater_equal"(%arg3, %2) : (tensor<i32>, tensor<i32>) -> tensor<i1>298 %4 = "tosa.logical_not"(%3) : (tensor<i1>) -> tensor<i1>299 tosa.yield %4 : tensor<i1>300 }, {301 ^bb0(%arg3: tensor<i32>):302 %3 = "tosa.add"(%arg3, %arg1) : (tensor<i32>, tensor<i32>) -> tensor<i32>303 tosa.yield %3 : tensor<i32>304 }) : (tensor<i32>) -> (tensor<i32>)305 return306}307