// RUN: mlir-opt -split-input-file -pass-pipeline="builtin.module(mlprogram-pipeline-globals)" --allow-unregistered-dialect %s // CHECK-LABEL: @global_variable ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32> // CHECK-LABEL: @global_double_load func.func @global_double_load() { // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable // CHECK-NOT: ml_program.global_load @global_variable %0 = ml_program.global_load @global_variable : tensor<4xi32> %1 = ml_program.global_load @global_variable : tensor<4xi32> // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]], %[[LOAD]]) %2 = "unregistered.dummy"(%0, %1) : (tensor<4xi32>, tensor<4xi32>) -> (tensor<4xi32>) // CHECK: ml_program.global_store @global_variable %[[DUMMY]] ml_program.global_store @global_variable = %2 : tensor<4xi32> func.return } // ----- // CHECK-LABEL: @global_variable ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32> // CHECK-LABEL: @global_double_store func.func @global_double_store() { // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable %0 = ml_program.global_load @global_variable : tensor<4xi32> // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]]) %1 = "unregistered.dummy"(%0) : (tensor<4xi32>) -> (tensor<4xi32>) // CHECK: ml_program.global_store @global_variable %[[DUMMY]] ml_program.global_store @global_variable = %1 : tensor<4xi32> // CHECK-NOT: ml_program.global_store ml_program.global_store @global_variable = %1 : tensor<4xi32> func.return } // ----- // CHECK-LABEL: @global_variable ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32> // CHECK-LABEL: @global_store_load func.func @global_store_load() { // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable %0 = ml_program.global_load @global_variable : tensor<4xi32> // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]]) // CHECK: %[[DUMMY2:.+]] = "unregistered.dummy"(%[[DUMMY2]]) %1 = "unregistered.dummy"(%0) : (tensor<4xi32>) -> (tensor<4xi32>) ml_program.global_store @global_variable = %1 : tensor<4xi32> %2 = ml_program.global_load @global_variable : tensor<4xi32> %3 = "unregistered.dummy"(%2) : (tensor<4xi32>) -> (tensor<4xi32>) // CHECK: ml_program.global_store @global_variable %[[DUMMY2]] ml_program.global_store @global_variable = %3 : tensor<4xi32> func.return } // ----- // CHECK-LABEL: @global_variable ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32> // CHECK-LABEL: @global_store_load_region func.func @global_store_load_region() { // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable %0 = ml_program.global_load @global_variable : tensor<4xi32> // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]]) %1 = "unregistered.dummy"(%0) : (tensor<4xi32>) -> (tensor<4xi32>) // CHECK: ml_program.global_store @global_variable %[[DUMMY]] ml_program.global_store @global_variable = %1 : tensor<4xi32> // CHECK: "unregistered.dummy2" "unregistered.dummy2"() ({ ^bb(): %cst = arith.constant dense<0> : tensor<4xi32> // CHECK: ml_program.global_store @global_variable ml_program.global_store @global_variable = %cst : tensor<4xi32> "unregistered.terminator"() : () -> () }) : () -> () // CHECK: %[[LOAD:.+]] ml_program.global_load @global_variable %2 = ml_program.global_load @global_variable : tensor<4xi32> // CHECK: %[[DUMMY2:.+]] = "unregistered.dummy"(%[[LOAD]]) %3 = "unregistered.dummy"(%2) : (tensor<4xi32>) -> (tensor<4xi32>) // CHECK: ml_program.global_store @global_variable %[[DUMMY2]] ml_program.global_store @global_variable = %3 : tensor<4xi32> func.return } // ----- // CHECK-LABEL: @global_variable ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32> // CHECK-LABEL: @interrupt func.func @interrupt() { %cst = arith.constant dense<0> : tensor<4xi32> // CHECK: ml_program.global_store ml_program.global_store @global_variable = %cst : tensor<4xi32> func.return } // CHECK-LABEL: @call_global_store func.func @call_global_store() { // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable %0 = ml_program.global_load @global_variable : tensor<4xi32> // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]]) %1 = "unregistered.dummy"(%0) : (tensor<4xi32>) -> (tensor<4xi32>) // CHECK: ml_program.global_store @global_variable %[[DUMMY]] ml_program.global_store @global_variable = %1 : tensor<4xi32> call @interrupt() : () -> () // CHECK: %[[LOAD:.+]] ml_program.global_load @global_variable %2 = ml_program.global_load @global_variable : tensor<4xi32> // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]]) %3 = "unregistered.dummy"(%2) : (tensor<4xi32>) -> (tensor<4xi32>) // CHECK: ml_program.global_store @global_variable %[[DUMMY]] ml_program.global_store @global_variable = %3 : tensor<4xi32> func.return } // ----- // CHECK-LABEL: @global_variable ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32> // CHECK-LABEL: @interrupt_indirect func.func @interrupt_indirect() { %cst = arith.constant dense<0> : tensor<4xi32> // CHECK: ml_program.global_store ml_program.global_store @global_variable = %cst : tensor<4xi32> func.return } // CHECK-LABEL: @interrupt func.func @interrupt() { call @interrupt_indirect() : () -> () func.return } // CHECK-LABEL: @call_indirect_store func.func @call_indirect_store() { // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable %0 = ml_program.global_load @global_variable : tensor<4xi32> // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]]) %1 = "unregistered.dummy"(%0) : (tensor<4xi32>) -> (tensor<4xi32>) // CHECK: ml_program.global_store @global_variable %[[DUMMY]] ml_program.global_store @global_variable = %1 : tensor<4xi32> call @interrupt() : () -> () // CHECK: %[[LOAD:.+]] ml_program.global_load @global_variable %2 = ml_program.global_load @global_variable : tensor<4xi32> // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]]) %3 = "unregistered.dummy"(%2) : (tensor<4xi32>) -> (tensor<4xi32>) // CHECK: ml_program.global_store @global_variable %[[DUMMY]] ml_program.global_store @global_variable = %3 : tensor<4xi32> func.return } // ----- // CHECK-LABEL: @global_variable ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32> // CHECK-LABEL: @interrupt_indirect func.func @interrupt_indirect() -> tensor<4xi32> { // CHECK: ml_program.global_load %0 = ml_program.global_load @global_variable : tensor<4xi32> func.return %0 : tensor<4xi32> } // CHECK-LABEL: @interrupt func.func @interrupt() { %0 = call @interrupt_indirect() : () -> (tensor<4xi32>) "unregistered.dummy"(%0) : (tensor<4xi32>) -> () func.return } // CHECK-LABEL: @call_indirect_load func.func @call_indirect_load() { // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable %0 = ml_program.global_load @global_variable : tensor<4xi32> // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]]) %1 = "unregistered.dummy"(%0) : (tensor<4xi32>) -> (tensor<4xi32>) // CHECK: ml_program.global_store @global_variable %[[DUMMY]] ml_program.global_store @global_variable = %1 : tensor<4xi32> call @interrupt() : () -> () // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]]) %2 = ml_program.global_load @global_variable : tensor<4xi32> %3 = "unregistered.dummy"(%2) : (tensor<4xi32>) -> (tensor<4xi32>) // CHECK: ml_program.global_store @global_variable %[[DUMMY]] ml_program.global_store @global_variable = %3 : tensor<4xi32> func.return } // ----- // CHECK-LABEL: @global_variable ml_program.global private mutable @global_variable(dense<4> : tensor<4xi32>) : tensor<4xi32> // CHECK-LABEL: @call_recursive func.func @call_recursive() { // CHECK: %[[LOAD:.+]] = ml_program.global_load @global_variable %0 = ml_program.global_load @global_variable : tensor<4xi32> // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]]) %1 = "unregistered.dummy"(%0) : (tensor<4xi32>) -> (tensor<4xi32>) // CHECK: ml_program.global_store @global_variable %[[DUMMY]] ml_program.global_store @global_variable = %1 : tensor<4xi32> call @call_recursive() : () -> () // CHECK: %[[LOAD:.+]] ml_program.global_load @global_variable %2 = ml_program.global_load @global_variable : tensor<4xi32> // CHECK: %[[DUMMY:.+]] = "unregistered.dummy"(%[[LOAD]]) %3 = "unregistered.dummy"(%2) : (tensor<4xi32>) -> (tensor<4xi32>) // CHECK: ml_program.global_store @global_variable %[[DUMMY]] ml_program.global_store @global_variable = %3 : tensor<4xi32> func.return }