Skip to content

Commit f55622f

Browse files
authored
[flang] Lower non optional inquired argument in custom intrinsic lowering (#93592)
Handle lowering of non optional inquired argument in custom lowering. Also fix an issue in the lowering of associated optional argument where a box was emboxed again which led to weird result.
1 parent 1159e76 commit f55622f

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

flang/lib/Lower/ConvertCall.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1790,7 +1790,8 @@ static std::optional<hlfir::EntityWithAttributes> genCustomIntrinsicRefCore(
17901790
if (loadArg && fir::conformsWithPassByRef(actual.getType())) {
17911791
return hlfir::loadTrivialScalar(loc, builder, actual);
17921792
}
1793-
return actual;
1793+
return Fortran::lower::translateToExtendedValue(loc, builder, actual,
1794+
callContext.stmtCtx);
17941795
};
17951796
// helper to get the isPresent flag for a particular prepared argument
17961797
auto isPresent = [&](std::size_t i) -> std::optional<mlir::Value> {
@@ -2436,8 +2437,9 @@ genCustomIntrinsicRef(const Fortran::evaluate::SpecificIntrinsic *intrinsic,
24362437
getActualFortranElementType());
24372438
break;
24382439
case fir::LowerIntrinsicArgAs::Inquired:
2439-
TODO(loc, "Inquired non-optional arg to intrinsic with custom handling");
2440-
return;
2440+
exv = Fortran::lower::translateToExtendedValue(loc, builder, actual,
2441+
stmtCtx);
2442+
break;
24412443
}
24422444
if (!exv)
24432445
llvm_unreachable("bad switch");

flang/test/Lower/Intrinsics/associated.f90

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,3 +151,26 @@ subroutine test_allocatable_target(p, allocatable_ziel)
151151
! CHECK: fir.call @_FortranAPointerIsAssociatedWith(%[[VAL_9]], %[[VAL_10]]) {{.*}}: (!fir.box<none>, !fir.box<none>) -> i1
152152
print *, associated(p, allocatable_ziel)
153153
end subroutine
154+
155+
subroutine test_optional_argument(a, b)
156+
integer, pointer :: a
157+
integer, optional, pointer :: b
158+
logical :: assoc
159+
160+
assoc = associated(a, b)
161+
end subroutine
162+
163+
! CHECK-LABEL: func.func @_QPtest_optional_argument(
164+
! CHECK-SAME: %[[A:.*]]: !fir.ref<!fir.box<!fir.ptr<i32>>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<!fir.box<!fir.ptr<i32>>> {fir.bindc_name = "b", fir.optional}) {
165+
! CHECK: %[[IS_PRESENT_B:.*]] = fir.is_present %[[B]] : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> i1
166+
! CHECK: %[[BOX_B:.*]] = fir.if %[[IS_PRESENT_B]] -> (!fir.box<!fir.ptr<i32>>) {
167+
! CHECK: %[[LOADED_B:.*]] = fir.load %[[B]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
168+
! CHECK: fir.result %[[LOADED_B]] : !fir.box<!fir.ptr<i32>>
169+
! CHECK: } else {
170+
! CHECK: %[[ABSENT_B:.*]] = fir.absent !fir.box<!fir.ptr<i32>>
171+
! CHECK: fir.result %[[ABSENT_B]] : !fir.box<!fir.ptr<i32>>
172+
! CHECK: }
173+
! CHECK: %[[LOADED_A:.*]] = fir.load %[[A]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
174+
! CHECK: %[[BOX_NONE_A:.*]] = fir.convert %[[LOADED_A]] : (!fir.box<!fir.ptr<i32>>) -> !fir.box<none>
175+
! CHECK: %[[BOX_NONE_B:.*]] = fir.convert %[[BOX_B]] : (!fir.box<!fir.ptr<i32>>) -> !fir.box<none>
176+
! CHECK: %{{.*}} fir.call @_FortranAPointerIsAssociatedWith(%[[BOX_NONE_A]], %[[BOX_NONE_B]]) fastmath<contract> : (!fir.box<none>, !fir.box<none>) -> i1

0 commit comments

Comments
 (0)