// RUN: mlir-opt %s -canonicalize="test-convergence" -split-input-file | FileCheck %s func.func @update_no_op(%x : memref) { omp.atomic.update %x : memref { ^bb0(%xval : i32): omp.yield(%xval : i32) } return } // CHECK-LABEL: func.func @update_no_op // CHECK-NOT: omp.atomic.update // ----- func.func @update_write_op(%x : memref, %value: i32) { omp.atomic.update %x : memref { ^bb0(%xval : i32): omp.yield(%value : i32) } return } // CHECK-LABEL: func.func @update_write_op // CHECK-SAME: (%[[X:.+]]: memref, %[[VALUE:.+]]: i32) // CHECK: omp.atomic.write %[[X]] = %[[VALUE]] : memref, i32 // CHECK-NOT: omp.atomic.update // ----- func.func @update_normal(%x : memref, %value: i32) { omp.atomic.update %x : memref { ^bb0(%xval : i32): %newval = arith.addi %xval, %value : i32 omp.yield(%newval : i32) } return } // CHECK-LABEL: func.func @update_normal // CHECK: omp.atomic.update // CHECK: arith.addi // CHECK: omp.yield // ----- func.func @update_unnecessary_computations(%x: memref) { %c0 = arith.constant 0 : i32 omp.atomic.update %x : memref { ^bb0(%xval: i32): %newval = arith.addi %xval, %c0 : i32 omp.yield(%newval: i32) } return } // CHECK-LABEL: func.func @update_unnecessary_computations // CHECK-NOT: omp.atomic.update // ----- func.func @update_unnecessary_computations(%x: memref) { %c0 = arith.constant 0 : i32 omp.atomic.update %x : memref { ^bb0(%xval: i32): %newval = arith.muli %xval, %c0 : i32 omp.yield(%newval: i32) } return } // CHECK-LABEL: func.func @update_unnecessary_computations // CHECK-NOT: omp.atomic.update // CHECK: omp.atomic.write // ----- // CHECK-LABEL: func.func @parallel_empty func.func @parallel_empty() { omp.parallel {} return } // CHECK-NOT: omp.parallel // ----- // CHECK-LABEL: func.func @parallel_only_terminator func.func @parallel_only_terminator() { omp.parallel { omp.terminator } return } // CHECK-NOT: omp.parallel // CHECK-NOT: omp.terminator // ----- // CHECK-LABEL: func.func @parallel_no_side_effects func.func @parallel_no_side_effects(%a: i32, %b: i32) { omp.parallel { %x = arith.addi %a, %b : i32 omp.terminator } return } // CHECK-NOT: omp.parallel // CHECK-NOT: omp.terminator // ----- // CHECK-LABEL: func.func @parallel_maybe_side_effects func.func @parallel_maybe_side_effects(%a: i32, %b: i32) { omp.parallel { func.call @foo() : () -> () omp.terminator } return } func.func private @foo() -> () // CHECK: omp.parallel // CHECK: func.call @foo() : () -> () // CHECK: omp.terminator // ----- func.func @constant_hoisting_target(%x : !llvm.ptr) { omp.target { ^bb0(%arg0: !llvm.ptr): %c1 = arith.constant 10 : i32 llvm.store %c1, %arg0 : i32, !llvm.ptr omp.terminator } return } // CHECK-LABEL: func.func @constant_hoisting_target // CHECK-NOT: arith.constant // CHECK: omp.target // CHECK: arith.constant