[flang-commits] [flang] [flang][OpenMP] Lower DO, SIMD, and DO SIMD metadirective variants (PR #218555)

via flang-commits flang-commits at lists.llvm.org
Mon Aug 31 13:56:11 PDT 2026


================
@@ -0,0 +1,1124 @@
+! Test lowering of metadirectives with ordinary loop-associated variants.
+
+! RUN: %flang_fc1 -fopenmp -emit-hlfir -fopenmp-version=52 %s -o - | \
+! RUN:   FileCheck %s --implicit-check-not=omp.parallel
+
+! CHECK: #[[UNROLL:loop_unroll[0-9]*]] =
+! CHECK-SAME: #llvm.loop_unroll<disable = false, count = 4 : i64>
+! CHECK: #[[VECTORIZE:loop_vectorize[0-9]*]] =
+! CHECK-SAME: #llvm.loop_vectorize<disable = false>
+! CHECK: #[[UNROLL_ANNOTATION:loop_annotation[0-9]*]] =
+! CHECK-SAME: #llvm.loop_annotation<unroll = #[[UNROLL]]>
+! CHECK: #[[VECTOR_ANNOTATION:loop_annotation[0-9]*]] =
+! CHECK-SAME: #llvm.loop_annotation<vectorize = #[[VECTORIZE]]>
+
+! CHECK-LABEL: func.func @_QPtest_do(
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:         omp.wsloop private(@_QFtest_doEi_private_i32 {{.*}} ->
+! CHECK-SAME:      %[[DO_PRIVATE:.*]] : !fir.ref<i32>)
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:           omp.loop_nest (%[[DO_IV:.*]]) :
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:             %[[DO_PRIVATE_DECL:.*]]:2 =
+! CHECK-SAME:          hlfir.declare %[[DO_PRIVATE]]
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:             hlfir.assign %[[DO_IV]] to %[[DO_PRIVATE_DECL]]#0
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:             %[[DO_VALUE:.*]] =
+! CHECK-SAME:          fir.load %[[DO_PRIVATE_DECL]]#0
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:             %[[DO_INDEX:.*]] =
+! CHECK-SAME:          fir.load %[[DO_PRIVATE_DECL]]#0
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:             %[[DO_INDEX_I64:.*]] = fir.convert %[[DO_INDEX]]
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK-NOT:         {{^ *}}}
+! CHECK:             %[[DO_ELEMENT:.*]] = hlfir.designate
+! CHECK-SAME:          (%[[DO_INDEX_I64]])
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK-NOT:         {{^ *}}}
+! CHECK:             hlfir.assign %[[DO_VALUE]] to %[[DO_ELEMENT]]
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:             omp.yield
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:         return
+subroutine test_do(n, a)
+  integer :: n, a(n), i
+  !$omp metadirective &
+  !$omp & when(implementation={vendor(llvm)}: do) &
+  !$omp & otherwise(nothing)
+  do i = 1, n
+    a(i) = i
+  end do
+end subroutine
+
+! CHECK-LABEL: func.func @_QPtest_simd(
+! CHECK:         %[[SIMD_AFTER:.*]]:2 = hlfir.declare %arg2
+! CHECK-SAME:      uniq_name = "_QFtest_simdEafter"
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:         omp.simd linear(
+! CHECK-SAME:      val(%[[SIMD_LINEAR:.*]] : !fir.ref<i32> =
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:           omp.loop_nest (%[[SIMD_IV:.*]]) :
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:             hlfir.assign %[[SIMD_IV]] to %[[SIMD_LINEAR]]
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:             %[[SIMD_VALUE:.*]] = fir.load %[[SIMD_LINEAR]]
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:             %[[SIMD_INDEX:.*]] = fir.load %[[SIMD_LINEAR]]
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:             %[[SIMD_INDEX_I64:.*]] =
+! CHECK-SAME:          fir.convert %[[SIMD_INDEX]]
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK-NOT:         {{^ *}}}
+! CHECK:             %[[SIMD_ELEMENT:.*]] = hlfir.designate
+! CHECK-SAME:          (%[[SIMD_INDEX_I64]])
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK-NOT:         {{^ *}}}
+! CHECK:             hlfir.assign %[[SIMD_VALUE]] to %[[SIMD_ELEMENT]]
+! CHECK:             omp.yield
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:         %[[SIMD_AFTER_VALUE:.*]] = fir.load %[[SIMD_LINEAR]]
+! CHECK:         hlfir.assign %[[SIMD_AFTER_VALUE]] to %[[SIMD_AFTER]]#0
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:         return
+subroutine test_simd(n, a, after)
+  integer :: n, a(n), after, i
+  !$omp metadirective &
+  !$omp & when(implementation={vendor(llvm)}: simd) &
+  !$omp & otherwise(nothing)
+  do i = 1, n
+    a(i) = i
+  end do
+  after = i
+end subroutine
+
+! CHECK-LABEL: func.func @_QPtest_do_simd(
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:         omp.wsloop
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:           omp.simd linear(
+! CHECK-SAME:        val(%[[DO_SIMD_LINEAR:.*]] : !fir.ref<i32> =
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:             omp.loop_nest (%[[DO_SIMD_IV:.*]]) :
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:               hlfir.assign %[[DO_SIMD_IV]] to
+! CHECK-SAME:            %[[DO_SIMD_LINEAR]]
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:               %[[DO_SIMD_VALUE:.*]] =
+! CHECK-SAME:            fir.load %[[DO_SIMD_LINEAR]]
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:               %[[DO_SIMD_INDEX:.*]] =
+! CHECK-SAME:            fir.load %[[DO_SIMD_LINEAR]]
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:               %[[DO_SIMD_INDEX_I64:.*]] =
+! CHECK-SAME:            fir.convert %[[DO_SIMD_INDEX]]
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK-NOT:           {{^ *}}}
+! CHECK:               %[[DO_SIMD_ELEMENT:.*]] = hlfir.designate
+! CHECK-SAME:            (%[[DO_SIMD_INDEX_I64]])
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK-NOT:           {{^ *}}}
+! CHECK:               hlfir.assign %[[DO_SIMD_VALUE]] to
+! CHECK-SAME:            %[[DO_SIMD_ELEMENT]]
+! CHECK:               omp.yield
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:         return
+subroutine test_do_simd(n, a)
+  integer :: n, a(n), i
+  !$omp metadirective &
+  !$omp & when(implementation={vendor(llvm)}: do simd) &
+  !$omp & otherwise(nothing)
+  do i = 1, n
+    a(i) = i
+  end do
+end subroutine
+
+! CHECK-LABEL: func.func @_QPtest_begin_do(
+! CHECK-NOT:     {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:         fir.if {{.*}} {
+! CHECK-NOT:       {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:           omp.wsloop private(@_QFtest_begin_doEi_private_i32 {{.*}} ->
+! CHECK-SAME:        %[[BEGIN_DO_PRIVATE:.*]] : !fir.ref<i32>)
+! CHECK-NOT:       {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:             omp.loop_nest (%[[BEGIN_DO_IV:.*]]) :
+! CHECK-NOT:       {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:               %[[BEGIN_DO_PRIVATE_DECL:.*]]:2 =
+! CHECK-SAME:            hlfir.declare %[[BEGIN_DO_PRIVATE]]
+! CHECK-NOT:       {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:               hlfir.assign %[[BEGIN_DO_IV]] to
+! CHECK-SAME:            %[[BEGIN_DO_PRIVATE_DECL]]#0
+! CHECK-NOT:       {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:               %[[BEGIN_DO_VALUE:.*]] =
+! CHECK-SAME:            fir.load %[[BEGIN_DO_PRIVATE_DECL]]#0
+! CHECK-NOT:       {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:               %[[BEGIN_DO_INDEX:.*]] =
+! CHECK-SAME:            fir.load %[[BEGIN_DO_PRIVATE_DECL]]#0
+! CHECK-NOT:       {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK:               %[[BEGIN_DO_INDEX_I64:.*]] =
+! CHECK-SAME:            fir.convert %[[BEGIN_DO_INDEX]]
+! CHECK-NOT:       {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK-NOT:           {{^ *}}}
+! CHECK:               %[[BEGIN_DO_ELEMENT:.*]] = hlfir.designate
+! CHECK-SAME:            (%[[BEGIN_DO_INDEX_I64]])
+! CHECK-NOT:       {{omp\.(wsloop|simd|loop_nest)|fir\.do_loop}}
+! CHECK-NOT:           {{^ *}}}
+! CHECK:               hlfir.assign %[[BEGIN_DO_VALUE]] to
+! CHECK-SAME:            %[[BEGIN_DO_ELEMENT]]
+! CHECK:               omp.yield
----------------
MattPD wrote:

I confirmed that all three selected arms now reject the original extra-loop cases. Thanks!

https://github.com/llvm/llvm-project/pull/218555


More information about the flang-commits mailing list