xref: /llvm-project/mlir/test/Dialect/MLProgram/pipeline-globals.mlir (revision cbd475040f8952cfc55b9e13dd5ce6c4f6434cd3)
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