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