Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[flang][NFC] Add forall lowering tests
This patch adds some lowering tests for the `forall` construct. This patch is part of the upstreaming effort from fir-dev branch. Reviewed By: PeteSteinfeld Differential Revision: https://reviews.llvm.org/D122253 Co-authored-by: Jean Perier <jperier@nvidia.com> Co-authored-by: Eric Schweitz <eschweitz@nvidia.com>
- Loading branch information
1 parent
f7d7d2a
commit d8beb2c
Showing
13 changed files
with
1,254 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
! RUN: bbc -emit-fir %s -o - | FileCheck %s | ||
|
||
! Make sure we use array values for subscripts that are arrays on the lhs so | ||
! that copy-in/copy-out works correctly. | ||
integer :: a(4,4) | ||
forall(i=1:4,j=1:4) | ||
a(a(i,j),a(j,i)) = j - i*100 | ||
end forall | ||
end | ||
|
||
! CHECK-LABEL: func @_QQmain | ||
! CHECK: %[[a:.*]] = fir.address_of(@_QFEa) : !fir.ref<!fir.array<4x4xi32>> | ||
! CHECK: %[[a1:.*]] = fir.array_load %[[a]](%{{.*}}) : (!fir.ref<!fir.array<4x4xi32>>, !fir.shape<2>) -> !fir.array<4x4xi32> | ||
! CHECK: %[[a2:.*]] = fir.array_load %[[a]](%{{.*}}) : (!fir.ref<!fir.array<4x4xi32>>, !fir.shape<2>) -> !fir.array<4x4xi32> | ||
! CHECK: %[[a3:.*]] = fir.array_load %[[a]](%{{.*}}) : (!fir.ref<!fir.array<4x4xi32>>, !fir.shape<2>) -> !fir.array<4x4xi32> | ||
! CHECK: %[[av:.*]] = fir.do_loop | ||
! CHECK: fir.do_loop | ||
! CHECK: = fir.array_fetch %[[a2]], %{{.*}}, %{{.*}} : (!fir.array<4x4xi32>, index, index) -> i32 | ||
! CHECK: = fir.array_fetch %[[a3]], %{{.*}}, %{{.*}} : (!fir.array<4x4xi32>, index, index) -> i32 | ||
! CHECK: = fir.array_update %{{.*}}, %{{.*}}, %{{.*}} : (!fir.array<4x4xi32>, i32, index, index) -> !fir.array<4x4xi32> | ||
! CHECK : fir.array_merge_store %[[a1]], %[[av]] to %[[a]] : !fir.array<4x4xi32>, !fir.array<4x4xi32>, !fir.ref<!fir.array<4x4xi32>> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
! RUN: bbc %s -o - | tco | FileCheck %s | ||
! Test from Fortran source through to LLVM IR. | ||
! UNSUPPORTED: system-windows | ||
|
||
! Assumed size array of assumed length character. | ||
program test | ||
character :: x(3) = (/ '1','2','3' /) | ||
call sub(x) | ||
contains | ||
subroutine sub(x) | ||
character(*) x(:) | ||
forall (i=1:2) | ||
x(i:i)(1:1) = x(i+1:i+1)(1:1) | ||
end forall | ||
print *,x | ||
end subroutine sub | ||
end program test | ||
|
||
! CHECK-LABEL: define void @_QFPsub({ | ||
! CHECK-SAME: , [1 x [3 x i64]] }* %[[arg:.*]]) | ||
! CHECK: %[[extent:.*]] = getelementptr { {{.*}}, [1 x [3 x i64]] }, { {{.*}}, [1 x [3 x i64]] }* %[[arg]], i32 0, i32 7, i64 0, i32 1 | ||
! CHECK: %[[extval:.*]] = load i64, i64* %[[extent]] | ||
! CHECK: %[[elesize:.*]] = getelementptr { {{.*}}, [1 x [3 x i64]] }, { {{.*}}, [1 x [3 x i64]] }* %[[arg]], i32 0, i32 1 | ||
! CHECK: %[[esval:.*]] = load i64, i64* %[[elesize]] | ||
! CHECK: %[[mul:.*]] = mul i64 1, %[[esval]] | ||
! CHECK: %[[mul2:.*]] = mul i64 %[[mul]], %[[extval]], !dbg !18 | ||
! CHECK: %[[buff:.*]] = call i8* @malloc(i64 %[[mul2]]) | ||
! CHECK: %[[to:.*]] = getelementptr i8, i8* %[[buff]], i64 % | ||
! CHECK: call void @llvm.memmove.p0i8.p0i8.i64(i8* %[[to]], i8* %{{.*}}, i64 %{{.*}}, i1 false) | ||
! CHECK: call void @free(i8* %[[buff]]) | ||
! CHECK: call i8* @_FortranAioBeginExternalListOutput |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
! Test forall lowering | ||
|
||
! RUN: bbc -emit-fir %s -o - | FileCheck %s | ||
|
||
subroutine forall_with_allocatable2(a1) | ||
real :: a1(:) | ||
type t | ||
integer :: i | ||
real, allocatable :: arr(:) | ||
end type t | ||
type(t) :: thing | ||
forall (i=5:15) | ||
thing%arr(i) = a1(i) | ||
end forall | ||
end subroutine forall_with_allocatable2 | ||
|
||
! CHECK-LABEL: func @_QPforall_with_allocatable2( | ||
! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xf32>>{{.*}}) { | ||
! CHECK: %[[VAL_1:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"} | ||
! CHECK: %[[VAL_2:.*]] = fir.alloca !fir.type<_QFforall_with_allocatable2Tt{i:i32,arr:!fir.box<!fir.heap<!fir.array<?xf32>>>}> {bindc_name = "thing", uniq_name = "_QFforall_with_allocatable2Ething"} | ||
! CHECK: %[[VAL_3:.*]] = fir.embox %[[VAL_2]] : (!fir.ref<!fir.type<_QFforall_with_allocatable2Tt{i:i32,arr:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) -> !fir.box<!fir.type<_QFforall_with_allocatable2Tt{i:i32,arr:!fir.box<!fir.heap<!fir.array<?xf32>>>}>> | ||
! CHECK: %[[VAL_4:.*]] = fir.address_of(@_QQcl.{{.*}}) : !fir.ref<!fir.char<1, | ||
! CHECK: %[[VAL_5:.*]] = arith.constant {{.*}} : i32 | ||
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_3]] : (!fir.box<!fir.type<_QFforall_with_allocatable2Tt{i:i32,arr:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) -> !fir.box<none> | ||
! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_4]] : (!fir.ref<!fir.char<1,{{.*}}>>) -> !fir.ref<i8> | ||
! CHECK: %[[VAL_8:.*]] = fir.call @_FortranAInitialize(%[[VAL_6]], %[[VAL_7]], %[[VAL_5]]) : (!fir.box<none>, !fir.ref<i8>, i32) -> none | ||
! CHECK: %[[VAL_9:.*]] = arith.constant 5 : i32 | ||
! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (i32) -> index | ||
! CHECK: %[[VAL_11:.*]] = arith.constant 15 : i32 | ||
! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_11]] : (i32) -> index | ||
! CHECK: %[[VAL_13:.*]] = arith.constant 1 : index | ||
! CHECK: %[[VAL_14:.*]] = fir.field_index arr, !fir.type<_QFforall_with_allocatable2Tt{i:i32,arr:!fir.box<!fir.heap<!fir.array<?xf32>>>}> | ||
! CHECK: %[[VAL_15:.*]] = fir.coordinate_of %[[VAL_2]], %[[VAL_14]] : (!fir.ref<!fir.type<_QFforall_with_allocatable2Tt{i:i32,arr:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> | ||
! CHECK: %[[VAL_16:.*]] = fir.load %[[VAL_15]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> | ||
! CHECK: %[[VAL_17:.*]] = arith.constant 0 : index | ||
! CHECK: %[[VAL_18:.*]]:3 = fir.box_dims %[[VAL_16]], %[[VAL_17]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index) | ||
! CHECK: %[[VAL_19:.*]] = fir.box_addr %[[VAL_16]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>> | ||
! CHECK: %[[VAL_20:.*]] = fir.shape_shift %[[VAL_18]]#0, %[[VAL_18]]#1 : (index, index) -> !fir.shapeshift<1> | ||
! CHECK: %[[VAL_21:.*]] = fir.array_load %[[VAL_19]](%[[VAL_20]]) : (!fir.heap<!fir.array<?xf32>>, !fir.shapeshift<1>) -> !fir.array<?xf32> | ||
! CHECK: %[[VAL_22:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?xf32>>) -> !fir.array<?xf32> | ||
! CHECK: %[[VAL_23:.*]] = fir.do_loop %[[VAL_24:.*]] = %[[VAL_10]] to %[[VAL_12]] step %[[VAL_13]] unordered iter_args(%[[VAL_25:.*]] = %[[VAL_21]]) -> (!fir.array<?xf32>) { | ||
! CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_24]] : (index) -> i32 | ||
! CHECK: fir.store %[[VAL_26]] to %[[VAL_1]] : !fir.ref<i32> | ||
! CHECK: %[[VAL_27:.*]] = arith.constant 1 : index | ||
! CHECK: %[[VAL_28:.*]] = fir.load %[[VAL_1]] : !fir.ref<i32> | ||
! CHECK: %[[VAL_29:.*]] = fir.convert %[[VAL_28]] : (i32) -> i64 | ||
! CHECK: %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (i64) -> index | ||
! CHECK: %[[VAL_31:.*]] = arith.subi %[[VAL_30]], %[[VAL_27]] : index | ||
! CHECK: %[[VAL_32:.*]] = fir.array_fetch %[[VAL_22]], %[[VAL_31]] : (!fir.array<?xf32>, index) -> f32 | ||
! CHECK: %[[VAL_33:.*]] = arith.constant 1 : index | ||
! CHECK: %[[VAL_34:.*]] = fir.load %[[VAL_1]] : !fir.ref<i32> | ||
! CHECK: %[[VAL_35:.*]] = fir.convert %[[VAL_34]] : (i32) -> i64 | ||
! CHECK: %[[VAL_36:.*]] = fir.convert %[[VAL_35]] : (i64) -> index | ||
! CHECK: %[[VAL_37:.*]] = arith.subi %[[VAL_36]], %[[VAL_33]] : index | ||
! CHECK: %[[VAL_38:.*]] = fir.array_update %[[VAL_25]], %[[VAL_32]], %[[VAL_37]] : (!fir.array<?xf32>, f32, index) -> !fir.array<?xf32> | ||
! CHECK: fir.result %[[VAL_38]] : !fir.array<?xf32> | ||
! CHECK: } | ||
! CHECK: fir.array_merge_store %[[VAL_21]], %[[VAL_39:.*]] to %[[VAL_19]] : !fir.array<?xf32>, !fir.array<?xf32>, !fir.heap<!fir.array<?xf32>> | ||
! CHECK: return | ||
! CHECK: } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
! Test forall lowering | ||
|
||
! RUN: bbc -emit-fir %s -o - | FileCheck %s | ||
|
||
subroutine forall_with_allocatable(a1) | ||
real :: a1(:) | ||
real, allocatable :: arr(:) | ||
forall (i=5:15) | ||
arr(i) = a1(i) | ||
end forall | ||
end subroutine forall_with_allocatable | ||
|
||
! CHECK-LABEL: func @_QPforall_with_allocatable( | ||
! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xf32>>{{.*}}) { | ||
! CHECK: %[[VAL_1:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"} | ||
! CHECK: %[[VAL_2:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?xf32>>> {bindc_name = "arr", uniq_name = "_QFforall_with_allocatableEarr"} | ||
! CHECK: %[[VAL_3:.*]] = fir.alloca !fir.heap<!fir.array<?xf32>> {uniq_name = "_QFforall_with_allocatableEarr.addr"} | ||
! CHECK: %[[VAL_4:.*]] = fir.alloca index {uniq_name = "_QFforall_with_allocatableEarr.lb0"} | ||
! CHECK: %[[VAL_5:.*]] = fir.alloca index {uniq_name = "_QFforall_with_allocatableEarr.ext0"} | ||
! CHECK: %[[VAL_6:.*]] = fir.zero_bits !fir.heap<!fir.array<?xf32>> | ||
! CHECK: fir.store %[[VAL_6]] to %[[VAL_3]] : !fir.ref<!fir.heap<!fir.array<?xf32>>> | ||
! CHECK: %[[VAL_7:.*]] = arith.constant 5 : i32 | ||
! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i32) -> index | ||
! CHECK: %[[VAL_9:.*]] = arith.constant 15 : i32 | ||
! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (i32) -> index | ||
! CHECK: %[[VAL_11:.*]] = arith.constant 1 : index | ||
! CHECK: %[[VAL_12:.*]] = fir.load %[[VAL_4]] : !fir.ref<index> | ||
! CHECK: %[[VAL_13:.*]] = fir.load %[[VAL_5]] : !fir.ref<index> | ||
! CHECK: %[[VAL_14:.*]] = fir.load %[[VAL_3]] : !fir.ref<!fir.heap<!fir.array<?xf32>>> | ||
! CHECK: %[[VAL_15:.*]] = fir.shape_shift %[[VAL_12]], %[[VAL_13]] : (index, index) -> !fir.shapeshift<1> | ||
! CHECK: %[[VAL_16:.*]] = fir.array_load %[[VAL_14]](%[[VAL_15]]) : (!fir.heap<!fir.array<?xf32>>, !fir.shapeshift<1>) -> !fir.array<?xf32> | ||
! CHECK: %[[VAL_17:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?xf32>>) -> !fir.array<?xf32> | ||
! CHECK: %[[VAL_18:.*]] = fir.do_loop %[[VAL_19:.*]] = %[[VAL_8]] to %[[VAL_10]] step %[[VAL_11]] unordered iter_args(%[[VAL_20:.*]] = %[[VAL_16]]) -> (!fir.array<?xf32>) { | ||
! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_19]] : (index) -> i32 | ||
! CHECK: fir.store %[[VAL_21]] to %[[VAL_1]] : !fir.ref<i32> | ||
! CHECK: %[[VAL_22:.*]] = arith.constant 1 : index | ||
! CHECK: %[[VAL_23:.*]] = fir.load %[[VAL_1]] : !fir.ref<i32> | ||
! CHECK: %[[VAL_24:.*]] = fir.convert %[[VAL_23]] : (i32) -> i64 | ||
! CHECK: %[[VAL_25:.*]] = fir.convert %[[VAL_24]] : (i64) -> index | ||
! CHECK: %[[VAL_26:.*]] = arith.subi %[[VAL_25]], %[[VAL_22]] : index | ||
! CHECK: %[[VAL_27:.*]] = fir.array_fetch %[[VAL_17]], %[[VAL_26]] : (!fir.array<?xf32>, index) -> f32 | ||
! CHECK: %[[VAL_29:.*]] = fir.load %[[VAL_1]] : !fir.ref<i32> | ||
! CHECK: %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (i32) -> i64 | ||
! CHECK: %[[VAL_31:.*]] = fir.convert %[[VAL_30]] : (i64) -> index | ||
! CHECK: %[[VAL_32:.*]] = arith.subi %[[VAL_31]], %[[VAL_12]] : index | ||
! CHECK: %[[VAL_33:.*]] = fir.array_update %[[VAL_20]], %[[VAL_27]], %[[VAL_32]] : (!fir.array<?xf32>, f32, index) -> !fir.array<?xf32> | ||
! CHECK: fir.result %[[VAL_33]] : !fir.array<?xf32> | ||
! CHECK: } | ||
! CHECK: fir.array_merge_store %[[VAL_16]], %[[VAL_34:.*]] to %[[VAL_14]] : !fir.array<?xf32>, !fir.array<?xf32>, !fir.heap<!fir.array<?xf32>> | ||
! CHECK: return | ||
! CHECK: } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
! Test forall lowering | ||
|
||
! RUN: bbc -emit-fir %s -o - | FileCheck %s | ||
|
||
!*** Test a FORALL construct with an array assignment | ||
! This is similar to the following embedded WHERE construct test, but the | ||
! elements are assigned unconditionally. | ||
subroutine test_forall_with_array_assignment(aa,bb) | ||
type t | ||
integer(kind=8) :: block1(64) | ||
integer(kind=8) :: block2(64) | ||
end type t | ||
type(t) :: aa(10), bb(10) | ||
|
||
forall (i=1:10:2) | ||
aa(i)%block1 = bb(i+1)%block2 | ||
end forall | ||
end subroutine test_forall_with_array_assignment | ||
|
||
! CHECK-LABEL: func @_QPtest_forall_with_array_assignment( | ||
! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10x!fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}>>>{{.*}}, %[[VAL_1:.*]]: !fir.ref<!fir.array<10x!fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}>>>{{.*}}) { | ||
! CHECK: %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"} | ||
! CHECK: %[[VAL_3:.*]] = arith.constant 10 : index | ||
! CHECK: %[[VAL_4:.*]] = arith.constant 10 : index | ||
! CHECK: %[[VAL_5:.*]] = arith.constant 1 : i32 | ||
! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index | ||
! CHECK: %[[VAL_7:.*]] = arith.constant 10 : i32 | ||
! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i32) -> index | ||
! CHECK: %[[VAL_9:.*]] = arith.constant 2 : i32 | ||
! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (i32) -> index | ||
! CHECK: %[[VAL_11:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1> | ||
! CHECK: %[[VAL_12:.*]] = fir.array_load %[[VAL_0]](%[[VAL_11]]) : (!fir.ref<!fir.array<10x!fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}>>>, !fir.shape<1>) -> !fir.array<10x!fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}>> | ||
! CHECK: %[[VAL_13:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> | ||
! CHECK: %[[VAL_14:.*]] = fir.array_load %[[VAL_1]](%[[VAL_13]]) : (!fir.ref<!fir.array<10x!fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}>>>, !fir.shape<1>) -> !fir.array<10x!fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}>> | ||
! CHECK: %[[VAL_15:.*]] = fir.do_loop %[[VAL_16:.*]] = %[[VAL_6]] to %[[VAL_8]] step %[[VAL_10]] unordered iter_args(%[[VAL_17:.*]] = %[[VAL_12]]) -> (!fir.array<10x!fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}>>) { | ||
! CHECK: %[[VAL_18:.*]] = fir.convert %[[VAL_16]] : (index) -> i32 | ||
! CHECK: fir.store %[[VAL_18]] to %[[VAL_2]] : !fir.ref<i32> | ||
! CHECK: %[[VAL_19:.*]] = arith.constant 1 : index | ||
! CHECK: %[[VAL_20:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32> | ||
! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i32) -> i64 | ||
! CHECK: %[[VAL_22:.*]] = fir.convert %[[VAL_21]] : (i64) -> index | ||
! CHECK: %[[VAL_23:.*]] = arith.subi %[[VAL_22]], %[[VAL_19]] : index | ||
! CHECK: %[[VAL_24:.*]] = fir.field_index block1, !fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}> | ||
! CHECK: %[[VAL_26:.*]] = arith.constant 64 : index | ||
! CHECK: %[[VAL_27:.*]] = arith.constant 1 : index | ||
! CHECK-DAG: %[[VAL_28:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32> | ||
! CHECK-DAG: %[[VAL_29:.*]] = arith.constant 1 : i32 | ||
! CHECK: %[[VAL_30:.*]] = arith.addi %[[VAL_28]], %[[VAL_29]] : i32 | ||
! CHECK: %[[VAL_31:.*]] = fir.convert %[[VAL_30]] : (i32) -> i64 | ||
! CHECK: %[[VAL_32:.*]] = fir.convert %[[VAL_31]] : (i64) -> index | ||
! CHECK: %[[VAL_33:.*]] = arith.subi %[[VAL_32]], %[[VAL_27]] : index | ||
! CHECK: %[[VAL_34:.*]] = fir.field_index block2, !fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}> | ||
! CHECK: %[[VAL_35:.*]] = arith.constant 1 : index | ||
! CHECK: %[[VAL_36:.*]] = arith.constant 0 : index | ||
! CHECK: %[[VAL_37:.*]] = arith.subi %[[VAL_26]], %[[VAL_35]] : index | ||
! CHECK: %[[VAL_38:.*]] = fir.do_loop %[[VAL_39:.*]] = %[[VAL_36]] to %[[VAL_37]] step %[[VAL_35]] unordered iter_args(%[[VAL_40:.*]] = %[[VAL_17]]) -> (!fir.array<10x!fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}>>) { | ||
! CHECK: %[[VAL_41:.*]] = fir.array_fetch %[[VAL_14]], %[[VAL_33]], %[[VAL_34]], %[[VAL_39]] : (!fir.array<10x!fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}>>, index, !fir.field, index) -> i64 | ||
! CHECK: %[[VAL_42:.*]] = fir.array_update %[[VAL_40]], %[[VAL_41]], %[[VAL_23]], %[[VAL_24]], %[[VAL_39]] : (!fir.array<10x!fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}>>, i64, index, !fir.field, index) -> !fir.array<10x!fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}>> | ||
! CHECK: fir.result %[[VAL_42]] : !fir.array<10x!fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}>> | ||
! CHECK: } | ||
! CHECK: fir.result %[[VAL_43:.*]] : !fir.array<10x!fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}>> | ||
! CHECK: } | ||
! CHECK: fir.array_merge_store %[[VAL_12]], %[[VAL_44:.*]] to %[[VAL_0]] : !fir.array<10x!fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}>>, !fir.array<10x!fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}>>, !fir.ref<!fir.array<10x!fir.type<_QFtest_forall_with_array_assignmentTt{block1:!fir.array<64xi64>,block2:!fir.array<64xi64>}>>> | ||
! CHECK: return | ||
! CHECK: } |
Oops, something went wrong.