// RUN: fir-opt --bufferize-hlfir %s | FileCheck %s // Checks that we correctly identify when to use the lowering to // omp.workshare.loop_wrapper // CHECK-LABEL: @should_parallelize_0 // CHECK: omp.workshare.loop_wrapper func.func @should_parallelize_0(%arg: !fir.ref>, %idx : index) { omp.workshare { %c42 = arith.constant 42 : index %c1_i32 = arith.constant 1 : i32 %shape = fir.shape %c42 : (index) -> !fir.shape<1> %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref>, !fir.shape<1>) -> (!fir.ref>, !fir.ref>) %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> { ^bb0(%i: index): hlfir.yield_element %c1_i32 : i32 } hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref> hlfir.destroy %elemental : !hlfir.expr<42xi32> omp.terminator } return } // CHECK-LABEL: @should_parallelize_1 // CHECK: omp.workshare.loop_wrapper func.func @should_parallelize_1(%arg: !fir.ref>, %idx : index) { omp.parallel { omp.workshare { %c42 = arith.constant 42 : index %c1_i32 = arith.constant 1 : i32 %shape = fir.shape %c42 : (index) -> !fir.shape<1> %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref>, !fir.shape<1>) -> (!fir.ref>, !fir.ref>) %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> { ^bb0(%i: index): hlfir.yield_element %c1_i32 : i32 } hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref> hlfir.destroy %elemental : !hlfir.expr<42xi32> omp.terminator } omp.terminator } return } // CHECK-LABEL: @should_not_parallelize_0 // CHECK-NOT: omp.workshare.loop_wrapper func.func @should_not_parallelize_0(%arg: !fir.ref>, %idx : index) { omp.workshare { omp.single { %c42 = arith.constant 42 : index %c1_i32 = arith.constant 1 : i32 %shape = fir.shape %c42 : (index) -> !fir.shape<1> %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref>, !fir.shape<1>) -> (!fir.ref>, !fir.ref>) %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> { ^bb0(%i: index): hlfir.yield_element %c1_i32 : i32 } hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref> hlfir.destroy %elemental : !hlfir.expr<42xi32> omp.terminator } omp.terminator } return } // CHECK-LABEL: @should_not_parallelize_1 // CHECK-NOT: omp.workshare.loop_wrapper func.func @should_not_parallelize_1(%arg: !fir.ref>, %idx : index) { omp.workshare { omp.critical { %c42 = arith.constant 42 : index %c1_i32 = arith.constant 1 : i32 %shape = fir.shape %c42 : (index) -> !fir.shape<1> %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref>, !fir.shape<1>) -> (!fir.ref>, !fir.ref>) %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> { ^bb0(%i: index): hlfir.yield_element %c1_i32 : i32 } hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref> hlfir.destroy %elemental : !hlfir.expr<42xi32> omp.terminator } omp.terminator } return } // CHECK-LABEL: @should_not_parallelize_2 // CHECK-NOT: omp.workshare.loop_wrapper func.func @should_not_parallelize_2(%arg: !fir.ref>, %idx : index) { omp.workshare { omp.parallel { %c42 = arith.constant 42 : index %c1_i32 = arith.constant 1 : i32 %shape = fir.shape %c42 : (index) -> !fir.shape<1> %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref>, !fir.shape<1>) -> (!fir.ref>, !fir.ref>) %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> { ^bb0(%i: index): hlfir.yield_element %c1_i32 : i32 } hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref> hlfir.destroy %elemental : !hlfir.expr<42xi32> omp.terminator } omp.terminator } return } // CHECK-LABEL: @should_not_parallelize_3 // CHECK-NOT: omp.workshare.loop_wrapper func.func @should_not_parallelize_3(%arg: !fir.ref>, %idx : index) { omp.workshare { omp.parallel { omp.workshare { omp.parallel { %c42 = arith.constant 42 : index %c1_i32 = arith.constant 1 : i32 %shape = fir.shape %c42 : (index) -> !fir.shape<1> %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref>, !fir.shape<1>) -> (!fir.ref>, !fir.ref>) %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> { ^bb0(%i: index): hlfir.yield_element %c1_i32 : i32 } hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref> hlfir.destroy %elemental : !hlfir.expr<42xi32> omp.terminator } omp.terminator } omp.terminator } omp.terminator } return } // CHECK-LABEL: @should_not_parallelize_4 // CHECK-NOT: omp.workshare.loop_wrapper func.func @should_not_parallelize_4(%arg: !fir.ref>, %idx : index) { omp.workshare { ^bb1: %c42 = arith.constant 42 : index %c1_i32 = arith.constant 1 : i32 %shape = fir.shape %c42 : (index) -> !fir.shape<1> %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref>, !fir.shape<1>) -> (!fir.ref>, !fir.ref>) %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> { ^bb0(%i: index): hlfir.yield_element %c1_i32 : i32 } hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref> hlfir.destroy %elemental : !hlfir.expr<42xi32> cf.br ^bb2 ^bb2: omp.terminator } return }