247 lines · plain
1// RUN: mlir-opt -split-input-file -pass-pipeline="builtin.module(mlprogram-pipeline-globals)" --allow-unregistered-dialect %s2 3// CHECK-LABEL: @global_variable4ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32>5 6// CHECK-LABEL: @global_double_load7func.func @global_double_load() {8 // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable9 // CHECK-NOT: ml_program.global_load @global_variable10 %0 = ml_program.global_load @global_variable : tensor<4xi32>11 %1 = ml_program.global_load @global_variable : tensor<4xi32>12 13 // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]], %[[LOAD]])14 %2 = "unregistered.dummy"(%0, %1) : (tensor<4xi32>, tensor<4xi32>) -> (tensor<4xi32>)15 16 // CHECK: ml_program.global_store @global_variable %[[DUMMY]]17 ml_program.global_store @global_variable = %2 : tensor<4xi32>18 func.return19}20 21// -----22 23// CHECK-LABEL: @global_variable24ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32>25 26// CHECK-LABEL: @global_double_store27func.func @global_double_store() {28 // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable29 %0 = ml_program.global_load @global_variable : tensor<4xi32>30 31 // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]])32 %1 = "unregistered.dummy"(%0) : (tensor<4xi32>) -> (tensor<4xi32>)33 34 // CHECK: ml_program.global_store @global_variable %[[DUMMY]]35 ml_program.global_store @global_variable = %1 : tensor<4xi32>36 37 // CHECK-NOT: ml_program.global_store38 ml_program.global_store @global_variable = %1 : tensor<4xi32>39 func.return40}41 42// -----43 44// CHECK-LABEL: @global_variable45ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32>46 47// CHECK-LABEL: @global_store_load48func.func @global_store_load() {49 // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable50 %0 = ml_program.global_load @global_variable : tensor<4xi32>51 52 // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]])53 // CHECK: %[[DUMMY2:.+]] = "unregistered.dummy"(%[[DUMMY2]])54 %1 = "unregistered.dummy"(%0) : (tensor<4xi32>) -> (tensor<4xi32>)55 ml_program.global_store @global_variable = %1 : tensor<4xi32>56 %2 = ml_program.global_load @global_variable : tensor<4xi32>57 %3 = "unregistered.dummy"(%2) : (tensor<4xi32>) -> (tensor<4xi32>)58 59 // CHECK: ml_program.global_store @global_variable %[[DUMMY2]]60 ml_program.global_store @global_variable = %3 : tensor<4xi32>61 func.return62}63 64// -----65 66// CHECK-LABEL: @global_variable67ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32>68 69// CHECK-LABEL: @global_store_load_region70func.func @global_store_load_region() {71 // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable72 %0 = ml_program.global_load @global_variable : tensor<4xi32>73 74 // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]])75 %1 = "unregistered.dummy"(%0) : (tensor<4xi32>) -> (tensor<4xi32>)76 77 // CHECK: ml_program.global_store @global_variable %[[DUMMY]]78 ml_program.global_store @global_variable = %1 : tensor<4xi32>79 80 // CHECK: "unregistered.dummy2"81 "unregistered.dummy2"() ({82 ^bb():83 %cst = arith.constant dense<0> : tensor<4xi32>84 // CHECK: ml_program.global_store @global_variable85 ml_program.global_store @global_variable = %cst : tensor<4xi32>86 "unregistered.terminator"() : () -> ()87 }) : () -> ()88 89 // CHECK: %[[LOAD:.+]] ml_program.global_load @global_variable90 %2 = ml_program.global_load @global_variable : tensor<4xi32>91 92 // CHECK: %[[DUMMY2:.+]] = "unregistered.dummy"(%[[LOAD]])93 %3 = "unregistered.dummy"(%2) : (tensor<4xi32>) -> (tensor<4xi32>)94 95 // CHECK: ml_program.global_store @global_variable %[[DUMMY2]]96 ml_program.global_store @global_variable = %3 : tensor<4xi32>97 func.return98}99 100// -----101 102// CHECK-LABEL: @global_variable103ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32>104 105// CHECK-LABEL: @interrupt106func.func @interrupt() {107 %cst = arith.constant dense<0> : tensor<4xi32>108 // CHECK: ml_program.global_store109 ml_program.global_store @global_variable = %cst : tensor<4xi32>110 func.return111}112 113// CHECK-LABEL: @call_global_store114func.func @call_global_store() {115 // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable116 %0 = ml_program.global_load @global_variable : tensor<4xi32>117 118 // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]])119 %1 = "unregistered.dummy"(%0) : (tensor<4xi32>) -> (tensor<4xi32>)120 121 // CHECK: ml_program.global_store @global_variable %[[DUMMY]]122 ml_program.global_store @global_variable = %1 : tensor<4xi32>123 call @interrupt() : () -> ()124 125 // CHECK: %[[LOAD:.+]] ml_program.global_load @global_variable126 %2 = ml_program.global_load @global_variable : tensor<4xi32>127 128 // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]])129 %3 = "unregistered.dummy"(%2) : (tensor<4xi32>) -> (tensor<4xi32>)130 131 // CHECK: ml_program.global_store @global_variable %[[DUMMY]]132 ml_program.global_store @global_variable = %3 : tensor<4xi32>133 func.return134}135 136 137// -----138 139// CHECK-LABEL: @global_variable140ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32>141 142// CHECK-LABEL: @interrupt_indirect143func.func @interrupt_indirect() {144 %cst = arith.constant dense<0> : tensor<4xi32>145 // CHECK: ml_program.global_store146 ml_program.global_store @global_variable = %cst : tensor<4xi32>147 func.return148}149 150// CHECK-LABEL: @interrupt151func.func @interrupt() {152 call @interrupt_indirect() : () -> ()153 func.return154}155 156// CHECK-LABEL: @call_indirect_store157func.func @call_indirect_store() {158 // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable159 %0 = ml_program.global_load @global_variable : tensor<4xi32>160 161 // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]])162 %1 = "unregistered.dummy"(%0) : (tensor<4xi32>) -> (tensor<4xi32>)163 164 // CHECK: ml_program.global_store @global_variable %[[DUMMY]]165 ml_program.global_store @global_variable = %1 : tensor<4xi32>166 call @interrupt() : () -> ()167 168 // CHECK: %[[LOAD:.+]] ml_program.global_load @global_variable169 %2 = ml_program.global_load @global_variable : tensor<4xi32>170 171 // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]])172 %3 = "unregistered.dummy"(%2) : (tensor<4xi32>) -> (tensor<4xi32>)173 174 // CHECK: ml_program.global_store @global_variable %[[DUMMY]]175 ml_program.global_store @global_variable = %3 : tensor<4xi32>176 func.return177}178 179 180// -----181 182// CHECK-LABEL: @global_variable183ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32>184 185// CHECK-LABEL: @interrupt_indirect186func.func @interrupt_indirect() -> tensor<4xi32> {187 // CHECK: ml_program.global_load188 %0 = ml_program.global_load @global_variable : tensor<4xi32>189 func.return %0 : tensor<4xi32>190}191 192// CHECK-LABEL: @interrupt193func.func @interrupt() {194 %0 = call @interrupt_indirect() : () -> (tensor<4xi32>)195 "unregistered.dummy"(%0) : (tensor<4xi32>) -> ()196 func.return197}198 199// CHECK-LABEL: @call_indirect_load200func.func @call_indirect_load() {201 // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable202 %0 = ml_program.global_load @global_variable : tensor<4xi32>203 204 // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]])205 %1 = "unregistered.dummy"(%0) : (tensor<4xi32>) -> (tensor<4xi32>)206 207 // CHECK: ml_program.global_store @global_variable %[[DUMMY]]208 ml_program.global_store @global_variable = %1 : tensor<4xi32>209 call @interrupt() : () -> ()210 211 // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]])212 %2 = ml_program.global_load @global_variable : tensor<4xi32>213 %3 = "unregistered.dummy"(%2) : (tensor<4xi32>) -> (tensor<4xi32>)214 215 // CHECK: ml_program.global_store @global_variable %[[DUMMY]]216 ml_program.global_store @global_variable = %3 : tensor<4xi32>217 func.return218}219 220// -----221 222// CHECK-LABEL: @global_variable223ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32>224 225// CHECK-LABEL: @call_recursive226func.func @call_recursive() {227 // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable228 %0 = ml_program.global_load @global_variable : tensor<4xi32>229 230 // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]])231 %1 = "unregistered.dummy"(%0) : (tensor<4xi32>) -> (tensor<4xi32>)232 233 // CHECK: ml_program.global_store @global_variable %[[DUMMY]]234 ml_program.global_store @global_variable = %1 : tensor<4xi32>235 call @call_recursive() : () -> ()236 237 // CHECK: %[[LOAD:.+]] ml_program.global_load @global_variable238 %2 = ml_program.global_load @global_variable : tensor<4xi32>239 240 // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]])241 %3 = "unregistered.dummy"(%2) : (tensor<4xi32>) -> (tensor<4xi32>)242 243 // CHECK: ml_program.global_store @global_variable %[[DUMMY]]244 ml_program.global_store @global_variable = %3 : tensor<4xi32>245 func.return246}247