@@ -280,3 +280,60 @@ func.func @test_cond_if_isolated_from_above(%arg0: tensor<f32>, %arg1: tensor<f3
280
280
}) : (tensor <i1 >, tensor <f32 >, tensor <f32 >) -> tensor <f32 >
281
281
return %0 : tensor <f32 >
282
282
}
283
+
284
+ // -----
285
+
286
+ func.func @test_while_loop_cond_not_isolated_from_above (%arg0: tensor <i32 >, %arg1: tensor <i32 >, %arg2: tensor <f32 >) {
287
+ %0 = " tosa.const" () {values = dense <0 > : tensor <i32 >} : () -> tensor <i32 >
288
+ // expected-error@+1 {{'tosa.while_loop' op is not conformant to the TOSA specification. It requires the 'cond' region is isolated from above.}}
289
+ %1 = " tosa.while_loop" (%0 ) ({
290
+ ^bb0 (%arg3: tensor <i32 >):
291
+ %2 = " tosa.greater_equal" (%arg3 , %arg1 ) : (tensor <i32 >, tensor <i32 >) -> tensor <i1 >
292
+ %3 = " tosa.logical_not" (%2 ) : (tensor <i1 >) -> tensor <i1 >
293
+ tosa.yield %3 : tensor <i1 >
294
+ }, {
295
+ ^bb0 (%arg3: tensor <i32 >):
296
+ %2 = " tosa.const" () {values = dense <1 > : tensor <i32 >} : () -> tensor <i32 >
297
+ %3 = " tosa.add" (%arg3 , %2 ) : (tensor <i32 >, tensor <i32 >) -> tensor <i32 >
298
+ tosa.yield %3 : tensor <i32 >
299
+ }) : (tensor <i32 >) -> (tensor <i32 >)
300
+ return
301
+ }
302
+
303
+ // -----
304
+
305
+ func.func @test_while_loop_body_not_isolated_from_above (%arg0: tensor <i32 >, %arg1: tensor <i32 >, %arg2: tensor <f32 >) {
306
+ %0 = " tosa.const" () {values = dense <0 > : tensor <i32 >} : () -> tensor <i32 >
307
+ // expected-error@+1 {{'tosa.while_loop' op is not conformant to the TOSA specification. It requires the 'body' region is isolated from above.}}
308
+ %1 = " tosa.while_loop" (%0 ) ({
309
+ ^bb0 (%arg3: tensor <i32 >):
310
+ %2 = " tosa.const" () {values = dense <1 > : tensor <i32 >} : () -> tensor <i32 >
311
+ %3 = " tosa.greater_equal" (%arg3 , %2 ) : (tensor <i32 >, tensor <i32 >) -> tensor <i1 >
312
+ %4 = " tosa.logical_not" (%3 ) : (tensor <i1 >) -> tensor <i1 >
313
+ tosa.yield %4 : tensor <i1 >
314
+ }, {
315
+ ^bb0 (%arg3: tensor <i32 >):
316
+ %3 = " tosa.add" (%arg3 , %arg1 ) : (tensor <i32 >, tensor <i32 >) -> tensor <i32 >
317
+ tosa.yield %3 : tensor <i32 >
318
+ }) : (tensor <i32 >) -> (tensor <i32 >)
319
+ return
320
+ }
321
+
322
+ // -----
323
+
324
+ // Check isolated while_loops are valid
325
+ func.func @test_while_loop_isolated_from_above (%arg0: tensor <f32 >, %arg1: tensor <i32 >) {
326
+ %0 = " tosa.const" () {values = dense <0 > : tensor <i32 >} : () -> tensor <i32 >
327
+ %1:3 = " tosa.while_loop" (%0 , %arg0 , %arg1 ) ({
328
+ ^bb0 (%arg3: tensor <i32 >, %arg4: tensor <f32 >, %arg5: tensor <i32 >):
329
+ %2 = " tosa.greater_equal" (%arg3 , %arg5 ) : (tensor <i32 >, tensor <i32 >) -> tensor <i1 >
330
+ %3 = " tosa.logical_not" (%2 ) : (tensor <i1 >) -> tensor <i1 >
331
+ " tosa.yield" (%3 ) : (tensor <i1 >) -> ()
332
+ }, {
333
+ ^bb0 (%arg3: tensor <i32 >, %arg4: tensor <f32 >, %arg5: tensor <i32 >):
334
+ %2 = " tosa.const" () {values = dense <1 > : tensor <i32 >} : () -> tensor <i32 >
335
+ %3 = " tosa.add" (%arg3 , %2 ) : (tensor <i32 >, tensor <i32 >) -> tensor <i32 >
336
+ " tosa.yield" (%3 , %arg4 , %arg5 ) : (tensor <i32 >, tensor <f32 >, tensor <i32 >) -> ()
337
+ }) : (tensor <i32 >, tensor <f32 >, tensor <i32 >) -> (tensor <i32 >, tensor <f32 >, tensor <i32 >)
338
+ return
339
+ }
0 commit comments