@@ -185,3 +185,67 @@ func.func @uplift_while(%arg0: index, %arg1: index, %arg2: index) -> (i32, f32)
185185// CHECK: %[[T2:.*]] = "test.test2"(%[[ARG2]]) : (f32) -> f32
186186// CHECK: scf.yield %[[T1]], %[[T2]] : i32, f32
187187// CHECK: return %[[RES]]#0, %[[RES]]#1 : i32, f32
188+
189+ // -----
190+
191+ func.func @uplift_while (%arg0: index , %arg1: index , %arg2: index ) -> index {
192+ %0 = scf.while (%arg3 = %arg0 ) : (index ) -> (index ) {
193+ %1 = arith.cmpi ult , %arg3 , %arg1 : index
194+ scf.condition (%1 ) %arg3 : index
195+ } do {
196+ ^bb0 (%arg3: index ):
197+ " test.test1" (%arg3 ) : (index ) -> ()
198+ %added = arith.addi %arg3 , %arg2 : index
199+ " test.test2" (%added ) : (index ) -> ()
200+ scf.yield %added : index
201+ }
202+ return %0 : index
203+ }
204+
205+ // CHECK-LABEL: func @uplift_while
206+ // CHECK-SAME: (%[[BEGIN:.*]]: index, %[[END:.*]]: index, %[[STEP:.*]]: index) -> index
207+ // CHECK: %[[C1:.*]] = arith.constant 1 : index
208+ // CHECK: scf.for %[[I:.*]] = %[[BEGIN]] to %[[END]] step %[[STEP]] {
209+ // CHECK: "test.test1"(%[[I]]) : (index) -> ()
210+ // CHECK: %[[INC:.*]] = arith.addi %[[I]], %[[STEP]] : index
211+ // CHECK: "test.test2"(%[[INC]]) : (index) -> ()
212+ // CHECK: %[[R1:.*]] = arith.subi %[[STEP]], %[[C1]] : index
213+ // CHECK: %[[R2:.*]] = arith.subi %[[END]], %[[BEGIN]] : index
214+ // CHECK: %[[R3:.*]] = arith.addi %[[R2]], %[[R1]] : index
215+ // CHECK: %[[R4:.*]] = arith.divsi %[[R3]], %[[STEP]] : index
216+ // CHECK: %[[R5:.*]] = arith.subi %[[R4]], %[[C1]] : index
217+ // CHECK: %[[R6:.*]] = arith.muli %[[R5]], %[[STEP]] : index
218+ // CHECK: %[[R7:.*]] = arith.addi %[[BEGIN]], %[[R6]] : index
219+ // CHECK: return %[[R7]] : index
220+
221+ // -----
222+
223+ func.func @uplift_while (%arg0: index , %arg1: index , %arg2: index ) -> index {
224+ %0 = scf.while (%arg3 = %arg0 ) : (index ) -> (index ) {
225+ %1 = arith.cmpi ugt , %arg1 , %arg3 : index
226+ scf.condition (%1 ) %arg3 : index
227+ } do {
228+ ^bb0 (%arg3: index ):
229+ " test.test1" (%arg3 ) : (index ) -> ()
230+ %added = arith.addi %arg3 , %arg2 : index
231+ " test.test2" (%added ) : (index ) -> ()
232+ scf.yield %added : index
233+ }
234+ return %0 : index
235+ }
236+
237+ // CHECK-LABEL: func @uplift_while
238+ // CHECK-SAME: (%[[BEGIN:.*]]: index, %[[END:.*]]: index, %[[STEP:.*]]: index) -> index
239+ // CHECK: %[[C1:.*]] = arith.constant 1 : index
240+ // CHECK: scf.for %[[I:.*]] = %[[BEGIN]] to %[[END]] step %[[STEP]] {
241+ // CHECK: "test.test1"(%[[I]]) : (index) -> ()
242+ // CHECK: %[[INC:.*]] = arith.addi %[[I]], %[[STEP]] : index
243+ // CHECK: "test.test2"(%[[INC]]) : (index) -> ()
244+ // CHECK: %[[R1:.*]] = arith.subi %[[STEP]], %[[C1]] : index
245+ // CHECK: %[[R2:.*]] = arith.subi %[[END]], %[[BEGIN]] : index
246+ // CHECK: %[[R3:.*]] = arith.addi %[[R2]], %[[R1]] : index
247+ // CHECK: %[[R4:.*]] = arith.divsi %[[R3]], %[[STEP]] : index
248+ // CHECK: %[[R5:.*]] = arith.subi %[[R4]], %[[C1]] : index
249+ // CHECK: %[[R6:.*]] = arith.muli %[[R5]], %[[STEP]] : index
250+ // CHECK: %[[R7:.*]] = arith.addi %[[BEGIN]], %[[R6]] : index
251+ // CHECK: return %[[R7]] : index
0 commit comments