! 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: of type '!fir.box>' at index: 0 W: of type '!fir.box>' 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: of type '!fir.box>' at index: 0 W: of type '!fir.box>' 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: of type '!fir.box>' at index: 2 W: of type '!fir.box>' 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: of type '!fir.box>' at index: 0 W: of type '!fir.box>' at index: 0 !FUSE-NEXT: run 2 evaluate: forall/forall1/region_assign1