104 lines · plain
1! Test optional fusing of forall assignments in the scheduling analysis2! from lower-hlfir-ordered-assignments pass. Assignments are fused in the3! 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 NOFUSE6 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 FUSE8 9! REQUIRES: asserts10 11subroutine fusable_assign_easy(x, y, z)12 integer :: x(:), y(:), z(:)13 forall(i=1:10)14 x(i) = 4215 z(i) = 4216 end forall17end subroutine18!NOFUSE-LABEL: ------------ scheduling forall in _QPfusable_assign_easy ------------19!NOFUSE-NEXT: run 1 evaluate: forall/region_assign120!NOFUSE-NEXT: run 2 evaluate: forall/region_assign221 22!FUSE-LABEL: ------------ scheduling forall in _QPfusable_assign_easy ------------23!FUSE-NEXT: run 1 evaluate: forall/region_assign124!FUSE-NEXT: run 1 evaluate: forall/region_assign225 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 forall32end subroutine33!NOFUSE-LABEL: ------------ scheduling forall in _QPfusable_assign ------------34!NOFUSE-NEXT: run 1 evaluate: forall/region_assign135!NOFUSE-NEXT: run 2 evaluate: forall/region_assign236 37!FUSE-LABEL: ------------ scheduling forall in _QPfusable_assign ------------38!FUSE-NEXT: run 1 evaluate: forall/region_assign139!FUSE-NEXT: run 1 evaluate: forall/region_assign240 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 forall47end subroutine48!NOFUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_1 ------------49!NOFUSE-NEXT: run 1 evaluate: forall/region_assign150!NOFUSE-NEXT: run 2 evaluate: forall/region_assign251 52!FUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_1 ------------53!FUSE-NEXT: run 1 evaluate: forall/region_assign154!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: 055!FUSE-NEXT: run 2 evaluate: forall/region_assign256 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 forall63end subroutine64!NOFUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_2 ------------65!NOFUSE-NEXT: run 1 evaluate: forall/region_assign166!NOFUSE-NEXT: run 2 evaluate: forall/region_assign267 68!FUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_2 ------------69!FUSE-NEXT: run 1 evaluate: forall/region_assign170!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: 071!FUSE-NEXT: run 2 evaluate: forall/region_assign272 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 forall79end subroutine80!NOFUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_3 ------------81!NOFUSE-NEXT: run 1 evaluate: forall/forall1/region_assign182!NOFUSE-NEXT: run 2 evaluate: forall/region_assign183 84!FUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_3 ------------85!FUSE-NEXT: run 1 evaluate: forall/forall1/region_assign186!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: 287!FUSE-NEXT: run 2 evaluate: forall/region_assign188 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 forall95end subroutine96!NOFUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_4 ------------97!NOFUSE-NEXT: run 1 evaluate: forall/region_assign198!NOFUSE-NEXT: run 2 evaluate: forall/forall1/region_assign199 100!FUSE-LABEL: ------------ scheduling forall in _QPunfusable_assign_4 ------------101!FUSE-NEXT: run 1 evaluate: forall/region_assign1102!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: 0103!FUSE-NEXT: run 2 evaluate: forall/forall1/region_assign1104