1// RUN: mlir-opt -split-input-file -pass-pipeline="builtin.module(mlprogram-pipeline-globals)" --allow-unregistered-dialect %s 2 3// CHECK-LABEL: @global_variable 4ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32> 5 6// CHECK-LABEL: @global_double_load 7func.func @global_double_load() { 8 // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable 9 // CHECK-NOT: ml_program.global_load @global_variable 10 %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.return 19} 20 21// ----- 22 23// CHECK-LABEL: @global_variable 24ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32> 25 26// CHECK-LABEL: @global_double_store 27func.func @global_double_store() { 28 // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable 29 %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_store 38 ml_program.global_store @global_variable = %1 : tensor<4xi32> 39 func.return 40} 41 42// ----- 43 44// CHECK-LABEL: @global_variable 45ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32> 46 47// CHECK-LABEL: @global_store_load 48func.func @global_store_load() { 49 // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable 50 %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.return 62} 63 64// ----- 65 66// CHECK-LABEL: @global_variable 67ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32> 68 69// CHECK-LABEL: @global_store_load_region 70func.func @global_store_load_region() { 71 // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable 72 %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_variable 85 ml_program.global_store @global_variable = %cst : tensor<4xi32> 86 "unregistered.terminator"() : () -> () 87 }) : () -> () 88 89 // CHECK: %[[LOAD:.+]] ml_program.global_load @global_variable 90 %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.return 98} 99 100// ----- 101 102// CHECK-LABEL: @global_variable 103ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32> 104 105// CHECK-LABEL: @interrupt 106func.func @interrupt() { 107 %cst = arith.constant dense<0> : tensor<4xi32> 108 // CHECK: ml_program.global_store 109 ml_program.global_store @global_variable = %cst : tensor<4xi32> 110 func.return 111} 112 113// CHECK-LABEL: @call_global_store 114func.func @call_global_store() { 115 // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable 116 %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_variable 126 %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.return 134} 135 136 137// ----- 138 139// CHECK-LABEL: @global_variable 140ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32> 141 142// CHECK-LABEL: @interrupt_indirect 143func.func @interrupt_indirect() { 144 %cst = arith.constant dense<0> : tensor<4xi32> 145 // CHECK: ml_program.global_store 146 ml_program.global_store @global_variable = %cst : tensor<4xi32> 147 func.return 148} 149 150// CHECK-LABEL: @interrupt 151func.func @interrupt() { 152 call @interrupt_indirect() : () -> () 153 func.return 154} 155 156// CHECK-LABEL: @call_indirect_store 157func.func @call_indirect_store() { 158 // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable 159 %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_variable 169 %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.return 177} 178 179 180// ----- 181 182// CHECK-LABEL: @global_variable 183ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32> 184 185// CHECK-LABEL: @interrupt_indirect 186func.func @interrupt_indirect() -> tensor<4xi32> { 187 // CHECK: ml_program.global_load 188 %0 = ml_program.global_load @global_variable : tensor<4xi32> 189 func.return %0 : tensor<4xi32> 190} 191 192// CHECK-LABEL: @interrupt 193func.func @interrupt() { 194 %0 = call @interrupt_indirect() : () -> (tensor<4xi32>) 195 "unregistered.dummy"(%0) : (tensor<4xi32>) -> () 196 func.return 197} 198 199// CHECK-LABEL: @call_indirect_load 200func.func @call_indirect_load() { 201 // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable 202 %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.return 218} 219 220// ----- 221 222// CHECK-LABEL: @global_variable 223ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32> 224 225// CHECK-LABEL: @call_recursive 226func.func @call_recursive() { 227 // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable 228 %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_variable 238 %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.return 246} 247