1// RUN: mlir-opt %s -canonicalize="test-convergence" -split-input-file | FileCheck %s 2 3func.func @testenterdataop(%a: memref<f32>) -> () { 4 %ifCond = arith.constant true 5 %0 = acc.create varPtr(%a : memref<f32>) -> memref<f32> 6 acc.enter_data if(%ifCond) dataOperands(%0 : memref<f32>) 7 return 8} 9 10// CHECK: acc.enter_data dataOperands(%{{.*}} : memref<f32>) 11 12// ----- 13 14func.func @testenterdataop(%a: memref<f32>) -> () { 15 %ifCond = arith.constant false 16 %0 = acc.create varPtr(%a : memref<f32>) -> memref<f32> 17 acc.enter_data if(%ifCond) dataOperands(%0 : memref<f32>) 18 return 19} 20 21// CHECK: func @testenterdataop 22// CHECK-NOT: acc.enter_data 23 24// ----- 25 26func.func @testexitdataop(%a: memref<f32>) -> () { 27 %ifCond = arith.constant true 28 %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32> 29 acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>) 30 acc.delete accPtr(%0 : memref<f32>) 31 return 32} 33 34// CHECK: acc.exit_data dataOperands(%{{.*}} : memref<f32>) 35 36// ----- 37 38func.func @testexitdataop(%a: memref<f32>) -> () { 39 %ifCond = arith.constant false 40 %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32> 41 acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>) 42 acc.delete accPtr(%0 : memref<f32>) 43 return 44} 45 46// CHECK: func @testexitdataop 47// CHECK-NOT: acc.exit_data 48 49// ----- 50 51func.func @testupdateop(%a: memref<f32>) -> () { 52 %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32> 53 acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>) 54 %ifCond = arith.constant true 55 acc.update if(%ifCond) dataOperands(%0: memref<f32>) 56 return 57} 58 59// CHECK: acc.update dataOperands(%{{.*}} : memref<f32>) 60 61// ----- 62 63func.func @testupdateop(%a: memref<f32>) -> () { 64 %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32> 65 acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>) 66 %ifCond = arith.constant false 67 acc.update if(%ifCond) dataOperands(%0: memref<f32>) 68 return 69} 70 71// CHECK: func @testupdateop 72// CHECK-NOT: acc.update{{.$}} 73 74// ----- 75 76func.func @testenterdataop(%a: memref<f32>, %ifCond: i1) -> () { 77 %0 = acc.create varPtr(%a : memref<f32>) -> memref<f32> 78 acc.enter_data if(%ifCond) dataOperands(%0 : memref<f32>) 79 return 80} 81 82// CHECK: func @testenterdataop(%{{.*}}: memref<f32>, [[IFCOND:%.*]]: i1) 83// CHECK: acc.enter_data if(%{{.*}}) dataOperands(%{{.*}} : memref<f32>) 84 85// ----- 86 87func.func @testexitdataop(%a: memref<f32>, %ifCond: i1) -> () { 88 %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32> 89 acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>) 90 acc.delete accPtr(%0 : memref<f32>) 91 return 92} 93 94// CHECK: func @testexitdataop(%{{.*}}: memref<f32>, [[IFCOND:%.*]]: i1) 95// CHECK: acc.exit_data if(%{{.*}}) dataOperands(%{{.*}} : memref<f32>) 96 97// ----- 98 99func.func @testupdateop(%a: memref<f32>, %ifCond: i1) -> () { 100 %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32> 101 acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>) 102 acc.update if(%ifCond) dataOperands(%0: memref<f32>) 103 return 104} 105 106// CHECK: func @testupdateop(%{{.*}}: memref<f32>, [[IFCOND:%.*]]: i1) 107// CHECK: acc.update if(%{{.*}}) dataOperands(%{{.*}} : memref<f32>) 108 109// ----- 110 111func.func @testhostdataop(%a: memref<f32>, %ifCond: i1) -> () { 112 %0 = acc.use_device varPtr(%a : memref<f32>) -> memref<f32> 113 %1 = arith.constant 1 : i32 114 %2 = arith.constant 10 : i32 115 %false = arith.constant false 116 acc.host_data dataOperands(%0 : memref<f32>) if(%false) { 117 acc.loop control(%iv : i32) = (%1 : i32) to (%2 : i32) step (%1 : i32) { 118 acc.yield 119 } attributes { inclusiveUpperbound = array<i1: true> } 120 acc.loop control(%iv : i32) = (%1 : i32) to (%2 : i32) step (%1 : i32) { 121 acc.yield 122 } attributes { inclusiveUpperbound = array<i1: true> } 123 acc.terminator 124 } 125 return 126} 127 128// CHECK-LABEL: func.func @testhostdataop 129// CHECK-NOT: acc.host_data 130// CHECK: acc.loop 131// CHECK: acc.yield 132// CHECK: acc.loop 133// CHECK: acc.yield 134 135// ----- 136 137func.func @testhostdataop(%a: memref<f32>, %ifCond: i1) -> () { 138 %0 = acc.use_device varPtr(%a : memref<f32>) -> memref<f32> 139 %true = arith.constant true 140 acc.host_data dataOperands(%0 : memref<f32>) if(%true) { 141 } 142 return 143} 144 145// CHECK-LABEL: func.func @testhostdataop 146// CHECK: acc.host_data dataOperands(%{{.*}} : memref<f32>) { 147 148// ----- 149 150func.func @update_no_op(%x : memref<i32>) { 151 acc.atomic.update %x : memref<i32> { 152 ^bb0(%xval : i32): 153 acc.yield %xval : i32 154 } 155 return 156} 157 158// CHECK-LABEL: func.func @update_no_op 159// CHECK-NOT: acc.atomic.update 160 161// ----- 162 163func.func @update_write_op(%x : memref<i32>, %value: i32) { 164 acc.atomic.update %x : memref<i32> { 165 ^bb0(%xval : i32): 166 acc.yield %value : i32 167 } 168 return 169} 170 171// CHECK-LABEL: func.func @update_write_op 172// CHECK-SAME: (%[[X:.+]]: memref<i32>, %[[VALUE:.+]]: i32) 173// CHECK: acc.atomic.write %[[X]] = %[[VALUE]] : memref<i32>, i32 174// CHECK-NOT: acc.atomic.update 175 176// ----- 177 178func.func @update_normal(%x : memref<i32>, %value: i32) { 179 acc.atomic.update %x : memref<i32> { 180 ^bb0(%xval : i32): 181 %newval = arith.addi %xval, %value : i32 182 acc.yield %newval : i32 183 } 184 return 185} 186 187// CHECK-LABEL: func.func @update_normal 188// CHECK: acc.atomic.update 189// CHECK: arith.addi 190// CHECK: acc.yield 191 192// ----- 193 194func.func @update_unnecessary_computations(%x: memref<i32>) { 195 %c0 = arith.constant 0 : i32 196 acc.atomic.update %x : memref<i32> { 197 ^bb0(%xval: i32): 198 %newval = arith.addi %xval, %c0 : i32 199 acc.yield %newval: i32 200 } 201 return 202} 203 204// CHECK-LABEL: func.func @update_unnecessary_computations 205// CHECK-NOT: acc.atomic.update 206 207// ----- 208 209func.func @update_unnecessary_computations(%x: memref<i32>) { 210 %c0 = arith.constant 0 : i32 211 acc.atomic.update %x : memref<i32> { 212 ^bb0(%xval: i32): 213 %newval = arith.muli %xval, %c0 : i32 214 acc.yield %newval: i32 215 } 216 return 217} 218 219// CHECK-LABEL: func.func @update_unnecessary_computations 220// CHECK-NOT: acc.atomic.update 221// CHECK: acc.atomic.write 222