diff --git a/flang/test/Lower/OpenMP/target_private.f90 b/flang/test/Lower/OpenMP/target_private.f90 index 98e3b79d035dfd..442e8c592feccb 100644 --- a/flang/test/Lower/OpenMP/target_private.f90 +++ b/flang/test/Lower/OpenMP/target_private.f90 @@ -28,3 +28,42 @@ subroutine omp_target_private !CHECK-NEXT: } end subroutine omp_target_private + +!CHECK-LABEL: func.func @_QPomp_target_target_do_simd() +subroutine omp_target_target_do_simd() + implicit none + + real(8) :: var + integer(8) :: iv + +!$omp target teams distribute parallel do simd private(iv,var) + do iv=0,10 + var = 3.14 + end do +!$omp end target teams distribute parallel do simd + +!CHECK: omp.target trip_count +!CHECK: fir.alloca f64 {bindc_name = "var", pinned +!CHECK: omp.teams { +!CHECK: fir.alloca i64 +!CHECK: omp.distribute { +!CHECK-NEXT: omp.parallel { +!CHECK-NEXT: omp.wsloop { +!CHECK-NEXT: omp.simd { +!CHECK-NEXT: omp.loop_nest +!CHECK: omp.yield +!CHECK-NEXT: } +!CHECK-NEXT: omp.terminator +!CHECK-NEXT: } +!CHECK-NEXT: omp.terminator +!CHECK-NEXT: } +!CHECK-NEXT: omp.terminator +!CHECK-NEXT: } +!CHECK-NEXT: omp.terminator +!CHECK-NEXT: } +!CHECK-NEXT: omp.terminator +!CHECK-NEXT: } +!CHECK-NEXT: omp.terminator +!CHECK-NEXT: } + +end subroutine omp_target_target_do_simd diff --git a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp index 576b798aeef7df..26e137022554e9 100644 --- a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp +++ b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp @@ -1389,6 +1389,11 @@ bool TargetOp::isTargetSPMDLoop() { return false; Operation *workshareOp = capturedOp->getParentOp(); + + // Accept optional SIMD leaf construct. + if (isa_and_present(workshareOp)) + workshareOp = workshareOp->getParentOp(); + if (!isa_and_present(workshareOp)) return false;