vla2.f90 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. ! { dg-do run }
  2. call test
  3. contains
  4. subroutine check (x, y, l)
  5. integer :: x, y
  6. logical :: l
  7. l = l .or. x .ne. y
  8. end subroutine check
  9. subroutine foo (c, d, e, f, g, h, i, j, k, n)
  10. use omp_lib
  11. integer :: n
  12. character (len = *) :: c
  13. character (len = n) :: d
  14. integer, dimension (2, 3:5, n) :: e
  15. integer, dimension (2, 3:n, n) :: f
  16. character (len = *), dimension (5, 3:n) :: g
  17. character (len = n), dimension (5, 3:n) :: h
  18. real, dimension (:, :, :) :: i
  19. double precision, dimension (3:, 5:, 7:) :: j
  20. integer, dimension (:, :, :) :: k
  21. logical :: l
  22. integer :: p, q, r
  23. character (len = n) :: s
  24. integer, dimension (2, 3:5, n) :: t
  25. integer, dimension (2, 3:n, n) :: u
  26. character (len = n), dimension (5, 3:n) :: v
  27. character (len = 2 * n + 24) :: w
  28. integer :: x
  29. character (len = 1) :: y
  30. l = .false.
  31. !$omp parallel default (none) private (c, d, e, f, g, h, i, j, k) &
  32. !$omp & private (s, t, u, v) reduction (.or.:l) num_threads (6) &
  33. !$omp private (p, q, r, w, x, y)
  34. x = omp_get_thread_num ()
  35. w = ''
  36. if (x .eq. 0) w = 'thread0thr_number_0THREAD0THR_NUMBER_0'
  37. if (x .eq. 1) w = 'thread1thr_number_1THREAD1THR_NUMBER_1'
  38. if (x .eq. 2) w = 'thread2thr_number_2THREAD2THR_NUMBER_2'
  39. if (x .eq. 3) w = 'thread3thr_number_3THREAD3THR_NUMBER_3'
  40. if (x .eq. 4) w = 'thread4thr_number_4THREAD4THR_NUMBER_4'
  41. if (x .eq. 5) w = 'thread5thr_number_5THREAD5THR_NUMBER_5'
  42. c = w(8:19)
  43. d = w(1:7)
  44. forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 * x + p + q + 2 * r
  45. forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 * x + p + q + 2 * r
  46. forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = w(8:19)
  47. forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = w(27:38)
  48. forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = w(1:7)
  49. forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = w(20:26)
  50. forall (p = 3:5, q = 2:6, r = 1:7) i(p - 2, q - 1, r) = (7.5 + x) * p * q * r
  51. forall (p = 3:5, q = 2:6, r = 1:7) j(p, q + 3, r + 6) = (9.5 + x) * p * q * r
  52. forall (p = 1:5, q = 7:7, r = 4:6) k(p, q - 6, r - 3) = 19 + x + p + q + 3 * r
  53. s = w(20:26)
  54. forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + x + p - q + 2 * r
  55. forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - x - p + q - 2 * r
  56. forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = w(1:7)
  57. forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = w(20:26)
  58. !$omp barrier
  59. y = ''
  60. if (x .eq. 0) y = '0'
  61. if (x .eq. 1) y = '1'
  62. if (x .eq. 2) y = '2'
  63. if (x .eq. 3) y = '3'
  64. if (x .eq. 4) y = '4'
  65. if (x .eq. 5) y = '5'
  66. l = l .or. w(7:7) .ne. y
  67. l = l .or. w(19:19) .ne. y
  68. l = l .or. w(26:26) .ne. y
  69. l = l .or. w(38:38) .ne. y
  70. l = l .or. c .ne. w(8:19)
  71. l = l .or. d .ne. w(1:7)
  72. l = l .or. s .ne. w(20:26)
  73. do 103, p = 1, 2
  74. do 103, q = 3, 7
  75. do 103, r = 1, 7
  76. if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 * x + p + q + 2 * r
  77. l = l .or. f(p, q, r) .ne. 25 * x + p + q + 2 * r
  78. if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. w(8:19)
  79. if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. w(27:38)
  80. if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. w(1:7)
  81. if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. w(20:26)
  82. if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + x + p - q + 2 * r
  83. l = l .or. u(p, q, r) .ne. 30 - x - p + q - 2 * r
  84. if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. w(1:7)
  85. if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. w(20:26)
  86. 103 continue
  87. do 104, p = 3, 5
  88. do 104, q = 2, 6
  89. do 104, r = 1, 7
  90. l = l .or. i(p - 2, q - 1, r) .ne. (7.5 + x) * p * q * r
  91. l = l .or. j(p, q + 3, r + 6) .ne. (9.5 + x) * p * q * r
  92. 104 continue
  93. do 105, p = 1, 5
  94. do 105, q = 4, 6
  95. l = l .or. k(p, 1, q - 3) .ne. 19 + x + p + 7 + 3 * q
  96. 105 continue
  97. call check (size (e, 1), 2, l)
  98. call check (size (e, 2), 3, l)
  99. call check (size (e, 3), 7, l)
  100. call check (size (e), 42, l)
  101. call check (size (f, 1), 2, l)
  102. call check (size (f, 2), 5, l)
  103. call check (size (f, 3), 7, l)
  104. call check (size (f), 70, l)
  105. call check (size (g, 1), 5, l)
  106. call check (size (g, 2), 5, l)
  107. call check (size (g), 25, l)
  108. call check (size (h, 1), 5, l)
  109. call check (size (h, 2), 5, l)
  110. call check (size (h), 25, l)
  111. call check (size (i, 1), 3, l)
  112. call check (size (i, 2), 5, l)
  113. call check (size (i, 3), 7, l)
  114. call check (size (i), 105, l)
  115. call check (size (j, 1), 4, l)
  116. call check (size (j, 2), 5, l)
  117. call check (size (j, 3), 7, l)
  118. call check (size (j), 140, l)
  119. call check (size (k, 1), 5, l)
  120. call check (size (k, 2), 1, l)
  121. call check (size (k, 3), 3, l)
  122. call check (size (k), 15, l)
  123. !$omp end parallel
  124. if (l) call abort
  125. end subroutine foo
  126. subroutine test
  127. character (len = 12) :: c
  128. character (len = 7) :: d
  129. integer, dimension (2, 3:5, 7) :: e
  130. integer, dimension (2, 3:7, 7) :: f
  131. character (len = 12), dimension (5, 3:7) :: g
  132. character (len = 7), dimension (5, 3:7) :: h
  133. real, dimension (3:5, 2:6, 1:7) :: i
  134. double precision, dimension (3:6, 2:6, 1:7) :: j
  135. integer, dimension (1:5, 7:7, 4:6) :: k
  136. integer :: p, q, r
  137. call foo (c, d, e, f, g, h, i, j, k, 7)
  138. end subroutine test
  139. end