131 lines · plain
1// RUN: mlir-opt %s -test-wrap-scf-while-loop-in-zero-trip-check -split-input-file | FileCheck %s2// RUN: mlir-opt %s -test-wrap-scf-while-loop-in-zero-trip-check='force-create-check=true' -split-input-file | FileCheck %s --check-prefix FORCE-CREATE-CHECK3 4func.func @wrap_while_loop_in_zero_trip_check(%bound : i32) -> i32 {5 %cst0 = arith.constant 0 : i326 %cst5 = arith.constant 5 : i327 %res:2 = scf.while (%iter = %cst0) : (i32) -> (i32, i32) {8 %cond = arith.cmpi slt, %iter, %bound : i329 %inv = arith.addi %bound, %cst5 : i3210 scf.condition(%cond) %iter, %inv : i32, i3211 } do {12 ^bb0(%arg1: i32, %arg2: i32):13 %next = arith.addi %arg1, %arg2 : i3214 scf.yield %next : i3215 }16 return %res#0 : i3217}18 19// CHECK-LABEL: func.func @wrap_while_loop_in_zero_trip_check(20// CHECK-SAME: %[[BOUND:.*]]: i32) -> i32 {21// CHECK-DAG: %[[C0:.*]] = arith.constant 0 : i3222// CHECK-DAG: %[[C5:.*]] = arith.constant 5 : i3223// CHECK-DAG: %[[PRE_COND:.*]] = arith.cmpi sgt, %[[BOUND]], %[[C0]] : i3224// CHECK-DAG: %[[PRE_INV:.*]] = arith.addi %[[BOUND]], %[[C5]] : i3225// CHECK: %[[IF:.*]]:2 = scf.if %[[PRE_COND]] -> (i32, i32) {26// CHECK: %[[WHILE:.*]]:2 = scf.while (27// CHECK-SAME: %[[ARG1:.*]] = %[[C0]], %[[ARG2:.*]] = %[[PRE_INV]]28// CHECK-SAME: ) : (i32, i32) -> (i32, i32) {29// CHECK: %[[NEXT:.*]] = arith.addi %[[ARG1]], %[[ARG2]] : i3230// CHECK: %[[COND:.*]] = arith.cmpi slt, %[[NEXT]], %[[BOUND]] : i3231// CHECK: %[[INV:.*]] = arith.addi %[[BOUND]], %[[C5]] : i3232// CHECK: scf.condition(%[[COND]]) %[[NEXT]], %[[INV]] : i32, i3233// CHECK: } do {34// CHECK: ^bb0(%[[ARG3:.*]]: i32, %[[ARG4:.*]]: i32):35// CHECK: scf.yield %[[ARG3]], %[[ARG4]] : i32, i3236// CHECK: }37// CHECK: scf.yield %[[WHILE]]#0, %[[WHILE]]#1 : i32, i3238// CHECK: } else {39// CHECK: scf.yield %[[C0]], %[[PRE_INV]] : i32, i3240// CHECK: }41// CHECK: return %[[IF]]#0 : i3242 43// -----44 45func.func @wrap_while_loop_with_minimal_before_block(%bound : i32) -> i32 {46 %cst0 = arith.constant 0 : i3247 %true = arith.constant true48 %cst5 = arith.constant 5 : i3249 %res = scf.while (%iter = %cst0, %arg0 = %true) : (i32, i1) -> i32 {50 scf.condition(%arg0) %iter : i3251 } do {52 ^bb0(%arg1: i32):53 %next = arith.addi %arg1, %cst5 : i3254 %cond = arith.cmpi slt, %next, %bound : i3255 scf.yield %next, %cond : i32, i156 }57 return %res : i3258}59 60// CHECK-LABEL: func.func @wrap_while_loop_with_minimal_before_block(61// CHECK-SAME: %[[BOUND:.*]]: i32) -> i32 {62// CHECK-DAG: %[[C0:.*]] = arith.constant 0 : i3263// CHECK-DAG: %[[TRUE:.*]] = arith.constant true64// CHECK-DAG: %[[C5:.*]] = arith.constant 5 : i3265// CHECK: %[[IF:.*]] = scf.if %[[TRUE]] -> (i32) {66// CHECK: %[[WHILE:.*]] = scf.while (%[[ARG1:.*]] = %[[C0]]) : (i32) -> i32 {67// CHECK: %[[NEXT:.*]] = arith.addi %[[ARG1]], %[[C5]] : i3268// CHECK: %[[COND:.*]] = arith.cmpi slt, %[[NEXT]], %[[BOUND]] : i3269// CHECK: scf.condition(%[[COND]]) %[[NEXT]] : i3270// CHECK: } do {71// CHECK: ^bb0(%[[ARG2:.*]]: i32):72// CHECK: scf.yield %[[ARG2]] : i3273// CHECK: }74// CHECK: scf.yield %[[WHILE]] : i3275// CHECK: } else {76// CHECK: scf.yield %[[C0]] : i3277// CHECK: }78// CHECK: return %[[IF]] : i3279 80// -----81 82func.func @wrap_do_while_loop_in_zero_trip_check(%bound : i32) -> i32 {83 %cst0 = arith.constant 0 : i3284 %cst5 = arith.constant 5 : i3285 %res = scf.while (%iter = %cst0) : (i32) -> i32 {86 %next = arith.addi %iter, %cst5 : i3287 %cond = arith.cmpi slt, %next, %bound : i3288 scf.condition(%cond) %next : i3289 } do {90 ^bb0(%arg1: i32):91 scf.yield %arg1 : i3292 }93 return %res : i3294}95 96// CHECK-LABEL: func.func @wrap_do_while_loop_in_zero_trip_check(97// CHECK-SAME: %[[BOUND:.*]]: i32) -> i32 {98// CHECK-DAG: %[[C0:.*]] = arith.constant 0 : i3299// CHECK-DAG: %[[C5:.*]] = arith.constant 5 : i32100// CHECK-NOT: scf.if101// CHECK: %[[WHILE:.*]] = scf.while (%[[ARG1:.*]] = %[[C0]]) : (i32) -> i32 {102// CHECK: %[[NEXT:.*]] = arith.addi %[[ARG1]], %[[C5]] : i32103// CHECK: %[[COND:.*]] = arith.cmpi slt, %[[NEXT]], %[[BOUND]] : i32104// CHECK: scf.condition(%[[COND]]) %[[NEXT]] : i32105// CHECK: } do {106// CHECK: ^bb0(%[[ARG2:.*]]: i32):107// CHECK: scf.yield %[[ARG2]] : i32108// CHECK: }109// CHECK: return %[[WHILE]] : i32110 111// FORCE-CREATE-CHECK-LABEL: func.func @wrap_do_while_loop_in_zero_trip_check(112// FORCE-CREATE-CHECK-SAME: %[[BOUND:.*]]: i32) -> i32 {113// FORCE-CREATE-CHECK-DAG: %[[C0:.*]] = arith.constant 0 : i32114// FORCE-CREATE-CHECK-DAG: %[[C5:.*]] = arith.constant 5 : i32115// FORCE-CREATE-CHECK: %[[PRE_NEXT:.*]] = arith.addi %[[C0]], %[[C5]] : i32116// FORCE-CREATE-CHECK: %[[PRE_COND:.*]] = arith.cmpi slt, %[[PRE_NEXT]], %[[BOUND]] : i32117// FORCE-CREATE-CHECK: %[[IF:.*]] = scf.if %[[PRE_COND]] -> (i32) {118// FORCE-CREATE-CHECK: %[[WHILE:.*]] = scf.while (%[[ARG1:.*]] = %[[PRE_NEXT]]) : (i32) -> i32 {119// FORCE-CREATE-CHECK: %[[NEXT:.*]] = arith.addi %[[ARG1]], %[[C5]] : i32120// FORCE-CREATE-CHECK: %[[COND:.*]] = arith.cmpi slt, %[[NEXT]], %[[BOUND]] : i32121// FORCE-CREATE-CHECK: scf.condition(%[[COND]]) %[[NEXT]] : i32122// FORCE-CREATE-CHECK: } do {123// FORCE-CREATE-CHECK: ^bb0(%[[ARG2:.*]]: i32):124// FORCE-CREATE-CHECK: scf.yield %[[ARG2]] : i32125// FORCE-CREATE-CHECK: }126// FORCE-CREATE-CHECK: scf.yield %[[WHILE]] : i32127// FORCE-CREATE-CHECK: } else {128// FORCE-CREATE-CHECK: scf.yield %[[PRE_NEXT]] : i32129// FORCE-CREATE-CHECK: }130// FORCE-CREATE-CHECK: return %[[IF]] : i32131