1 // RUN: mlir-opt %s -canonicalize="test-convergence" -split-input-file | FileCheck %s
3 func.func @update_no_op(%x : memref<i32>) {
4 omp.atomic.update %x : memref<i32> {
11 // CHECK-LABEL: func.func @update_no_op
12 // CHECK-NOT: omp.atomic.update
16 func.func @update_write_op(%x : memref<i32>, %value: i32) {
17 omp.atomic.update %x : memref<i32> {
19 omp.yield(%value : i32)
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
31 func.func @update_normal(%x : memref<i32>, %value: i32) {
32 omp.atomic.update %x : memref<i32> {
34 %newval = arith.addi %xval, %value : i32
35 omp.yield(%newval : i32)
40 // CHECK-LABEL: func.func @update_normal
41 // CHECK: omp.atomic.update
47 func.func @update_unnecessary_computations(%x: memref<i32>) {
48 %c0 = arith.constant 0 : i32
49 omp.atomic.update %x : memref<i32> {
51 %newval = arith.addi %xval, %c0 : i32
52 omp.yield(%newval: i32)
57 // CHECK-LABEL: func.func @update_unnecessary_computations
58 // CHECK-NOT: omp.atomic.update
62 func.func @update_unnecessary_computations(%x: memref<i32>) {
63 %c0 = arith.constant 0 : i32
64 omp.atomic.update %x : memref<i32> {
66 %newval = arith.muli %xval, %c0 : i32
67 omp.yield(%newval: i32)
72 // CHECK-LABEL: func.func @update_unnecessary_computations
73 // CHECK-NOT: omp.atomic.update
74 // CHECK: omp.atomic.write
78 // CHECK-LABEL: func.func @parallel_empty
79 func.func @parallel_empty() {
84 // CHECK-NOT: omp.parallel
88 // CHECK-LABEL: func.func @parallel_only_terminator
89 func.func @parallel_only_terminator() {
96 // CHECK-NOT: omp.parallel
97 // CHECK-NOT: omp.terminator
101 // CHECK-LABEL: func.func @parallel_no_side_effects
102 func.func @parallel_no_side_effects(%a: i32, %b: i32) {
104 %x = arith.addi %a, %b : i32
110 // CHECK-NOT: omp.parallel
111 // CHECK-NOT: omp.terminator
115 // CHECK-LABEL: func.func @parallel_maybe_side_effects
116 func.func @parallel_maybe_side_effects(%a: i32, %b: i32) {
118 func.call @foo() : () -> ()
124 func.func private @foo() -> ()
126 // CHECK: omp.parallel
127 // CHECK: func.call @foo() : () -> ()
128 // CHECK: omp.terminator
132 func.func @constant_hoisting_target(%x : !llvm.ptr) {
134 ^bb0(%arg0: !llvm.ptr):
135 %c1 = arith.constant 10 : i32
136 llvm.store %c1, %arg0 : i32, !llvm.ptr
142 // CHECK-LABEL: func.func @constant_hoisting_target
143 // CHECK-NOT: arith.constant
145 // CHECK: arith.constant