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