@@ -280,3 +280,60 @@ func.func @test_cond_if_isolated_from_above(%arg0: tensor<f32>, %arg1: tensor<f3
280280 }) : (tensor <i1 >, tensor <f32 >, tensor <f32 >) -> tensor <f32 >
281281 return %0 : tensor <f32 >
282282}
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