! This test checks lowering of OpenMP compound (combined and composite) loop ! constructs. ! RUN: bbc -fopenmp -emit-hlfir %s -o - | FileCheck %s ! RUN: %flang_fc1 -fopenmp -emit-hlfir %s -o - | FileCheck %s program main integer :: i,j ! TODO When composite constructs are supported add: ! - TASKLOOP SIMD ! ---------------------------------------------------------------------------- ! DISTRIBUTE PARALLEL DO ! ---------------------------------------------------------------------------- !$omp teams ! CHECK: omp.parallel ! CHECK: omp.distribute ! CHECK-NEXT: omp.wsloop ! CHECK-NEXT: omp.loop_nest !$omp distribute parallel do do i = 1, 10 end do !$omp end distribute parallel do !$omp end teams ! ---------------------------------------------------------------------------- ! DISTRIBUTE PARALLEL DO SIMD ! ---------------------------------------------------------------------------- !$omp teams ! CHECK: omp.parallel ! CHECK: omp.distribute ! CHECK-NEXT: omp.wsloop ! CHECK-NEXT: omp.simd ! CHECK-NEXT: omp.loop_nest !$omp distribute parallel do simd do i = 1, 10 end do !$omp end distribute parallel do simd !$omp end teams ! ---------------------------------------------------------------------------- ! DISTRIBUTE SIMD ! ---------------------------------------------------------------------------- !$omp teams ! CHECK: omp.distribute ! CHECK-NEXT: omp.simd ! CHECK-NEXT: omp.loop_nest !$omp distribute simd do i = 1, 10 end do !$omp end distribute simd !$omp end teams ! ---------------------------------------------------------------------------- ! DO SIMD ! ---------------------------------------------------------------------------- ! CHECK: omp.wsloop ! CHECK-NEXT: omp.simd ! CHECK-NEXT: omp.loop_nest !$omp do simd do i = 1, 10 end do !$omp end do simd ! ---------------------------------------------------------------------------- ! PARALLEL DO SIMD ! ---------------------------------------------------------------------------- ! CHECK: omp.parallel ! CHECK: omp.wsloop ! CHECK-NEXT: omp.simd ! CHECK-NEXT: omp.loop_nest !$omp parallel do simd do i = 1, 10 end do !$omp end parallel do simd ! ---------------------------------------------------------------------------- ! PARALLEL DO ! ---------------------------------------------------------------------------- ! CHECK: omp.parallel ! CHECK: omp.wsloop ! CHECK-NEXT: omp.loop_nest !$omp parallel do do i = 1, 10 end do !$omp end parallel do ! ---------------------------------------------------------------------------- ! TARGET PARALLEL DO SIMD ! ---------------------------------------------------------------------------- ! CHECK: omp.target ! CHECK: omp.parallel ! CHECK: omp.wsloop ! CHECK-NEXT: omp.simd ! CHECK-NEXT: omp.loop_nest !$omp target parallel do simd do i = 1, 10 end do !$omp end target parallel do simd ! ---------------------------------------------------------------------------- ! TARGET PARALLEL DO ! ---------------------------------------------------------------------------- ! CHECK: omp.target ! CHECK: omp.parallel ! CHECK: omp.wsloop ! CHECK-NEXT: omp.loop_nest !$omp target parallel do do i = 1, 10 end do !$omp end target parallel do ! ---------------------------------------------------------------------------- ! TARGET SIMD ! ---------------------------------------------------------------------------- ! CHECK: omp.target ! CHECK: omp.simd ! CHECK-NEXT: omp.loop_nest !$omp target simd do i = 1, 10 end do !$omp end target simd ! ---------------------------------------------------------------------------- ! TARGET TEAMS DISTRIBUTE ! ---------------------------------------------------------------------------- ! CHECK: omp.target ! CHECK: omp.teams ! CHECK: omp.distribute ! CHECK-NEXT: omp.loop_nest !$omp target teams distribute do i = 1, 10 end do !$omp end target teams distribute ! ---------------------------------------------------------------------------- ! TARGET TEAMS DISTRIBUTE PARALLEL DO ! ---------------------------------------------------------------------------- ! CHECK: omp.target ! CHECK: omp.teams ! CHECK: omp.parallel ! CHECK: omp.distribute ! CHECK-NEXT: omp.wsloop ! CHECK-NEXT: omp.loop_nest !$omp target teams distribute parallel do do i = 1, 10 end do !$omp end target teams distribute parallel do ! ---------------------------------------------------------------------------- ! TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD ! ---------------------------------------------------------------------------- ! CHECK: omp.target ! CHECK: omp.teams ! CHECK: omp.parallel ! CHECK: omp.distribute ! CHECK-NEXT: omp.wsloop ! CHECK-NEXT: omp.simd ! CHECK-NEXT: omp.loop_nest !$omp target teams distribute parallel do simd do i = 1, 10 end do !$omp end target teams distribute parallel do simd ! ---------------------------------------------------------------------------- ! TARGET TEAMS DISTRIBUTE SIMD ! ---------------------------------------------------------------------------- ! CHECK: omp.target ! CHECK: omp.teams ! CHECK: omp.distribute ! CHECK-NEXT: omp.simd ! CHECK-NEXT: omp.loop_nest !$omp target teams distribute simd do i = 1, 10 end do !$omp end target teams distribute simd ! ---------------------------------------------------------------------------- ! TEAMS DISTRIBUTE ! ---------------------------------------------------------------------------- ! CHECK: omp.teams ! CHECK: omp.distribute ! CHECK-NEXT: omp.loop_nest !$omp teams distribute do i = 1, 10 end do !$omp end teams distribute ! ---------------------------------------------------------------------------- ! TEAMS DISTRIBUTE PARALLEL DO ! ---------------------------------------------------------------------------- ! CHECK: omp.teams ! CHECK: omp.parallel ! CHECK: omp.distribute ! CHECK-NEXT: omp.wsloop ! CHECK-NEXT: omp.loop_nest !$omp teams distribute parallel do do i = 1, 10 end do !$omp end teams distribute parallel do ! ---------------------------------------------------------------------------- ! TEAMS DISTRIBUTE PARALLEL DO SIMD ! ---------------------------------------------------------------------------- ! CHECK: omp.teams ! CHECK: omp.parallel ! CHECK: omp.distribute ! CHECK-NEXT: omp.wsloop ! CHECK-NEXT: omp.simd ! CHECK-NEXT: omp.loop_nest !$omp teams distribute parallel do simd do i = 1, 10 end do !$omp end teams distribute parallel do simd ! ---------------------------------------------------------------------------- ! TEAMS DISTRIBUTE SIMD ! ---------------------------------------------------------------------------- ! CHECK: omp.teams ! CHECK: omp.distribute ! CHECK-NEXT: omp.simd ! CHECK-NEXT: omp.loop_nest !$omp teams distribute simd do i = 1, 10 end do !$omp end teams distribute simd ! ---------------------------------------------------------------------------- ! Unstructured control-flow in loop ! ---------------------------------------------------------------------------- ! CHECK: omp.target ! CHECK: omp.teams ! CHECK: omp.parallel ! CHECK: omp.distribute ! CHECK-NEXT: omp.wsloop ! CHECK-NEXT: omp.loop_nest ! ! Verify the conrol-flow of the unstructured inner loop. ! CHECK: cf.br ^[[BB1:.*]] ! CHECK: ^[[BB1]]: ! CHECK: cf.br ^[[BB2:.*]] ! CHECK: ^[[BB2]]: ! CHECK: cf.cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]] ! CHECK: ^[[BB3]]: ! CHECK: cf.cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.*]] ! CHECK: ^[[BB4]]: ! CHECK: cf.br ^[[BB6]] ! CHECK: ^[[BB5]]: ! CHECK: cf.br ^[[BB2]] ! CHECK: ^[[BB6]]: ! CHECK-NEXT: omp.yield !$omp target teams distribute parallel do do i = 1, 10 outerloop: do j = i-1, i+i if (j == i) then exit outerloop end if end do outerloop end do !$omp end target teams distribute parallel do end program main