Skip to content

Commit 15ef2a5

Browse files
DanielCChenDebadri Basak
authored andcommitted
Use the RHS of a pointer assignment inside of FORALL if it is already of boxType instead of convertToBox again. (llvm#165771)
Fixes llvm#165055.
1 parent 91daacc commit 15ef2a5

File tree

3 files changed

+49
-11
lines changed

3 files changed

+49
-11
lines changed

flang/lib/Optimizer/Builder/TemporaryStorage.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -258,13 +258,9 @@ void fir::factory::AnyVariableStack::pushValue(mlir::Location loc,
258258
fir::FirOpBuilder &builder,
259259
mlir::Value variable) {
260260
hlfir::Entity entity{variable};
261-
mlir::Type storageElementType =
262-
hlfir::getFortranElementType(retValueBox.getType());
263-
auto [box, maybeCleanUp] =
264-
hlfir::convertToBox(loc, builder, entity, storageElementType);
261+
mlir::Value box =
262+
hlfir::genVariableBox(loc, builder, entity, entity.getBoxType());
265263
fir::runtime::genPushDescriptor(loc, builder, opaquePtr, fir::getBase(box));
266-
if (maybeCleanUp)
267-
(*maybeCleanUp)();
268264
}
269265

270266
void fir::factory::AnyVariableStack::resetFetchPosition(

flang/test/HLFIR/order_assignments/forall-pointer-assignment-codegen.fir

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,8 @@ func.func @test_need_to_save_rhs(%n: i64, %arg1: !fir.box<!fir.array<?x!ptr_wrap
9191
// CHECK: %[[VAL_21:.*]] = hlfir.designate %[[VAL_6]]#0 (%[[VAL_20]]) : (!fir.box<!fir.array<?x!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>>, i64) -> !fir.ref<!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>
9292
// CHECK: %[[VAL_22:.*]] = hlfir.designate %[[VAL_21]]{"p"} {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!fir.type<ptr_wrapper{p:!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>}>>) -> !fir.ref<!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>>
9393
// CHECK: %[[VAL_23:.*]] = fir.load %[[VAL_22]] : !fir.ref<!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>>
94-
// CHECK: %[[VAL_24:.*]] = fir.box_addr %[[VAL_23]] : (!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>) -> !fir.ptr<!fir.type<t{i:i64}>>
95-
// CHECK: %[[VAL_25:.*]] = fir.embox %[[VAL_24]] : (!fir.ptr<!fir.type<t{i:i64}>>) -> !fir.box<!fir.type<t{i:i64}>>
96-
// CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (!fir.box<!fir.type<t{i:i64}>>) -> !fir.box<none>
97-
// CHECK: fir.call @_FortranAPushDescriptor(%[[VAL_16]], %[[VAL_26]]) : (!fir.llvm_ptr<i8>, !fir.box<none>) -> ()
94+
// CHECK: %[[VAL_24:.*]] = fir.convert %[[VAL_23]] : (!fir.box<!fir.ptr<!fir.type<t{i:i64}>>>) -> !fir.box<none>
95+
// CHECK: fir.call @_FortranAPushDescriptor(%[[VAL_16]], %[[VAL_24]]) : (!fir.llvm_ptr<i8>, !fir.box<none>) -> ()
9896
// CHECK: }
9997
// CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_4]] : (i64) -> index
10098
// CHECK: %[[VAL_28:.*]] = fir.convert %[[VAL_0]] : (i64) -> index

flang/test/Lower/forall-polymorphic.f90 renamed to flang/test/Lower/forall-pointer-assignment.f90

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
! Test lower of FORALL polymorphic pointer assignment
1+
! Test lower of FORALL pointer assignment
22
! RUN: bbc -emit-fir %s -o - | FileCheck %s
33

44

@@ -128,3 +128,47 @@ subroutine forallPolymorphic3()
128128
! CHECK: }
129129

130130
end subroutine forallPolymorphic3
131+
132+
133+
!! Test the LHS of a pointer assignment gets the isPointer flag from the
134+
!! RHS that is a reference to a function that returns a pointer.
135+
! CHECK-LABEL: c.func @_QPforallpointerassignment1
136+
subroutine forallPointerAssignment1()
137+
type base
138+
real, pointer :: data => null()
139+
end type
140+
141+
interface
142+
pure function makeData (i)
143+
real, pointer :: makeData
144+
integer*4, intent(in) :: i
145+
end function
146+
end interface
147+
148+
type(base) :: co1(10)
149+
150+
forall (i=1:10)
151+
co1(i)%data => makeData (i)
152+
end forall
153+
154+
! CHECK: %[[V_3:[0-9]+]] = fir.alloca i64
155+
! CHECK: %[[V_3:[0-9]+]] = fir.alloca i32 {bindc_name = "i"}
156+
! CHECK: %[[V_4:[0-9]+]] = fir.alloca !fir.box<!fir.ptr<f32>> {bindc_name = ".result"}
157+
! CHECK: %[[V_25:[0-9]+]] = fir.convert %c1_i32 : (i32) -> index
158+
! CHECK: %[[V_26:[0-9]+]] = fir.convert %c10_i32 : (i32) -> index
159+
! CHECK: %[[V_27:[0-9]+]] = fir.address_of(@{{_QQcl.*}}) : !fir.ref<!fir.char<1,{{.*}}>>
160+
! CHECK: %[[V_28:[0-9]+]] = fir.convert %[[V_27]] : (!fir.ref<!fir.char<1,{{.*}}>>) -> !fir.ref<i8>
161+
! CHECK: %[[V_29:[0-9]+]] = fir.call @_FortranACreateDescriptorStack(%[[V_28]], %c{{.*}}) : (!fir.ref<i8>, i32) -> !fir.llvm_ptr<i8>
162+
! CHECK: fir.do_loop %arg0 = %[[V_25]] to %[[V_26]] step %c1
163+
! CHECK: {
164+
! CHECK: %[[V_32:[0-9]+]] = fir.convert %arg0 : (index) -> i32
165+
! CHECK: fir.store %[[V_32]] to %[[V_3]] : !fir.ref<i32>
166+
! CHECK: %[[V_33:[0-9]+]] = fir.call @_QPmakedata(%[[V_3]]) proc_attrs<pure> fastmath<contract> : (!fir.ref<i32>) -> !fir.box<!fir.ptr<f32>>
167+
! CHECK: fir.save_result %[[V_33]] to %[[V_4]] : !fir.box<!fir.ptr<f32>>, !fir.ref<!fir.box<!fir.ptr<f32>>>
168+
! CHECK: %[[V_34:[0-9]+]] = fir.declare %[[V_4]] {uniq_name = ".tmp.func_result"} : (!fir.ref<!fir.box<!fir.ptr<f32>>>) -> !fir.ref<!fir.box<!fir.ptr<f32>>>
169+
! CHECK: %[[V_35:[0-9]+]] = fir.load %[[V_34]] : !fir.ref<!fir.box<!fir.ptr<f32>>>
170+
! CHECK: %[[V_36:[0-9]+]] = fir.convert %[[V_35]] : (!fir.box<!fir.ptr<f32>>) -> !fir.box<none>
171+
! CHECK: fir.call @_FortranAPushDescriptor(%[[V_29]], %[[V_36]]) : (!fir.llvm_ptr<i8>, !fir.box<none>) -> ()
172+
! CHECK: }
173+
174+
end subroutine forallPointerAssignment1

0 commit comments

Comments
 (0)