summaryrefslogtreecommitdiff
path: root/flang/test/HLFIR/order_assignments/forall-fusing-scheduling.f90
blob: 2ebbebd2355219c2991650b761d6646e5e76f77e (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
91
92
93
94
95
96
97
98
99
100
101
102
103
! Test optional fusing of forall assignments in the scheduling analysis
! from lower-hlfir-ordered-assignments pass. Assignments are fused in the
! same loop nest if they are given the same run id.

! RUN: bbc -hlfir -o - -pass-pipeline="builtin.module(lower-hlfir-ordered-assignments{fuse-assignments=false})" --debug-only=flang-ordered-assignment -flang-dbg-order-assignment-schedule-only %s 2>&1 | FileCheck %s --check-prefix NOFUSE

! RUN: bbc -hlfir -o - -pass-pipeline="builtin.module(lower-hlfir-ordered-assignments{fuse-assignments=true})" --debug-only=flang-ordered-assignment -flang-dbg-order-assignment-schedule-only %s 2>&1 | FileCheck %s --check-prefix FUSE

! REQUIRES: asserts

subroutine fusable_assign_easy(x, y, z)
  integer :: x(:), y(:), z(:)
  forall(i=1:10)
    x(i) = 42
    z(i) = 42
  end forall
end subroutine
!NOFUSE-LABEL: ------------ scheduling forall in _QPfusable_assign_easy ------------
!NOFUSE-NEXT: run 1 evaluate: forall/region_assign1
!NOFUSE-NEXT: run 2 evaluate: forall/region_assign2

!FUSE-LABEL: ------------ scheduling forall in _QPfusable_assign_easy ------------
!FUSE-NEXT: run 1 evaluate: forall/region_assign1
!FUSE-NEXT: run 1 evaluate: forall/region_assign2

subroutine fusable_assign(x, y, z)
  integer :: x(:), y(:), z(:)
  forall(i=1:10)
    x(i) = y(i)
    z(i) = y(11-i)
  end forall
end subroutine
!NOFUSE-LABEL: ------------ scheduling forall in _QPfusable_assign ------------
!NOFUSE-NEXT: run 1 evaluate: forall/region_assign1
!NOFUSE-NEXT: run 2 evaluate: forall/region_assign2

!FUSE-LABEL: ------------ scheduling forall in _QPfusable_assign ------------
!FUSE-NEXT: run 1 evaluate: forall/region_assign1
!FUSE-NEXT: run 1 evaluate: forall/region_assign2

subroutine unfusable_assign_1(x, y, z)
  integer :: x(:), y(:), z(:)
  forall(i=1:10)
    x(i) = y(i)
    z(i) = x(11-i)
  end forall
end subroutine
!NOFUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_1 ------------
!NOFUSE-NEXT: run 1 evaluate: forall/region_assign1
!NOFUSE-NEXT: run 2 evaluate: forall/region_assign2

!FUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_1 ------------
!FUSE-NEXT: run 1 evaluate: forall/region_assign1
!FUSE-NEXT: conflict: R/W: <block argument> of type '!fir.box<!fir.array<?xi32>>' at index: 0 W:<block argument> of type '!fir.box<!fir.array<?xi32>>' at index: 0
!FUSE-NEXT: run 2 evaluate: forall/region_assign2

subroutine unfusable_assign_2(x, y)
  integer :: x(:), y(:)
  forall(i=1:10)
    x(i) = y(i)
    x(i+1) = y(i+1)
  end forall
end subroutine
!NOFUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_2 ------------
!NOFUSE-NEXT: run 1 evaluate: forall/region_assign1
!NOFUSE-NEXT: run 2 evaluate: forall/region_assign2

!FUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_2 ------------
!FUSE-NEXT: run 1 evaluate: forall/region_assign1
!FUSE-NEXT: conflict: R/W: <block argument> of type '!fir.box<!fir.array<?xi32>>' at index: 0 W:<block argument> of type '!fir.box<!fir.array<?xi32>>' at index: 0
!FUSE-NEXT: run 2 evaluate: forall/region_assign2

subroutine unfusable_assign_3(x, y, z)
  integer :: x(:, :), y(:, :), z(:, :)
  forall(i=1:10)
    forall(j=1:z(i, i)) x(i, j) = y(i, j)
    z(i, :) = y(i, :)
  end forall
end subroutine
!NOFUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_3 ------------
!NOFUSE-NEXT: run 1 evaluate: forall/forall1/region_assign1
!NOFUSE-NEXT: run 2 evaluate: forall/region_assign1

!FUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_3 ------------
!FUSE-NEXT: run 1 evaluate: forall/forall1/region_assign1
!FUSE-NEXT: conflict: R/W: <block argument> of type '!fir.box<!fir.array<?x?xi32>>' at index: 2 W:<block argument> of type '!fir.box<!fir.array<?x?xi32>>' at index: 2
!FUSE-NEXT: run 2 evaluate: forall/region_assign1

subroutine unfusable_assign_4(x, y, z)
  integer :: x(:, :), y(:, :), z(:, :)
  forall(i=1:10)
    x(i, :) = y(i, :)
    forall(j=1:x(i, i)) z(i, j) = y(i, j)
  end forall
end subroutine
!NOFUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_4 ------------
!NOFUSE-NEXT: run 1 evaluate: forall/region_assign1
!NOFUSE-NEXT: run 2 evaluate: forall/forall1/region_assign1

!FUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_4 ------------
!FUSE-NEXT: run 1 evaluate: forall/region_assign1
!FUSE-NEXT: conflict: R/W: <block argument> of type '!fir.box<!fir.array<?x?xi32>>' at index: 0 W:<block argument> of type '!fir.box<!fir.array<?x?xi32>>' at index: 0
!FUSE-NEXT: run 2 evaluate: forall/forall1/region_assign1