171 lines · plain
1! Test forall scheduling analysis from lower-hlfir-ordered-assignments pass.2! The printed output is done via LLVM_DEBUG, hence the "asserts" requirement.3! This test test that conflicting actions are not scheduled to be evaluated4! in the same loops (same run id).5 6! RUN: bbc -hlfir -o - -pass-pipeline="builtin.module(lower-hlfir-ordered-assignments)" --debug-only=flang-ordered-assignment -flang-dbg-order-assignment-schedule-only %s 2>&1 | FileCheck %s7! REQUIRES: asserts8 9subroutine no_conflict(x)10 real :: x(:)11 forall(i=1:10) x(i) = i12end subroutine13!CHECK-LABEL: ------------ scheduling forall in _QPno_conflict ------------14!CHECK-NEXT: run 1 evaluate: forall/region_assign115 16subroutine rhs_lhs_overlap(x)17 real :: x(:)18 forall(i=1:10) x(i) = x(11-i)19end subroutine20!CHECK-LABEL: ------------ scheduling forall in _QPrhs_lhs_overlap ------------21!CHECK-NEXT: conflict: R/W: <block argument> of type '!fir.box<!fir.array<?xf32>>' at index: 0 W:<block argument> of type '!fir.box<!fir.array<?xf32>>' at index: 022!CHECK-NEXT: run 1 save : forall/region_assign1/rhs23!CHECK-NEXT: run 2 evaluate: forall/region_assign124 25subroutine no_rhs_lhs_overlap(x, y)26 real :: x(:), y(:)27 forall(i=1:10) x(i) = y(i)28end subroutine29!CHECK-LABEL: ------------ scheduling forall in _QPno_rhs_lhs_overlap ------------30!CHECK-NEXT: run 1 evaluate: forall/region_assign131 32subroutine no_rhs_lhs_overlap_2(x)33 real :: x(:), y(10)34 forall(i=1:10) x(i) = y(i)35end subroutine36!CHECK-LABEL: ------------ scheduling forall in _QPno_rhs_lhs_overlap_2 ------------37!CHECK-NEXT: run 1 evaluate: forall/region_assign138 39subroutine no_rhs_lhs_overlap_3()40 real :: x(10), y(10)41 forall(i=1:10) x(i) = y(i)42end subroutine43!CHECK-LABEL: ------------ scheduling forall in _QPno_rhs_lhs_overlap_3 ------------44!CHECK-NEXT: run 1 evaluate: forall/region_assign145 46subroutine array_expr_rhs_lhs_overlap(x)47 real :: x(:, :)48 forall(i=1:10) x(i, :) = x(:, i)*249end subroutine50!CHECK-LABEL: ------------ scheduling forall in _QParray_expr_rhs_lhs_overlap ------------51!CHECK-NEXT: conflict: R/W: <block argument> of type '!fir.box<!fir.array<?x?xf32>>' at index: 0 W:<block argument> of type '!fir.box<!fir.array<?x?xf32>>' at index: 052!CHECK-NEXT: run 1 save : forall/region_assign1/rhs53!CHECK-NEXT: run 2 evaluate: forall/region_assign154 55subroutine array_expr_no_rhs_lhs_overlap(x, y, z)56 real :: x(:, :), y(:, :), z(:, :)57 forall(i=1:10) x(i, :) = y(:, i) + z(i, :)58end subroutine59!CHECK-LABEL: ------------ scheduling forall in _QParray_expr_no_rhs_lhs_overlap ------------60!CHECK-NEXT: run 1 evaluate: forall/region_assign161 62subroutine rhs_lhs_overlap_2(x, y)63 real, target :: x(:), y(:)64 forall(i=1:10) x(i) = y(i)65end subroutine66!CHECK-LABEL: ------------ scheduling forall in _QPrhs_lhs_overlap_2 ------------67!CHECK-NEXT: conflict: R/W: <block argument> of type '!fir.box<!fir.array<?xf32>>' at index: 1 W:<block argument> of type '!fir.box<!fir.array<?xf32>>' at index: 068!CHECK-NEXT: run 1 save : forall/region_assign1/rhs69!CHECK-NEXT: run 2 evaluate: forall/region_assign170 71subroutine lhs_lhs_overlap(x)72 integer :: x(10)73 forall(i=1:10) x(x(i)) = i74end subroutine75!CHECK-LABEL: ------------ scheduling forall in _QPlhs_lhs_overlap ------------76!CHECK-NEXT: conflict: R/W: <block argument> of type '!fir.ref<!fir.array<10xi32>>' at index: 0 W:<block argument> of type '!fir.ref<!fir.array<10xi32>>' at index: 077!CHECK-NEXT: run 1 save : forall/region_assign1/lhs78!CHECK-NEXT: run 2 evaluate: forall/region_assign179 80subroutine unknown_function_call(x)81 interface82 pure real function foo(x, i)83 integer, intent(in) :: i84 real, intent(in) :: x(10)85 end function86 end interface87 real :: x(10)88 forall(i=1:10) x(i) = foo(x, i)89end subroutine90!CHECK-LABEL: ------------ scheduling forall in _QPunknown_function_call ------------91!CHECK-NEXT: unknown effect: {{.*}} fir.call @_QPfoo92!CHECK-NEXT: unknown effect: {{.*}} fir.call @_QPfoo93!CHECK-NEXT: conflict: R/W: <unknown> W:<block argument> of type '!fir.ref<!fir.array<10xf32>>' at index: 094!CHECK-NEXT: run 1 save : forall/region_assign1/rhs95!CHECK-NEXT: run 2 evaluate: forall/region_assign196 97subroutine unknown_function_call2(x)98 interface99 pure real function foo2(i)100 integer, value :: i101 end function102 end interface103 ! foo2 may read x since it is a target, even if it is pure,104 ! if the actual argument of x is a module variable accessible105 ! to foo via host association.106 real, target :: x(:)107 forall(i=1:10) x(i) = foo2(i)108end subroutine109!CHECK-LABEL: ------------ scheduling forall in _QPunknown_function_call2 ------------110!CHECK-NEXT: unknown effect: {{.*}} fir.call @_QPfoo2(111!CHECK-NEXT: unknown effect: {{.*}} fir.call @_QPfoo2(112!CHECK-NEXT: conflict: R/W: <unknown> W:<block argument> of type '!fir.box<!fir.array<?xf32>>' at index: 0113!CHECK-NEXT: run 1 save : forall/region_assign1/rhs114!CHECK-NEXT: run 2 evaluate: forall/region_assign1115 116subroutine forall_mask_conflict(x)117 integer :: x(:)118 forall(i=1:10, x(11-i)>0) x(i) = 42119end subroutine120!CHECK-LABEL: ------------ scheduling forall in _QPforall_mask_conflict ------------121!CHECK-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: 0122!CHECK-NEXT: run 1 save : forall/forall_mask1/mask123!CHECK-NEXT: run 2 evaluate: forall/forall_mask1/region_assign1124 125subroutine forall_ub_conflict(x, y)126 integer :: x(:, :)127 forall(i=1:10)128 forall(j=1:x(i,i))129 x(i, j) = 42130 end forall131 end forall132end subroutine133!CHECK-LABEL: ------------ scheduling forall in _QPforall_ub_conflict ------------134!CHECK-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: 0135!CHECK-NEXT: run 1 save : forall/forall1/ub136!CHECK-NEXT: run 2 evaluate: forall/forall1/region_assign1137 138subroutine sequential_assign(x, y)139 integer :: x(:), y(:)140 forall(i=1:10)141 x(i) = y(i)142 y(2*i) = x(i)143 end forall144end subroutine145!CHECK-LABEL: ------------ scheduling forall in _QPsequential_assign ------------146!CHECK-NEXT: run 1 evaluate: forall/region_assign1147!CHECK-NEXT: run 2 evaluate: forall/region_assign2148 149subroutine loads_of_conlficts(x, y)150 integer, target :: x(:, :), y(:, :)151 forall(i=1:10)152 forall (j=1:y(i,i)) x(x(i, j), j) = y(i, j)153 forall (j=1:x(i,i), y(i,i)>0) y(x(i, j), j) = 0154 end forall155end subroutine156!CHECK-LABEL: ------------ scheduling forall in _QPloads_of_conlficts ------------157!CHECK-NEXT: conflict: R/W: <block argument> of type '!fir.box<!fir.array<?x?xi32>>' at index: 1 W:<block argument> of type '!fir.box<!fir.array<?x?xi32>>' at index: 0158!CHECK-NEXT: run 1 save : forall/forall1/ub159!CHECK-NEXT: conflict: R/W: <block argument> of type '!fir.box<!fir.array<?x?xi32>>' at index: 1 W:<block argument> of type '!fir.box<!fir.array<?x?xi32>>' at index: 0160!CHECK-NEXT: run 1 save : forall/forall1/region_assign1/rhs161!CHECK-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: 0162!CHECK-NEXT: run 1 save : forall/forall1/region_assign1/lhs163!CHECK-NEXT: run 2 evaluate: forall/forall1/region_assign1164!CHECK-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: 1165!CHECK-NEXT: run 3 save : forall/forall2/ub166!CHECK-NEXT: conflict: R/W: <block argument> of type '!fir.box<!fir.array<?x?xi32>>' at index: 1 W:<block argument> of type '!fir.box<!fir.array<?x?xi32>>' at index: 1167!CHECK-NEXT: run 3 save : forall/forall2/forall_mask1/mask168!CHECK-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: 1169!CHECK-NEXT: run 3 save : forall/forall2/forall_mask1/region_assign1/lhs170!CHECK-NEXT: run 4 evaluate: forall/forall2/forall_mask1/region_assign1171