brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.1 KiB · d2e14f3 Raw
149 lines · plain
1// RUN: mlir-opt %s -pass-pipeline='builtin.module(func.func(scf-for-to-while))' -split-input-file | FileCheck %s2// NOTE: Assertions have been autogenerated by utils/generate-test-checks.py3 4// CHECK-LABEL:   func @single_loop(5// CHECK-SAME:                              %[[VAL_0:.*]]: memref<?xi32>,6// CHECK-SAME:                              %[[VAL_1:.*]]: index,7// CHECK-SAME:                              %[[VAL_2:.*]]: i32) {8// CHECK:           %[[VAL_3:.*]] = arith.constant 0 : index9// CHECK:           %[[VAL_4:.*]] = arith.constant 1 : index10// CHECK:           %[[VAL_5:.*]] = scf.while (%[[VAL_6:.*]] = %[[VAL_3]]) : (index) -> index {11// CHECK:             %[[VAL_7:.*]] = arith.cmpi slt, %[[VAL_6]], %[[VAL_1]] : index12// CHECK:             scf.condition(%[[VAL_7]]) %[[VAL_6]] : index13// CHECK:           } do {14// CHECK:           ^bb0(%[[VAL_8:.*]]: index):15// CHECK:             %[[VAL_9:.*]] = arith.addi %[[VAL_8]], %[[VAL_4]] : index16// CHECK:             %[[VAL_10:.*]] = arith.addi %[[VAL_2]], %[[VAL_2]] : i3217// CHECK:             memref.store %[[VAL_10]], %[[VAL_0]]{{\[}}%[[VAL_8]]] : memref<?xi32>18// CHECK:             scf.yield %[[VAL_9]] : index19// CHECK:           }20// CHECK:           return21// CHECK:         }22func.func @single_loop(%arg0: memref<?xi32>, %arg1: index, %arg2: i32) {23  %c0 = arith.constant 0 : index24  %c1 = arith.constant 1 : index25  scf.for %i = %c0 to %arg1 step %c1 {26    %0 = arith.addi %arg2, %arg2 : i3227    memref.store %0, %arg0[%i] : memref<?xi32>28  }29  return30}31 32// -----33 34// CHECK-LABEL:   func @nested_loop(35// CHECK-SAME:                              %[[VAL_0:.*]]: memref<?xi32>,36// CHECK-SAME:                              %[[VAL_1:.*]]: index,37// CHECK-SAME:                              %[[VAL_2:.*]]: i32) {38// CHECK:           %[[VAL_3:.*]] = arith.constant 0 : index39// CHECK:           %[[VAL_4:.*]] = arith.constant 1 : index40// CHECK:           %[[VAL_5:.*]] = scf.while (%[[VAL_6:.*]] = %[[VAL_3]]) : (index) -> index {41// CHECK:             %[[VAL_7:.*]] = arith.cmpi slt, %[[VAL_6]], %[[VAL_1]] : index42// CHECK:             scf.condition(%[[VAL_7]]) %[[VAL_6]] : index43// CHECK:           } do {44// CHECK:           ^bb0(%[[VAL_8:.*]]: index):45// CHECK:             %[[VAL_9:.*]] = arith.addi %[[VAL_8]], %[[VAL_4]] : index46// CHECK:             %[[VAL_10:.*]] = scf.while (%[[VAL_11:.*]] = %[[VAL_3]]) : (index) -> index {47// CHECK:               %[[VAL_12:.*]] = arith.cmpi slt, %[[VAL_11]], %[[VAL_1]] : index48// CHECK:               scf.condition(%[[VAL_12]]) %[[VAL_11]] : index49// CHECK:             } do {50// CHECK:             ^bb0(%[[VAL_13:.*]]: index):51// CHECK:               %[[VAL_14:.*]] = arith.addi %[[VAL_13]], %[[VAL_4]] : index52// CHECK:               %[[VAL_15:.*]] = arith.addi %[[VAL_2]], %[[VAL_2]] : i3253// CHECK:               memref.store %[[VAL_15]], %[[VAL_0]]{{\[}}%[[VAL_8]]] : memref<?xi32>54// CHECK:               memref.store %[[VAL_15]], %[[VAL_0]]{{\[}}%[[VAL_13]]] : memref<?xi32>55// CHECK:               scf.yield %[[VAL_14]] : index56// CHECK:             }57// CHECK:             scf.yield %[[VAL_9]] : index58// CHECK:           }59// CHECK:           return60// CHECK:         }61func.func @nested_loop(%arg0: memref<?xi32>, %arg1: index, %arg2: i32) {62  %c0 = arith.constant 0 : index63  %c1 = arith.constant 1 : index64  scf.for %i = %c0 to %arg1 step %c1 {65    scf.for %j = %c0 to %arg1 step %c1 {66      %0 = arith.addi %arg2, %arg2 : i3267      memref.store %0, %arg0[%i] : memref<?xi32>68      memref.store %0, %arg0[%j] : memref<?xi32>69    }70  }71  return72}73 74// -----75 76// CHECK-LABEL:   func @for_iter_args(77// CHECK-SAME:                                %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index,78// CHECK-SAME:                                %[[VAL_2:.*]]: index) -> f32 {79// CHECK:           %[[VAL_3:.*]] = arith.constant 0.000000e+00 : f3280// CHECK:           %[[VAL_4:.*]]:3 = scf.while (%[[VAL_5:.*]] = %[[VAL_0]], %[[VAL_6:.*]] = %[[VAL_3]], %[[VAL_7:.*]] = %[[VAL_3]]) : (index, f32, f32) -> (index, f32, f32) {81// CHECK:             %[[VAL_8:.*]] = arith.cmpi slt, %[[VAL_5]], %[[VAL_1]] : index82// CHECK:             scf.condition(%[[VAL_8]]) %[[VAL_5]], %[[VAL_6]], %[[VAL_7]] : index, f32, f3283// CHECK:           } do {84// CHECK:           ^bb0(%[[VAL_9:.*]]: index, %[[VAL_10:.*]]: f32, %[[VAL_11:.*]]: f32):85// CHECK:             %[[VAL_12:.*]] = arith.addi %[[VAL_9]], %[[VAL_2]] : index86// CHECK:             %[[VAL_13:.*]] = arith.addf %[[VAL_10]], %[[VAL_11]] : f3287// CHECK:             scf.yield %[[VAL_12]], %[[VAL_13]], %[[VAL_13]] : index, f32, f3288// CHECK:           }89// CHECK:           return %[[VAL_14:.*]]#2 : f3290// CHECK:         }91func.func @for_iter_args(%arg0 : index, %arg1: index, %arg2: index) -> f32 {92  %s0 = arith.constant 0.0 : f3293  %result:2 = scf.for %i0 = %arg0 to %arg1 step %arg2 iter_args(%iarg0 = %s0, %iarg1 = %s0) -> (f32, f32) {94    %sn = arith.addf %iarg0, %iarg1 : f3295    scf.yield %sn, %sn : f32, f3296  }97  return %result#1 : f3298}99 100// -----101 102// CHECK-LABEL:   func @exec_region_multiple_yields(103// CHECK-SAME:                                              %[[VAL_0:.*]]: i32,104// CHECK-SAME:                                              %[[VAL_1:.*]]: index,105// CHECK-SAME:                                              %[[VAL_2:.*]]: i32) -> i32 {106// CHECK:           %[[VAL_3:.*]] = arith.constant 0 : index107// CHECK:           %[[VAL_4:.*]] = arith.constant 1 : index108// CHECK:           %[[VAL_5:.*]]:2 = scf.while (%[[VAL_6:.*]] = %[[VAL_3]], %[[VAL_7:.*]] = %[[VAL_0]]) : (index, i32) -> (index, i32) {109// CHECK:             %[[VAL_8:.*]] = arith.cmpi slt, %[[VAL_6]], %[[VAL_1]] : index110// CHECK:             scf.condition(%[[VAL_8]]) %[[VAL_6]], %[[VAL_7]] : index, i32111// CHECK:           } do {112// CHECK:           ^bb0(%[[VAL_9:.*]]: index, %[[VAL_10:.*]]: i32):113// CHECK:             %[[VAL_11:.*]] = arith.addi %[[VAL_9]], %[[VAL_4]] : index114// CHECK:             %[[VAL_12:.*]] = scf.execute_region -> i32 {115// CHECK:               %[[VAL_13:.*]] = arith.cmpi slt, %[[VAL_9]], %[[VAL_4]] : index116// CHECK:               cf.cond_br %[[VAL_13]], ^bb1, ^bb2117// CHECK:             ^bb1:118// CHECK:               %[[VAL_14:.*]] = arith.subi %[[VAL_10]], %[[VAL_0]] : i32119// CHECK:               scf.yield %[[VAL_14]] : i32120// CHECK:             ^bb2:121// CHECK:               %[[VAL_15:.*]] = arith.muli %[[VAL_10]], %[[VAL_2]] : i32122// CHECK:               scf.yield %[[VAL_15]] : i32123// CHECK:             }124// CHECK:             scf.yield %[[VAL_11]], %[[VAL_16:.*]] : index, i32125// CHECK:           }126// CHECK:           return %[[VAL_17:.*]]#1 : i32127// CHECK:         }128func.func @exec_region_multiple_yields(%arg0: i32, %arg1: index, %arg2: i32) -> i32 {129  %c1_i32 = arith.constant 1 : i32130  %c2_i32 = arith.constant 2 : i32131  %c0 = arith.constant 0 : index132  %c1 = arith.constant 1 : index133  %c5 = arith.constant 5 : index134  %0 = scf.for %i = %c0 to %arg1 step %c1 iter_args(%iarg0 = %arg0) -> i32 {135    %2 = scf.execute_region -> i32 {136      %1 = arith.cmpi slt, %i, %c1 : index137      cf.cond_br %1, ^bb1, ^bb2138    ^bb1:139      %2 = arith.subi %iarg0, %arg0 : i32140      scf.yield %2 : i32141    ^bb2:142      %3 = arith.muli %iarg0, %arg2 : i32143      scf.yield %3 : i32144    }145    scf.yield %2 : i32146  }147  return %0 : i32148}149