xref: /llvm-project/flang/test/HLFIR/order_assignments/forall-fusing-scheduling.f90 (revision 4f30a63ca2a6cbc16beaa49df16373d020118e92)
1! Test optional fusing of forall assignments in the scheduling analysis
2! from lower-hlfir-ordered-assignments pass. Assignments are fused in the
3! same loop nest if they are given the same run id.
4
5! 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
6
7! 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
8
9! REQUIRES: asserts
10
11subroutine fusable_assign_easy(x, y, z)
12  integer :: x(:), y(:), z(:)
13  forall(i=1:10)
14    x(i) = 42
15    z(i) = 42
16  end forall
17end subroutine
18!NOFUSE-LABEL: ------------ scheduling forall in _QPfusable_assign_easy ------------
19!NOFUSE-NEXT: run 1 evaluate: forall/region_assign1
20!NOFUSE-NEXT: run 2 evaluate: forall/region_assign2
21
22!FUSE-LABEL: ------------ scheduling forall in _QPfusable_assign_easy ------------
23!FUSE-NEXT: run 1 evaluate: forall/region_assign1
24!FUSE-NEXT: run 1 evaluate: forall/region_assign2
25
26subroutine fusable_assign(x, y, z)
27  integer :: x(:), y(:), z(:)
28  forall(i=1:10)
29    x(i) = y(i)
30    z(i) = y(11-i)
31  end forall
32end subroutine
33!NOFUSE-LABEL: ------------ scheduling forall in _QPfusable_assign ------------
34!NOFUSE-NEXT: run 1 evaluate: forall/region_assign1
35!NOFUSE-NEXT: run 2 evaluate: forall/region_assign2
36
37!FUSE-LABEL: ------------ scheduling forall in _QPfusable_assign ------------
38!FUSE-NEXT: run 1 evaluate: forall/region_assign1
39!FUSE-NEXT: run 1 evaluate: forall/region_assign2
40
41subroutine unfusable_assign_1(x, y, z)
42  integer :: x(:), y(:), z(:)
43  forall(i=1:10)
44    x(i) = y(i)
45    z(i) = x(11-i)
46  end forall
47end subroutine
48!NOFUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_1 ------------
49!NOFUSE-NEXT: run 1 evaluate: forall/region_assign1
50!NOFUSE-NEXT: run 2 evaluate: forall/region_assign2
51
52!FUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_1 ------------
53!FUSE-NEXT: run 1 evaluate: forall/region_assign1
54!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
55!FUSE-NEXT: run 2 evaluate: forall/region_assign2
56
57subroutine unfusable_assign_2(x, y)
58  integer :: x(:), y(:)
59  forall(i=1:10)
60    x(i) = y(i)
61    x(i+1) = y(i+1)
62  end forall
63end subroutine
64!NOFUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_2 ------------
65!NOFUSE-NEXT: run 1 evaluate: forall/region_assign1
66!NOFUSE-NEXT: run 2 evaluate: forall/region_assign2
67
68!FUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_2 ------------
69!FUSE-NEXT: run 1 evaluate: forall/region_assign1
70!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
71!FUSE-NEXT: run 2 evaluate: forall/region_assign2
72
73subroutine unfusable_assign_3(x, y, z)
74  integer :: x(:, :), y(:, :), z(:, :)
75  forall(i=1:10)
76    forall(j=1:z(i, i)) x(i, j) = y(i, j)
77    z(i, :) = y(i, :)
78  end forall
79end subroutine
80!NOFUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_3 ------------
81!NOFUSE-NEXT: run 1 evaluate: forall/forall1/region_assign1
82!NOFUSE-NEXT: run 2 evaluate: forall/region_assign1
83
84!FUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_3 ------------
85!FUSE-NEXT: run 1 evaluate: forall/forall1/region_assign1
86!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
87!FUSE-NEXT: run 2 evaluate: forall/region_assign1
88
89subroutine unfusable_assign_4(x, y, z)
90  integer :: x(:, :), y(:, :), z(:, :)
91  forall(i=1:10)
92    x(i, :) = y(i, :)
93    forall(j=1:x(i, i)) z(i, j) = y(i, j)
94  end forall
95end subroutine
96!NOFUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_4 ------------
97!NOFUSE-NEXT: run 1 evaluate: forall/region_assign1
98!NOFUSE-NEXT: run 2 evaluate: forall/forall1/region_assign1
99
100!FUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_4 ------------
101!FUSE-NEXT: run 1 evaluate: forall/region_assign1
102!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
103!FUSE-NEXT: run 2 evaluate: forall/forall1/region_assign1
104