! 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