146 lines · plain
1// RUN: mlir-opt %s -canonicalize="test-convergence" -split-input-file | FileCheck %s2 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 return9}10 11// CHECK-LABEL: func.func @update_no_op12// CHECK-NOT: omp.atomic.update13 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 return22}23 24// CHECK-LABEL: func.func @update_write_op25// CHECK-SAME: (%[[X:.+]]: memref<i32>, %[[VALUE:.+]]: i32)26// CHECK: omp.atomic.write %[[X]] = %[[VALUE]] : memref<i32>, i3227// CHECK-NOT: omp.atomic.update28 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 : i3235 omp.yield(%newval : i32)36 }37 return38}39 40// CHECK-LABEL: func.func @update_normal41// CHECK: omp.atomic.update42// CHECK: arith.addi43// CHECK: omp.yield44 45// -----46 47func.func @update_unnecessary_computations(%x: memref<i32>) {48 %c0 = arith.constant 0 : i3249 omp.atomic.update %x : memref<i32> {50 ^bb0(%xval: i32):51 %newval = arith.addi %xval, %c0 : i3252 omp.yield(%newval: i32)53 }54 return55}56 57// CHECK-LABEL: func.func @update_unnecessary_computations58// CHECK-NOT: omp.atomic.update59 60// -----61 62func.func @update_unnecessary_computations(%x: memref<i32>) {63 %c0 = arith.constant 0 : i3264 omp.atomic.update %x : memref<i32> {65 ^bb0(%xval: i32):66 %newval = arith.muli %xval, %c0 : i3267 omp.yield(%newval: i32)68 }69 return70}71 72// CHECK-LABEL: func.func @update_unnecessary_computations73// CHECK-NOT: omp.atomic.update74// CHECK: omp.atomic.write75 76// -----77 78// CHECK-LABEL: func.func @parallel_empty79func.func @parallel_empty() {80 omp.parallel {}81 return82}83 84// CHECK-NOT: omp.parallel85 86// -----87 88// CHECK-LABEL: func.func @parallel_only_terminator89func.func @parallel_only_terminator() {90 omp.parallel {91 omp.terminator92 }93 return94}95 96// CHECK-NOT: omp.parallel97// CHECK-NOT: omp.terminator98 99// -----100 101// CHECK-LABEL: func.func @parallel_no_side_effects102func.func @parallel_no_side_effects(%a: i32, %b: i32) {103 omp.parallel {104 %x = arith.addi %a, %b : i32105 omp.terminator106 }107 return108}109 110// CHECK-NOT: omp.parallel111// CHECK-NOT: omp.terminator112 113// -----114 115// CHECK-LABEL: func.func @parallel_maybe_side_effects116func.func @parallel_maybe_side_effects(%a: i32, %b: i32) {117 omp.parallel {118 func.call @foo() : () -> ()119 omp.terminator120 }121 return122}123 124func.func private @foo() -> ()125 126// CHECK: omp.parallel127// CHECK: func.call @foo() : () -> ()128// CHECK: omp.terminator129 130// -----131 132func.func @constant_hoisting_target(%x : !llvm.ptr) {133 omp.target {134 ^bb0(%arg0: !llvm.ptr):135 %c1 = arith.constant 10 : i32136 llvm.store %c1, %arg0 : i32, !llvm.ptr137 omp.terminator138 }139 return140}141 142// CHECK-LABEL: func.func @constant_hoisting_target143// CHECK-NOT: arith.constant144// CHECK: omp.target145// CHECK: arith.constant146