308 lines · plain
1// RUN: mlir-opt %s | FileCheck %s --enable-var-scope2// RUN: mlir-opt %s | mlir-opt | FileCheck %s --enable-var-scope3 4 5// CHECK-LABEL: @omp_canonloop_raw(6// CHECK-SAME: %[[tc:.+]]: i32)7func.func @omp_canonloop_raw(%tc : i32) -> () {8 // CHECK: omp.canonical_loop %iv : i32 in range(%[[tc]]) {9 "omp.canonical_loop" (%tc) ({10 ^bb0(%iv: i32):11 // CHECK-NEXT: = llvm.add %iv, %iv : i3212 %newval = llvm.add %iv, %iv : i3213 // CHECK-NEXT: omp.terminator14 omp.terminator15 // CHECK-NEXT: }16 }) : (i32) -> ()17 // CHECK-NEXT: return18 return19}20 21 22// CHECK-LABEL: @omp_canonloop_sequential_raw(23// CHECK-SAME: %[[tc:.+]]: i32)24func.func @omp_canonloop_sequential_raw(%tc : i32) -> () {25 // CHECK-NEXT: %canonloop_s0 = omp.new_cli26 %canonloop_s0 = "omp.new_cli" () : () -> (!omp.cli)27 // CHECK-NEXT: omp.canonical_loop(%canonloop_s0) %iv_s0 : i32 in range(%[[tc]]) {28 "omp.canonical_loop" (%tc, %canonloop_s0) ({29 ^bb_first(%iv_first: i32):30 // CHECK-NEXT: = llvm.add %iv_s0, %iv_s0 : i3231 %newval = llvm.add %iv_first, %iv_first : i3232 // CHECK-NEXT: omp.terminator33 omp.terminator34 // CHECK-NEXT: }35 }) : (i32, !omp.cli) -> ()36 37 // CHECK-NEXT: %canonloop_s1 = omp.new_cli38 %canonloop_s1 = "omp.new_cli" () : () -> (!omp.cli)39 // CHECK-NEXT: omp.canonical_loop(%canonloop_s1) %iv_s1 : i32 in range(%[[tc]]) {40 "omp.canonical_loop" (%tc, %canonloop_s1) ({41 ^bb_second(%iv_second: i32):42 // CHECK: omp.terminator43 omp.terminator44 // CHECK-NEXT: }45 }) : (i32, !omp.cli) -> ()46 47 // CHECK-NEXT: return48 return49}50 51 52// CHECK-LABEL: @omp_nested_canonloop_raw(53// CHECK-SAME: %[[tc_outer:.+]]: i32, %[[tc_inner:.+]]: i32)54func.func @omp_nested_canonloop_raw(%tc_outer : i32, %tc_inner : i32) -> () {55 // CHECK-NEXT: %canonloop = omp.new_cli56 %outer = "omp.new_cli" () : () -> (!omp.cli)57 // CHECK-NEXT: %canonloop_d1 = omp.new_cli58 %inner = "omp.new_cli" () : () -> (!omp.cli)59 // CHECK-NEXT: omp.canonical_loop(%canonloop) %iv : i32 in range(%[[tc_outer]]) {60 "omp.canonical_loop" (%tc_outer, %outer) ({61 ^bb_outer(%iv_outer: i32):62 // CHECK-NEXT: omp.canonical_loop(%canonloop_d1) %iv_d1 : i32 in range(%[[tc_inner]]) {63 "omp.canonical_loop" (%tc_inner, %inner) ({64 ^bb_inner(%iv_inner: i32):65 // CHECK-NEXT: = llvm.add %iv, %iv_d1 : i3266 %newval = llvm.add %iv_outer, %iv_inner: i3267 // CHECK-NEXT: omp.terminator68 omp.terminator69 }) : (i32, !omp.cli) -> ()70 // CHECK: omp.terminator71 omp.terminator72 }) : (i32, !omp.cli) -> ()73 return74}75 76 77// CHECK-LABEL: @omp_canonloop_pretty(78// CHECK-SAME: %[[tc:.+]]: i32)79func.func @omp_canonloop_pretty(%tc : i32) -> () {80 // CHECK-NEXT: omp.canonical_loop %iv : i32 in range(%[[tc]]) {81 omp.canonical_loop %iv : i32 in range(%tc) {82 // CHECK-NEXT: llvm.add %iv, %iv : i3283 %newval = llvm.add %iv, %iv: i3284 // CHECK-NEXT: omp.terminator85 omp.terminator86 }87 return88}89 90 91// CHECK-LABEL: @omp_canonloop_constant_pretty()92func.func @omp_canonloop_constant_pretty() -> () {93 // CHECK-NEXT: %[[tc:.+]] = llvm.mlir.constant(4 : i32) : i3294 %tc = llvm.mlir.constant(4 : i32) : i3295 // CHECK-NEXT: omp.canonical_loop %iv : i32 in range(%[[tc]]) {96 omp.canonical_loop %iv : i32 in range(%tc) {97 // CHECK-NEXT: llvm.add %iv, %iv : i3298 %newval = llvm.add %iv, %iv: i3299 // CHECK-NEXT: omp.terminator100 omp.terminator101 }102 return103}104 105 106// CHECK-LABEL: @omp_canonloop_sequential_pretty(107// CHECK-SAME: %[[tc:.+]]: i32)108func.func @omp_canonloop_sequential_pretty(%tc : i32) -> () {109 // CHECK-NEXT: %canonloop_s0 = omp.new_cli110 %canonloop_s0 = omp.new_cli111 // CHECK-NEXT: omp.canonical_loop(%canonloop_s0) %iv_s0 : i32 in range(%[[tc]]) {112 omp.canonical_loop(%canonloop_s0) %iv_s0 : i32 in range(%tc) {113 // CHECK-NEXT: omp.terminator114 omp.terminator115 }116 117 // CHECK: %canonloop_s1 = omp.new_cli118 %canonloop_s1 = omp.new_cli119 // CHECK-NEXT: omp.canonical_loop(%canonloop_s1) %iv_s1 : i32 in range(%[[tc]]) {120 omp.canonical_loop(%canonloop_s1) %iv_s1 : i32 in range(%tc) {121 // CHECK-NEXT: omp.terminator122 omp.terminator123 }124 125 // CHECK: %canonloop_s2 = omp.new_cli126 %canonloop_s2 = omp.new_cli127 // CHECK-NEXT: omp.canonical_loop(%canonloop_s2) %iv_s2 : i32 in range(%[[tc]]) {128 omp.canonical_loop(%canonloop_s2) %iv_s2 : i32 in range(%tc) {129 // CHECK-NEXT: omp.terminator130 omp.terminator131 }132 133 return134}135 136 137// CHECK-LABEL: @omp_canonloop_2d_nested_pretty(138// CHECK-SAME: %[[tc:.+]]: i32)139func.func @omp_canonloop_2d_nested_pretty(%tc : i32) -> () {140 // CHECK-NEXT: %canonloop = omp.new_cli141 %canonloop = omp.new_cli142 // CHECK-NEXT: %canonloop_d1 = omp.new_cli143 %canonloop_d1 = omp.new_cli144 // CHECK-NEXT: omp.canonical_loop(%canonloop) %iv : i32 in range(%[[tc]]) {145 omp.canonical_loop(%canonloop) %iv : i32 in range(%tc) {146 // CHECK-NEXT: omp.canonical_loop(%canonloop_d1) %iv_d1 : i32 in range(%[[tc]]) {147 omp.canonical_loop(%canonloop_d1) %iv_d1 : i32 in range(%tc) {148 // CHECK: omp.terminator149 omp.terminator150 }151 // CHECK: omp.terminator152 omp.terminator153 }154 return155}156 157 158// CHECK-LABEL: @omp_canonloop_3d_nested_pretty(159// CHECK-SAME: %[[tc:.+]]: i32)160func.func @omp_canonloop_3d_nested_pretty(%tc : i32) -> () {161 // CHECK: %canonloop = omp.new_cli162 %canonloop = omp.new_cli163 // CHECK: %canonloop_d1 = omp.new_cli164 %canonloop_d1 = omp.new_cli165 // CHECK: %canonloop_d2 = omp.new_cli166 %canonloop_d2 = omp.new_cli167 // CHECK-NEXT: omp.canonical_loop(%canonloop) %iv : i32 in range(%[[tc]]) {168 omp.canonical_loop(%canonloop) %iv : i32 in range(%tc) {169 // CHECK-NEXT: omp.canonical_loop(%canonloop_d1) %iv_d1 : i32 in range(%[[tc]]) {170 omp.canonical_loop(%canonloop_d1) %iv_1d : i32 in range(%tc) {171 // CHECK-NEXT: omp.canonical_loop(%canonloop_d2) %iv_d2 : i32 in range(%[[tc]]) {172 omp.canonical_loop(%canonloop_d2) %iv_d2 : i32 in range(%tc) {173 // CHECK-NEXT: omp.terminator174 omp.terminator175 // CHECK-NEXT: }176 }177 // CHECK-NEXT: omp.terminator178 omp.terminator179 // CHECK-NEXT: }180 }181 // CHECK-NEXT: omp.terminator182 omp.terminator183 }184 185 return186}187 188 189// CHECK-LABEL: @omp_canonloop_sequential_nested_pretty(190// CHECK-SAME: %[[tc:.+]]: i32)191func.func @omp_canonloop_sequential_nested_pretty(%tc : i32) -> () {192 // CHECK-NEXT: %canonloop_s0 = omp.new_cli193 %canonloop_s0 = omp.new_cli194 // CHECK-NEXT: %canonloop_s0_d1 = omp.new_cli195 %canonloop_s0_d1 = omp.new_cli196 // CHECK-NEXT: omp.canonical_loop(%canonloop_s0) %iv_s0 : i32 in range(%[[tc]]) {197 omp.canonical_loop(%canonloop_s0) %iv_s0 : i32 in range(%tc) {198 // CHECK-NEXT: omp.canonical_loop(%canonloop_s0_d1) %iv_s0_d1 : i32 in range(%[[tc]]) {199 omp.canonical_loop(%canonloop_s0_d1) %iv_s0_d1 : i32 in range(%tc) {200 // CHECK-NEXT: omp.terminator201 omp.terminator202 // CHECK-NEXT: }203 }204 // CHECK-NEXT: omp.terminator205 omp.terminator206 // CHECK-NEXT: }207 }208 209 // CHECK-NEXT: %canonloop_s1 = omp.new_cli210 %canonloop_s1 = omp.new_cli211 // CHECK-NEXT: %canonloop_s1_d1 = omp.new_cli212 %canonloop_s1_d1 = omp.new_cli213 // CHECK-NEXT: omp.canonical_loop(%canonloop_s1) %iv_s1 : i32 in range(%[[tc]]) {214 omp.canonical_loop(%canonloop_s1) %iv_s1 : i32 in range(%tc) {215 // CHECK-NEXT: omp.canonical_loop(%canonloop_s1_d1) %iv_s1_d1 : i32 in range(%[[tc]]) {216 omp.canonical_loop(%canonloop_s1_d1) %iv_s1d1 : i32 in range(%tc) {217 // CHECK-NEXT: omp.terminator218 omp.terminator219 // CHECK-NEXT: }220 }221 // CHECK-NEXT: omp.terminator222 omp.terminator223 }224 225 return226}227 228 229// CHECK-LABEL: @omp_newcli_unused(230// CHECK-SAME: )231func.func @omp_newcli_unused() -> () {232 // CHECK-NEXT: %cli = omp.new_cli233 %cli = omp.new_cli234 // CHECK-NEXT: return235 return236}237 238 239// CHECK-LABEL: @omp_canonloop_multiregion_isolatedfromabove(240func.func @omp_canonloop_multiregion_isolatedfromabove() -> () {241 omp.private {type = firstprivate} @x.privatizer : !llvm.ptr init {242 ^bb0(%arg0: !llvm.ptr, %arg1: !llvm.ptr):243 %c42_i32 = arith.constant 42: i32244 // CHECK: omp.canonical_loop %iv : i32 in range(%c42_i32) {245 omp.canonical_loop %iv1 : i32 in range(%c42_i32) {246 omp.terminator247 }248 // CHECK: omp.yield249 omp.yield(%arg0 : !llvm.ptr)250 } copy {251 ^bb0(%arg0: !llvm.ptr, %arg1: !llvm.ptr):252 %c42_i32 = arith.constant 42: i32253 // CHECK: omp.canonical_loop %iv : i32 in range(%c42_i32) {254 omp.canonical_loop %iv : i32 in range(%c42_i32) {255 // CHECK: omp.canonical_loop %iv_d1 : i32 in range(%c42_i32) {256 omp.canonical_loop %iv_d1 : i32 in range(%c42_i32) {257 omp.terminator258 }259 omp.terminator260 }261 // CHECK: omp.yield262 omp.yield(%arg0 : !llvm.ptr)263 } dealloc {264 ^bb0(%arg0: !llvm.ptr):265 %c42_i32 = arith.constant 42: i32266 // CHECK: omp.canonical_loop %iv_s0 : i32 in range(%c42_i32) {267 omp.canonical_loop %iv_s0 : i32 in range(%c42_i32) {268 omp.terminator269 }270 // CHECK: omp.canonical_loop %iv_s1 : i32 in range(%c42_i32) {271 omp.canonical_loop %iv_s1 : i32 in range(%c42_i32) {272 omp.terminator273 }274 // CHECK: omp.yield275 omp.yield276 }277 278 // CHECK: return279 return280}281 282 283// CHECK-LABEL: @omp_canonloop_multiregion(284func.func @omp_canonloop_multiregion(%c : i1) -> () {285 %c42_i32 = arith.constant 42: i32286 %canonloop1 = omp.new_cli287 %canonloop2 = omp.new_cli288 %canonloop3 = omp.new_cli289 scf.if %c {290 // CHECK: omp.canonical_loop(%canonloop_r0) %iv_r0 : i32 in range(%c42_i32) {291 omp.canonical_loop(%canonloop1) %iv1 : i32 in range(%c42_i32) {292 omp.terminator293 }294 } else {295 // CHECK: omp.canonical_loop(%canonloop_r1_s0) %iv_r1_s0 : i32 in range(%c42_i32) {296 omp.canonical_loop(%canonloop2) %iv2 : i32 in range(%c42_i32) {297 omp.terminator298 }299 // CHECK: omp.canonical_loop(%canonloop_r1_s1) %iv_r1_s1 : i32 in range(%c42_i32) {300 omp.canonical_loop(%canonloop3) %iv3 : i32 in range(%c42_i32) {301 omp.terminator302 }303 }304 305 // CHECK: return306 return307}308