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