aboutsummaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.fortran/cancel-do-2.f90
blob: c748800cad5523fd30174df3f31999a1cc20c190 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
! { dg-do run }
! { dg-options "-fno-inline -fno-ipa-sra -fno-ipa-cp -fno-ipa-cp-clone" }
! { dg-set-target-env-var OMP_CANCELLATION "true" }

  use omp_lib
  integer :: i
  logical :: x(5)

  x(:) = .false.
  x(1) = .true.
  x(3) = .true.
  if (omp_get_cancellation ()) call foo (x)
contains
  subroutine foo (x)
    use omp_lib
    logical :: x(5)
    integer :: v, w, i

    v = 0
    w = 0
    !$omp parallel num_threads (32) shared (v, w)
      !$omp do
	do i = 0, 999
	  !$omp cancel do if (x(1))
	  call abort
	end do
      !$omp do
	do i = 0, 999
	  !$omp cancel do if (x(2))
	  !$omp atomic
	    v = v + 1
	  !$omp endatomic
	enddo
      !$omp do
	do i = 0, 999
	  !$omp cancel do if (x(3))
	  !$omp atomic
	    w = w + 8
	  !$omp end atomic
	end do
      !$omp do
	do i = 0, 999
	  !$omp cancel do if (x(4))
	  !$omp atomic
	    v = v + 2
	  !$omp end atomic
	end do
      !$omp end do
    !$omp end parallel
    if (v.ne.3000.or.w.ne.0) call abort
    !$omp parallel num_threads (32) shared (v, w)
      ! None of these cancel directives should actually cancel anything,
      ! but the compiler shouldn't know that and thus should use cancellable
      ! barriers at the end of all the workshares.
      !$omp cancel parallel if (omp_get_thread_num ().eq.1.and.x(5))
      !$omp do
	do i = 0, 999
	  !$omp cancel do if (x(1))
	  call abort
	end do
      !$omp cancel parallel if (omp_get_thread_num ().eq.2.and.x(5))
      !$omp do
	do i = 0, 999
	  !$omp cancel do if (x(2))
	  !$omp atomic
	    v = v + 1
	  !$omp endatomic
	enddo
      !$omp cancel parallel if (omp_get_thread_num ().eq.3.and.x(5))
      !$omp do
	do i = 0, 999
	  !$omp cancel do if (x(3))
	  !$omp atomic
	    w = w + 8
	  !$omp end atomic
	end do
      !$omp cancel parallel if (omp_get_thread_num ().eq.4.and.x(5))
      !$omp do
	do i = 0, 999
	  !$omp cancel do if (x(4))
	  !$omp atomic
	    v = v + 2
	  !$omp end atomic
	end do
      !$omp end do
      !$omp cancel parallel if (omp_get_thread_num ().eq.5.and.x(5))
    !$omp end parallel
    if (v.ne.6000.or.w.ne.0) call abort
  end subroutine
end