brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.4 KiB · 571517f Raw
167 lines · plain
1// RUN: mlir-opt -allow-unregistered-dialect -convert-scf-to-emitc %s | FileCheck %s2// RUN: mlir-opt -allow-unregistered-dialect -convert-to-emitc="filter-dialects=scf" %s | FileCheck %s3 4func.func @simple_std_for_loop(%arg0 : index, %arg1 : index, %arg2 : index) {5  scf.for %i0 = %arg0 to %arg1 step %arg2 {6    %c1 = arith.constant 1 : index7  }8  return9}10// CHECK-LABEL: func.func @simple_std_for_loop(11// CHECK-SAME:      %[[ARG_0:.*]]: index, %[[ARG_1:.*]]: index, %[[ARG_2:.*]]: index) {12// CHECK-NEXT:    %[[VAL_2:.*]] = builtin.unrealized_conversion_cast %[[ARG_2]] : index to !emitc.size_t13// CHECK-NEXT:    %[[VAL_1:.*]] = builtin.unrealized_conversion_cast %[[ARG_1]] : index to !emitc.size_t14// CHECK-NEXT:    %[[VAL_0:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : index to !emitc.size_t15// CHECK-NEXT:    emitc.for %[[VAL_3:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] : !emitc.size_t {16// CHECK-NEXT:      %[[VAL_4:.*]] = arith.constant 1 : index17// CHECK-NEXT:    }18// CHECK-NEXT:    return19// CHECK-NEXT:  }20 21func.func @simple_std_2_for_loops(%arg0 : index, %arg1 : index, %arg2 : index) {22  scf.for %i0 = %arg0 to %arg1 step %arg2 {23    %c1 = arith.constant 1 : index24    scf.for %i1 = %arg0 to %arg1 step %arg2 {25      %c1_0 = arith.constant 1 : index26    }27  }28  return29}30// CHECK-LABEL: func.func @simple_std_2_for_loops(31// CHECK-SAME:      %[[ARG_0:.*]]: index, %[[ARG_1:.*]]: index, %[[ARG_2:.*]]: index) {32// CHECK-NEXT:    %[[VAL_2:.*]] = builtin.unrealized_conversion_cast %[[ARG_2]] : index to !emitc.size_t33// CHECK-NEXT:    %[[VAL_1:.*]] = builtin.unrealized_conversion_cast %[[ARG_1]] : index to !emitc.size_t34// CHECK-NEXT:    %[[VAL_0:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : index to !emitc.size_t35// CHECK-NEXT:    emitc.for %[[VAL_3:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] : !emitc.size_t {36// CHECK-NEXT:      %[[VAL_4:.*]] = arith.constant 1 : index37// CHECK-NEXT:      for %[[VAL_5:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] : !emitc.size_t {38// CHECK-NEXT:        %[[VAL_6:.*]] = arith.constant 1 : index39// CHECK-NEXT:      }40// CHECK-NEXT:    }41// CHECK-NEXT:    return42// CHECK-NEXT:  }43 44func.func @for_yield(%arg0 : index, %arg1 : index, %arg2 : index) -> (f32, f32) {45  %s0 = arith.constant 0.0 : f3246  %s1 = arith.constant 1.0 : f3247  %result:2 = scf.for %i0 = %arg0 to %arg1 step %arg2 iter_args(%si = %s0, %sj = %s1) -> (f32, f32) {48    %sn = arith.addf %si, %sj : f3249    scf.yield %sn, %sn : f32, f3250  }51  return %result#0, %result#1 : f32, f3252}53// CHECK-LABEL: func.func @for_yield(54// CHECK-SAME:      %[[ARG_0:.*]]: index, %[[ARG_1:.*]]: index, %[[ARG_2:.*]]: index) -> (f32, f32) {55// CHECK-NEXT:    %[[VAL_2:.*]] = builtin.unrealized_conversion_cast %[[ARG_2]] : index to !emitc.size_t56// CHECK-NEXT:    %[[VAL_1:.*]] = builtin.unrealized_conversion_cast %[[ARG_1]] : index to !emitc.size_t57// CHECK-NEXT:    %[[VAL_0:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : index to !emitc.size_t58// CHECK-NEXT:    %[[VAL_3:.*]] = arith.constant 0.000000e+00 : f3259// CHECK-NEXT:    %[[VAL_4:.*]] = arith.constant 1.000000e+00 : f3260// CHECK-NEXT:    %[[VAL_5:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<f32>61// CHECK-NEXT:    %[[VAL_6:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<f32>62// CHECK-NEXT:    emitc.assign %[[VAL_3]] : f32 to %[[VAL_5]] : <f32>63// CHECK-NEXT:    emitc.assign %[[VAL_4]] : f32 to %[[VAL_6]] : <f32>64// CHECK-NEXT:    emitc.for %[[VAL_7:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] : !emitc.size_t {65// CHECK-NEXT:      %[[VAL_8:.*]] = load %[[VAL_5]] : <f32>66// CHECK-NEXT:      %[[VAL_9:.*]] = load %[[VAL_6]] : <f32>67// CHECK-NEXT:      %[[VAL_10:.*]] = arith.addf %[[VAL_8]], %[[VAL_9]] : f3268// CHECK-NEXT:      assign %[[VAL_10]] : f32 to %[[VAL_5]] : <f32>69// CHECK-NEXT:      assign %[[VAL_10]] : f32 to %[[VAL_6]] : <f32>70// CHECK-NEXT:    }71// CHECK-NEXT:    %[[VAL_11:.*]] = emitc.load %[[VAL_5]] : <f32>72// CHECK-NEXT:    %[[VAL_12:.*]] = emitc.load %[[VAL_6]] : <f32>73// CHECK-NEXT:    return %[[VAL_11]], %[[VAL_12]] : f32, f3274// CHECK-NEXT:  }75 76func.func @nested_for_yield(%arg0 : index, %arg1 : index, %arg2 : index) -> f32 {77  %s0 = arith.constant 1.0 : f3278  %r = scf.for %i0 = %arg0 to %arg1 step %arg2 iter_args(%iter = %s0) -> (f32) {79    %result = scf.for %i1 = %arg0 to %arg1 step %arg2 iter_args(%si = %iter) -> (f32) {80      %sn = arith.addf %si, %si : f3281      scf.yield %sn : f3282    }83    scf.yield %result : f3284  }85  return %r : f3286}87// CHECK-LABEL: func.func @nested_for_yield(88// CHECK-SAME:      %[[ARG_0:.*]]: index, %[[ARG_1:.*]]: index, %[[ARG_2:.*]]: index) -> f32 {89// CHECK-NEXT:    %[[VAL_2:.*]] = builtin.unrealized_conversion_cast %[[ARG_2]] : index to !emitc.size_t90// CHECK-NEXT:    %[[VAL_1:.*]] = builtin.unrealized_conversion_cast %[[ARG_1]] : index to !emitc.size_t91// CHECK-NEXT:    %[[VAL_0:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : index to !emitc.size_t92// CHECK-NEXT:    %[[VAL_3:.*]] = arith.constant 1.000000e+00 : f3293// CHECK-NEXT:    %[[VAL_4:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<f32>94// CHECK-NEXT:    emitc.assign %[[VAL_3]] : f32 to %[[VAL_4]] : <f32>95// CHECK-NEXT:    emitc.for %[[VAL_5:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] : !emitc.size_t {96// CHECK-NEXT:      %[[VAL_6:.*]] = load %[[VAL_4]] : <f32>97// CHECK-NEXT:      %[[VAL_7:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<f32>98// CHECK-NEXT:      assign %[[VAL_6]] : f32 to %[[VAL_7]] : <f32>99// CHECK-NEXT:      for %[[VAL_8:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] : !emitc.size_t {100// CHECK-NEXT:        %[[VAL_9:.*]] = load %[[VAL_7]] : <f32>  101// CHECK-NEXT:        %[[VAL_10:.*]] = arith.addf %[[VAL_9]], %[[VAL_9]] : f32102// CHECK-NEXT:        assign %[[VAL_10]] : f32 to %[[VAL_7]] : <f32>103// CHECK-NEXT:      }104// CHECK-NEXT:      %[[VAL_11:.*]] = load %[[VAL_7]] : <f32>  105// CHECK-NEXT:      assign %[[VAL_11]] : f32 to %[[VAL_4]] : <f32>106// CHECK-NEXT:    }107// CHECK-NEXT:    %[[VAL_12:.*]] = emitc.load %[[VAL_4]] : <f32>  108// CHECK-NEXT:    return %[[VAL_12]] : f32109// CHECK-NEXT:  }110 111func.func @for_yield_index(%arg0 : index, %arg1 : index, %arg2 : index) -> index {112  %zero = arith.constant 0 : index113  %r = scf.for %i0 = %arg0 to %arg1 step %arg2 iter_args(%acc = %zero) -> index {114    scf.yield %acc : index115  }116  return %r : index117}118 119// CHECK-LABEL: func.func @for_yield_index(120// CHECK-SAME: %[[ARG_0:.*]]: index, %[[ARG_1:.*]]: index, %[[ARG_2:.*]]: index) -> index {121// CHECK:     %[[VAL_0:.*]] = builtin.unrealized_conversion_cast %[[ARG_2]] : index to !emitc.size_t122// CHECK:     %[[VAL_1:.*]] = builtin.unrealized_conversion_cast %[[ARG_1]] : index to !emitc.size_t123// CHECK:     %[[VAL_2:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : index to !emitc.size_t124// CHECK:     %[[C0:.*]] = arith.constant 0 : index125// CHECK:     %[[VAL_3:.*]] = builtin.unrealized_conversion_cast %[[C0]] : index to !emitc.size_t126// CHECK:     %[[VAL_4:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<!emitc.size_t>127// CHECK:     emitc.assign %[[VAL_3]] : !emitc.size_t to %[[VAL_4]] : <!emitc.size_t>128// CHECK:     emitc.for %[[VAL_5:.*]] = %[[VAL_2]] to %[[VAL_1]] step %[[VAL_0]] : !emitc.size_t {129// CHECK:       %[[V:.*]] = load %[[VAL_4]] : <!emitc.size_t>130// CHECK:       assign %[[V]] : !emitc.size_t to %[[VAL_4]] : <!emitc.size_t>131// CHECK:     }132// CHECK:     %[[V2:.*]] = emitc.load %[[VAL_4]] : <!emitc.size_t>133// CHECK:     %[[VAL_8:.*]] = builtin.unrealized_conversion_cast %[[V2]] : !emitc.size_t to index134// CHECK:     return %[[VAL_8]] : index135// CHECK:   }136 137 138func.func @for_yield_update_loop_carried_var(%arg0 : index, %arg1 : index, %arg2 : index) -> index {139   %zero = arith.constant 0 : index140   %r = scf.for %i0 = %arg0 to %arg1 step %arg2 iter_args(%acc = %zero) -> index {141     %sn = arith.addi %acc, %acc : index142     scf.yield %sn: index143   }144   return %r : index145 }146 147// CHECK-LABEL: func.func @for_yield_update_loop_carried_var(148// CHECK-SAME:  %[[ARG_0:.*]]: index, %[[ARG_1:.*]]: index, %[[ARG_2:.*]]: index) -> index {149// CHECK:   %[[VAL_0:.*]] = builtin.unrealized_conversion_cast %[[ARG_2]] : index to !emitc.size_t150// CHECK:   %[[VAL_1:.*]] = builtin.unrealized_conversion_cast %[[ARG_1]] : index to !emitc.size_t151// CHECK:   %[[VAL_2:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : index to !emitc.size_t152// CHECK:   %[[C0:.*]] = arith.constant 0 : index153// CHECK:   %[[VAL_3:.*]] = builtin.unrealized_conversion_cast %[[C0]] : index to !emitc.size_t154// CHECK:   %[[VAL_4:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<!emitc.size_t>155// CHECK:   emitc.assign %[[VAL_3]] : !emitc.size_t to %[[VAL_4]] : <!emitc.size_t>156// CHECK:   emitc.for %[[ARG_3:.*]] = %[[VAL_2]] to %[[VAL_1]] step %[[VAL_0]] : !emitc.size_t {157// CHECK:     %[[V:.*]] = load %[[VAL_4]] : <!emitc.size_t>158// CHECK:     %[[VAL_5:.*]] = builtin.unrealized_conversion_cast %[[V]] : !emitc.size_t to index159// CHECK:     %[[VAL_6:.*]] = arith.addi %[[VAL_5]], %[[VAL_5]] : index160// CHECK:     %[[VAL_8:.*]] = builtin.unrealized_conversion_cast %[[VAL_6]] : index to !emitc.size_t161// CHECK:     assign %[[VAL_8]] : !emitc.size_t to %[[VAL_4]] : <!emitc.size_t>162// CHECK:   }163// CHECK:   %[[V2:.*]] = emitc.load %[[VAL_4]] : <!emitc.size_t>164// CHECK:   %[[VAL_9:.*]] = builtin.unrealized_conversion_cast %[[V2]] : !emitc.size_t to index165// CHECK:   return %[[VAL_9]] : index166// CHECK: }167