xref: /llvm-project/mlir/test/Dialect/OpenMP/canonicalize.mlir (revision 72e2387c0528be72999beabf532e6929d3054e03)
1// RUN: mlir-opt %s -canonicalize="test-convergence" -split-input-file | FileCheck %s
2
3func.func @update_no_op(%x : memref<i32>) {
4  omp.atomic.update %x : memref<i32> {
5  ^bb0(%xval : i32):
6    omp.yield(%xval : i32)
7  }
8  return
9}
10
11// CHECK-LABEL: func.func @update_no_op
12// CHECK-NOT: omp.atomic.update
13
14// -----
15
16func.func @update_write_op(%x : memref<i32>, %value: i32) {
17  omp.atomic.update %x : memref<i32> {
18  ^bb0(%xval : i32):
19    omp.yield(%value : i32)
20  }
21  return
22}
23
24// CHECK-LABEL: func.func @update_write_op
25// CHECK-SAME:            (%[[X:.+]]: memref<i32>, %[[VALUE:.+]]: i32)
26// CHECK: omp.atomic.write %[[X]] = %[[VALUE]] : memref<i32>, i32
27// CHECK-NOT: omp.atomic.update
28
29// -----
30
31func.func @update_normal(%x : memref<i32>, %value: i32) {
32  omp.atomic.update %x : memref<i32> {
33  ^bb0(%xval : i32):
34    %newval = arith.addi %xval, %value : i32
35    omp.yield(%newval : i32)
36  }
37  return
38}
39
40// CHECK-LABEL: func.func @update_normal
41// CHECK: omp.atomic.update
42// CHECK: arith.addi
43// CHECK: omp.yield
44
45// -----
46
47func.func @update_unnecessary_computations(%x: memref<i32>) {
48  %c0 = arith.constant 0 : i32
49  omp.atomic.update %x : memref<i32> {
50  ^bb0(%xval: i32):
51    %newval = arith.addi %xval, %c0 : i32
52    omp.yield(%newval: i32)
53  }
54  return
55}
56
57// CHECK-LABEL: func.func @update_unnecessary_computations
58// CHECK-NOT: omp.atomic.update
59
60// -----
61
62func.func @update_unnecessary_computations(%x: memref<i32>) {
63  %c0 = arith.constant 0 : i32
64  omp.atomic.update %x : memref<i32> {
65  ^bb0(%xval: i32):
66    %newval = arith.muli %xval, %c0 : i32
67    omp.yield(%newval: i32)
68  }
69  return
70}
71
72// CHECK-LABEL: func.func @update_unnecessary_computations
73// CHECK-NOT: omp.atomic.update
74// CHECK: omp.atomic.write
75
76// -----
77
78// CHECK-LABEL: func.func @parallel_empty
79func.func @parallel_empty() {
80  omp.parallel {}
81  return
82}
83
84// CHECK-NOT: omp.parallel
85
86// -----
87
88// CHECK-LABEL: func.func @parallel_only_terminator
89func.func @parallel_only_terminator() {
90  omp.parallel {
91    omp.terminator
92  }
93  return
94}
95
96// CHECK-NOT: omp.parallel
97// CHECK-NOT: omp.terminator
98
99// -----
100
101// CHECK-LABEL: func.func @parallel_no_side_effects
102func.func @parallel_no_side_effects(%a: i32, %b: i32) {
103  omp.parallel {
104    %x = arith.addi %a, %b : i32
105    omp.terminator
106  }
107  return
108}
109
110// CHECK-NOT: omp.parallel
111// CHECK-NOT: omp.terminator
112
113// -----
114
115// CHECK-LABEL: func.func @parallel_maybe_side_effects
116func.func @parallel_maybe_side_effects(%a: i32, %b: i32) {
117  omp.parallel {
118    func.call @foo() : () -> ()
119    omp.terminator
120  }
121  return
122}
123
124func.func private @foo() -> ()
125
126// CHECK: omp.parallel
127// CHECK: func.call @foo() : () -> ()
128// CHECK: omp.terminator
129
130// -----
131
132func.func @constant_hoisting_target(%x : !llvm.ptr) {
133  omp.target {
134    ^bb0(%arg0: !llvm.ptr):
135    %c1 = arith.constant 10 : i32
136    llvm.store %c1, %arg0 : i32, !llvm.ptr
137    omp.terminator
138  }
139  return
140}
141
142// CHECK-LABEL: func.func @constant_hoisting_target
143// CHECK-NOT: arith.constant
144// CHECK: omp.target
145// CHECK: arith.constant
146