aboutsummaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.fortran/taskloop-5.f90
blob: 247f93b97c4c5b4c61338e5830b89653615ca061 (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
! { dg-do run }
! { dg-options "-O2" }
! { dg-additional-sources taskloop-5-a.f90 }

module m_taskloop5
  implicit none (type, external)
  integer :: u(0:63), v, w(0:63)

contains
integer function test (a, b, c, d, fn, num_tasks, min_iters, max_iters, sep)
  integer, value :: a, b, c, d
  interface
    subroutine fn (n1, n2, n3, n4)
      integer, value :: n1, n2, n3, n4
    end
  end interface
  integer :: num_tasks, min_iters, max_iters, sep
  integer :: i, j, t

  t = 0
  u = 0
  v = 0
  call fn (a, b, c, d)
  min_iters = 0
  max_iters = 0
  num_tasks = v
  sep = v
  if (v /= 0) then
    min_iters = u(0)
    max_iters = u(0)
    t = u(0)
    do i = 1, v - 1
      if (min_iters > u(i)) &
        min_iters = u(i)
      if (max_iters < u(i)) &
        max_iters = u(i)
      t = t + u(i)
    end do

    if (min_iters /= max_iters) then
      do i = 0, v - 2
        block
          integer :: min_idx
          min_idx = i
          do j = i + 1, v - 1
            if (w(min_idx) > w(j)) &
              min_idx = j
          end do
          if (min_idx /= i) then
            block
              integer tem
              tem = u(i)
              u(i) = u(min_idx)
              u(min_idx) = tem
              tem = w(i)
              w(i) = w(min_idx)
              w(min_idx) = tem
            end block
          end if
        end block
      end do
      if (u(0) /= max_iters) &
        stop 1
      do i = 1, v - 1
        if (u(i) /= u(i - 1)) then
          if (sep /= v .or. u(i) /= min_iters) &
            stop 2
          sep = i;
        end if
      end do
    end if
  end if
  test = t
end
end module