Skip to content

Commit e89ac24

Browse files
committed
HLFIR intrinsic lowering needs convertBox to be updated
1 parent c02651a commit e89ac24

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

flang/lib/Optimizer/Builder/HLFIRTools.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1193,7 +1193,9 @@ hlfir::convertToBox(mlir::Location loc, fir::FirOpBuilder &builder,
11931193
if (entity.isProcedurePointer())
11941194
entity = hlfir::derefPointersAndAllocatables(loc, builder, entity);
11951195

1196-
auto [exv, cleanup] = translateToExtendedValue(loc, builder, entity);
1196+
auto [exv, cleanup] =
1197+
translateToExtendedValue(loc, builder, entity, /*contiguousHint=*/false,
1198+
/*keepScalarOptionalBoxed=*/true);
11971199
// Procedure entities should not go through createBoxValue that embox
11981200
// object entities. Return the fir.boxproc directly.
11991201
if (entity.isProcedure())

flang/test/HLFIR/maxval-lowering.fir

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,25 @@ func.func @_QPmaxval6(%arg0: !fir.box<!fir.array<?x!fir.char<1,?>>> {fir.bindc_n
216216
// CHECK: hlfir.destroy %[[ASEXPR]]
217217
// CHECK-NEXT: return
218218
// CHECK-NEXT: }
219+
220+
func.func @_QPmaxval_opt_mask(%arg0: !fir.box<!fir.array<?x?xf32>> {fir.bindc_name = "input"}, %arg1: !fir.ref<!fir.logical<4>> {fir.bindc_name = "mask", fir.optional}) -> f32 {
221+
%0 = fir.dummy_scope : !fir.dscope
222+
%1:2 = hlfir.declare %arg0 dummy_scope %0 {fortran_attrs = #fir.var_attrs<intent_in>, uniq_name = "_QFmaxval_opt_maskEinput"} : (!fir.box<!fir.array<?x?xf32>>, !fir.dscope) -> (!fir.box<!fir.array<?x?xf32>>, !fir.box<!fir.array<?x?xf32>>)
223+
%2:2 = hlfir.declare %arg1 dummy_scope %0 {fortran_attrs = #fir.var_attrs<intent_in, optional>, uniq_name = "_QFmaxval_opt_maskEmask"} : (!fir.ref<!fir.logical<4>>, !fir.dscope) -> (!fir.ref<!fir.logical<4>>, !fir.ref<!fir.logical<4>>)
224+
%3 = fir.alloca f32 {bindc_name = "maxval_1", uniq_name = "_QFmaxval_opt_maskEmaxval_1"}
225+
%4:2 = hlfir.declare %3 {uniq_name = "_QFmaxval_opt_maskEmaxval_1"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
226+
%5 = fir.is_present %2#0 : (!fir.ref<!fir.logical<4>>) -> i1
227+
%6 = fir.embox %2#1 : (!fir.ref<!fir.logical<4>>) -> !fir.box<!fir.logical<4>>
228+
%7 = fir.absent !fir.box<!fir.logical<4>>
229+
%8 = arith.select %5, %6, %7 : !fir.box<!fir.logical<4>>
230+
%9 = hlfir.maxval %1#0 mask %8 : (!fir.box<!fir.array<?x?xf32>>, !fir.box<!fir.logical<4>>) -> f32
231+
hlfir.assign %9 to %4#0 : f32, !fir.ref<f32>
232+
%10 = fir.load %4#1 : !fir.ref<f32>
233+
return %10 : f32
234+
}
235+
// CHECK-LABEL: func.func @_QPmaxval_opt_mask(
236+
// CHECK: %[[VAL_10:.*]] = fir.embox %{{.*}} : (!fir.ref<!fir.logical<4>>) -> !fir.box<!fir.logical<4>>
237+
// CHECK: %[[VAL_11:.*]] = fir.absent !fir.box<!fir.logical<4>>
238+
// CHECK: %[[VAL_12:.*]] = arith.select %{{.*}}, %[[VAL_10]], %[[VAL_11]] : !fir.box<!fir.logical<4>>
239+
// CHECK: %[[VAL_17:.*]] = fir.convert %[[VAL_12]] : (!fir.box<!fir.logical<4>>) -> !fir.box<none>
240+
// CHECK: %[[VAL_18:.*]] = fir.call @_FortranAMaxvalReal4(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) : (!fir.box<none>, !fir.ref<i8>, i32, i32, !fir.box<none>) -> f32

0 commit comments

Comments
 (0)