[flang-commits] [flang] c3645de - [flang][hlfir] Handle intrinsic subroutines

Jean Perier via flang-commits flang-commits at lists.llvm.org
Fri Feb 3 06:04:01 PST 2023


Author: Jean Perier
Date: 2023-02-03T15:03:12+01:00
New Revision: c3645de20738190fb0f4e6d194f8dd45f94aebbf

URL: https://github.com/llvm/llvm-project/commit/c3645de20738190fb0f4e6d194f8dd45f94aebbf
DIFF: https://github.com/llvm/llvm-project/commit/c3645de20738190fb0f4e6d194f8dd45f94aebbf.diff

LOG: [flang][hlfir] Handle intrinsic subroutines

The code did not propagate the result optionality for subroutine.
Make the result of genIntrinsicRef optional.

Differential Revision: https://reviews.llvm.org/D143251

Added: 
    flang/test/Lower/HLFIR/intrinsic-subroutines.f90

Modified: 
    flang/lib/Lower/ConvertCall.cpp

Removed: 
    


################################################################################
diff  --git a/flang/lib/Lower/ConvertCall.cpp b/flang/lib/Lower/ConvertCall.cpp
index 4f1dd00b6ded5..6ee61229aae9f 100644
--- a/flang/lib/Lower/ConvertCall.cpp
+++ b/flang/lib/Lower/ConvertCall.cpp
@@ -1057,7 +1057,7 @@ genUserCall(PreparedActualArguments &loweredActuals,
 
 /// Lower calls to intrinsic procedures with actual arguments that have been
 /// pre-lowered but have not yet been prepared according to the interface.
-static hlfir::EntityWithAttributes genIntrinsicRefCore(
+static std::optional<hlfir::EntityWithAttributes> genIntrinsicRefCore(
     PreparedActualArguments &loweredActuals,
     const Fortran::evaluate::SpecificIntrinsic &intrinsic,
     const Fortran::lower::IntrinsicArgumentLoweringRules *argLowering,
@@ -1112,6 +1112,8 @@ static hlfir::EntityWithAttributes genIntrinsicRefCore(
   auto [resultExv, mustBeFreed] = Fortran::lower::genIntrinsicCall(
       callContext.getBuilder(), loc, intrinsic.name, scalarResultType,
       operands);
+  if (!fir::getBase(resultExv))
+    return std::nullopt;
   hlfir::EntityWithAttributes resultEntity = extendedValueToHlfirEntity(
       loc, builder, resultExv, ".tmp.intrinsic_result");
   // Move result into memory into an hlfir.expr since they are immutable from
@@ -1371,7 +1373,7 @@ genIsPresentIfArgMaybeAbsent(mlir::Location loc, hlfir::Entity actual,
 }
 
 /// Lower an intrinsic procedure reference.
-static hlfir::EntityWithAttributes
+static std::optional<hlfir::EntityWithAttributes>
 genIntrinsicRef(const Fortran::evaluate::SpecificIntrinsic &intrinsic,
                 CallContext &callContext) {
   mlir::Location loc = callContext.loc;
@@ -1413,12 +1415,12 @@ genIntrinsicRef(const Fortran::evaluate::SpecificIntrinsic &intrinsic,
         .genElementalCall(loweredActuals, /*isImpure=*/!isFunction, callContext)
         .value();
   }
-  hlfir::EntityWithAttributes result =
+  std::optional<hlfir::EntityWithAttributes> result =
       genIntrinsicRefCore(loweredActuals, intrinsic, argLowering, callContext);
-  if (result.getType().isa<hlfir::ExprType>()) {
+  if (result && result->getType().isa<hlfir::ExprType>()) {
     fir::FirOpBuilder *bldr = &callContext.getBuilder();
     callContext.stmtCtx.attachCleanup(
-        [=]() { bldr->create<hlfir::DestroyOp>(loc, result); });
+        [=]() { bldr->create<hlfir::DestroyOp>(loc, *result); });
   }
   return result;
 }

diff  --git a/flang/test/Lower/HLFIR/intrinsic-subroutines.f90 b/flang/test/Lower/HLFIR/intrinsic-subroutines.f90
new file mode 100644
index 0000000000000..775c1509620d2
--- /dev/null
+++ b/flang/test/Lower/HLFIR/intrinsic-subroutines.f90
@@ -0,0 +1,14 @@
+! Test lowering of intrinsic subroutines to HLFIR what matters here
+! is not to test each subroutine, but to check how their
+! lowering interfaces with the rest of lowering.
+! RUN: bbc -emit-fir -hlfir -o - %s | FileCheck %s
+
+subroutine test_subroutine(x)
+ real :: x
+ call cpu_time(x)
+end subroutine
+! CHECK-LABEL: func.func @_QPtest_subroutine(
+! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %{{.*}}
+! CHECK:  %[[VAL_2:.*]] = fir.call @_FortranACpuTime() fastmath<contract> : () -> f64
+! CHECK:  %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (f64) -> f32
+! CHECK:  fir.store %[[VAL_3]] to %[[VAL_1]]#1 : !fir.ref<f32>


        


More information about the flang-commits mailing list