2 ! { dg-additional-options "-fdump-tree-original -fcheck=all" }
6 ! Nonrectangular loop nests checks
11 ! (3) a1 * var-outer + a2
12 ! (4) a2 + a1 * var-outer
13 ! (5) a1 * var-outer - a2
14 ! (6) a2 - a1 * var-outer
16 ! (8) var-outer * a1 + a2
17 ! (9) a2 + var-outer * a1
18 ! (10) var-outer * a1 - a2
19 ! (11) a2 - var-outer * a1
25 ! { dg-final { scan-tree-dump-times "for \\(one_two_inner = one_two_outer \\* -1 \\+ one_a2; one_two_inner <= one_two_outer \\* two_a1 \\+ 0; one_two_inner = one_two_inner \\+ 1\\)" 1 original } }
33 integer :: one_two_outer
, one_two_inner
35 integer, allocatable
:: var(:,:)
39 allocate(var(1:10, one_a2
- 10:two_a1
* 10), &
41 if (size(var
) <= 4) error
stop
43 !$omp simd collapse(2)
44 do one_two_outer
= 1, 10
45 do one_two_inner
= one_a2
- one_two_outer
, two_a1
* one_two_outer
47 var(one_two_outer
,one_two_inner
) = var(one_two_outer
,one_two_inner
) + 2
52 do j
= one_a2
- i
, two_a1
* i
53 if (var(i
,j
) /= 2) error
stop
59 ! { dg-final { scan-tree-dump-times "for \\(three_four_inner = three_four_outer \\* three_a1 \\+ three_a2; three_four_inner <= three_four_outer \\* four_a1 \\+ four_a2; three_four_inner = three_four_inner \\+ 1\\)" 1 original } }
61 ! (3) a1 * var-outer + a2
62 ! (4) a2 + a1 * var-outer
63 subroutine three_four()
65 integer :: three_a1
, three_a2
66 integer :: four_a1
, four_a2
67 integer :: three_four_outer
, three_four_inner
69 integer, allocatable
:: var(:,:)
75 allocate(var(1:10, three_a1
* 1 + three_a2
:four_a2
+ four_a1
* 10), &
77 if (size(var
) <= 4) error
stop
79 !$omp simd collapse(2)
80 do three_four_outer
= 1, 10
81 do three_four_inner
= three_a1
* three_four_outer
+ three_a2
, four_a2
+ four_a1
* three_four_outer
83 var(three_four_outer
, three_four_inner
) = var(three_four_outer
, three_four_inner
) + 2
87 do j
= three_a1
* i
+ three_a2
, four_a2
+ four_a1
* i
88 if (var(i
,j
) /= 2) error
stop
94 ! { dg-final { scan-tree-dump-times "for \\(five_six_inner = five_six_outer \\* five_a1 \\+ D\\.\[0-9\]+; five_six_inner <= five_six_outer \\* D\\.\[0-9\]+ \\+ six_a2; five_six_inner = five_six_inner \\+ 1\\)" 1 original } }
96 ! (5) a1 * var-outer - a2
97 ! (6) a2 - a1 * var-outer
100 integer :: five_a1
, five_a2
101 integer :: six_a1
, six_a2
102 integer :: five_six_outer
, five_six_inner
104 integer, allocatable
:: var(:,:)
110 allocate(var(1:10, five_a1
* 1 - five_a2
:six_a2
- six_a1
* 1), &
112 if (size(var
) <= 4) error
stop
114 !$omp simd collapse(2)
115 do five_six_outer
= 1, 10
116 do five_six_inner
= five_a1
* five_six_outer
- five_a2
, six_a2
- six_a1
* five_six_outer
118 var(five_six_outer
, five_six_inner
) = var(five_six_outer
, five_six_inner
) + 2
123 do j
= five_a1
* i
- five_a2
, six_a2
- six_a1
* i
124 if (var(i
,j
) /= 2) error
stop
130 ! { dg-final { scan-tree-dump-times "for \\(seven_eight_inner = seven_eight_outer \\* seven_a1 \\+ 0; seven_eight_inner <= seven_eight_outer \\* eight_a1 \\+ eight_a2; seven_eight_inner = seven_eight_inner \\+ 1\\)" 1 original } }
133 ! (8) var-outer * a1 + a2
134 subroutine seven_eight()
137 integer :: eight_a1
, eight_a2
138 integer :: seven_eight_outer
, seven_eight_inner
140 integer, allocatable
:: var(:,:)
145 allocate(var(1:10, 1 * seven_a1
: 10 * eight_a1
+ eight_a2
), &
147 if (size(var
) <= 4) error
stop
149 !$omp simd collapse(2)
150 do seven_eight_outer
= 1, 10
151 do seven_eight_inner
= seven_eight_outer
* seven_a1
, seven_eight_outer
* eight_a1
+ eight_a2
153 var(seven_eight_outer
, seven_eight_inner
) = var(seven_eight_outer
, seven_eight_inner
) + 2
158 do j
= i
* seven_a1
, i
* eight_a1
+ eight_a2
159 if (var(i
,j
) /= 2) error
stop
165 ! { dg-final { scan-tree-dump-times "for \\(nine_ten_inner = nine_ten_outer \\* nine_a1 \\+ nine_a2; nine_ten_inner <= nine_ten_outer \\* ten_a1 \\+ D\\.\[0-9\]+; nine_ten_inner = nine_ten_inner \\+ 1\\)" 1 original } }
167 ! (9) a2 + var-outer * a1
168 ! (10) var-outer * a1 - a2
169 subroutine nine_ten()
171 integer :: nine_a1
, nine_a2
172 integer :: ten_a1
, ten_a2
173 integer :: nine_ten_outer
, nine_ten_inner
175 integer, allocatable
:: var(:,:)
181 allocate(var(1:10, nine_a2
+ 1 * nine_a1
:10 * ten_a1
- ten_a2
), &
183 if (size(var
) <= 4) error
stop
185 !$omp simd collapse(2)
186 do nine_ten_outer
= 1, 10
187 do nine_ten_inner
= nine_a2
+ nine_ten_outer
* nine_a1
, nine_ten_outer
* ten_a1
- ten_a2
189 var(nine_ten_outer
, nine_ten_inner
) = var(nine_ten_outer
, nine_ten_inner
) + 2
194 do j
= nine_a2
+ i
* nine_a1
, i
* ten_a1
- ten_a2
195 if (var(i
,j
) /= 2) error
stop
201 ! { dg-final { scan-tree-dump-times "for \\(eleven_inner = eleven_outer \\* D\\.\[0-9\]+ \\+ eleven_a2; eleven_inner <= 10; eleven_inner = eleven_inner \\+ 1\\)" 1 original } }
203 ! (11) a2 - var-outer * a1
207 integer :: eleven_a1
, eleven_a2
208 integer :: eleven_outer
, eleven_inner
210 integer, allocatable
:: var(:,:)
214 allocate(var(1:10, eleven_a2
- 10 * eleven_a1
: 10), &
216 if (size(var
) <= 4) error
stop
218 !$omp simd collapse(2)
219 do eleven_outer
= 1, 10
220 do eleven_inner
= eleven_a2
- eleven_outer
* eleven_a1
, 10
222 var(eleven_outer
, eleven_inner
) = var(eleven_outer
, eleven_inner
) + 2
227 do j
= eleven_a2
- i
* eleven_a1
, 10
228 if (var(i
,j
) /= 2) error
stop