diff --git a/flang/lib/Lower/IntrinsicCall.cpp b/flang/lib/Lower/IntrinsicCall.cpp --- a/flang/lib/Lower/IntrinsicCall.cpp +++ b/flang/lib/Lower/IntrinsicCall.cpp @@ -806,7 +806,7 @@ {"spacing", &I::genSpacing}, {"spread", &I::genSpread, - {{{"source", asAddr}, {"dim", asValue}, {"ncopies", asValue}}}, + {{{"source", asBox}, {"dim", asValue}, {"ncopies", asValue}}}, /*isElemental=*/false}, {"sum", &I::genSum, diff --git a/flang/test/Lower/Intrinsics/spread.f90 b/flang/test/Lower/Intrinsics/spread.f90 --- a/flang/test/Lower/Intrinsics/spread.f90 +++ b/flang/test/Lower/Intrinsics/spread.f90 @@ -1,6 +1,18 @@ -! RUN: bbc -emit-fir %s -o - | FileCheck %s +! RUN: bbc -emit-fir -polymorphic-type %s -o - | FileCheck %s -! CHECK-LABEL: func @_QPspread_test( +module spread_mod + +type :: p1 + integer :: a +end type + +type, extends(p1) :: p2 + integer :: b +end type + +contains + +! CHECK-LABEL: func @_QMspread_modPspread_test( ! CHECK-SAME: %[[arg0:[^:]+]]: !fir.ref{{.*}}, %[[arg1:[^:]+]]: !fir.ref{{.*}}, %[[arg2:[^:]+]]: !fir.ref{{.*}}, %[[arg3:.*]]: !fir.box>{{.*}}) { subroutine spread_test(s,d,n,r) integer :: s,d,n @@ -17,11 +29,11 @@ ! CHECK-DAG: %[[a13:.*]] = fir.load %[[a0]] : !fir.ref>>> ! CHECK-DAG: %[[a15:.*]] = fir.box_addr %[[a13]] : (!fir.box>>) -> !fir.heap> ! CHECK: fir.freemem %[[a15]] - end subroutine +end subroutine - ! CHECK-LABEL: func @_QPspread_test2( - ! CHECK-SAME: %[[arg0:.*]]: !fir.box>{{.*}}, %[[arg1:[^:]+]]: !fir.ref{{.*}}, %[[arg2:[^:]+]]: !fir.ref{{.*}}, %[[arg3:.*]]: !fir.box>{{.*}}) { - subroutine spread_test2(s,d,n,r) +! CHECK-LABEL: func @_QMspread_modPspread_test2( +! CHECK-SAME: %[[arg0:.*]]: !fir.box>{{.*}}, %[[arg1:[^:]+]]: !fir.ref{{.*}}, %[[arg2:[^:]+]]: !fir.ref{{.*}}, %[[arg3:.*]]: !fir.box>{{.*}}) { +subroutine spread_test2(s,d,n,r) integer :: s(:),d,n integer :: r(:,:) ! CHECK-DAG: %[[a0:.*]] = fir.alloca !fir.box>> @@ -35,5 +47,23 @@ ! CHECK-DAG: %[[a12:.*]] = fir.load %[[a0]] : !fir.ref>>> ! CHECK-DAG: %[[a15:.*]] = fir.box_addr %[[a12]] : (!fir.box>>) -> !fir.heap> ! CHECK: fir.freemem %[[a15:.*]] - end subroutine - +end subroutine + +! CHECK-LABEL: func.func @_QMspread_modPspread_test_polymorphic_source( +! CHECK-SAME: %[[arg0:.*]]: !fir.ref>>> {fir.bindc_name = "p"}) { +subroutine spread_test_polymorphic_source(p) + class(*), pointer :: p(:,:) + class(*), allocatable :: r(:,:,:) + r = spread(p(:,::2), dim=1, ncopies=2) +! CHECK: %[[res:.*]] = fir.alloca !fir.class>> +! CHECK: %[[load_p:.*]] = fir.load %[[arg0]] : !fir.ref>>> +! CHECK: %[[source_box:.*]] = fir.rebox %[[load_p]](%{{.*}}) [%{{.*}}] : (!fir.class>>, !fir.shift<2>, !fir.slice<2>) -> !fir.class> +! CHECK: %[[embox:.*]] = fir.embox %{{.*}}(%{{.*}}) source_box %[[source_box]] : (!fir.heap>, !fir.shape<3>, !fir.class>) -> !fir.class>> +! CHECK: fir.store %[[embox]] to %[[res]] : !fir.ref>>> +! CHECK: %[[res_box_none:.*]] = fir.convert %[[res]] : (!fir.ref>>>) -> !fir.ref> +! CHECK: %[[source_box_none:.*]] = fir.convert %[[source_box]] : (!fir.class>) -> !fir.box +! CHECK: %{{.*}} = fir.call @_FortranASpread(%[[res_box_none]], %[[source_box_none]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) fastmath : (!fir.ref>, !fir.box, i32, i64, !fir.ref, i32) -> none + +end subroutine + +end module